26 FT_CALLBACK_DEF( FT_Error )
27 pfr_cmap_init( FT_CMap cmap,
30 PFR_CMap pfrcmap = (PFR_CMap)cmap;
31 FT_Error error = FT_Err_Ok;
32 PFR_Face face = (PFR_Face)FT_CMAP_FACE( cmap );
37 pfrcmap->num_chars = face->phy_font.num_chars;
38 pfrcmap->chars = face->phy_font.chars;
46 for ( n = 1; n < pfrcmap->num_chars; n++ )
48 if ( pfrcmap->chars[n - 1].char_code >= pfrcmap->chars[n].char_code )
50 error = FT_THROW( Invalid_Table );
61 FT_CALLBACK_DEF(
void )
62 pfr_cmap_done( FT_CMap cmap )
64 PFR_CMap pfrcmap = (PFR_CMap)cmap;
67 pfrcmap->chars = NULL;
68 pfrcmap->num_chars = 0;
72 FT_CALLBACK_DEF( FT_UInt )
73 pfr_cmap_char_index( FT_CMap cmap,
76 PFR_CMap pfrcmap = (PFR_CMap)cmap;
78 FT_UInt max = pfrcmap->num_chars;
79 FT_UInt mid = min + ( max - min ) / 2;
85 gchar = pfrcmap->chars + mid;
87 if ( gchar->char_code == char_code )
90 if ( gchar->char_code < char_code )
96 mid += char_code - gchar->char_code;
97 if ( mid >= max || mid < min )
98 mid = min + ( max - min ) / 2;
104 FT_CALLBACK_DEF( FT_UInt )
105 pfr_cmap_char_next( FT_CMap cmap,
106 FT_UInt32 *pchar_code )
108 PFR_CMap pfrcmap = (PFR_CMap)cmap;
110 FT_UInt32 char_code = *pchar_code + 1;
116 FT_UInt max = pfrcmap->num_chars;
117 FT_UInt mid = min + ( max - min ) / 2;
123 gchar = pfrcmap->chars + mid;
125 if ( gchar->char_code == char_code )
138 if ( gchar->char_code < char_code )
144 mid += char_code - gchar->char_code;
145 if ( mid >= max || mid < min )
146 mid = min + ( max - min ) / 2;
152 if ( min < pfrcmap->num_chars )
154 gchar = pfrcmap->chars + min;
159 char_code = gchar->char_code;
165 *pchar_code = char_code;
170 FT_CALLBACK_TABLE_DEF
const FT_CMap_ClassRec
173 sizeof ( PFR_CMapRec ),
175 (FT_CMap_InitFunc) pfr_cmap_init,
176 (FT_CMap_DoneFunc) pfr_cmap_done,
177 (FT_CMap_CharIndexFunc)pfr_cmap_char_index,
178 (FT_CMap_CharNextFunc) pfr_cmap_char_next,
180 (FT_CMap_CharVarIndexFunc) NULL,
181 (FT_CMap_CharVarIsDefaultFunc)NULL,
182 (FT_CMap_VariantListFunc) NULL,
183 (FT_CMap_CharVariantListFunc) NULL,
184 (FT_CMap_VariantCharListFunc) NULL