1*37da2899SCharles.Forsyth /***************************************************************************/ 2*37da2899SCharles.Forsyth /* */ 3*37da2899SCharles.Forsyth /* ttpload.c */ 4*37da2899SCharles.Forsyth /* */ 5*37da2899SCharles.Forsyth /* TrueType glyph data/program tables loader (body). */ 6*37da2899SCharles.Forsyth /* */ 7*37da2899SCharles.Forsyth /* Copyright 1996-2001, 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 <ft2build.h> 20*37da2899SCharles.Forsyth #include FT_INTERNAL_DEBUG_H 21*37da2899SCharles.Forsyth #include FT_INTERNAL_OBJECTS_H 22*37da2899SCharles.Forsyth #include FT_INTERNAL_STREAM_H 23*37da2899SCharles.Forsyth #include FT_TRUETYPE_TAGS_H 24*37da2899SCharles.Forsyth 25*37da2899SCharles.Forsyth #include "ttpload.h" 26*37da2899SCharles.Forsyth 27*37da2899SCharles.Forsyth #include "tterrors.h" 28*37da2899SCharles.Forsyth 29*37da2899SCharles.Forsyth 30*37da2899SCharles.Forsyth /*************************************************************************/ 31*37da2899SCharles.Forsyth /* */ 32*37da2899SCharles.Forsyth /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 33*37da2899SCharles.Forsyth /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 34*37da2899SCharles.Forsyth /* messages during execution. */ 35*37da2899SCharles.Forsyth /* */ 36*37da2899SCharles.Forsyth #undef FT_COMPONENT 37*37da2899SCharles.Forsyth #define FT_COMPONENT trace_ttpload 38*37da2899SCharles.Forsyth 39*37da2899SCharles.Forsyth 40*37da2899SCharles.Forsyth /*************************************************************************/ 41*37da2899SCharles.Forsyth /* */ 42*37da2899SCharles.Forsyth /* <Function> */ 43*37da2899SCharles.Forsyth /* tt_face_load_loca */ 44*37da2899SCharles.Forsyth /* */ 45*37da2899SCharles.Forsyth /* <Description> */ 46*37da2899SCharles.Forsyth /* Loads the locations table. */ 47*37da2899SCharles.Forsyth /* */ 48*37da2899SCharles.Forsyth /* <InOut> */ 49*37da2899SCharles.Forsyth /* face :: A handle to the target face object. */ 50*37da2899SCharles.Forsyth /* */ 51*37da2899SCharles.Forsyth /* <Input> */ 52*37da2899SCharles.Forsyth /* stream :: The input stream. */ 53*37da2899SCharles.Forsyth /* */ 54*37da2899SCharles.Forsyth /* <Return> */ 55*37da2899SCharles.Forsyth /* FreeType error code. 0 means success. */ 56*37da2899SCharles.Forsyth /* */ 57*37da2899SCharles.Forsyth FT_LOCAL_DEF( FT_Error ) tt_face_load_loca(TT_Face face,FT_Stream stream)58*37da2899SCharles.Forsyth tt_face_load_loca( TT_Face face, 59*37da2899SCharles.Forsyth FT_Stream stream ) 60*37da2899SCharles.Forsyth { 61*37da2899SCharles.Forsyth FT_Error error; 62*37da2899SCharles.Forsyth FT_Memory memory = stream->memory; 63*37da2899SCharles.Forsyth FT_Short LongOffsets; 64*37da2899SCharles.Forsyth FT_ULong table_len; 65*37da2899SCharles.Forsyth 66*37da2899SCharles.Forsyth 67*37da2899SCharles.Forsyth FT_TRACE2(( "Locations " )); 68*37da2899SCharles.Forsyth LongOffsets = face->header.Index_To_Loc_Format; 69*37da2899SCharles.Forsyth 70*37da2899SCharles.Forsyth error = face->goto_table( face, TTAG_loca, stream, &table_len ); 71*37da2899SCharles.Forsyth if ( error ) 72*37da2899SCharles.Forsyth { 73*37da2899SCharles.Forsyth error = TT_Err_Locations_Missing; 74*37da2899SCharles.Forsyth goto Exit; 75*37da2899SCharles.Forsyth } 76*37da2899SCharles.Forsyth 77*37da2899SCharles.Forsyth if ( LongOffsets != 0 ) 78*37da2899SCharles.Forsyth { 79*37da2899SCharles.Forsyth face->num_locations = (FT_UShort)( table_len >> 2 ); 80*37da2899SCharles.Forsyth 81*37da2899SCharles.Forsyth FT_TRACE2(( "(32bit offsets): %12d ", face->num_locations )); 82*37da2899SCharles.Forsyth 83*37da2899SCharles.Forsyth if ( FT_NEW_ARRAY( face->glyph_locations, face->num_locations ) ) 84*37da2899SCharles.Forsyth goto Exit; 85*37da2899SCharles.Forsyth 86*37da2899SCharles.Forsyth if ( FT_FRAME_ENTER( face->num_locations * 4L ) ) 87*37da2899SCharles.Forsyth goto Exit; 88*37da2899SCharles.Forsyth 89*37da2899SCharles.Forsyth { 90*37da2899SCharles.Forsyth FT_Long* loc = face->glyph_locations; 91*37da2899SCharles.Forsyth FT_Long* limit = loc + face->num_locations; 92*37da2899SCharles.Forsyth 93*37da2899SCharles.Forsyth 94*37da2899SCharles.Forsyth for ( ; loc < limit; loc++ ) 95*37da2899SCharles.Forsyth *loc = FT_GET_LONG(); 96*37da2899SCharles.Forsyth } 97*37da2899SCharles.Forsyth 98*37da2899SCharles.Forsyth FT_FRAME_EXIT(); 99*37da2899SCharles.Forsyth } 100*37da2899SCharles.Forsyth else 101*37da2899SCharles.Forsyth { 102*37da2899SCharles.Forsyth face->num_locations = (FT_UShort)( table_len >> 1 ); 103*37da2899SCharles.Forsyth 104*37da2899SCharles.Forsyth FT_TRACE2(( "(16bit offsets): %12d ", face->num_locations )); 105*37da2899SCharles.Forsyth 106*37da2899SCharles.Forsyth if ( FT_NEW_ARRAY( face->glyph_locations, face->num_locations ) ) 107*37da2899SCharles.Forsyth goto Exit; 108*37da2899SCharles.Forsyth 109*37da2899SCharles.Forsyth if ( FT_FRAME_ENTER( face->num_locations * 2L ) ) 110*37da2899SCharles.Forsyth goto Exit; 111*37da2899SCharles.Forsyth { 112*37da2899SCharles.Forsyth FT_Long* loc = face->glyph_locations; 113*37da2899SCharles.Forsyth FT_Long* limit = loc + face->num_locations; 114*37da2899SCharles.Forsyth 115*37da2899SCharles.Forsyth 116*37da2899SCharles.Forsyth for ( ; loc < limit; loc++ ) 117*37da2899SCharles.Forsyth *loc = (FT_Long)( (FT_ULong)FT_GET_USHORT() * 2 ); 118*37da2899SCharles.Forsyth } 119*37da2899SCharles.Forsyth FT_FRAME_EXIT(); 120*37da2899SCharles.Forsyth } 121*37da2899SCharles.Forsyth 122*37da2899SCharles.Forsyth FT_TRACE2(( "loaded\n" )); 123*37da2899SCharles.Forsyth 124*37da2899SCharles.Forsyth Exit: 125*37da2899SCharles.Forsyth return error; 126*37da2899SCharles.Forsyth } 127*37da2899SCharles.Forsyth 128*37da2899SCharles.Forsyth 129*37da2899SCharles.Forsyth /*************************************************************************/ 130*37da2899SCharles.Forsyth /* */ 131*37da2899SCharles.Forsyth /* <Function> */ 132*37da2899SCharles.Forsyth /* tt_face_load_cvt */ 133*37da2899SCharles.Forsyth /* */ 134*37da2899SCharles.Forsyth /* <Description> */ 135*37da2899SCharles.Forsyth /* Loads the control value table into a face object. */ 136*37da2899SCharles.Forsyth /* */ 137*37da2899SCharles.Forsyth /* <InOut> */ 138*37da2899SCharles.Forsyth /* face :: A handle to the target face object. */ 139*37da2899SCharles.Forsyth /* */ 140*37da2899SCharles.Forsyth /* <Input> */ 141*37da2899SCharles.Forsyth /* stream :: A handle to the input stream. */ 142*37da2899SCharles.Forsyth /* */ 143*37da2899SCharles.Forsyth /* <Return> */ 144*37da2899SCharles.Forsyth /* FreeType error code. 0 means success. */ 145*37da2899SCharles.Forsyth /* */ 146*37da2899SCharles.Forsyth FT_LOCAL_DEF( FT_Error ) tt_face_load_cvt(TT_Face face,FT_Stream stream)147*37da2899SCharles.Forsyth tt_face_load_cvt( TT_Face face, 148*37da2899SCharles.Forsyth FT_Stream stream ) 149*37da2899SCharles.Forsyth { 150*37da2899SCharles.Forsyth FT_Error error; 151*37da2899SCharles.Forsyth FT_Memory memory = stream->memory; 152*37da2899SCharles.Forsyth FT_ULong table_len; 153*37da2899SCharles.Forsyth 154*37da2899SCharles.Forsyth 155*37da2899SCharles.Forsyth FT_TRACE2(( "CVT " )); 156*37da2899SCharles.Forsyth 157*37da2899SCharles.Forsyth error = face->goto_table( face, TTAG_cvt, stream, &table_len ); 158*37da2899SCharles.Forsyth if ( error ) 159*37da2899SCharles.Forsyth { 160*37da2899SCharles.Forsyth FT_TRACE2(( "is missing!\n" )); 161*37da2899SCharles.Forsyth 162*37da2899SCharles.Forsyth face->cvt_size = 0; 163*37da2899SCharles.Forsyth face->cvt = NULL; 164*37da2899SCharles.Forsyth error = TT_Err_Ok; 165*37da2899SCharles.Forsyth 166*37da2899SCharles.Forsyth goto Exit; 167*37da2899SCharles.Forsyth } 168*37da2899SCharles.Forsyth 169*37da2899SCharles.Forsyth face->cvt_size = table_len / 2; 170*37da2899SCharles.Forsyth 171*37da2899SCharles.Forsyth if ( FT_NEW_ARRAY( face->cvt, face->cvt_size ) ) 172*37da2899SCharles.Forsyth goto Exit; 173*37da2899SCharles.Forsyth 174*37da2899SCharles.Forsyth if ( FT_FRAME_ENTER( face->cvt_size * 2L ) ) 175*37da2899SCharles.Forsyth goto Exit; 176*37da2899SCharles.Forsyth 177*37da2899SCharles.Forsyth { 178*37da2899SCharles.Forsyth FT_Short* cur = face->cvt; 179*37da2899SCharles.Forsyth FT_Short* limit = cur + face->cvt_size; 180*37da2899SCharles.Forsyth 181*37da2899SCharles.Forsyth 182*37da2899SCharles.Forsyth for ( ; cur < limit; cur++ ) 183*37da2899SCharles.Forsyth *cur = FT_GET_SHORT(); 184*37da2899SCharles.Forsyth } 185*37da2899SCharles.Forsyth 186*37da2899SCharles.Forsyth FT_FRAME_EXIT(); 187*37da2899SCharles.Forsyth FT_TRACE2(( "loaded\n" )); 188*37da2899SCharles.Forsyth 189*37da2899SCharles.Forsyth Exit: 190*37da2899SCharles.Forsyth return error; 191*37da2899SCharles.Forsyth } 192*37da2899SCharles.Forsyth 193*37da2899SCharles.Forsyth 194*37da2899SCharles.Forsyth /*************************************************************************/ 195*37da2899SCharles.Forsyth /* */ 196*37da2899SCharles.Forsyth /* <Function> */ 197*37da2899SCharles.Forsyth /* tt_face_load_fpgm */ 198*37da2899SCharles.Forsyth /* */ 199*37da2899SCharles.Forsyth /* <Description> */ 200*37da2899SCharles.Forsyth /* Loads the font program and the cvt program. */ 201*37da2899SCharles.Forsyth /* */ 202*37da2899SCharles.Forsyth /* <InOut> */ 203*37da2899SCharles.Forsyth /* face :: A handle to the target face object. */ 204*37da2899SCharles.Forsyth /* */ 205*37da2899SCharles.Forsyth /* <Input> */ 206*37da2899SCharles.Forsyth /* stream :: A handle to the input stream. */ 207*37da2899SCharles.Forsyth /* */ 208*37da2899SCharles.Forsyth /* <Return> */ 209*37da2899SCharles.Forsyth /* FreeType error code. 0 means success. */ 210*37da2899SCharles.Forsyth /* */ 211*37da2899SCharles.Forsyth FT_LOCAL_DEF( FT_Error ) tt_face_load_fpgm(TT_Face face,FT_Stream stream)212*37da2899SCharles.Forsyth tt_face_load_fpgm( TT_Face face, 213*37da2899SCharles.Forsyth FT_Stream stream ) 214*37da2899SCharles.Forsyth { 215*37da2899SCharles.Forsyth FT_Error error; 216*37da2899SCharles.Forsyth FT_ULong table_len; 217*37da2899SCharles.Forsyth 218*37da2899SCharles.Forsyth 219*37da2899SCharles.Forsyth FT_TRACE2(( "Font program " )); 220*37da2899SCharles.Forsyth 221*37da2899SCharles.Forsyth /* The font program is optional */ 222*37da2899SCharles.Forsyth error = face->goto_table( face, TTAG_fpgm, stream, &table_len ); 223*37da2899SCharles.Forsyth if ( error ) 224*37da2899SCharles.Forsyth { 225*37da2899SCharles.Forsyth face->font_program = NULL; 226*37da2899SCharles.Forsyth face->font_program_size = 0; 227*37da2899SCharles.Forsyth 228*37da2899SCharles.Forsyth FT_TRACE2(( "is missing!\n" )); 229*37da2899SCharles.Forsyth } 230*37da2899SCharles.Forsyth else 231*37da2899SCharles.Forsyth { 232*37da2899SCharles.Forsyth face->font_program_size = table_len; 233*37da2899SCharles.Forsyth if ( FT_FRAME_EXTRACT( table_len, face->font_program ) ) 234*37da2899SCharles.Forsyth goto Exit; 235*37da2899SCharles.Forsyth 236*37da2899SCharles.Forsyth FT_TRACE2(( "loaded, %12d bytes\n", face->font_program_size )); 237*37da2899SCharles.Forsyth } 238*37da2899SCharles.Forsyth 239*37da2899SCharles.Forsyth FT_TRACE2(( "Prep program " )); 240*37da2899SCharles.Forsyth 241*37da2899SCharles.Forsyth error = face->goto_table( face, TTAG_prep, stream, &table_len ); 242*37da2899SCharles.Forsyth if ( error ) 243*37da2899SCharles.Forsyth { 244*37da2899SCharles.Forsyth face->cvt_program = NULL; 245*37da2899SCharles.Forsyth face->cvt_program_size = 0; 246*37da2899SCharles.Forsyth error = TT_Err_Ok; 247*37da2899SCharles.Forsyth 248*37da2899SCharles.Forsyth FT_TRACE2(( "is missing!\n" )); 249*37da2899SCharles.Forsyth } 250*37da2899SCharles.Forsyth else 251*37da2899SCharles.Forsyth { 252*37da2899SCharles.Forsyth face->cvt_program_size = table_len; 253*37da2899SCharles.Forsyth if ( FT_FRAME_EXTRACT( table_len, face->cvt_program ) ) 254*37da2899SCharles.Forsyth goto Exit; 255*37da2899SCharles.Forsyth 256*37da2899SCharles.Forsyth FT_TRACE2(( "loaded, %12d bytes\n", face->cvt_program_size )); 257*37da2899SCharles.Forsyth } 258*37da2899SCharles.Forsyth 259*37da2899SCharles.Forsyth Exit: 260*37da2899SCharles.Forsyth return error; 261*37da2899SCharles.Forsyth } 262*37da2899SCharles.Forsyth 263*37da2899SCharles.Forsyth 264*37da2899SCharles.Forsyth /* END */ 265