Get a glyph index
#include <font_api.h> int PfGetGlyphIndexCx( struct _Pf_ctrl * context, wchar_tglyph, FontID * font, uint32_t * pIndex );
font
This function retrieves the glyph index for the provided font and glyph combination.
#include <fcntl.h> #include <stdio.h> #include <unistd.h> #include <ctype.h> #include <errno.h> #include <malloc.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/stat.h> #include <dirent.h> #include <photon/PhT.h> #include <photon/PhProto.h> #include <Pt.h> #include <Ph.h> #include <font_api.h> FontName name; uint16_t wc = 0x65; int font_changed(PtWidget_t * widget, void * data, PtCallbackInfo_t * cbinfo) { snprintf(name, sizeof(name), "%s", cbinfo->cbdata); printf("%s\n", name); PtDamageWidget(data); return(Pt_CONTINUE); } void raw_draw(PtWidget_t *widget, PhTile_t *damage) { PhArea_t area; PhRect_t tsClip; PhPoint_t pos = { 10, 10 }; FontQueryInfo info; wchar_t w; FontID * id; pf_metrics_t * metric; FontRender * render; PtSuperClassDraw( PtBasic, widget, damage ); PtCalcCanvas(widget, &tsClip); PgDrawRect(&tsClip, Pg_DRAW_FILL); PtClipAdd(widget, &tsClip); tsClip.ul.x += 2; tsClip.ul.y += 10; PgSetTranslation (&tsClip.ul, Pg_RELATIVE); PgSetTextColor(Pg_BLACK); PgSetFont(name); if(PfQueryFontInfoCx(PfDefaultContext(), name, &info) == -1) { fprintf(stderr, "NOTE : PfQueryFontInfoCx failed, errno %d.\n", errno); fprintf(stderr, "FAIL : Glyph capture.\n"); exit(EXIT_FAILURE); } pos.y += -info.ascender; w = wc; if((id = PfDecomposeStemToIDCx(PfDefaultContext(), name)) != NULL) { FontRender r; int size = 32000; char * bitmap = calloc(size, sizeof(char)); if(PfGlyphCx(PfDefaultContext(), name, w, &r, bitmap, size, NULL) == -1) { fprintf(stderr, "NOTE : PfGlyphCx failed, errno %d.\n", errno); fprintf(stderr, "FAIL : Glyph capture.\n"); free(bitmap); exit(EXIT_FAILURE); } else { pos.y -= r.offset.y; PgDrawText(&wc, sizeof(wc), &pos, Pg_TEXT_WIDECHAR); } free(bitmap); PfFreeFontCx(PfDefaultContext(), id); } else { fprintf(stderr, "NOTE : PfDecomposeStemToIDCx failed, errno %d.\n", errno); fprintf(stderr, "FAIL : Glyph capture.\n"); exit(EXIT_FAILURE); } tsClip.ul.x *= -1; tsClip.ul.y *= -1; PgSetTranslation (&tsClip.ul, Pg_RELATIVE); PtClipRemove(); } int main(int argc, char *argv[]) { PtArg_t tsArg[10]; int i; PhDim_t dim = { 300, 300 }; PtWidget_t * win, * raw, * fontsel; PhPoint_t pos = {0,0}; PhRect_t canvas; int flags; uint32_t index; FontID * id; fprintf(stderr, "POINT : Glyph capture.\n"); if(PtInit(NULL) == -1) { fprintf(stderr, "NOTE : PtInit failed, no photon.\n"); fprintf(stderr, "FAIL : Glyph Capture.\n"); return(EXIT_FAILURE); } PgSetDrawBufferSize(0xFFFF); i = 0; PtSetArg(&tsArg[i++], Pt_ARG_DIM, &dim, 0L); PtSetArg(&tsArg[i++], Pt_ARG_WINDOW_TITLE, "Glyph Capture", 0L); PtSetArg(&tsArg[i++], Pt_ARG_FLAGS, Pt_GETS_FOCUS, Pt_GETS_FOCUS); if((win = PtCreateWidget(PtWindow, NULL, i, tsArg)) == NULL) { fprintf(stderr, "NOTE : Unable to create window.\n"); fprintf(stderr, "FAIL : Glyph Capture.\n"); return(EXIT_FAILURE); } PtCalcCanvas(win, &canvas); i = 0; dim.w = canvas.lr.x - canvas.ul.x; dim.h = (canvas.lr.y / 2) - canvas.ul.y; PtSetArg(&tsArg[i++], Pt_ARG_DIM, &dim, 0L); PtSetArg(&tsArg[i++], Pt_ARG_RAW_DRAW_F, raw_draw, 0L); pos.x = 0; pos.y = dim.h; PtSetArg(&tsArg[i++], Pt_ARG_POS, &pos, 0L); PtSetArg(&tsArg[i++], Pt_ARG_FILL_COLOR, Pg_YELLOW, 0L); flags = Pt_RIGHT_ANCHORED_RIGHT | Pt_LEFT_ANCHORED_LEFT | Pt_TOP_ANCHORED_TOP | Pt_BOTTOM_ANCHORED_BOTTOM; PtSetArg(&tsArg[i++], Pt_ARG_ANCHOR_FLAGS, flags, flags); if((raw = PtCreateWidget(PtRaw, win, i, tsArg)) == NULL) { fprintf(stderr, "NOTE : Unable to create raw canvas.\n"); fprintf(stderr, "FAIL : Glyph Capture.\n"); return(EXIT_FAILURE); } i = 0; dim.w = canvas.lr.x - canvas.ul.x; dim.h = (canvas.lr.y / 2) - canvas.ul.y; PtSetArg(&tsArg[i++], Pt_ARG_DIM, &dim, 0L); pos.x = 0; pos.y = 0; PtSetArg(&tsArg[i++], Pt_ARG_POS, &pos, 0L); flags = Pt_RIGHT_ANCHORED_RIGHT | Pt_LEFT_ANCHORED_LEFT | Pt_TOP_ANCHORED_TOP | Pt_BOTTOM_ANCHORED_BOTTOM; PtSetArg(&tsArg[i++], Pt_ARG_ANCHOR_FLAGS, flags, flags); PtSetArg(&tsArg[i++], Pt_ARG_FONT_FLAGS, 0L, Pt_FONTSEL_SAMPLE); if((fontsel = PtCreateWidget(PtFontSel, win, i, tsArg)) == NULL) { fprintf(stderr, "NOTE : Unable to create fontsel.\n"); fprintf(stderr, "FAIL : Glyph Capture.\n"); return(EXIT_FAILURE); } PtAddCallback(fontsel, Pt_CB_FONT_MODIFY, font_changed, raw); id = PfFindFontCx(PfDefaultContext(), "TextFont", 0L, 9L); PfConvertFontIDCx(PfDefaultContext(), id, name); if(PfGetGlyphIndexCx(PfDefaultContext(), wc, id, &index) == -1) { fprintf(stderr, "NOTE : Unable to fetch index, errno %d.\n", errno); fprintf(stderr, "FAIL : Glyph Capture.\n"); return(EXIT_FAILURE); } else fprintf(stderr, "NOTE : index is %d\n", index); PtRealizeWidget(win); PtMainLoop(); return(EXIT_SUCCESS); }
Photon
Safety: | |
---|---|
Cancellation point | No |
Interrupt handler | No |
Signal handler | No |
Thread | Yes |
PfAttachCx(), PfAttachDllCx(), PfFindFontCx().
Fonts chapter of the Photon Programmer's Guide