1d060a75b0d100780118cb2f0adc1bd0c6c016f17Werner Lemberg/***************************************************************************/ 2d060a75b0d100780118cb2f0adc1bd0c6c016f17Werner Lemberg/* */ 3314f35ad2e8931f9061566fa224f6fbec8dfdb41Werner Lemberg/* ftsnames.c */ 4d060a75b0d100780118cb2f0adc1bd0c6c016f17Werner Lemberg/* */ 5d060a75b0d100780118cb2f0adc1bd0c6c016f17Werner Lemberg/* Simple interface to access SFNT name tables (which are used */ 647a5f41de65b358ccbdada33a7c2fec4790aa3f9Werner Lemberg/* to hold font names, copyright info, notices, etc.) (body). */ 7d060a75b0d100780118cb2f0adc1bd0c6c016f17Werner Lemberg/* */ 8d060a75b0d100780118cb2f0adc1bd0c6c016f17Werner Lemberg/* This is _not_ used to retrieve glyph names! */ 9d060a75b0d100780118cb2f0adc1bd0c6c016f17Werner Lemberg/* */ 100a0c22569deab933df21127e75db5c81f724f292Werner Lemberg/* Copyright 1996-2018 by */ 11d060a75b0d100780118cb2f0adc1bd0c6c016f17Werner Lemberg/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 12d060a75b0d100780118cb2f0adc1bd0c6c016f17Werner Lemberg/* */ 13d060a75b0d100780118cb2f0adc1bd0c6c016f17Werner Lemberg/* This file is part of the FreeType project, and may only be used, */ 14d060a75b0d100780118cb2f0adc1bd0c6c016f17Werner Lemberg/* modified, and distributed under the terms of the FreeType project */ 15d060a75b0d100780118cb2f0adc1bd0c6c016f17Werner Lemberg/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 16d060a75b0d100780118cb2f0adc1bd0c6c016f17Werner Lemberg/* this file you indicate that you have read the license and */ 17d060a75b0d100780118cb2f0adc1bd0c6c016f17Werner Lemberg/* understand and accept it fully. */ 18d060a75b0d100780118cb2f0adc1bd0c6c016f17Werner Lemberg/* */ 19d060a75b0d100780118cb2f0adc1bd0c6c016f17Werner Lemberg/***************************************************************************/ 20d060a75b0d100780118cb2f0adc1bd0c6c016f17Werner Lemberg 21cc069beb2d2b6b1cb9f9b9f2af2a7ea12780f634Werner Lemberg 22cc069beb2d2b6b1cb9f9b9f2af2a7ea12780f634Werner Lemberg#include <ft2build.h> 23bffb7fe90b1a3403ee253c30974beaa8ee436567Werner Lemberg#include FT_INTERNAL_DEBUG_H 24bffb7fe90b1a3403ee253c30974beaa8ee436567Werner Lemberg 256ce03efb12909f239fe139e7ec609fa7e9654dbdDavid Turner#include FT_SFNT_NAMES_H 26cc069beb2d2b6b1cb9f9b9f2af2a7ea12780f634Werner Lemberg#include FT_INTERNAL_TRUETYPE_TYPES_H 278c90c22dbe0b89970f0fb878117c3c2a5e2e214cWerner Lemberg#include FT_INTERNAL_STREAM_H 286930b45f78abc193e84544f804cead9436b86ad5David Turner 296930b45f78abc193e84544f804cead9436b86ad5David Turner 30dc268f24bada48cf13a5c29174c71791083d1102Werner Lemberg#ifdef TT_CONFIG_OPTION_SFNT_NAMES 316930b45f78abc193e84544f804cead9436b86ad5David Turner 326930b45f78abc193e84544f804cead9436b86ad5David Turner 33314f35ad2e8931f9061566fa224f6fbec8dfdb41Werner Lemberg /* documentation is in ftsnames.h */ 3490a03301421ee470aea404955c4069ebac324173Werner Lemberg 35f814d0fafe344f1454b52e2d455c14b5fcea5b67Werner Lemberg FT_EXPORT_DEF( FT_UInt ) 36f814d0fafe344f1454b52e2d455c14b5fcea5b67Werner Lemberg FT_Get_Sfnt_Name_Count( FT_Face face ) 376930b45f78abc193e84544f804cead9436b86ad5David Turner { 38d9ba68d6b8a4295428c397236d29f10f8fe46079Werner Lemberg return ( face && FT_IS_SFNT( face ) ) ? ((TT_Face)face)->num_names : 0; 396930b45f78abc193e84544f804cead9436b86ad5David Turner } 40e4b32a5dc5517285dbecf9e058185a9d36712fbeWerner Lemberg 41e4b32a5dc5517285dbecf9e058185a9d36712fbeWerner Lemberg 42314f35ad2e8931f9061566fa224f6fbec8dfdb41Werner Lemberg /* documentation is in ftsnames.h */ 4390a03301421ee470aea404955c4069ebac324173Werner Lemberg 44f814d0fafe344f1454b52e2d455c14b5fcea5b67Werner Lemberg FT_EXPORT_DEF( FT_Error ) 45f814d0fafe344f1454b52e2d455c14b5fcea5b67Werner Lemberg FT_Get_Sfnt_Name( FT_Face face, 460d9165e1d6451063693eda6d7dce367051a39eadWerner Lemberg FT_UInt idx, 47f814d0fafe344f1454b52e2d455c14b5fcea5b67Werner Lemberg FT_SfntName *aname ) 486930b45f78abc193e84544f804cead9436b86ad5David Turner { 4989f5064765bdedd1f3449d3f8d7b96bfe86aa23dWerner Lemberg FT_Error error = FT_ERR( Invalid_Argument ); 50e4b32a5dc5517285dbecf9e058185a9d36712fbeWerner Lemberg 51d060a75b0d100780118cb2f0adc1bd0c6c016f17Werner Lemberg 52d060a75b0d100780118cb2f0adc1bd0c6c016f17Werner Lemberg if ( aname && face && FT_IS_SFNT( face ) ) 536930b45f78abc193e84544f804cead9436b86ad5David Turner { 546930b45f78abc193e84544f804cead9436b86ad5David Turner TT_Face ttface = (TT_Face)face; 55e4b32a5dc5517285dbecf9e058185a9d36712fbeWerner Lemberg 56d060a75b0d100780118cb2f0adc1bd0c6c016f17Werner Lemberg 570d9165e1d6451063693eda6d7dce367051a39eadWerner Lemberg if ( idx < (FT_UInt)ttface->num_names ) 586930b45f78abc193e84544f804cead9436b86ad5David Turner { 59f4e569664332b30eca48643ed5194d0da91b0560Werner Lemberg TT_Name entry = ttface->name_table.names + idx; 60791d83a612ac9bbdd185dd3ad8ec7034e40a3959David Turner 61791d83a612ac9bbdd185dd3ad8ec7034e40a3959David Turner 62791d83a612ac9bbdd185dd3ad8ec7034e40a3959David Turner /* load name on demand */ 634441f7b24675fbd7d91f794f5d54e6c1ff168439Werner Lemberg if ( entry->stringLength > 0 && !entry->string ) 64791d83a612ac9bbdd185dd3ad8ec7034e40a3959David Turner { 65791d83a612ac9bbdd185dd3ad8ec7034e40a3959David Turner FT_Memory memory = face->memory; 66877ff67887184a1f8edbccafc39c2ee3a5d88aa3Werner Lemberg FT_Stream stream = face->stream; 67791d83a612ac9bbdd185dd3ad8ec7034e40a3959David Turner 68791d83a612ac9bbdd185dd3ad8ec7034e40a3959David Turner 69877ff67887184a1f8edbccafc39c2ee3a5d88aa3Werner Lemberg if ( FT_NEW_ARRAY ( entry->string, entry->stringLength ) || 70877ff67887184a1f8edbccafc39c2ee3a5d88aa3Werner Lemberg FT_STREAM_SEEK( entry->stringOffset ) || 71877ff67887184a1f8edbccafc39c2ee3a5d88aa3Werner Lemberg FT_STREAM_READ( entry->string, entry->stringLength ) ) 72791d83a612ac9bbdd185dd3ad8ec7034e40a3959David Turner { 73791d83a612ac9bbdd185dd3ad8ec7034e40a3959David Turner FT_FREE( entry->string ); 74791d83a612ac9bbdd185dd3ad8ec7034e40a3959David Turner entry->stringLength = 0; 75791d83a612ac9bbdd185dd3ad8ec7034e40a3959David Turner } 76791d83a612ac9bbdd185dd3ad8ec7034e40a3959David Turner } 77791d83a612ac9bbdd185dd3ad8ec7034e40a3959David Turner 78791d83a612ac9bbdd185dd3ad8ec7034e40a3959David Turner aname->platform_id = entry->platformID; 79791d83a612ac9bbdd185dd3ad8ec7034e40a3959David Turner aname->encoding_id = entry->encodingID; 80791d83a612ac9bbdd185dd3ad8ec7034e40a3959David Turner aname->language_id = entry->languageID; 81791d83a612ac9bbdd185dd3ad8ec7034e40a3959David Turner aname->name_id = entry->nameID; 82791d83a612ac9bbdd185dd3ad8ec7034e40a3959David Turner aname->string = (FT_Byte*)entry->string; 83791d83a612ac9bbdd185dd3ad8ec7034e40a3959David Turner aname->string_len = entry->stringLength; 84e4b32a5dc5517285dbecf9e058185a9d36712fbeWerner Lemberg 856930b45f78abc193e84544f804cead9436b86ad5David Turner error = FT_Err_Ok; 866930b45f78abc193e84544f804cead9436b86ad5David Turner } 876930b45f78abc193e84544f804cead9436b86ad5David Turner } 88e4b32a5dc5517285dbecf9e058185a9d36712fbeWerner Lemberg 896930b45f78abc193e84544f804cead9436b86ad5David Turner return error; 90e4b32a5dc5517285dbecf9e058185a9d36712fbeWerner Lemberg } 91d060a75b0d100780118cb2f0adc1bd0c6c016f17Werner Lemberg 92d060a75b0d100780118cb2f0adc1bd0c6c016f17Werner Lemberg 93f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg /* documentation is in ftsnames.h */ 94f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg 95f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg FT_EXPORT_DEF( FT_Error ) 96f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg FT_Get_Sfnt_LangTag( FT_Face face, 97f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg FT_UInt langID, 98f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg FT_SfntLangTag *alangTag ) 99f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg { 100f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg FT_Error error = FT_ERR( Invalid_Argument ); 101f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg 102f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg 103f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg if ( alangTag && face && FT_IS_SFNT( face ) ) 104f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg { 105f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg TT_Face ttface = (TT_Face)face; 106f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg 107f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg 108f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg if ( ttface->name_table.format != 1 ) 109f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg return FT_THROW( Invalid_Table ); 110f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg 111f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg if ( langID > 0x8000U && 112f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg langID - 0x8000U < ttface->name_table.numLangTagRecords ) 113f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg { 114f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg TT_LangTag entry = ttface->name_table.langTags + 115f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg ( langID - 0x8000U ); 116f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg 117f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg 118f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg /* load name on demand */ 119f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg if ( entry->stringLength > 0 && !entry->string ) 120f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg { 121f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg FT_Memory memory = face->memory; 122f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg FT_Stream stream = face->stream; 123f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg 124f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg 125f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg if ( FT_NEW_ARRAY ( entry->string, entry->stringLength ) || 126f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg FT_STREAM_SEEK( entry->stringOffset ) || 127f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg FT_STREAM_READ( entry->string, entry->stringLength ) ) 128f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg { 129f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg FT_FREE( entry->string ); 130f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg entry->stringLength = 0; 131f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg } 132f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg } 133f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg 134f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg alangTag->string = (FT_Byte*)entry->string; 135f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg alangTag->string_len = entry->stringLength; 136f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg 137f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg error = FT_Err_Ok; 138f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg } 139f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg } 140f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg 141f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg return error; 142f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg } 143f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg 144f4253366f1d90e6b28b4b3e34ed74e24aa7c2c31Werner Lemberg 145dc268f24bada48cf13a5c29174c71791083d1102Werner Lemberg#endif /* TT_CONFIG_OPTION_SFNT_NAMES */ 146d060a75b0d100780118cb2f0adc1bd0c6c016f17Werner Lemberg 147d060a75b0d100780118cb2f0adc1bd0c6c016f17Werner Lemberg 148d060a75b0d100780118cb2f0adc1bd0c6c016f17Werner Lemberg/* END */ 149