1 /***************************************************************************/
5 /* FreeType PFR cmap handling (body). */
7 /* Copyright 2002, 2007, 2009 by */
8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */
10 /* This file is part of the FreeType project, and may only be used, */
11 /* modified, and distributed under the terms of the FreeType project */
12 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */
13 /* this file you indicate that you have read the license and */
14 /* understand and accept it fully. */
16 /***************************************************************************/
25 FT_CALLBACK_DEF( FT_Error )
26 pfr_cmap_init( PFR_CMap cmap )
28 FT_Error error = PFR_Err_Ok;
29 PFR_Face face = (PFR_Face)FT_CMAP_FACE( cmap );
32 cmap->num_chars = face->phy_font.num_chars;
33 cmap->chars = face->phy_font.chars;
35 /* just for safety, check that the character entries are correctly */
36 /* sorted in increasing character code order */
41 for ( n = 1; n < cmap->num_chars; n++ )
43 if ( cmap->chars[n - 1].char_code >= cmap->chars[n].char_code )
45 error = PFR_Err_Invalid_Table;
56 FT_CALLBACK_DEF( void )
57 pfr_cmap_done( PFR_CMap cmap )
64 FT_CALLBACK_DEF( FT_UInt )
65 pfr_cmap_char_index( PFR_CMap cmap,
69 FT_UInt max = cmap->num_chars;
76 mid = min + ( max - min ) / 2;
77 gchar = cmap->chars + mid;
79 if ( gchar->char_code == char_code )
82 if ( gchar->char_code < char_code )
91 FT_CALLBACK_DEF( FT_UInt32 )
92 pfr_cmap_char_next( PFR_CMap cmap,
93 FT_UInt32 *pchar_code )
96 FT_UInt32 char_code = *pchar_code + 1;
102 FT_UInt max = cmap->num_chars;
109 mid = min + ( ( max - min ) >> 1 );
110 gchar = cmap->chars + mid;
112 if ( gchar->char_code == char_code )
125 if ( gchar->char_code < char_code )
131 /* we didn't find it, but we have a pair just above it */
134 if ( min < cmap->num_chars )
136 gchar = cmap->chars + min;
141 char_code = gchar->char_code;
147 *pchar_code = char_code;
152 FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
155 sizeof ( PFR_CMapRec ),
157 (FT_CMap_InitFunc) pfr_cmap_init,
158 (FT_CMap_DoneFunc) pfr_cmap_done,
159 (FT_CMap_CharIndexFunc)pfr_cmap_char_index,
160 (FT_CMap_CharNextFunc) pfr_cmap_char_next,
162 NULL, NULL, NULL, NULL, NULL