Calculate the width of a char string of multibyte UTF-8 characters
#include <photon/Pf.h> int PfTextWidthBytes( const char *font, const char *str, int len );
ph
PfTextWidthBytes() is a convenience function that calculates the width of the given string in the given font, using the formula:
extent.lr.x - min(extent.ul.x, 0) + 1
PfTextWidthChars() is similar, but you give it the number of characters in the string rather than the number of bytes.
The width of the string, or 0 if an error occurred.
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <Ap.h> #include <Ph.h> #include <Pt.h> #include <errno.h> int fnDrawCanvas( PtWidget_t * ptsWidget, PhTile_t * ptsDamage ); int main(int argc, char *argv[]) { PtArg_t args[8]; PhPoint_t win_size, pntPOS, pntDIM; short nArgs = 0; PtWidget_t * pwndMain = NULL, * pobjRaw = NULL; PtInit (NULL); // set base pwndMain parms win_size.x = 450; win_size.y = 600; PtSetArg(&args[0],Pt_ARG_DIM, &win_size, 0); // window title = name of program PtSetArg(&args[1],Pt_ARG_WINDOW_TITLE, "PfTextWidth", 0); pwndMain = PtCreateWidget (PtWindow, Pt_NO_PARENT, 2, args); pntPOS.y = 100; pntPOS.x = 75; pntDIM.x = 300; pntDIM.y = 300; PtSetArg(&args[0], Pt_ARG_POS, &pntPOS, 0); PtSetArg(&args[1], Pt_ARG_DIM, &pntDIM, 0); PtSetArg(&args[2], Pt_ARG_RAW_DRAW_F, fnDrawCanvas, 0L); pobjRaw = PtCreateWidget(PtRaw, pwndMain, 3, args); (void) PtRealizeWidget(pwndMain); PtMainLoop (); return(0); } int fnDrawCanvas( PtWidget_t * ptsWidget, PhTile_t * ptsDamage ) { PhRect_t rect; PhPoint_t tsPos = {0, 0}; PgColor_t old; int iLen = 0; char szHelvetica12[MAX_FONT_TAG]; // find our canvas PtCalcCanvas(ptsWidget, &rect); PtSuperClassDraw(PtBasic, ptsWidget, ptsDamage); old = PgSetStrokeColor(Pg_BLACK); // draw text tsPos.x = 10 + rect.ul.x; tsPos.y = 10 + rect.ul.y; PgSetFont(PfGenerateFontName("Helvetica", 0, 12, szHelvetica12)); PgSetTextColor(Pg_BLACK); PgDrawText("Hello", 5, &tsPos, 0); if((iLen = PfTextWidthBytes(szHelvetica12, "Hello", 0)) == 0) return(Pt_CONTINUE); PgDrawILine(tsPos.x, tsPos.y, tsPos.x + iLen, tsPos.y); PgSetStrokeColor(old); return( Pt_CONTINUE ); }
Photon
Safety: | |
---|---|
Interrupt handler | No |
Signal handler | No |
Thread | No |
PfGenerateFontName(), PfTextWidthChars()
Fonts chapter of the Photon Programmer's Guide