1 /***************************************************************************/
5 /* FreeType PFR cmap handling (body). */
7 /* Copyright 2002, 2007 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 /***************************************************************************/
21 #include FT_INTERNAL_DEBUG_H
24 FT_CALLBACK_DEF( FT_Error
)
25 pfr_cmap_init( PFR_CMap cmap
)
27 FT_Error error
= PFR_Err_Ok
;
28 PFR_Face face
= (PFR_Face
)FT_CMAP_FACE( cmap
);
31 cmap
->num_chars
= face
->phy_font
.num_chars
;
32 cmap
->chars
= face
->phy_font
.chars
;
34 /* just for safety, check that the character entries are correctly */
35 /* sorted in increasing character code order */
40 for ( n
= 1; n
< cmap
->num_chars
; n
++ )
42 if ( cmap
->chars
[n
- 1].char_code
>= cmap
->chars
[n
].char_code
)
44 error
= PFR_Err_Invalid_Table
;
55 FT_CALLBACK_DEF( void )
56 pfr_cmap_done( PFR_CMap cmap
)
63 FT_CALLBACK_DEF( FT_UInt
)
64 pfr_cmap_char_index( PFR_CMap cmap
,
68 FT_UInt max
= cmap
->num_chars
;
75 mid
= min
+ ( max
- min
) / 2;
76 gchar
= cmap
->chars
+ mid
;
78 if ( gchar
->char_code
== char_code
)
81 if ( gchar
->char_code
< char_code
)
90 FT_CALLBACK_DEF( FT_UInt
)
91 pfr_cmap_char_next( PFR_CMap cmap
,
92 FT_UInt32
*pchar_code
)
95 FT_UInt32 char_code
= *pchar_code
+ 1;
101 FT_UInt max
= cmap
->num_chars
;
108 mid
= min
+ ( ( max
- min
) >> 1 );
109 gchar
= cmap
->chars
+ mid
;
111 if ( gchar
->char_code
== char_code
)
124 if ( gchar
->char_code
< char_code
)
130 /* we didn't find it, but we have a pair just above it */
133 if ( min
< cmap
->num_chars
)
135 gchar
= cmap
->chars
+ min
;
140 char_code
= gchar
->char_code
;
146 *pchar_code
= char_code
;
151 FT_CALLBACK_TABLE_DEF
const FT_CMap_ClassRec
154 sizeof ( PFR_CMapRec
),
156 (FT_CMap_InitFunc
) pfr_cmap_init
,
157 (FT_CMap_DoneFunc
) pfr_cmap_done
,
158 (FT_CMap_CharIndexFunc
)pfr_cmap_char_index
,
159 (FT_CMap_CharNextFunc
) pfr_cmap_char_next