1 /***************************************************************************/
5 /* FreeType API for checking patented TrueType bytecode instructions */
8 /* Copyright 2007 by David Turner. */
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. */
16 /***************************************************************************/
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
28 _tt_check_patents_in_range( FT_Stream stream
,
31 FT_Bool result
= FALSE
;
36 if ( FT_FRAME_ENTER( size
) )
46 case 0x06: /* SPvTL // */
47 case 0x07: /* SPvTL + */
48 case 0x08: /* SFvTL // */
49 case 0x09: /* SFvTL + */
50 case 0x0A: /* SPvFS */
51 case 0x0B: /* SFvFS */
69 case 0x71: /* DELTAP2 */
70 case 0x72: /* DELTAP3 */
71 case 0x73: /* DELTAC0 */
72 case 0x74: /* DELTAC1 */
73 case 0x75: /* DELTAC2 */
85 p
+= ( p
[0] - 0xB0 ) + 2;
96 p
+= ( p
[0] - 0xB8 ) * 2 + 3;
112 _tt_check_patents_in_table( FT_Face face
,
115 FT_Stream stream
= face
->stream
;
117 FT_Service_SFNT_Table service
;
118 FT_Bool result
= FALSE
;
121 FT_FACE_FIND_SERVICE( face
, service
, SFNT_TABLE
);
125 FT_ULong offset
, size
;
128 error
= service
->table_info( face
, tag
, &offset
, &size
);
130 FT_STREAM_SEEK( offset
) )
133 result
= _tt_check_patents_in_range( stream
, size
);
142 _tt_face_check_patents( FT_Face face
)
144 FT_Stream stream
= face
->stream
;
149 FT_Service_TTGlyf service
;
152 result
= _tt_check_patents_in_table( face
, TTAG_fpgm
);
156 result
= _tt_check_patents_in_table( face
, TTAG_prep
);
160 FT_FACE_FIND_SERVICE( face
, service
, TT_GLYF
);
161 if ( service
== NULL
)
164 for ( gindex
= 0; gindex
< (FT_UInt
)face
->num_glyphs
; gindex
++ )
166 FT_ULong offset
, num_ins
, size
;
170 offset
= service
->get_location( face
, gindex
, &size
);
174 if ( FT_STREAM_SEEK( offset
) ||
175 FT_READ_SHORT( num_contours
) )
178 if ( num_contours
>= 0 ) /* simple glyph */
180 if ( FT_STREAM_SKIP( 8 + num_contours
* 2 ) )
183 else /* compound glyph */
185 FT_Bool has_instr
= 0;
188 if ( FT_STREAM_SKIP( 8 ) )
191 /* now read each component */
194 FT_UInt flags
, toskip
;
197 if( FT_READ_USHORT( flags
) )
202 if ( ( flags
& ( 1 << 0 ) ) != 0 ) /* ARGS_ARE_WORDS */
205 if ( ( flags
& ( 1 << 3 ) ) != 0 ) /* WE_HAVE_A_SCALE */
207 else if ( ( flags
& ( 1 << 6 ) ) != 0 ) /* WE_HAVE_X_Y_SCALE */
209 else if ( ( flags
& ( 1 << 7 ) ) != 0 ) /* WE_HAVE_A_2x2 */
212 if ( ( flags
& ( 1 << 8 ) ) != 0 ) /* WE_HAVE_INSTRUCTIONS */
215 if ( FT_STREAM_SKIP( toskip
) )
218 if ( ( flags
& ( 1 << 5 ) ) == 0 ) /* MORE_COMPONENTS */
226 if ( FT_READ_USHORT( num_ins
) )
229 result
= _tt_check_patents_in_range( stream
, num_ins
);
242 /* documentation is in freetype.h */
244 FT_EXPORT_DEF( FT_Bool
)
245 FT_Face_CheckTrueTypePatents( FT_Face face
)
247 FT_Bool result
= FALSE
;
250 if ( face
&& FT_IS_SFNT( face
) )
251 result
= _tt_face_check_patents( face
);
257 /* documentation is in freetype.h */
259 FT_EXPORT_DEF( FT_Bool
)
260 FT_Face_SetUnpatentedHinting( FT_Face face
,
266 #if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING ) && \
267 !defined( TT_CONFIG_OPTION_BYTECODE_INTEPRETER )
268 if ( face
&& FT_IS_SFNT( face
) )
270 result
= !face
->internal
->ignore_unpatented_hinter
;
271 face
->internal
->ignore_unpatented_hinter
= !value
;