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