1*37da2899SCharles.Forsyth /***************************************************************************/ 2*37da2899SCharles.Forsyth /* */ 3*37da2899SCharles.Forsyth /* pfrcmap.c */ 4*37da2899SCharles.Forsyth /* */ 5*37da2899SCharles.Forsyth /* FreeType PFR cmap handling (body). */ 6*37da2899SCharles.Forsyth /* */ 7*37da2899SCharles.Forsyth /* Copyright 2002 by */ 8*37da2899SCharles.Forsyth /* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9*37da2899SCharles.Forsyth /* */ 10*37da2899SCharles.Forsyth /* This file is part of the FreeType project, and may only be used, */ 11*37da2899SCharles.Forsyth /* modified, and distributed under the terms of the FreeType project */ 12*37da2899SCharles.Forsyth /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13*37da2899SCharles.Forsyth /* this file you indicate that you have read the license and */ 14*37da2899SCharles.Forsyth /* understand and accept it fully. */ 15*37da2899SCharles.Forsyth /* */ 16*37da2899SCharles.Forsyth /***************************************************************************/ 17*37da2899SCharles.Forsyth 18*37da2899SCharles.Forsyth 19*37da2899SCharles.Forsyth #include "pfrcmap.h" 20*37da2899SCharles.Forsyth #include "pfrobjs.h" 21*37da2899SCharles.Forsyth #include FT_INTERNAL_DEBUG_H 22*37da2899SCharles.Forsyth 23*37da2899SCharles.Forsyth 24*37da2899SCharles.Forsyth FT_CALLBACK_DEF( FT_Error ) pfr_cmap_init(PFR_CMap cmap)25*37da2899SCharles.Forsyth pfr_cmap_init( PFR_CMap cmap ) 26*37da2899SCharles.Forsyth { 27*37da2899SCharles.Forsyth PFR_Face face = (PFR_Face)FT_CMAP_FACE( cmap ); 28*37da2899SCharles.Forsyth 29*37da2899SCharles.Forsyth 30*37da2899SCharles.Forsyth cmap->num_chars = face->phy_font.num_chars; 31*37da2899SCharles.Forsyth cmap->chars = face->phy_font.chars; 32*37da2899SCharles.Forsyth 33*37da2899SCharles.Forsyth /* just for safety, check that the character entries are correctly */ 34*37da2899SCharles.Forsyth /* sorted in increasing character code order */ 35*37da2899SCharles.Forsyth { 36*37da2899SCharles.Forsyth FT_UInt n; 37*37da2899SCharles.Forsyth 38*37da2899SCharles.Forsyth 39*37da2899SCharles.Forsyth for ( n = 1; n < cmap->num_chars; n++ ) 40*37da2899SCharles.Forsyth { 41*37da2899SCharles.Forsyth if ( cmap->chars[n - 1].char_code >= cmap->chars[n].char_code ) 42*37da2899SCharles.Forsyth FT_ASSERT( 0 ); 43*37da2899SCharles.Forsyth } 44*37da2899SCharles.Forsyth } 45*37da2899SCharles.Forsyth 46*37da2899SCharles.Forsyth return 0; 47*37da2899SCharles.Forsyth } 48*37da2899SCharles.Forsyth 49*37da2899SCharles.Forsyth 50*37da2899SCharles.Forsyth FT_CALLBACK_DEF( void ) pfr_cmap_done(PFR_CMap cmap)51*37da2899SCharles.Forsyth pfr_cmap_done( PFR_CMap cmap ) 52*37da2899SCharles.Forsyth { 53*37da2899SCharles.Forsyth cmap->chars = NULL; 54*37da2899SCharles.Forsyth cmap->num_chars = 0; 55*37da2899SCharles.Forsyth } 56*37da2899SCharles.Forsyth 57*37da2899SCharles.Forsyth 58*37da2899SCharles.Forsyth FT_CALLBACK_DEF( FT_UInt ) pfr_cmap_char_index(PFR_CMap cmap,FT_UInt32 char_code)59*37da2899SCharles.Forsyth pfr_cmap_char_index( PFR_CMap cmap, 60*37da2899SCharles.Forsyth FT_UInt32 char_code ) 61*37da2899SCharles.Forsyth { 62*37da2899SCharles.Forsyth FT_UInt min = 0; 63*37da2899SCharles.Forsyth FT_UInt max = cmap->num_chars; 64*37da2899SCharles.Forsyth FT_UInt mid; 65*37da2899SCharles.Forsyth PFR_Char gchar; 66*37da2899SCharles.Forsyth 67*37da2899SCharles.Forsyth 68*37da2899SCharles.Forsyth while ( min < max ) 69*37da2899SCharles.Forsyth { 70*37da2899SCharles.Forsyth mid = min + ( max - min ) / 2; 71*37da2899SCharles.Forsyth gchar = cmap->chars + mid; 72*37da2899SCharles.Forsyth 73*37da2899SCharles.Forsyth if ( gchar->char_code == char_code ) 74*37da2899SCharles.Forsyth return mid + 1; 75*37da2899SCharles.Forsyth 76*37da2899SCharles.Forsyth if ( gchar->char_code < char_code ) 77*37da2899SCharles.Forsyth min = mid + 1; 78*37da2899SCharles.Forsyth else 79*37da2899SCharles.Forsyth max = mid; 80*37da2899SCharles.Forsyth } 81*37da2899SCharles.Forsyth return 0; 82*37da2899SCharles.Forsyth } 83*37da2899SCharles.Forsyth 84*37da2899SCharles.Forsyth 85*37da2899SCharles.Forsyth FT_CALLBACK_DEF( FT_UInt ) pfr_cmap_char_next(PFR_CMap cmap,FT_UInt32 * pchar_code)86*37da2899SCharles.Forsyth pfr_cmap_char_next( PFR_CMap cmap, 87*37da2899SCharles.Forsyth FT_UInt32 *pchar_code ) 88*37da2899SCharles.Forsyth { 89*37da2899SCharles.Forsyth FT_UInt result = 0; 90*37da2899SCharles.Forsyth FT_UInt32 char_code = *pchar_code + 1; 91*37da2899SCharles.Forsyth 92*37da2899SCharles.Forsyth 93*37da2899SCharles.Forsyth Restart: 94*37da2899SCharles.Forsyth { 95*37da2899SCharles.Forsyth FT_UInt min = 0; 96*37da2899SCharles.Forsyth FT_UInt max = cmap->num_chars; 97*37da2899SCharles.Forsyth FT_UInt mid; 98*37da2899SCharles.Forsyth PFR_Char gchar; 99*37da2899SCharles.Forsyth 100*37da2899SCharles.Forsyth 101*37da2899SCharles.Forsyth while ( min < max ) 102*37da2899SCharles.Forsyth { 103*37da2899SCharles.Forsyth mid = min + ( ( max - min ) >> 1 ); 104*37da2899SCharles.Forsyth gchar = cmap->chars + mid; 105*37da2899SCharles.Forsyth 106*37da2899SCharles.Forsyth if ( gchar->char_code == char_code ) 107*37da2899SCharles.Forsyth { 108*37da2899SCharles.Forsyth result = mid; 109*37da2899SCharles.Forsyth if ( result != 0 ) 110*37da2899SCharles.Forsyth { 111*37da2899SCharles.Forsyth result++; 112*37da2899SCharles.Forsyth goto Exit; 113*37da2899SCharles.Forsyth } 114*37da2899SCharles.Forsyth 115*37da2899SCharles.Forsyth char_code++; 116*37da2899SCharles.Forsyth goto Restart; 117*37da2899SCharles.Forsyth } 118*37da2899SCharles.Forsyth 119*37da2899SCharles.Forsyth if ( gchar->char_code < char_code ) 120*37da2899SCharles.Forsyth min = mid+1; 121*37da2899SCharles.Forsyth else 122*37da2899SCharles.Forsyth max = mid; 123*37da2899SCharles.Forsyth } 124*37da2899SCharles.Forsyth 125*37da2899SCharles.Forsyth /* we didn't find it, but we have a pair just above it */ 126*37da2899SCharles.Forsyth char_code = 0; 127*37da2899SCharles.Forsyth 128*37da2899SCharles.Forsyth if ( min < cmap->num_chars ) 129*37da2899SCharles.Forsyth { 130*37da2899SCharles.Forsyth gchar = cmap->chars + min; 131*37da2899SCharles.Forsyth result = min; 132*37da2899SCharles.Forsyth if ( result != 0 ) 133*37da2899SCharles.Forsyth { 134*37da2899SCharles.Forsyth result++; 135*37da2899SCharles.Forsyth char_code = gchar->char_code; 136*37da2899SCharles.Forsyth } 137*37da2899SCharles.Forsyth } 138*37da2899SCharles.Forsyth } 139*37da2899SCharles.Forsyth 140*37da2899SCharles.Forsyth Exit: 141*37da2899SCharles.Forsyth *pchar_code = char_code; 142*37da2899SCharles.Forsyth return result; 143*37da2899SCharles.Forsyth } 144*37da2899SCharles.Forsyth 145*37da2899SCharles.Forsyth 146*37da2899SCharles.Forsyth FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec 147*37da2899SCharles.Forsyth pfr_cmap_class_rec = 148*37da2899SCharles.Forsyth { 149*37da2899SCharles.Forsyth sizeof ( PFR_CMapRec ), 150*37da2899SCharles.Forsyth 151*37da2899SCharles.Forsyth (FT_CMap_InitFunc) pfr_cmap_init, 152*37da2899SCharles.Forsyth (FT_CMap_DoneFunc) pfr_cmap_done, 153*37da2899SCharles.Forsyth (FT_CMap_CharIndexFunc)pfr_cmap_char_index, 154*37da2899SCharles.Forsyth (FT_CMap_CharNextFunc) pfr_cmap_char_next 155*37da2899SCharles.Forsyth }; 156*37da2899SCharles.Forsyth 157*37da2899SCharles.Forsyth 158*37da2899SCharles.Forsyth /* END */ 159