1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  ftsnames.c                                                             */
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*    Simple interface to access SFNT name tables (which are used          */
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*    to hold font names, copyright info, notices, etc.) (body).           */
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*    This is _not_ used to retrieve glyph names!                          */
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  Copyright 1996-2001, 2002, 2009 by                                     */
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  This file is part of the FreeType project, and may only be used,       */
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  modified, and distributed under the terms of the FreeType project      */
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  this file you indicate that you have read the license and              */
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  understand and accept it fully.                                        */
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/ft2build.h"
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/ftsnames.h"
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/tttypes.h"
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/ftstream.h"
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_SFNT_NAMES
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* documentation is in ftsnames.h */
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_EXPORT_DEF( FT_UInt )
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_Get_Sfnt_Name_Count( FT_Face  face )
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return ( face && FT_IS_SFNT( face ) ) ? ((TT_Face)face)->num_names : 0;
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* documentation is in ftsnames.h */
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_EXPORT_DEF( FT_Error )
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_Get_Sfnt_Name( FT_Face       face,
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    FT_UInt       idx,
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    FT_SfntName  *aname )
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Error  error = FT_ERR( Invalid_Argument );
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( aname && face && FT_IS_SFNT( face ) )
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      TT_Face  ttface = (TT_Face)face;
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( idx < (FT_UInt)ttface->num_names )
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        TT_NameEntryRec*  entry = ttface->name_table.names + idx;
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /* load name on demand */
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ( entry->stringLength > 0 && entry->string == NULL )
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        {
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          FT_Memory  memory = face->memory;
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          FT_Stream  stream = face->stream;
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          if ( FT_NEW_ARRAY  ( entry->string, entry->stringLength ) ||
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov               FT_STREAM_SEEK( entry->stringOffset )                ||
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov               FT_STREAM_READ( entry->string, entry->stringLength ) )
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          {
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            FT_FREE( entry->string );
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            entry->stringLength = 0;
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          }
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        aname->platform_id = entry->platformID;
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        aname->encoding_id = entry->encodingID;
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        aname->language_id = entry->languageID;
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        aname->name_id     = entry->nameID;
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        aname->string      = (FT_Byte*)entry->string;
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        aname->string_len  = entry->stringLength;
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        error = FT_Err_Ok;
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return error;
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* TT_CONFIG_OPTION_SFNT_NAMES */
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */
95