1 /***************************************************************************/ 2 /* */ 3 /* ftsnames.c */ 4 /* */ 5 /* Simple interface to access SFNT name tables (which are used */ 6 /* to hold font names, copyright info, notices, etc.) (body). */ 7 /* */ 8 /* This is _not_ used to retrieve glyph names! */ 9 /* */ 10 /* Copyright 1996-2017 by */ 11 /* David Turner, Robert Wilhelm, and Werner Lemberg. */ 12 /* */ 13 /* This file is part of the FreeType project, and may only be used, */ 14 /* modified, and distributed under the terms of the FreeType project */ 15 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 16 /* this file you indicate that you have read the license and */ 17 /* understand and accept it fully. */ 18 /* */ 19 /***************************************************************************/ 20 21 22 #include <ft2build.h> 23 #include FT_SFNT_NAMES_H 24 #include FT_INTERNAL_TRUETYPE_TYPES_H 25 #include FT_INTERNAL_STREAM_H 26 27 28 #ifdef TT_CONFIG_OPTION_SFNT_NAMES 29 30 31 /* documentation is in ftsnames.h */ 32 33 FT_EXPORT_DEF( FT_UInt ) FT_Get_Sfnt_Name_Count(FT_Face face)34 FT_Get_Sfnt_Name_Count( FT_Face face ) 35 { 36 return ( face && FT_IS_SFNT( face ) ) ? ((TT_Face)face)->num_names : 0; 37 } 38 39 40 /* documentation is in ftsnames.h */ 41 42 FT_EXPORT_DEF( FT_Error ) FT_Get_Sfnt_Name(FT_Face face,FT_UInt idx,FT_SfntName * aname)43 FT_Get_Sfnt_Name( FT_Face face, 44 FT_UInt idx, 45 FT_SfntName *aname ) 46 { 47 FT_Error error = FT_ERR( Invalid_Argument ); 48 49 50 if ( aname && face && FT_IS_SFNT( face ) ) 51 { 52 TT_Face ttface = (TT_Face)face; 53 54 55 if ( idx < (FT_UInt)ttface->num_names ) 56 { 57 TT_Name entry = ttface->name_table.names + idx; 58 59 60 /* load name on demand */ 61 if ( entry->stringLength > 0 && !entry->string ) 62 { 63 FT_Memory memory = face->memory; 64 FT_Stream stream = face->stream; 65 66 67 if ( FT_NEW_ARRAY ( entry->string, entry->stringLength ) || 68 FT_STREAM_SEEK( entry->stringOffset ) || 69 FT_STREAM_READ( entry->string, entry->stringLength ) ) 70 { 71 FT_FREE( entry->string ); 72 entry->stringLength = 0; 73 } 74 } 75 76 aname->platform_id = entry->platformID; 77 aname->encoding_id = entry->encodingID; 78 aname->language_id = entry->languageID; 79 aname->name_id = entry->nameID; 80 aname->string = (FT_Byte*)entry->string; 81 aname->string_len = entry->stringLength; 82 83 error = FT_Err_Ok; 84 } 85 } 86 87 return error; 88 } 89 90 91 /* documentation is in ftsnames.h */ 92 93 FT_EXPORT_DEF( FT_Error ) FT_Get_Sfnt_LangTag(FT_Face face,FT_UInt langID,FT_SfntLangTag * alangTag)94 FT_Get_Sfnt_LangTag( FT_Face face, 95 FT_UInt langID, 96 FT_SfntLangTag *alangTag ) 97 { 98 FT_Error error = FT_ERR( Invalid_Argument ); 99 100 101 if ( alangTag && face && FT_IS_SFNT( face ) ) 102 { 103 TT_Face ttface = (TT_Face)face; 104 105 106 if ( ttface->name_table.format != 1 ) 107 return FT_THROW( Invalid_Table ); 108 109 if ( langID > 0x8000U && 110 langID - 0x8000U < ttface->name_table.numLangTagRecords ) 111 { 112 TT_LangTag entry = ttface->name_table.langTags + 113 ( langID - 0x8000U ); 114 115 116 /* load name on demand */ 117 if ( entry->stringLength > 0 && !entry->string ) 118 { 119 FT_Memory memory = face->memory; 120 FT_Stream stream = face->stream; 121 122 123 if ( FT_NEW_ARRAY ( entry->string, entry->stringLength ) || 124 FT_STREAM_SEEK( entry->stringOffset ) || 125 FT_STREAM_READ( entry->string, entry->stringLength ) ) 126 { 127 FT_FREE( entry->string ); 128 entry->stringLength = 0; 129 } 130 } 131 132 alangTag->string = (FT_Byte*)entry->string; 133 alangTag->string_len = entry->stringLength; 134 135 error = FT_Err_Ok; 136 } 137 } 138 139 return error; 140 } 141 142 143 #endif /* TT_CONFIG_OPTION_SFNT_NAMES */ 144 145 146 /* END */ 147