ReactOS  0.4.15-dev-1207-g698a8e6
gxvopbd.c
Go to the documentation of this file.
1 /***************************************************************************/
2 /* */
3 /* gxvopbd.c */
4 /* */
5 /* TrueTypeGX/AAT opbd table validation (body). */
6 /* */
7 /* Copyright 2004-2018 by */
8 /* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
9 /* David Turner, Robert Wilhelm, and Werner Lemberg. */
10 /* */
11 /* This file is part of the FreeType project, and may only be used, */
12 /* modified, and distributed under the terms of the FreeType project */
13 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */
14 /* this file you indicate that you have read the license and */
15 /* understand and accept it fully. */
16 /* */
17 /***************************************************************************/
18 
19 /***************************************************************************/
20 /* */
21 /* gxvalid is derived from both gxlayout module and otvalid module. */
22 /* Development of gxlayout is supported by the Information-technology */
23 /* Promotion Agency(IPA), Japan. */
24 /* */
25 /***************************************************************************/
26 
27 
28 #include "gxvalid.h"
29 #include "gxvcommn.h"
30 
31 
32  /*************************************************************************/
33  /* */
34  /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
35  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
36  /* messages during execution. */
37  /* */
38 #undef FT_COMPONENT
39 #define FT_COMPONENT trace_gxvopbd
40 
41 
42  /*************************************************************************/
43  /*************************************************************************/
44  /***** *****/
45  /***** Data and Types *****/
46  /***** *****/
47  /*************************************************************************/
48  /*************************************************************************/
49 
50  typedef struct GXV_opbd_DataRec_
51  {
54 
56 
57 
58 #define GXV_OPBD_DATA( FIELD ) GXV_TABLE_DATA( opbd, FIELD )
59 
60 
61  /*************************************************************************/
62  /*************************************************************************/
63  /***** *****/
64  /***** UTILITY FUNCTIONS *****/
65  /***** *****/
66  /*************************************************************************/
67  /*************************************************************************/
68 
69  static void
71  GXV_LookupValueCPtr value_p,
72  GXV_Validator gxvalid )
73  {
74  /* offset in LookupTable is measured from the head of opbd table */
75  FT_Bytes p = gxvalid->root->base + value_p->u;
76  FT_Bytes limit = gxvalid->root->limit;
77  FT_Short delta_value;
78  int i;
79 
80 
81  if ( value_p->u < GXV_OPBD_DATA( valueOffset_min ) )
82  GXV_OPBD_DATA( valueOffset_min ) = value_p->u;
83 
84  for ( i = 0; i < 4; i++ )
85  {
86  GXV_LIMIT_CHECK( 2 );
87  delta_value = FT_NEXT_SHORT( p );
88 
89  if ( GXV_OPBD_DATA( format ) ) /* format 1, value is ctrl pt. */
90  {
91  if ( delta_value == -1 )
92  continue;
93 
94  gxv_ctlPoint_validate( glyph, (FT_UShort)delta_value, gxvalid );
95  }
96  else /* format 0, value is distance */
97  continue;
98  }
99  }
100 
101 
102  /*
103  opbd ---------------------+
104  |
105  +===============+ |
106  | lookup header | |
107  +===============+ |
108  | BinSrchHeader | |
109  +===============+ |
110  | lastGlyph[0] | |
111  +---------------+ |
112  | firstGlyph[0] | | head of opbd sfnt table
113  +---------------+ | +
114  | offset[0] | -> | offset [byte]
115  +===============+ | +
116  | lastGlyph[1] | | (glyphID - firstGlyph) * 4 * sizeof(FT_Short) [byte]
117  +---------------+ |
118  | firstGlyph[1] | |
119  +---------------+ |
120  | offset[1] | |
121  +===============+ |
122  |
123  .... |
124  |
125  48bit value array |
126  +===============+ |
127  | value | <-------+
128  | |
129  | |
130  | |
131  +---------------+
132  .... */
133 
134  static GXV_LookupValueDesc
136  GXV_LookupValueCPtr base_value_p,
137  FT_Bytes lookuptbl_limit,
138  GXV_Validator gxvalid )
139  {
141 
142  FT_UNUSED( lookuptbl_limit );
143  FT_UNUSED( gxvalid );
144 
145  /* XXX: check range? */
146  value.u = (FT_UShort)( base_value_p->u +
147  relative_gindex * 4 * sizeof ( FT_Short ) );
148 
149  return value;
150  }
151 
152 
153  /*************************************************************************/
154  /*************************************************************************/
155  /***** *****/
156  /***** opbd TABLE *****/
157  /***** *****/
158  /*************************************************************************/
159  /*************************************************************************/
160 
161  FT_LOCAL_DEF( void )
163  FT_Face face,
164  FT_Validator ftvalid )
165  {
166  GXV_ValidatorRec gxvalidrec;
167  GXV_Validator gxvalid = &gxvalidrec;
168  GXV_opbd_DataRec opbdrec;
169  GXV_opbd_Data opbd = &opbdrec;
170  FT_Bytes p = table;
171  FT_Bytes limit = 0;
172 
174 
175 
176  gxvalid->root = ftvalid;
177  gxvalid->table_data = opbd;
178  gxvalid->face = face;
179 
180  FT_TRACE3(( "validating `opbd' table\n" ));
181  GXV_INIT;
182  GXV_OPBD_DATA( valueOffset_min ) = 0xFFFFU;
183 
184 
185  GXV_LIMIT_CHECK( 4 + 2 );
186  version = FT_NEXT_ULONG( p );
188 
189 
190  /* only 0x00010000 is defined (1996) */
191  GXV_TRACE(( "(version=0x%08x)\n", version ));
192  if ( 0x00010000UL != version )
194 
195  /* only values 0 and 1 are defined (1996) */
196  GXV_TRACE(( "(format=0x%04x)\n", GXV_OPBD_DATA( format ) ));
197  if ( 0x0001 < GXV_OPBD_DATA( format ) )
199 
203 
204  gxv_LookupTable_validate( p, limit, gxvalid );
205  p += gxvalid->subtable_length;
206 
207  if ( p > table + GXV_OPBD_DATA( valueOffset_min ) )
208  {
209  GXV_TRACE((
210  "found overlap between LookupTable and opbd_value array\n" ));
212  }
213 
214  FT_TRACE4(( "\n" ));
215  }
216 
217 
218 /* END */
unsigned long FT_ULong
Definition: fttypes.h:253
ActualNumberDriverObjects * sizeof(PDRIVER_OBJECT)) PDRIVER_OBJECT *DriverObjectList
#define FT_INVALID_FORMAT
Definition: ftvalid.h:142
#define GXV_TRACE(s)
Definition: gxvcommn.h:304
#define U(x)
Definition: wordpad.c:45
GLenum GLsizei GLenum GLenum const GLvoid * table
Definition: glext.h:5644
FT_UShort format
Definition: gxvopbd.c:52
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: gl.h:1546
GXV_LookupValue_SignSpec lookupval_sign
Definition: gxvcommn.h:246
GLint limit
Definition: glext.h:10326
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GXV_Lookup_Fmt4_Transit_Func lookupfmt4_trans
Definition: gxvcommn.h:248
GXV_Lookup_Value_Validate_Func lookupval_func
Definition: gxvcommn.h:247
gxv_LookupTable_validate(FT_Bytes table, FT_Bytes limit, GXV_Validator gxvalid)
Definition: gxvcommn.c:755
gxv_opbd_validate(FT_Bytes table, FT_Face face, FT_Validator ftvalid)
Definition: gxvopbd.c:162
#define FT_TRACE4(varformat)
Definition: ftdebug.h:161
void * table_data
Definition: gxvcommn.h:242
static const WCHAR version[]
Definition: asmname.c:66
#define GXV_OPBD_DATA(FIELD)
Definition: gxvopbd.c:58
#define FT_LOCAL_DEF(x)
Definition: ftconfig.h:388
struct GXV_opbd_DataRec_ GXV_opbd_DataRec
FT_Validator root
Definition: gxvcommn.h:239
static void gxv_opbd_LookupValue_validate(FT_UShort glyph, GXV_LookupValueCPtr value_p, GXV_Validator gxvalid)
Definition: gxvopbd.c:70
typedefFT_BEGIN_HEADER struct FT_ValidatorRec_ volatile * FT_Validator
Definition: ftvalid.h:42
union value::@490 u
WORD face[3]
Definition: mesh.c:4747
const FT_Byte * FT_Bytes
Definition: fttypes.h:165
gxv_ctlPoint_validate(FT_UShort gid, FT_UShort ctl_point, GXV_Validator gxvalid)
Definition: gxvcommn.c:846
signed short FT_Short
Definition: fttypes.h:198
GLsizei const GLfloat * value
Definition: glext.h:6069
FT_UShort valueOffset_min
Definition: gxvopbd.c:53
#define FT_NEXT_USHORT(buffer)
Definition: ftstream.h:226
#define FT_TRACE3(varformat)
Definition: ftdebug.h:160
#define FT_INVALID_OFFSET
Definition: ftvalid.h:138
struct GXV_opbd_DataRec_ * GXV_opbd_Data
static GXV_LookupValueDesc gxv_opbd_LookupFmt4_transit(FT_UShort relative_gindex, GXV_LookupValueCPtr base_value_p, FT_Bytes lookuptbl_limit, GXV_Validator gxvalid)
Definition: gxvopbd.c:135
#define FT_NEXT_ULONG(buffer)
Definition: ftstream.h:238
#define FT_NEXT_SHORT(buffer)
Definition: ftstream.h:223
FT_ULong subtable_length
Definition: gxvcommn.h:244
GLfloat GLfloat p
Definition: glext.h:8902
unsigned short FT_UShort
Definition: fttypes.h:209
#define GXV_INIT
Definition: gxvcommn.h:300
#define FT_UNUSED(arg)
Definition: ftconfig.h:101
GLenum GLuint GLint GLenum face
Definition: glext.h:7025
#define GXV_LIMIT_CHECK(_count)
Definition: gxvcommn.h:272