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