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