PageRenderTime 63ms CodeModel.GetById 30ms app.highlight 17ms RepoModel.GetById 13ms app.codeStats 0ms

/src/compiler/android-ndk/jni/freetype/src/base/ftpatent.c

http://ftk.googlecode.com/
C | 286 lines | 199 code | 67 blank | 20 comment | 47 complexity | a8e9de75621e7386322735c39e120942 MD5 | raw file
  1/***************************************************************************/
  2/*                                                                         */
  3/*  ftpatent.c                                                             */
  4/*                                                                         */
  5/*    FreeType API for checking patented TrueType bytecode instructions    */
  6/*    (body).                                                              */
  7/*                                                                         */
  8/*  Copyright 2007, 2008, 2010 by David Turner.                            */
  9/*                                                                         */
 10/*  This file is part of the FreeType project, and may only be used,       */
 11/*  modified, and distributed under the terms of the FreeType project      */
 12/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
 13/*  this file you indicate that you have read the license and              */
 14/*  understand and accept it fully.                                        */
 15/*                                                                         */
 16/***************************************************************************/
 17
 18#include <ft2build.h>
 19#include FT_FREETYPE_H
 20#include FT_TRUETYPE_TAGS_H
 21#include FT_INTERNAL_OBJECTS_H
 22#include FT_INTERNAL_STREAM_H
 23#include FT_SERVICE_SFNT_H
 24#include FT_SERVICE_TRUETYPE_GLYF_H
 25
 26
 27  static FT_Bool
 28  _tt_check_patents_in_range( FT_Stream  stream,
 29                              FT_ULong   size )
 30  {
 31    FT_Bool   result = FALSE;
 32    FT_Error  error;
 33    FT_Bytes  p, end;
 34
 35
 36    if ( FT_FRAME_ENTER( size ) )
 37      return 0;
 38
 39    p   = stream->cursor;
 40    end = p + size;
 41
 42    while ( p < end )
 43    {
 44      switch (p[0])
 45      {
 46      case 0x06:  /* SPvTL // */
 47      case 0x07:  /* SPvTL +  */
 48      case 0x08:  /* SFvTL // */
 49      case 0x09:  /* SFvTL +  */
 50      case 0x0A:  /* SPvFS    */
 51      case 0x0B:  /* SFvFS    */
 52        result = TRUE;
 53        goto Exit;
 54
 55      case 0x40:
 56        if ( p + 1 >= end )
 57          goto Exit;
 58
 59        p += p[1] + 2;
 60        break;
 61
 62      case 0x41:
 63        if ( p + 1 >= end )
 64          goto Exit;
 65
 66        p += p[1] * 2 + 2;
 67        break;
 68
 69      case 0x71:  /* DELTAP2 */
 70      case 0x72:  /* DELTAP3 */
 71      case 0x73:  /* DELTAC0 */
 72      case 0x74:  /* DELTAC1 */
 73      case 0x75:  /* DELTAC2 */
 74        result = TRUE;
 75        goto Exit;
 76
 77      case 0xB0:
 78      case 0xB1:
 79      case 0xB2:
 80      case 0xB3:
 81      case 0xB4:
 82      case 0xB5:
 83      case 0xB6:
 84      case 0xB7:
 85        p += ( p[0] - 0xB0 ) + 2;
 86        break;
 87
 88      case 0xB8:
 89      case 0xB9:
 90      case 0xBA:
 91      case 0xBB:
 92      case 0xBC:
 93      case 0xBD:
 94      case 0xBE:
 95      case 0xBF:
 96        p += ( p[0] - 0xB8 ) * 2 + 3;
 97        break;
 98
 99      default:
100        p += 1;
101        break;
102      }
103    }
104
105  Exit:
106    FT_UNUSED( error );
107    FT_FRAME_EXIT();
108    return result;
109  }
110
111
112  static FT_Bool
113  _tt_check_patents_in_table( FT_Face   face,
114                              FT_ULong  tag )
115  {
116    FT_Stream              stream = face->stream;
117    FT_Error               error  = FT_Err_Ok;
118    FT_Service_SFNT_Table  service;
119    FT_Bool                result = FALSE;
120
121
122    FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
123
124    if ( service )
125    {
126      FT_UInt   i = 0;
127      FT_ULong  tag_i = 0, offset_i = 0, length_i = 0;
128
129
130      for ( i = 0; !error && tag_i != tag ; i++ )
131        error = service->table_info( face, i,
132                                     &tag_i, &offset_i, &length_i );
133
134      if ( error                    ||
135           FT_STREAM_SEEK( offset_i ) )
136        goto Exit;
137
138      result = _tt_check_patents_in_range( stream, length_i );
139    }
140
141  Exit:
142    return result;
143  }
144
145
146  static FT_Bool
147  _tt_face_check_patents( FT_Face  face )
148  {
149    FT_Stream  stream = face->stream;
150    FT_UInt    gindex;
151    FT_Error   error;
152    FT_Bool    result;
153
154    FT_Service_TTGlyf  service;
155
156
157    result = _tt_check_patents_in_table( face, TTAG_fpgm );
158    if ( result )
159      goto Exit;
160
161    result = _tt_check_patents_in_table( face, TTAG_prep );
162    if ( result )
163      goto Exit;
164
165    FT_FACE_FIND_SERVICE( face, service, TT_GLYF );
166    if ( service == NULL )
167      goto Exit;
168
169    for ( gindex = 0; gindex < (FT_UInt)face->num_glyphs; gindex++ )
170    {
171      FT_ULong  offset, num_ins, size;
172      FT_Int    num_contours;
173
174
175      offset = service->get_location( face, gindex, &size );
176      if ( size == 0 )
177        continue;
178
179      if ( FT_STREAM_SEEK( offset )      ||
180           FT_READ_SHORT( num_contours ) )
181        continue;
182
183      if ( num_contours >= 0 )  /* simple glyph */
184      {
185        if ( FT_STREAM_SKIP( 8 + num_contours * 2 ) )
186          continue;
187      }
188      else  /* compound glyph */
189      {
190        FT_Bool  has_instr = 0;
191
192
193        if ( FT_STREAM_SKIP( 8 ) )
194          continue;
195
196        /* now read each component */
197        for (;;)
198        {
199          FT_UInt  flags, toskip;
200
201
202          if( FT_READ_USHORT( flags ) )
203            break;
204
205          toskip = 2 + 1 + 1;
206
207          if ( ( flags & ( 1 << 0 ) ) != 0 )       /* ARGS_ARE_WORDS */
208            toskip += 2;
209
210          if ( ( flags & ( 1 << 3 ) ) != 0 )       /* WE_HAVE_A_SCALE */
211            toskip += 2;
212          else if ( ( flags & ( 1 << 6 ) ) != 0 )  /* WE_HAVE_X_Y_SCALE */
213            toskip += 4;
214          else if ( ( flags & ( 1 << 7 ) ) != 0 )  /* WE_HAVE_A_2x2 */
215            toskip += 8;
216
217          if ( ( flags & ( 1 << 8 ) ) != 0 )       /* WE_HAVE_INSTRUCTIONS */
218            has_instr = 1;
219
220          if ( FT_STREAM_SKIP( toskip ) )
221            goto NextGlyph;
222
223          if ( ( flags & ( 1 << 5 ) ) == 0 )       /* MORE_COMPONENTS */
224            break;
225        }
226
227        if ( !has_instr )
228          goto NextGlyph;
229      }
230
231      if ( FT_READ_USHORT( num_ins ) )
232        continue;
233
234      result = _tt_check_patents_in_range( stream, num_ins );
235      if ( result )
236        goto Exit;
237
238    NextGlyph:
239      ;
240    }
241
242  Exit:
243    return result;
244  }
245
246
247  /* documentation is in freetype.h */
248
249  FT_EXPORT_DEF( FT_Bool )
250  FT_Face_CheckTrueTypePatents( FT_Face  face )
251  {
252    FT_Bool  result = FALSE;
253
254
255    if ( face && FT_IS_SFNT( face ) )
256      result = _tt_face_check_patents( face );
257
258    return result;
259  }
260
261
262  /* documentation is in freetype.h */
263
264  FT_EXPORT_DEF( FT_Bool )
265  FT_Face_SetUnpatentedHinting( FT_Face  face,
266                                FT_Bool  value )
267  {
268    FT_Bool  result = FALSE;
269
270
271#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING ) && \
272    !defined( TT_CONFIG_OPTION_BYTECODE_INTEPRETER )
273    if ( face && FT_IS_SFNT( face ) )
274    {
275      result = !face->internal->ignore_unpatented_hinter;
276      face->internal->ignore_unpatented_hinter = !value;
277    }
278#else
279    FT_UNUSED( face );
280    FT_UNUSED( value );
281#endif
282
283    return result;
284  }
285
286/* END */