| OLD | NEW | 
|---|
| 1 /***************************************************************************/ | 1 /***************************************************************************/ | 
| 2 /*                                                                         */ | 2 /*                                                                         */ | 
| 3 /*  sfobjs.c                                                               */ | 3 /*  sfobjs.c                                                               */ | 
| 4 /*                                                                         */ | 4 /*                                                                         */ | 
| 5 /*    SFNT object management (base).                                       */ | 5 /*    SFNT object management (base).                                       */ | 
| 6 /*                                                                         */ | 6 /*                                                                         */ | 
| 7 /*  Copyright 1996-2008, 2010-2011 by                                      */ | 7 /*  Copyright 1996-2008, 2010-2013 by                                      */ | 
| 8 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */ | 8 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */ | 
| 9 /*                                                                         */ | 9 /*                                                                         */ | 
| 10 /*  This file is part of the FreeType project, and may only be used,       */ | 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      */ | 11 /*  modified, and distributed under the terms of the FreeType project      */ | 
| 12 /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */ | 12 /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */ | 
| 13 /*  this file you indicate that you have read the license and              */ | 13 /*  this file you indicate that you have read the license and              */ | 
| 14 /*  understand and accept it fully.                                        */ | 14 /*  understand and accept it fully.                                        */ | 
| 15 /*                                                                         */ | 15 /*                                                                         */ | 
| 16 /***************************************************************************/ | 16 /***************************************************************************/ | 
| 17 | 17 | 
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 57 | 57 | 
| 58 | 58 | 
| 59     len = (FT_UInt)entry->stringLength / 2; | 59     len = (FT_UInt)entry->stringLength / 2; | 
| 60 | 60 | 
| 61     if ( FT_NEW_ARRAY( string, len + 1 ) ) | 61     if ( FT_NEW_ARRAY( string, len + 1 ) ) | 
| 62       return NULL; | 62       return NULL; | 
| 63 | 63 | 
| 64     for ( n = 0; n < len; n++ ) | 64     for ( n = 0; n < len; n++ ) | 
| 65     { | 65     { | 
| 66       code = FT_NEXT_USHORT( read ); | 66       code = FT_NEXT_USHORT( read ); | 
|  | 67 | 
|  | 68       if ( code == 0 ) | 
|  | 69         break; | 
|  | 70 | 
| 67       if ( code < 32 || code > 127 ) | 71       if ( code < 32 || code > 127 ) | 
| 68         code = '?'; | 72         code = '?'; | 
| 69 | 73 | 
| 70       string[n] = (char)code; | 74       string[n] = (char)code; | 
| 71     } | 75     } | 
| 72 | 76 | 
| 73     string[len] = 0; | 77     string[n] = 0; | 
| 74 | 78 | 
| 75     return string; | 79     return string; | 
| 76   } | 80   } | 
| 77 | 81 | 
| 78 | 82 | 
| 79   /* convert an Apple Roman or symbol name entry to ASCII */ | 83   /* convert an Apple Roman or symbol name entry to ASCII */ | 
| 80   static FT_String* | 84   static FT_String* | 
| 81   tt_name_entry_ascii_from_other( TT_NameEntry  entry, | 85   tt_name_entry_ascii_from_other( TT_NameEntry  entry, | 
| 82                                   FT_Memory     memory ) | 86                                   FT_Memory     memory ) | 
| 83   { | 87   { | 
| 84     FT_String*  string = NULL; | 88     FT_String*  string = NULL; | 
| 85     FT_UInt     len, code, n; | 89     FT_UInt     len, code, n; | 
| 86     FT_Byte*    read   = (FT_Byte*)entry->string; | 90     FT_Byte*    read   = (FT_Byte*)entry->string; | 
| 87     FT_Error    error; | 91     FT_Error    error; | 
| 88 | 92 | 
| 89 | 93 | 
| 90     len = (FT_UInt)entry->stringLength; | 94     len = (FT_UInt)entry->stringLength; | 
| 91 | 95 | 
| 92     if ( FT_NEW_ARRAY( string, len + 1 ) ) | 96     if ( FT_NEW_ARRAY( string, len + 1 ) ) | 
| 93       return NULL; | 97       return NULL; | 
| 94 | 98 | 
| 95     for ( n = 0; n < len; n++ ) | 99     for ( n = 0; n < len; n++ ) | 
| 96     { | 100     { | 
| 97       code = *read++; | 101       code = *read++; | 
|  | 102 | 
|  | 103       if ( code == 0 ) | 
|  | 104         break; | 
|  | 105 | 
| 98       if ( code < 32 || code > 127 ) | 106       if ( code < 32 || code > 127 ) | 
| 99         code = '?'; | 107         code = '?'; | 
| 100 | 108 | 
| 101       string[n] = (char)code; | 109       string[n] = (char)code; | 
| 102     } | 110     } | 
| 103 | 111 | 
| 104     string[len] = 0; | 112     string[n] = 0; | 
| 105 | 113 | 
| 106     return string; | 114     return string; | 
| 107   } | 115   } | 
| 108 | 116 | 
| 109 | 117 | 
| 110   typedef FT_String*  (*TT_NameEntry_ConvertFunc)( TT_NameEntry  entry, | 118   typedef FT_String*  (*TT_NameEntry_ConvertFunc)( TT_NameEntry  entry, | 
| 111                                                    FT_Memory     memory ); | 119                                                    FT_Memory     memory ); | 
| 112 | 120 | 
| 113 | 121 | 
| 114   /*************************************************************************/ | 122   /*************************************************************************/ | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
| 130   /*                                                                       */ | 138   /*                                                                       */ | 
| 131   /* <Return>                                                              */ | 139   /* <Return>                                                              */ | 
| 132   /*    FreeType error code.  0 means success.                             */ | 140   /*    FreeType error code.  0 means success.                             */ | 
| 133   /*                                                                       */ | 141   /*                                                                       */ | 
| 134   static FT_Error | 142   static FT_Error | 
| 135   tt_face_get_name( TT_Face      face, | 143   tt_face_get_name( TT_Face      face, | 
| 136                     FT_UShort    nameid, | 144                     FT_UShort    nameid, | 
| 137                     FT_String**  name ) | 145                     FT_String**  name ) | 
| 138   { | 146   { | 
| 139     FT_Memory         memory = face->root.memory; | 147     FT_Memory         memory = face->root.memory; | 
| 140     FT_Error          error  = SFNT_Err_Ok; | 148     FT_Error          error  = FT_Err_Ok; | 
| 141     FT_String*        result = NULL; | 149     FT_String*        result = NULL; | 
| 142     FT_UShort         n; | 150     FT_UShort         n; | 
| 143     TT_NameEntryRec*  rec; | 151     TT_NameEntryRec*  rec; | 
| 144     FT_Int            found_apple         = -1; | 152     FT_Int            found_apple         = -1; | 
| 145     FT_Int            found_apple_roman   = -1; | 153     FT_Int            found_apple_roman   = -1; | 
| 146     FT_Int            found_apple_english = -1; | 154     FT_Int            found_apple_english = -1; | 
| 147     FT_Int            found_win           = -1; | 155     FT_Int            found_win           = -1; | 
| 148     FT_Int            found_unicode       = -1; | 156     FT_Int            found_unicode       = -1; | 
| 149 | 157 | 
| 150     FT_Bool           is_english = 0; | 158     FT_Bool           is_english = 0; | 
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 371       return error; | 379       return error; | 
| 372 | 380 | 
| 373     if ( tag != 0x00010000UL && | 381     if ( tag != 0x00010000UL && | 
| 374          tag != TTAG_ttcf    && | 382          tag != TTAG_ttcf    && | 
| 375          tag != TTAG_OTTO    && | 383          tag != TTAG_OTTO    && | 
| 376          tag != TTAG_true    && | 384          tag != TTAG_true    && | 
| 377          tag != TTAG_typ1    && | 385          tag != TTAG_typ1    && | 
| 378          tag != 0x00020000UL ) | 386          tag != 0x00020000UL ) | 
| 379     { | 387     { | 
| 380       FT_TRACE2(( "  not a font using the SFNT container format\n" )); | 388       FT_TRACE2(( "  not a font using the SFNT container format\n" )); | 
| 381       return SFNT_Err_Unknown_File_Format; | 389       return FT_THROW( Unknown_File_Format ); | 
| 382     } | 390     } | 
| 383 | 391 | 
| 384     face->ttc_header.tag = TTAG_ttcf; | 392     face->ttc_header.tag = TTAG_ttcf; | 
| 385 | 393 | 
| 386     if ( tag == TTAG_ttcf ) | 394     if ( tag == TTAG_ttcf ) | 
| 387     { | 395     { | 
| 388       FT_Int  n; | 396       FT_Int  n; | 
| 389 | 397 | 
| 390 | 398 | 
| 391       FT_TRACE3(( "sfnt_open_font: file is a collection\n" )); | 399       FT_TRACE3(( "sfnt_open_font: file is a collection\n" )); | 
| 392 | 400 | 
| 393       if ( FT_STREAM_READ_FIELDS( ttc_header_fields, &face->ttc_header ) ) | 401       if ( FT_STREAM_READ_FIELDS( ttc_header_fields, &face->ttc_header ) ) | 
| 394         return error; | 402         return error; | 
| 395 | 403 | 
| 396       if ( face->ttc_header.count == 0 ) | 404       if ( face->ttc_header.count == 0 ) | 
| 397         return SFNT_Err_Invalid_Table; | 405         return FT_THROW( Invalid_Table ); | 
| 398 | 406 | 
| 399       /* a rough size estimate: let's conservatively assume that there   */ | 407       /* a rough size estimate: let's conservatively assume that there   */ | 
| 400       /* is just a single table info in each subfont header (12 + 16*1 = */ | 408       /* is just a single table info in each subfont header (12 + 16*1 = */ | 
| 401       /* 28 bytes), thus we have (at least) `12 + 4*count' bytes for the */ | 409       /* 28 bytes), thus we have (at least) `12 + 4*count' bytes for the */ | 
| 402       /* size of the TTC header plus `28*count' bytes for all subfont    */ | 410       /* size of the TTC header plus `28*count' bytes for all subfont    */ | 
| 403       /* headers                                                         */ | 411       /* headers                                                         */ | 
| 404       if ( (FT_ULong)face->ttc_header.count > stream->size / ( 28 + 4 ) ) | 412       if ( (FT_ULong)face->ttc_header.count > stream->size / ( 28 + 4 ) ) | 
| 405         return SFNT_Err_Array_Too_Large; | 413         return FT_THROW( Array_Too_Large ); | 
| 406 | 414 | 
| 407       /* now read the offsets of each font in the file */ | 415       /* now read the offsets of each font in the file */ | 
| 408       if ( FT_NEW_ARRAY( face->ttc_header.offsets, face->ttc_header.count ) ) | 416       if ( FT_NEW_ARRAY( face->ttc_header.offsets, face->ttc_header.count ) ) | 
| 409         return error; | 417         return error; | 
| 410 | 418 | 
| 411       if ( FT_FRAME_ENTER( face->ttc_header.count * 4L ) ) | 419       if ( FT_FRAME_ENTER( face->ttc_header.count * 4L ) ) | 
| 412         return error; | 420         return error; | 
| 413 | 421 | 
| 414       for ( n = 0; n < face->ttc_header.count; n++ ) | 422       for ( n = 0; n < face->ttc_header.count; n++ ) | 
| 415         face->ttc_header.offsets[n] = FT_GET_ULONG(); | 423         face->ttc_header.offsets[n] = FT_GET_ULONG(); | 
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 450     FT_UNUSED( params ); | 458     FT_UNUSED( params ); | 
| 451 | 459 | 
| 452 | 460 | 
| 453     sfnt = (SFNT_Service)face->sfnt; | 461     sfnt = (SFNT_Service)face->sfnt; | 
| 454     if ( !sfnt ) | 462     if ( !sfnt ) | 
| 455     { | 463     { | 
| 456       sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" ); | 464       sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" ); | 
| 457       if ( !sfnt ) | 465       if ( !sfnt ) | 
| 458       { | 466       { | 
| 459         FT_ERROR(( "sfnt_init_face: cannot access `sfnt' module\n" )); | 467         FT_ERROR(( "sfnt_init_face: cannot access `sfnt' module\n" )); | 
| 460         return SFNT_Err_Missing_Module; | 468         return FT_THROW( Missing_Module ); | 
| 461       } | 469       } | 
| 462 | 470 | 
| 463       face->sfnt       = sfnt; | 471       face->sfnt       = sfnt; | 
| 464       face->goto_table = sfnt->goto_table; | 472       face->goto_table = sfnt->goto_table; | 
| 465     } | 473     } | 
| 466 | 474 | 
| 467     FT_FACE_FIND_GLOBAL_SERVICE( face, face->psnames, POSTSCRIPT_CMAPS ); | 475     FT_FACE_FIND_GLOBAL_SERVICE( face, face->psnames, POSTSCRIPT_CMAPS ); | 
| 468 | 476 | 
| 469     FT_TRACE2(( "SFNT driver\n" )); | 477     FT_TRACE2(( "SFNT driver\n" )); | 
| 470 | 478 | 
| 471     error = sfnt_open_font( stream, face ); | 479     error = sfnt_open_font( stream, face ); | 
| 472     if ( error ) | 480     if ( error ) | 
| 473       return error; | 481       return error; | 
| 474 | 482 | 
| 475     FT_TRACE2(( "sfnt_init_face: %08p, %ld\n", face, face_index )); | 483     FT_TRACE2(( "sfnt_init_face: %08p, %ld\n", face, face_index )); | 
| 476 | 484 | 
| 477     if ( face_index < 0 ) | 485     if ( face_index < 0 ) | 
| 478       face_index = 0; | 486       face_index = 0; | 
| 479 | 487 | 
| 480     if ( face_index >= face->ttc_header.count ) | 488     if ( face_index >= face->ttc_header.count ) | 
| 481       return SFNT_Err_Invalid_Argument; | 489       return FT_THROW( Invalid_Argument ); | 
| 482 | 490 | 
| 483     if ( FT_STREAM_SEEK( face->ttc_header.offsets[face_index] ) ) | 491     if ( FT_STREAM_SEEK( face->ttc_header.offsets[face_index] ) ) | 
| 484       return error; | 492       return error; | 
| 485 | 493 | 
| 486     /* check that we have a valid TrueType file */ | 494     /* check that we have a valid TrueType file */ | 
| 487     error = sfnt->load_font_dir( face, stream ); | 495     error = sfnt->load_font_dir( face, stream ); | 
| 488     if ( error ) | 496     if ( error ) | 
| 489       return error; | 497       return error; | 
| 490 | 498 | 
| 491     face->root.num_faces  = face->ttc_header.count; | 499     face->root.num_faces  = face->ttc_header.count; | 
| 492     face->root.face_index = face_index; | 500     face->root.face_index = face_index; | 
| 493 | 501 | 
| 494     return error; | 502     return error; | 
| 495   } | 503   } | 
| 496 | 504 | 
| 497 | 505 | 
| 498 #define LOAD_( x )                                            \ | 506 #define LOAD_( x )                                          \ | 
| 499   do {                                                        \ | 507   do {                                                      \ | 
| 500     FT_TRACE2(( "`" #x "' " ));                               \ | 508     FT_TRACE2(( "`" #x "' " ));                             \ | 
| 501     FT_TRACE3(( "-->\n" ));                                   \ | 509     FT_TRACE3(( "-->\n" ));                                 \ | 
| 502                                                               \ | 510                                                             \ | 
| 503     error = sfnt->load_##x( face, stream );                   \ | 511     error = sfnt->load_ ## x( face, stream );               \ | 
| 504                                                               \ | 512                                                             \ | 
| 505     FT_TRACE2(( "%s\n", ( !error )                            \ | 513     FT_TRACE2(( "%s\n", ( !error )                          \ | 
| 506                         ? "loaded"                            \ | 514                         ? "loaded"                          \ | 
| 507                         : ( error == SFNT_Err_Table_Missing ) \ | 515                         : FT_ERR_EQ( error, Table_Missing ) \ | 
| 508                           ? "missing"                         \ | 516                           ? "missing"                       \ | 
| 509                           : "failed to load" ));              \ | 517                           : "failed to load" ));            \ | 
| 510     FT_TRACE3(( "\n" ));                                      \ | 518     FT_TRACE3(( "\n" ));                                    \ | 
| 511   } while ( 0 ) | 519   } while ( 0 ) | 
| 512 | 520 | 
| 513 #define LOADM_( x, vertical )                                 \ | 521 #define LOADM_( x, vertical )                               \ | 
| 514   do {                                                        \ | 522   do {                                                      \ | 
| 515     FT_TRACE2(( "`%s" #x "' ",                                \ | 523     FT_TRACE2(( "`%s" #x "' ",                              \ | 
| 516                 vertical ? "vertical " : "" ));               \ | 524                 vertical ? "vertical " : "" ));             \ | 
| 517     FT_TRACE3(( "-->\n" ));                                   \ | 525     FT_TRACE3(( "-->\n" ));                                 \ | 
| 518                                                               \ | 526                                                             \ | 
| 519     error = sfnt->load_##x( face, stream, vertical );         \ | 527     error = sfnt->load_ ## x( face, stream, vertical );     \ | 
| 520                                                               \ | 528                                                             \ | 
| 521     FT_TRACE2(( "%s\n", ( !error )                            \ | 529     FT_TRACE2(( "%s\n", ( !error )                          \ | 
| 522                         ? "loaded"                            \ | 530                         ? "loaded"                          \ | 
| 523                         : ( error == SFNT_Err_Table_Missing ) \ | 531                         : FT_ERR_EQ( error, Table_Missing ) \ | 
| 524                           ? "missing"                         \ | 532                           ? "missing"                       \ | 
| 525                           : "failed to load" ));              \ | 533                           : "failed to load" ));            \ | 
| 526     FT_TRACE3(( "\n" ));                                      \ | 534     FT_TRACE3(( "\n" ));                                    \ | 
| 527   } while ( 0 ) | 535   } while ( 0 ) | 
| 528 | 536 | 
| 529 #define GET_NAME( id, field )                                 \ | 537 #define GET_NAME( id, field )                                   \ | 
| 530   do {                                                        \ | 538   do {                                                          \ | 
| 531     error = tt_face_get_name( face, TT_NAME_ID_##id, field ); \ | 539     error = tt_face_get_name( face, TT_NAME_ID_ ## id, field ); \ | 
| 532     if ( error )                                              \ | 540     if ( error )                                                \ | 
| 533       goto Exit;                                              \ | 541       goto Exit;                                                \ | 
| 534   } while ( 0 ) | 542   } while ( 0 ) | 
| 535 | 543 | 
| 536 | 544 | 
| 537   FT_LOCAL_DEF( FT_Error ) | 545   FT_LOCAL_DEF( FT_Error ) | 
| 538   sfnt_load_face( FT_Stream      stream, | 546   sfnt_load_face( FT_Stream      stream, | 
| 539                   TT_Face        face, | 547                   TT_Face        face, | 
| 540                   FT_Int         face_index, | 548                   FT_Int         face_index, | 
| 541                   FT_Int         num_params, | 549                   FT_Int         num_params, | 
| 542                   FT_Parameter*  params ) | 550                   FT_Parameter*  params ) | 
| 543   { | 551   { | 
| 544     FT_Error      error; | 552     FT_Error      error; | 
| 545 #ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES | 553 #ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES | 
| 546     FT_Error      psnames_error; | 554     FT_Error      psnames_error; | 
| 547 #endif | 555 #endif | 
| 548     FT_Bool       has_outline; | 556     FT_Bool       has_outline; | 
| 549     FT_Bool       is_apple_sbit; | 557     FT_Bool       is_apple_sbit; | 
| 550     FT_Bool       ignore_preferred_family = FALSE; | 558     FT_Bool       ignore_preferred_family    = FALSE; | 
| 551     FT_Bool       ignore_preferred_subfamily = FALSE; | 559     FT_Bool       ignore_preferred_subfamily = FALSE; | 
| 552 | 560 | 
| 553     SFNT_Service  sfnt = (SFNT_Service)face->sfnt; | 561     SFNT_Service  sfnt = (SFNT_Service)face->sfnt; | 
| 554 | 562 | 
| 555     FT_UNUSED( face_index ); | 563     FT_UNUSED( face_index ); | 
| 556 | 564 | 
|  | 565 | 
| 557     /* Check parameters */ | 566     /* Check parameters */ | 
| 558 | 567 | 
| 559     { | 568     { | 
| 560       FT_Int  i; | 569       FT_Int  i; | 
| 561 | 570 | 
| 562 | 571 | 
| 563       for ( i = 0; i < num_params; i++ ) | 572       for ( i = 0; i < num_params; i++ ) | 
| 564       { | 573       { | 
| 565         if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY ) | 574         if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY ) | 
| 566           ignore_preferred_family = TRUE; | 575           ignore_preferred_family = TRUE; | 
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 612     /* sbit font file                                             */ | 621     /* sbit font file                                             */ | 
| 613     if ( !is_apple_sbit ) | 622     if ( !is_apple_sbit ) | 
| 614     { | 623     { | 
| 615       LOAD_( head ); | 624       LOAD_( head ); | 
| 616       if ( error ) | 625       if ( error ) | 
| 617         goto Exit; | 626         goto Exit; | 
| 618     } | 627     } | 
| 619 | 628 | 
| 620     if ( face->header.Units_Per_EM == 0 ) | 629     if ( face->header.Units_Per_EM == 0 ) | 
| 621     { | 630     { | 
| 622       error = SFNT_Err_Invalid_Table; | 631       error = FT_THROW( Invalid_Table ); | 
| 623 | 632 | 
| 624       goto Exit; | 633       goto Exit; | 
| 625     } | 634     } | 
| 626 | 635 | 
| 627     /* the following tables are often not present in embedded TrueType */ | 636     /* the following tables are often not present in embedded TrueType */ | 
| 628     /* fonts within PDF documents, so don't check for them.            */ | 637     /* fonts within PDF documents, so don't check for them.            */ | 
| 629     LOAD_( maxp ); | 638     LOAD_( maxp ); | 
| 630     LOAD_( cmap ); | 639     LOAD_( cmap ); | 
| 631 | 640 | 
| 632     /* the following tables are optional in PCL fonts -- */ | 641     /* the following tables are optional in PCL fonts -- */ | 
| 633     /* don't check for errors                            */ | 642     /* don't check for errors                            */ | 
| 634     LOAD_( name ); | 643     LOAD_( name ); | 
| 635     LOAD_( post ); | 644     LOAD_( post ); | 
| 636 | 645 | 
| 637 #ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES | 646 #ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES | 
| 638     psnames_error = error; | 647     psnames_error = error; | 
| 639 #endif | 648 #endif | 
| 640 | 649 | 
| 641     /* do not load the metrics headers and tables if this is an Apple */ | 650     /* do not load the metrics headers and tables if this is an Apple */ | 
| 642     /* sbit font file                                                 */ | 651     /* sbit font file                                                 */ | 
| 643     if ( !is_apple_sbit ) | 652     if ( !is_apple_sbit ) | 
| 644     { | 653     { | 
| 645       /* load the `hhea' and `hmtx' tables */ | 654       /* load the `hhea' and `hmtx' tables */ | 
| 646       LOADM_( hhea, 0 ); | 655       LOADM_( hhea, 0 ); | 
| 647       if ( !error ) | 656       if ( !error ) | 
| 648       { | 657       { | 
| 649         LOADM_( hmtx, 0 ); | 658         LOADM_( hmtx, 0 ); | 
| 650         if ( error == SFNT_Err_Table_Missing ) | 659         if ( FT_ERR_EQ( error, Table_Missing ) ) | 
| 651         { | 660         { | 
| 652           error = SFNT_Err_Hmtx_Table_Missing; | 661           error = FT_THROW( Hmtx_Table_Missing ); | 
| 653 | 662 | 
| 654 #ifdef FT_CONFIG_OPTION_INCREMENTAL | 663 #ifdef FT_CONFIG_OPTION_INCREMENTAL | 
| 655           /* If this is an incrementally loaded font and there are */ | 664           /* If this is an incrementally loaded font and there are */ | 
| 656           /* overriding metrics, tolerate a missing `hmtx' table.  */ | 665           /* overriding metrics, tolerate a missing `hmtx' table.  */ | 
| 657           if ( face->root.internal->incremental_interface          && | 666           if ( face->root.internal->incremental_interface          && | 
| 658                face->root.internal->incremental_interface->funcs-> | 667                face->root.internal->incremental_interface->funcs-> | 
| 659                  get_glyph_metrics                                 ) | 668                  get_glyph_metrics                                 ) | 
| 660           { | 669           { | 
| 661             face->horizontal.number_Of_HMetrics = 0; | 670             face->horizontal.number_Of_HMetrics = 0; | 
| 662             error = SFNT_Err_Ok; | 671             error                               = FT_Err_Ok; | 
| 663           } | 672           } | 
| 664 #endif | 673 #endif | 
| 665         } | 674         } | 
| 666       } | 675       } | 
| 667       else if ( error == SFNT_Err_Table_Missing ) | 676       else if ( FT_ERR_EQ( error, Table_Missing ) ) | 
| 668       { | 677       { | 
| 669         /* No `hhea' table necessary for SFNT Mac fonts. */ | 678         /* No `hhea' table necessary for SFNT Mac fonts. */ | 
| 670         if ( face->format_tag == TTAG_true ) | 679         if ( face->format_tag == TTAG_true ) | 
| 671         { | 680         { | 
| 672           FT_TRACE2(( "This is an SFNT Mac font.\n" )); | 681           FT_TRACE2(( "This is an SFNT Mac font.\n" )); | 
| 673 | 682 | 
| 674           has_outline = 0; | 683           has_outline = 0; | 
| 675           error       = SFNT_Err_Ok; | 684           error       = FT_Err_Ok; | 
| 676         } | 685         } | 
| 677         else | 686         else | 
| 678         { | 687         { | 
| 679           error = SFNT_Err_Horiz_Header_Missing; | 688           error = FT_THROW( Horiz_Header_Missing ); | 
| 680 | 689 | 
| 681 #ifdef FT_CONFIG_OPTION_INCREMENTAL | 690 #ifdef FT_CONFIG_OPTION_INCREMENTAL | 
| 682           /* If this is an incrementally loaded font and there are */ | 691           /* If this is an incrementally loaded font and there are */ | 
| 683           /* overriding metrics, tolerate a missing `hhea' table.  */ | 692           /* overriding metrics, tolerate a missing `hhea' table.  */ | 
| 684           if ( face->root.internal->incremental_interface          && | 693           if ( face->root.internal->incremental_interface          && | 
| 685                face->root.internal->incremental_interface->funcs-> | 694                face->root.internal->incremental_interface->funcs-> | 
| 686                  get_glyph_metrics                                 ) | 695                  get_glyph_metrics                                 ) | 
| 687           { | 696           { | 
| 688             face->horizontal.number_Of_HMetrics = 0; | 697             face->horizontal.number_Of_HMetrics = 0; | 
| 689             error = SFNT_Err_Ok; | 698             error                               = FT_Err_Ok; | 
| 690           } | 699           } | 
| 691 #endif | 700 #endif | 
| 692 | 701 | 
| 693         } | 702         } | 
| 694       } | 703       } | 
| 695 | 704 | 
| 696       if ( error ) | 705       if ( error ) | 
| 697         goto Exit; | 706         goto Exit; | 
| 698 | 707 | 
| 699       /* try to load the `vhea' and `vmtx' tables */ | 708       /* try to load the `vhea' and `vmtx' tables */ | 
| 700       LOADM_( hhea, 1 ); | 709       LOADM_( hhea, 1 ); | 
| 701       if ( !error ) | 710       if ( !error ) | 
| 702       { | 711       { | 
| 703         LOADM_( hmtx, 1 ); | 712         LOADM_( hmtx, 1 ); | 
| 704         if ( !error ) | 713         if ( !error ) | 
| 705           face->vertical_info = 1; | 714           face->vertical_info = 1; | 
| 706       } | 715       } | 
| 707 | 716 | 
| 708       if ( error && error != SFNT_Err_Table_Missing ) | 717       if ( error && FT_ERR_NEQ( error, Table_Missing ) ) | 
| 709         goto Exit; | 718         goto Exit; | 
| 710 | 719 | 
| 711       LOAD_( os2 ); | 720       LOAD_( os2 ); | 
| 712       if ( error ) | 721       if ( error ) | 
| 713       { | 722       { | 
| 714         /* we treat the table as missing if there are any errors */ | 723         /* we treat the table as missing if there are any errors */ | 
| 715         face->os2.version = 0xFFFFU; | 724         face->os2.version = 0xFFFFU; | 
| 716       } | 725       } | 
| 717     } | 726     } | 
| 718 | 727 | 
| 719     /* the optional tables */ | 728     /* the optional tables */ | 
| 720 | 729 | 
| 721     /* embedded bitmap support */ | 730     /* embedded bitmap support */ | 
| 722     if ( sfnt->load_eblc ) | 731     if ( sfnt->load_eblc ) | 
| 723     { | 732     { | 
| 724       LOAD_( eblc ); | 733       LOAD_( eblc ); | 
| 725       if ( error ) | 734       if ( error ) | 
| 726       { | 735       { | 
| 727         /* a font which contains neither bitmaps nor outlines is */ | 736         /* a font which contains neither bitmaps nor outlines is */ | 
| 728         /* still valid (although rather useless in most cases);  */ | 737         /* still valid (although rather useless in most cases);  */ | 
| 729         /* however, you can find such stripped fonts in PDFs     */ | 738         /* however, you can find such stripped fonts in PDFs     */ | 
| 730         if ( error == SFNT_Err_Table_Missing ) | 739         if ( FT_ERR_EQ( error, Table_Missing ) ) | 
| 731           error = SFNT_Err_Ok; | 740           error = FT_Err_Ok; | 
| 732         else | 741         else | 
| 733           goto Exit; | 742           goto Exit; | 
| 734       } | 743       } | 
| 735     } | 744     } | 
| 736 | 745 | 
| 737     LOAD_( pclt ); | 746     LOAD_( pclt ); | 
| 738     if ( error ) | 747     if ( error ) | 
| 739     { | 748     { | 
| 740       if ( error != SFNT_Err_Table_Missing ) | 749       if ( FT_ERR_NEQ( error, Table_Missing ) ) | 
| 741         goto Exit; | 750         goto Exit; | 
| 742 | 751 | 
| 743       face->pclt.Version = 0; | 752       face->pclt.Version = 0; | 
| 744     } | 753     } | 
| 745 | 754 | 
| 746     /* consider the kerning and gasp tables as optional */ | 755     /* consider the kerning and gasp tables as optional */ | 
| 747     LOAD_( gasp ); | 756     LOAD_( gasp ); | 
| 748     LOAD_( kern ); | 757     LOAD_( kern ); | 
| 749 | 758 | 
| 750     face->root.num_glyphs = face->max_profile.numGlyphs; | 759     face->root.num_glyphs = face->max_profile.numGlyphs; | 
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 796       /*                                                                   */ | 805       /*                                                                   */ | 
| 797       if ( has_outline == TRUE ) | 806       if ( has_outline == TRUE ) | 
| 798         flags |= FT_FACE_FLAG_SCALABLE;   /* scalable outlines */ | 807         flags |= FT_FACE_FLAG_SCALABLE;   /* scalable outlines */ | 
| 799 | 808 | 
| 800       /* The sfnt driver only supports bitmap fonts natively, thus we */ | 809       /* The sfnt driver only supports bitmap fonts natively, thus we */ | 
| 801       /* don't set FT_FACE_FLAG_HINTER.                               */ | 810       /* don't set FT_FACE_FLAG_HINTER.                               */ | 
| 802       flags |= FT_FACE_FLAG_SFNT       |  /* SFNT file format  */ | 811       flags |= FT_FACE_FLAG_SFNT       |  /* SFNT file format  */ | 
| 803                FT_FACE_FLAG_HORIZONTAL;   /* horizontal data   */ | 812                FT_FACE_FLAG_HORIZONTAL;   /* horizontal data   */ | 
| 804 | 813 | 
| 805 #ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES | 814 #ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES | 
| 806       if ( psnames_error == SFNT_Err_Ok               && | 815       if ( !psnames_error                             && | 
| 807            face->postscript.FormatType != 0x00030000L ) | 816            face->postscript.FormatType != 0x00030000L ) | 
| 808         flags |= FT_FACE_FLAG_GLYPH_NAMES; | 817         flags |= FT_FACE_FLAG_GLYPH_NAMES; | 
| 809 #endif | 818 #endif | 
| 810 | 819 | 
| 811       /* fixed width font? */ | 820       /* fixed width font? */ | 
| 812       if ( face->postscript.isFixedPitch ) | 821       if ( face->postscript.isFixedPitch ) | 
| 813         flags |= FT_FACE_FLAG_FIXED_WIDTH; | 822         flags |= FT_FACE_FLAG_FIXED_WIDTH; | 
| 814 | 823 | 
| 815       /* vertical information? */ | 824       /* vertical information? */ | 
| 816       if ( face->vertical_info ) | 825       if ( face->vertical_info ) | 
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 903 | 912 | 
| 904       /* | 913       /* | 
| 905        *  Now allocate the root array of FT_Bitmap_Size records and | 914        *  Now allocate the root array of FT_Bitmap_Size records and | 
| 906        *  populate them.  Unfortunately, it isn't possible to indicate bit | 915        *  populate them.  Unfortunately, it isn't possible to indicate bit | 
| 907        *  depths in the FT_Bitmap_Size record.  This is a design error. | 916        *  depths in the FT_Bitmap_Size record.  This is a design error. | 
| 908        */ | 917        */ | 
| 909       { | 918       { | 
| 910         FT_UInt  i, count; | 919         FT_UInt  i, count; | 
| 911 | 920 | 
| 912 | 921 | 
| 913 #ifndef FT_CONFIG_OPTION_OLD_INTERNALS |  | 
| 914         count = face->sbit_num_strikes; | 922         count = face->sbit_num_strikes; | 
| 915 #else |  | 
| 916         count = (FT_UInt)face->num_sbit_strikes; |  | 
| 917 #endif |  | 
| 918 | 923 | 
| 919         if ( count > 0 ) | 924         if ( count > 0 ) | 
| 920         { | 925         { | 
| 921           FT_Memory        memory   = face->root.stream->memory; | 926           FT_Memory        memory   = face->root.stream->memory; | 
| 922           FT_UShort        em_size  = face->header.Units_Per_EM; | 927           FT_UShort        em_size  = face->header.Units_Per_EM; | 
| 923           FT_Short         avgwidth = face->os2.xAvgCharWidth; | 928           FT_Short         avgwidth = face->os2.xAvgCharWidth; | 
| 924           FT_Size_Metrics  metrics; | 929           FT_Size_Metrics  metrics; | 
| 925 | 930 | 
| 926 | 931 | 
| 927           if ( em_size == 0 || face->os2.version == 0xFFFFU ) | 932           if ( em_size == 0 || face->os2.version == 0xFFFFU ) | 
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1108     { | 1113     { | 
| 1109       FT_Stream  stream = FT_FACE_STREAM( face ); | 1114       FT_Stream  stream = FT_FACE_STREAM( face ); | 
| 1110 | 1115 | 
| 1111 | 1116 | 
| 1112       /* simply release the 'cmap' table frame */ | 1117       /* simply release the 'cmap' table frame */ | 
| 1113       FT_FRAME_RELEASE( face->cmap_table ); | 1118       FT_FRAME_RELEASE( face->cmap_table ); | 
| 1114       face->cmap_size = 0; | 1119       face->cmap_size = 0; | 
| 1115     } | 1120     } | 
| 1116 | 1121 | 
| 1117     /* freeing the horizontal metrics */ | 1122     /* freeing the horizontal metrics */ | 
| 1118 #ifndef FT_CONFIG_OPTION_OLD_INTERNALS |  | 
| 1119     { | 1123     { | 
| 1120       FT_Stream  stream = FT_FACE_STREAM( face ); | 1124       FT_Stream  stream = FT_FACE_STREAM( face ); | 
| 1121 | 1125 | 
| 1122 | 1126 | 
| 1123       FT_FRAME_RELEASE( face->horz_metrics ); | 1127       FT_FRAME_RELEASE( face->horz_metrics ); | 
| 1124       FT_FRAME_RELEASE( face->vert_metrics ); | 1128       FT_FRAME_RELEASE( face->vert_metrics ); | 
| 1125       face->horz_metrics_size = 0; | 1129       face->horz_metrics_size = 0; | 
| 1126       face->vert_metrics_size = 0; | 1130       face->vert_metrics_size = 0; | 
| 1127     } | 1131     } | 
| 1128 #else |  | 
| 1129     FT_FREE( face->horizontal.long_metrics ); |  | 
| 1130     FT_FREE( face->horizontal.short_metrics ); |  | 
| 1131 #endif |  | 
| 1132 | 1132 | 
| 1133     /* freeing the vertical ones, if any */ | 1133     /* freeing the vertical ones, if any */ | 
| 1134     if ( face->vertical_info ) | 1134     if ( face->vertical_info ) | 
| 1135     { | 1135     { | 
| 1136       FT_FREE( face->vertical.long_metrics  ); | 1136       FT_FREE( face->vertical.long_metrics  ); | 
| 1137       FT_FREE( face->vertical.short_metrics ); | 1137       FT_FREE( face->vertical.short_metrics ); | 
| 1138       face->vertical_info = 0; | 1138       face->vertical_info = 0; | 
| 1139     } | 1139     } | 
| 1140 | 1140 | 
| 1141     /* freeing the gasp table */ | 1141     /* freeing the gasp table */ | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 1154     FT_FREE( face->root.available_sizes ); | 1154     FT_FREE( face->root.available_sizes ); | 
| 1155     face->root.num_fixed_sizes = 0; | 1155     face->root.num_fixed_sizes = 0; | 
| 1156 | 1156 | 
| 1157     FT_FREE( face->postscript_name ); | 1157     FT_FREE( face->postscript_name ); | 
| 1158 | 1158 | 
| 1159     face->sfnt = 0; | 1159     face->sfnt = 0; | 
| 1160   } | 1160   } | 
| 1161 | 1161 | 
| 1162 | 1162 | 
| 1163 /* END */ | 1163 /* END */ | 
| OLD | NEW | 
|---|