![]()  | 
![]()  | 
![]()  | 
![]()  | 
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
![]()  | 
![]()  | 
![]()  | 
![]()  |