![]() |
![]() |
![]() |
![]() |
Calculate the extent of a string, up to a given rectangle
int PfExtentTextToRect(PhRect_t *ptsExtent, char *pkszFont, PhRect_t *ptsRect, char const *pkszString, int iLen );
ph
PfExtentTextToRect() extents a string, pkszString, of length iLen, and font pkszFont, up to the bounds specified by ptsRect. The resultant extent, which fits within the bounds of ptsRect, is placed in ptsExtent.
The arguments are:
The number of characters that will fit within ptsRect, or -1 if an error occurred (errno is set).
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <Ap.h> #include <Ph.h> #include <Pt.h> #include <errno.h> PtWidget_t * pwndMain = NULL, * pbtn = NULL, * pobjRaw = NULL; char * pcText = "pAfaBfbfffffffffffffffCfcXfxYfyZfzf"; char * pcGB = "\323\316\317\267"; int fnDrawCanvas( PtWidget_t * ptsWidget, PhTile_t * ptsDamage ); #define BUFFER_SIZE 256 int main (int argc, char *argv[]) { PtArg_t args[4]; PhPoint_t win_size, pntPOS, pntDIM; short nArgs = 0; char * pmbGB = NULL; struct PxTransCtrl * ptsTrans = NULL; int iTemp1 = 0, iTemp2 = 0; if((pmbGB = calloc(BUFFER_SIZE, sizeof(char))) == NULL) return(EXIT_FAILURE); PtInit (NULL); if(argc > 1) { if(PfGenerateFontName(argv[1], 0, 9, szFont) == NULL) PfGenerateFontName("TextFont", 0, 9, szFont); } else PfGenerateFontName("TextFont", 0, 9, szFont); if((ptsTrans = PxTranslateSet(NULL, "GB2312-80")) == NULL) return(EXIT_FAILURE); if(PxTranslateToUTF(ptsTrans, pcGB, 4, &iTemp1, pmbGB, BUFFER_SIZE, &iTemp2) == -1) printf("Could not translate from GB to UTF.\n"); if(argc > 2) pcText = pmbGB; // Set base pwndMain parameters. win_size.x = 450; win_size.y = 450; PtSetArg(&args[0],Pt_ARG_DIM, &win_size, 0); // window title = name of program PtSetArg(&args[1],Pt_ARG_WINDOW_TITLE, "PfExtentTextToRect", 0); pwndMain = PtCreateWidget (PtWindow, Pt_NO_PARENT, 2, args); nArgs = 0; pntPOS.x = 100; pntPOS.y = 10; PtSetArg(&args[nArgs], Pt_ARG_POS, &pntPOS, 0); nArgs++; PtSetArg(&args[nArgs], Pt_ARG_TEXT_STRING, pcText, NULL); nArgs++; PtSetArg(&args[nArgs], Pt_ARG_TEXT_FONT, szFont, NULL); nArgs++; pbtn = PtCreateWidget(PtButton, pwndMain, nArgs, args); PtRealizeWidget(pbtn); 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); PtRealizeWidget(pwndMain); PtMainLoop (); free(pmbGB); return(0); } int fnDrawCanvas( PtWidget_t * ptsWidget, PhTile_t * ptsDamage ) { PhRect_t tsExtentClip; PhRect_t rect; PhPoint_t pnt; PhRect_t tsExtent; PgColor_t old; PhPoint_t pnt2; PhPoint_t tsPos = {0, 0}; int iRet = 0; int iBytes = 0; // find our canvas PtCalcCanvas(pobjRaw, &rect); old = PgSetStrokeColor(Pg_BLACK); PfExtentText(&tsExtent, &tsPos, szFont, pcText, strlen(pcText)); // draw text pnt.x = 10 + rect.ul.x; pnt.y = 100 + rect.ul.y; PgSetFont(szFont); PgSetTextColor(Pg_BLACK); PgDrawText(pcText, strlen(pcText), &pnt, 0); pnt.x -= 10; pnt2.x = pnt.x + tsExtent.lr.x + 20; pnt2.y = pnt.y; PgSetStrokeColor(Pg_BLUE); PgDrawLine(&pnt, &pnt2); pnt.x = 10 + rect.ul.x; pnt.y = 100 + rect.ul.y; PgSetStrokeColor(Pg_RED); PgDrawIRect(tsExtent.ul.x + pnt.x, tsExtent.ul.y + pnt.y, (tsExtent.lr.x - min(tsExtent.ul.x, 0) + 1) + pnt.x, tsExtent.lr.y + pnt.y, Pg_DRAW_STROKE); if((iRet = PfExtentTextToRect(&tsExtentClip, szFont, &tsExtent, pcText, strlen(pcText))) == -1) printf("PfExtentTextToRect failed 1.\n"); else { printf("lrx == %d, %d characters in string.\n", tsExtent.lr.x, mbstrlen(pcText, 0, &iBytes)); printf("PfExtentTextToRect lrx == %d, %d characters will fit\ in clip of %d.\n", tsExtentClip.lr.x, iRet, tsExtent.lr.x); } tsExtent.lr.x /= 2; if((iRet = PfExtentTextToRect(&tsExtentClip, szFont, &tsExtent, pcText, strlen(pcText))) == -1) printf("PfExtentTextToRect failed 2.\n"); else { printf("lrx == %d, %d characters in string.\n", tsExtent.lr.x, mbstrlen(pcText, 0, &iBytes)); printf("PfExtentTextToRect lrx == %d, %d characters will\ fit in clip of %d.\n", tsExtentClip.lr.x, iRet, tsExtent.lr.x); } pnt.x = 10 + rect.ul.x; pnt.y = 150 + rect.ul.y; PgDrawText(pcText, iRet, &pnt, 0); PgDrawIRect(tsExtentClip.ul.x + pnt.x, tsExtentClip.ul.y + pnt.y, (tsExtentClip.lr.x - min(tsExtentClip.ul.x, 0) + 1) + pnt.x, tsExtentClip.lr.y + pnt.y, Pg_DRAW_STROKE); tsExtent.lr.x /= 2; if((iRet = PfExtentTextToRect(&tsExtentClip, szFont, &tsExtent, pcText, strlen(pcText))) == -1) printf("PfExtentTextToRect failed 3.\n"); else { printf("lrx == %d, %d characters in string.\n", tsExtent.lr.x, mbstrlen(pcText, 0, &iBytes)); printf("PfExtentTextToRect lrx == %d, %d characters will\ fit in clip of %d.\n", tsExtentClip.lr.x, iRet, tsExtent.lr.x); } pnt.x = 10 + rect.ul.x; pnt.y = 200 + rect.ul.y; PgDrawText(pcText, iRet, &pnt, 0); PgDrawIRect(tsExtentClip.ul.x + pnt.x, tsExtentClip.ul.y + pnt.y, (tsExtentClip.lr.x - min(tsExtentClip.ul.x, 0) + 1) + pnt.x, tsExtentClip.lr.y + pnt.y, Pg_DRAW_STROKE); PgSetStrokeColor(old); return( Pt_CONTINUE ); }
Photon
Safety: | |
---|---|
Interrupt handler | No |
Signal handler | No |
Thread | No |
PfExtentComponents(), PfExtentFractTextCharPositions(), PfExtentText(), PfExtentTextCharPositions(), PfExtentWideText(), PfFractionalExtentText(), PfGenerateFontName(), PhRect_t
Fonts chapter of the Photon Programmer's Guide
![]() |
![]() |
![]() |
![]() |