Disabling auto-refresh of game list by default, as it is causing bugs sometimes
[open-ps2-loader.git] / thirdparty / freetype-2.3.12 / src / pfr / pfrcmap.c
blob9c8f9ed8eb3318db80830bf841cb58a9469a250b
1 /***************************************************************************/
2 /* */
3 /* pfrcmap.c */
4 /* */
5 /* FreeType PFR cmap handling (body). */
6 /* */
7 /* Copyright 2002, 2007, 2009 by */
8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */
9 /* */
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. */
15 /* */
16 /***************************************************************************/
19 #include "pfrcmap.h"
20 #include "pfrobjs.h"
22 #include "pfrerror.h"
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 */
38 FT_UInt n;
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;
46 goto Exit;
51 Exit:
52 return error;
56 FT_CALLBACK_DEF( void )
57 pfr_cmap_done( PFR_CMap cmap )
59 cmap->chars = NULL;
60 cmap->num_chars = 0;
64 FT_CALLBACK_DEF( FT_UInt )
65 pfr_cmap_char_index( PFR_CMap cmap,
66 FT_UInt32 char_code )
68 FT_UInt min = 0;
69 FT_UInt max = cmap->num_chars;
70 FT_UInt mid;
71 PFR_Char gchar;
74 while ( min < max )
76 mid = min + ( max - min ) / 2;
77 gchar = cmap->chars + mid;
79 if ( gchar->char_code == char_code )
80 return mid + 1;
82 if ( gchar->char_code < char_code )
83 min = mid + 1;
84 else
85 max = mid;
87 return 0;
91 FT_CALLBACK_DEF( FT_UInt32 )
92 pfr_cmap_char_next( PFR_CMap cmap,
93 FT_UInt32 *pchar_code )
95 FT_UInt result = 0;
96 FT_UInt32 char_code = *pchar_code + 1;
99 Restart:
101 FT_UInt min = 0;
102 FT_UInt max = cmap->num_chars;
103 FT_UInt mid;
104 PFR_Char gchar;
107 while ( min < max )
109 mid = min + ( ( max - min ) >> 1 );
110 gchar = cmap->chars + mid;
112 if ( gchar->char_code == char_code )
114 result = mid;
115 if ( result != 0 )
117 result++;
118 goto Exit;
121 char_code++;
122 goto Restart;
125 if ( gchar->char_code < char_code )
126 min = mid+1;
127 else
128 max = mid;
131 /* we didn't find it, but we have a pair just above it */
132 char_code = 0;
134 if ( min < cmap->num_chars )
136 gchar = cmap->chars + min;
137 result = min;
138 if ( result != 0 )
140 result++;
141 char_code = gchar->char_code;
146 Exit:
147 *pchar_code = char_code;
148 return result;
152 FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
153 pfr_cmap_class_rec =
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
166 /* END */