1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  ttbdf.c                                                                */
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*    TrueType and OpenType embedded BDF properties (body).                */
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  Copyright 2005, 2006, 2010, 2013 by                                    */
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  This file is part of the FreeType project, and may only be used,       */
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  modified, and distributed under the terms of the FreeType project      */
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  this file you indicate that you have read the license and              */
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*  understand and accept it fully.                                        */
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/*                                                                         */
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/ft2build.h"
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/ftdebug.h"
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/internal/ftstream.h"
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/freetype/tttags.h"
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "ttbdf.h"
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "sferrors.h"
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef TT_CONFIG_OPTION_BDF
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*************************************************************************/
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /* messages during execution.                                            */
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  /*                                                                       */
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef  FT_COMPONENT
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_COMPONENT  trace_ttbdf
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_LOCAL_DEF( void )
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  tt_face_free_bdf_props( TT_Face  face )
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    TT_BDF  bdf = &face->bdf;
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( bdf->loaded )
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_Stream  stream = FT_FACE(face)->stream;
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( bdf->table != NULL )
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FT_FRAME_RELEASE( bdf->table );
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      bdf->table_end    = NULL;
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      bdf->strings      = NULL;
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      bdf->strings_size = 0;
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  static FT_Error
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  tt_face_load_bdf_props( TT_Face    face,
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                          FT_Stream  stream )
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    TT_BDF    bdf = &face->bdf;
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_ULong  length;
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Error  error;
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_ZERO( bdf );
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    error = tt_face_goto_table( face, TTAG_BDF, stream, &length );
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( error                                  ||
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov         length < 8                             ||
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov         FT_FRAME_EXTRACT( length, bdf->table ) )
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      error = FT_THROW( Invalid_Table );
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      goto Exit;
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bdf->table_end = bdf->table + length;
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_Byte*   p           = bdf->table;
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_UInt    version     = FT_NEXT_USHORT( p );
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_UInt    num_strikes = FT_NEXT_USHORT( p );
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_ULong   strings     = FT_NEXT_ULONG ( p );
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_UInt    count;
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_Byte*   strike;
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( version != 0x0001                 ||
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov           strings < 8                       ||
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov           ( strings - 8 ) / 4 < num_strikes ||
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov           strings + 1 > length              )
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        goto BadTable;
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      bdf->num_strikes  = num_strikes;
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      bdf->strings      = bdf->table + strings;
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      bdf->strings_size = length - strings;
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      count  = bdf->num_strikes;
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      p      = bdf->table + 8;
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      strike = p + count * 4;
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      for ( ; count > 0; count-- )
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FT_UInt  num_items = FT_PEEK_USHORT( p + 2 );
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /*
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov         *  We don't need to check the value sets themselves, since this
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov         *  is done later.
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov         */
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        strike += 10 * num_items;
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        p += 4;
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( strike > bdf->strings )
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        goto BadTable;
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    bdf->loaded = 1;
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  Exit:
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return error;
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  BadTable:
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_FRAME_RELEASE( bdf->table );
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_ZERO( bdf );
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    error = FT_THROW( Invalid_Table );
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    goto Exit;
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FT_LOCAL_DEF( FT_Error )
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  tt_face_find_bdf_prop( TT_Face           face,
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                         const char*       property_name,
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                         BDF_PropertyRec  *aprop )
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  {
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    TT_BDF     bdf   = &face->bdf;
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Size    size  = FT_FACE(face)->size;
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Error   error = FT_Err_Ok;
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Byte*   p;
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_UInt    count;
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Byte*   strike;
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FT_Offset  property_len;
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    aprop->type = BDF_PROPERTY_TYPE_NONE;
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( bdf->loaded == 0 )
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      error = tt_face_load_bdf_props( face, FT_FACE( face )->stream );
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( error )
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        goto Exit;
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    count  = bdf->num_strikes;
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    p      = bdf->table + 8;
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    strike = p + 4 * count;
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    error = FT_ERR( Invalid_Argument );
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( size == NULL || property_name == NULL )
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      goto Exit;
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    property_len = ft_strlen( property_name );
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ( property_len == 0 )
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      goto Exit;
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for ( ; count > 0; count-- )
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_UInt  _ppem  = FT_NEXT_USHORT( p );
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_UInt  _count = FT_NEXT_USHORT( p );
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( _ppem == size->metrics.y_ppem )
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        count = _count;
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        goto FoundStrike;
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      strike += 10 * _count;
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    goto Exit;
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  FoundStrike:
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    p = strike;
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    for ( ; count > 0; count-- )
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      FT_UInt  type = FT_PEEK_USHORT( p + 4 );
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      if ( ( type & 0x10 ) != 0 )
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      {
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FT_UInt32  name_offset = FT_PEEK_ULONG( p     );
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FT_UInt32  value       = FT_PEEK_ULONG( p + 6 );
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        /* be a bit paranoid for invalid entries here */
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if ( name_offset < bdf->strings_size                    &&
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov             property_len < bdf->strings_size - name_offset     &&
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov             ft_strncmp( property_name,
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                         (const char*)bdf->strings + name_offset,
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                         bdf->strings_size - name_offset ) == 0 )
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        {
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          switch ( type & 0x0F )
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          {
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          case 0x00:  /* string */
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          case 0x01:  /* atoms */
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            /* check that the content is really 0-terminated */
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            if ( value < bdf->strings_size &&
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                 ft_memchr( bdf->strings + value, 0, bdf->strings_size ) )
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            {
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov              aprop->type   = BDF_PROPERTY_TYPE_ATOM;
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov              aprop->u.atom = (const char*)bdf->strings + value;
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov              error         = FT_Err_Ok;
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov              goto Exit;
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            }
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            break;
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          case 0x02:
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            aprop->type      = BDF_PROPERTY_TYPE_INTEGER;
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            aprop->u.integer = (FT_Int32)value;
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            error            = FT_Err_Ok;
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            goto Exit;
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          case 0x03:
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            aprop->type       = BDF_PROPERTY_TYPE_CARDINAL;
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            aprop->u.cardinal = value;
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            error             = FT_Err_Ok;
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            goto Exit;
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          default:
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            ;
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          }
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      }
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov      p += 10;
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  Exit:
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return error;
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov  }
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif /* TT_CONFIG_OPTION_BDF */
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */
251