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 (C) 1996-2020 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 <freetype/internal/ftdebug.h> 23 24 #include <freetype/ftsnames.h> 25 #include <freetype/internal/tttypes.h> 26 #include <freetype/internal/ftstream.h> 27 28 29 #ifdef TT_CONFIG_OPTION_SFNT_NAMES 30 31 32 /* documentation is in ftsnames.h */ 33 34 FT_EXPORT_DEF( FT_UInt ) FT_Get_Sfnt_Name_Count(FT_Face face)35 FT_Get_Sfnt_Name_Count( FT_Face face ) 36 { 37 return ( face && FT_IS_SFNT( face ) ) ? ((TT_Face)face)->num_names : 0; 38 } 39 40 41 /* documentation is in ftsnames.h */ 42 43 FT_EXPORT_DEF( FT_Error ) FT_Get_Sfnt_Name(FT_Face face,FT_UInt idx,FT_SfntName * aname)44 FT_Get_Sfnt_Name( FT_Face face, 45 FT_UInt idx, 46 FT_SfntName *aname ) 47 { 48 FT_Error error = FT_ERR( Invalid_Argument ); 49 50 51 if ( aname && face && FT_IS_SFNT( face ) ) 52 { 53 TT_Face ttface = (TT_Face)face; 54 55 56 if ( idx < (FT_UInt)ttface->num_names ) 57 { 58 TT_Name entry = ttface->name_table.names + idx; 59 60 61 /* load name on demand */ 62 if ( entry->stringLength > 0 && !entry->string ) 63 { 64 FT_Memory memory = face->memory; 65 FT_Stream stream = face->stream; 66 67 68 if ( FT_NEW_ARRAY ( entry->string, entry->stringLength ) || 69 FT_STREAM_SEEK( entry->stringOffset ) || 70 FT_STREAM_READ( entry->string, entry->stringLength ) ) 71 { 72 FT_FREE( entry->string ); 73 entry->stringLength = 0; 74 } 75 } 76 77 aname->platform_id = entry->platformID; 78 aname->encoding_id = entry->encodingID; 79 aname->language_id = entry->languageID; 80 aname->name_id = entry->nameID; 81 aname->string = (FT_Byte*)entry->string; 82 aname->string_len = entry->stringLength; 83 84 error = FT_Err_Ok; 85 } 86 } 87 88 return error; 89 } 90 91 92 /* documentation is in ftsnames.h */ 93 94 FT_EXPORT_DEF( FT_Error ) FT_Get_Sfnt_LangTag(FT_Face face,FT_UInt langID,FT_SfntLangTag * alangTag)95 FT_Get_Sfnt_LangTag( FT_Face face, 96 FT_UInt langID, 97 FT_SfntLangTag *alangTag ) 98 { 99 FT_Error error = FT_ERR( Invalid_Argument ); 100 101 102 if ( alangTag && face && FT_IS_SFNT( face ) ) 103 { 104 TT_Face ttface = (TT_Face)face; 105 106 107 if ( ttface->name_table.format != 1 ) 108 return FT_THROW( Invalid_Table ); 109 110 if ( langID > 0x8000U && 111 langID - 0x8000U < ttface->name_table.numLangTagRecords ) 112 { 113 TT_LangTag entry = ttface->name_table.langTags + 114 ( langID - 0x8000U ); 115 116 117 /* load name on demand */ 118 if ( entry->stringLength > 0 && !entry->string ) 119 { 120 FT_Memory memory = face->memory; 121 FT_Stream stream = face->stream; 122 123 124 if ( FT_NEW_ARRAY ( entry->string, entry->stringLength ) || 125 FT_STREAM_SEEK( entry->stringOffset ) || 126 FT_STREAM_READ( entry->string, entry->stringLength ) ) 127 { 128 FT_FREE( entry->string ); 129 entry->stringLength = 0; 130 } 131 } 132 133 alangTag->string = (FT_Byte*)entry->string; 134 alangTag->string_len = entry->stringLength; 135 136 error = FT_Err_Ok; 137 } 138 } 139 140 return error; 141 } 142 143 144 #else /* !TT_CONFIG_OPTION_SFNT_NAMES */ 145 146 147 FT_EXPORT_DEF( FT_UInt ) FT_Get_Sfnt_Name_Count(FT_Face face)148 FT_Get_Sfnt_Name_Count( FT_Face face ) 149 { 150 FT_UNUSED( face ); 151 152 return 0; 153 } 154 155 156 FT_EXPORT_DEF( FT_Error ) FT_Get_Sfnt_Name(FT_Face face,FT_UInt idx,FT_SfntName * aname)157 FT_Get_Sfnt_Name( FT_Face face, 158 FT_UInt idx, 159 FT_SfntName *aname ) 160 { 161 FT_UNUSED( face ); 162 FT_UNUSED( idx ); 163 FT_UNUSED( aname ); 164 165 return FT_THROW( Unimplemented_Feature ); 166 } 167 168 169 FT_EXPORT_DEF( FT_Error ) FT_Get_Sfnt_LangTag(FT_Face face,FT_UInt langID,FT_SfntLangTag * alangTag)170 FT_Get_Sfnt_LangTag( FT_Face face, 171 FT_UInt langID, 172 FT_SfntLangTag *alangTag ) 173 { 174 FT_UNUSED( face ); 175 FT_UNUSED( langID ); 176 FT_UNUSED( alangTag ); 177 178 return FT_THROW( Unimplemented_Feature ); 179 } 180 181 182 #endif /* !TT_CONFIG_OPTION_SFNT_NAMES */ 183 184 185 /* END */ 186