ReactOS  0.4.15-dev-1150-g593bcce
gxvmort.c File Reference
#include "gxvmort.h"
#include "gxvfeat.h"
Include dependency graph for gxvmort.c:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define FT_COMPONENT   trace_gxvmort
 

Functions

static void gxv_mort_feature_validate (GXV_mort_feature f, GXV_Validator gxvalid)
 
 gxv_mort_featurearray_validate (FT_Bytes table, FT_Bytes limit, FT_ULong nFeatureFlags, GXV_Validator gxvalid)
 
 gxv_mort_coverage_validate (FT_UShort coverage, GXV_Validator gxvalid)
 
static void gxv_mort_subtables_validate (FT_Bytes table, FT_Bytes limit, FT_UShort nSubtables, GXV_Validator gxvalid)
 
static void gxv_mort_chain_validate (FT_Bytes table, FT_Bytes limit, GXV_Validator gxvalid)
 
 gxv_mort_validate (FT_Bytes table, FT_Face face, FT_Validator ftvalid)
 

Macro Definition Documentation

◆ FT_COMPONENT

#define FT_COMPONENT   trace_gxvmort

Definition at line 39 of file gxvmort.c.

Function Documentation

◆ gxv_mort_chain_validate()

static void gxv_mort_chain_validate ( FT_Bytes  table,
FT_Bytes  limit,
GXV_Validator  gxvalid 
)
static

Definition at line 224 of file gxvmort.c.

227  {
228  FT_Bytes p = table;
229 #ifdef GXV_LOAD_UNUSED_VARS
230  FT_ULong defaultFlags;
231 #endif
232  FT_ULong chainLength;
233  FT_UShort nFeatureFlags;
234  FT_UShort nSubtables;
235 
236 
237  GXV_NAME_ENTER( "mort chain header" );
238 
239  GXV_LIMIT_CHECK( 4 + 4 + 2 + 2 );
240 #ifdef GXV_LOAD_UNUSED_VARS
241  defaultFlags = FT_NEXT_ULONG( p );
242 #else
243  p += 4;
244 #endif
245  chainLength = FT_NEXT_ULONG( p );
246  nFeatureFlags = FT_NEXT_USHORT( p );
247  nSubtables = FT_NEXT_USHORT( p );
248 
249  gxv_mort_featurearray_validate( p, table + chainLength,
250  nFeatureFlags, gxvalid );
251  p += gxvalid->subtable_length;
252  gxv_mort_subtables_validate( p, table + chainLength, nSubtables, gxvalid );
253  gxvalid->subtable_length = chainLength;
254 
255  /* TODO: validate defaultFlags */
256  GXV_EXIT;
257  }
unsigned long FT_ULong
Definition: fttypes.h:253
#define GXV_NAME_ENTER(name)
Definition: gxvcommn.h:301
static void gxv_mort_subtables_validate(FT_Bytes table, FT_Bytes limit, FT_UShort nSubtables, GXV_Validator gxvalid)
Definition: gxvmort.c:151
GLenum GLsizei GLenum GLenum const GLvoid * table
Definition: glext.h:5644
#define GXV_EXIT
Definition: gxvcommn.h:302
const FT_Byte * FT_Bytes
Definition: fttypes.h:165
#define FT_NEXT_USHORT(buffer)
Definition: ftstream.h:226
#define FT_NEXT_ULONG(buffer)
Definition: ftstream.h:238
gxv_mort_featurearray_validate(FT_Bytes table, FT_Bytes limit, FT_ULong nFeatureFlags, GXV_Validator gxvalid)
Definition: gxvmort.c:90
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_LIMIT_CHECK(_count)
Definition: gxvcommn.h:272

Referenced by gxv_mort_validate().

◆ gxv_mort_coverage_validate()

gxv_mort_coverage_validate ( FT_UShort  coverage,
GXV_Validator  gxvalid 
)

Definition at line 122 of file gxvmort.c.

124  {
125  FT_UNUSED( gxvalid );
126 
127 #ifdef FT_DEBUG_LEVEL_TRACE
128  if ( coverage & 0x8000U )
129  GXV_TRACE(( " this subtable is for vertical text only\n" ));
130  else
131  GXV_TRACE(( " this subtable is for horizontal text only\n" ));
132 
133  if ( coverage & 0x4000 )
134  GXV_TRACE(( " this subtable is applied to glyph array "
135  "in descending order\n" ));
136  else
137  GXV_TRACE(( " this subtable is applied to glyph array "
138  "in ascending order\n" ));
139 
140  if ( coverage & 0x2000 )
141  GXV_TRACE(( " this subtable is forcibly applied to "
142  "vertical/horizontal text\n" ));
143 
144  if ( coverage & 0x1FF8 )
145  GXV_TRACE(( " coverage has non-zero bits in reserved area\n" ));
146 #endif
147  }
#define GXV_TRACE(s)
Definition: gxvcommn.h:304
#define FT_UNUSED(arg)
Definition: ftconfig.h:101

Referenced by gxv_mort_subtables_validate(), and gxv_morx_subtables_validate().

◆ gxv_mort_feature_validate()

static void gxv_mort_feature_validate ( GXV_mort_feature  f,
GXV_Validator  gxvalid 
)
static

Definition at line 43 of file gxvmort.c.

45  {
46  if ( f->featureType >= gxv_feat_registry_length )
47  {
48  GXV_TRACE(( "featureType %d is out of registered range, "
49  "setting %d is unchecked\n",
50  f->featureType, f->featureSetting ));
52  }
53  else if ( !gxv_feat_registry[f->featureType].existence )
54  {
55  GXV_TRACE(( "featureType %d is within registered area "
56  "but undefined, setting %d is unchecked\n",
57  f->featureType, f->featureSetting ));
59  }
60  else
61  {
62  FT_Byte nSettings_max;
63 
64 
65  /* nSettings in gxvfeat.c is halved for exclusive on/off settings */
66  nSettings_max = gxv_feat_registry[f->featureType].nSettings;
67  if ( gxv_feat_registry[f->featureType].exclusive )
68  nSettings_max = (FT_Byte)( 2 * nSettings_max );
69 
70  GXV_TRACE(( "featureType %d is registered", f->featureType ));
71  GXV_TRACE(( "setting %d", f->featureSetting ));
72 
73  if ( f->featureSetting > nSettings_max )
74  {
75  GXV_TRACE(( "out of defined range %d", nSettings_max ));
77  }
78  GXV_TRACE(( "\n" ));
79  }
80 
81  /* TODO: enableFlags must be unique value in specified chain? */
82  }
#define GXV_TRACE(s)
Definition: gxvcommn.h:304
#define gxv_feat_registry_length
Definition: gxvfeat.h:55
#define GXV_SET_ERR_IF_PARANOID(err)
Definition: gxvcommn.h:66
unsigned char FT_Byte
Definition: fttypes.h:154
static GX_Feature_RegistryRec gxv_feat_registry[]
Definition: gxvfeat.h:60
GLfloat f
Definition: glext.h:7540
#define FT_INVALID_DATA
Definition: ftvalid.h:150

Referenced by gxv_mort_featurearray_validate().

◆ gxv_mort_featurearray_validate()

gxv_mort_featurearray_validate ( FT_Bytes  table,
FT_Bytes  limit,
FT_ULong  nFeatureFlags,
GXV_Validator  gxvalid 
)

Definition at line 90 of file gxvmort.c.

94  {
95  FT_Bytes p = table;
96  FT_ULong i;
97 
99 
100 
101  GXV_NAME_ENTER( "mort feature list" );
102  for ( i = 0; i < nFeatureFlags; i++ )
103  {
104  GXV_LIMIT_CHECK( 2 + 2 + 4 + 4 );
105  f.featureType = FT_NEXT_USHORT( p );
106  f.featureSetting = FT_NEXT_USHORT( p );
107  f.enableFlags = FT_NEXT_ULONG( p );
108  f.disableFlags = FT_NEXT_ULONG( p );
109 
110  gxv_mort_feature_validate( &f, gxvalid );
111  }
112 
113  if ( !IS_GXV_MORT_FEATURE_OFF( f ) )
115 
116  gxvalid->subtable_length = (FT_ULong)( p - table );
117  GXV_EXIT;
118  }
unsigned long FT_ULong
Definition: fttypes.h:253
#define GXV_NAME_ENTER(name)
Definition: gxvcommn.h:301
GLenum GLsizei GLenum GLenum const GLvoid * table
Definition: glext.h:5644
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
static void gxv_mort_feature_validate(GXV_mort_feature f, GXV_Validator gxvalid)
Definition: gxvmort.c:43
#define GXV_MORT_FEATURE_OFF
Definition: gxvmort.h:46
#define IS_GXV_MORT_FEATURE_OFF(f)
Definition: gxvmort.h:48
#define GXV_EXIT
Definition: gxvcommn.h:302
GLfloat f
Definition: glext.h:7540
const FT_Byte * FT_Bytes
Definition: fttypes.h:165
#define FT_NEXT_USHORT(buffer)
Definition: ftstream.h:226
#define FT_NEXT_ULONG(buffer)
Definition: ftstream.h:238
#define FT_INVALID_DATA
Definition: ftvalid.h:150
FT_ULong subtable_length
Definition: gxvcommn.h:244
GLfloat GLfloat p
Definition: glext.h:8902
#define GXV_LIMIT_CHECK(_count)
Definition: gxvcommn.h:272

Referenced by gxv_mort_chain_validate(), and gxv_morx_chain_validate().

◆ gxv_mort_subtables_validate()

static void gxv_mort_subtables_validate ( FT_Bytes  table,
FT_Bytes  limit,
FT_UShort  nSubtables,
GXV_Validator  gxvalid 
)
static

Definition at line 151 of file gxvmort.c.

155  {
156  FT_Bytes p = table;
157 
158  GXV_Validate_Func fmt_funcs_table[] =
159  {
163  NULL, /* 3 */
166 
167  };
168 
169  FT_UShort i;
170 
171 
172  GXV_NAME_ENTER( "subtables in a chain" );
173 
174  for ( i = 0; i < nSubtables; i++ )
175  {
177 
179  FT_UShort coverage;
180 #ifdef GXV_LOAD_UNUSED_VARS
181  FT_ULong subFeatureFlags;
182 #endif
183  FT_UInt type;
184  FT_UInt rest;
185 
186 
187  GXV_LIMIT_CHECK( 2 + 2 + 4 );
188  length = FT_NEXT_USHORT( p );
189  coverage = FT_NEXT_USHORT( p );
190 #ifdef GXV_LOAD_UNUSED_VARS
191  subFeatureFlags = FT_NEXT_ULONG( p );
192 #else
193  p += 4;
194 #endif
195 
196  GXV_TRACE(( "validating chain subtable %d/%d (%d bytes)\n",
197  i + 1, nSubtables, length ));
198  type = coverage & 0x0007;
199  rest = length - ( 2 + 2 + 4 );
200 
201  GXV_LIMIT_CHECK( rest );
202  gxv_mort_coverage_validate( coverage, gxvalid );
203 
204  if ( type > 5 )
206 
207  func = fmt_funcs_table[type];
208  if ( !func )
209  GXV_TRACE(( "morx type %d is reserved\n", type ));
210 
211  func( p, p + rest, gxvalid );
212 
213  p += rest;
214  /* TODO: validate subFeatureFlags */
215  }
216 
217  gxvalid->subtable_length = (FT_ULong)( p - table );
218 
219  GXV_EXIT;
220  }
GLenum func
Definition: glext.h:6028
unsigned long FT_ULong
Definition: fttypes.h:253
#define FT_INVALID_FORMAT
Definition: ftvalid.h:142
#define GXV_NAME_ENTER(name)
Definition: gxvcommn.h:301
#define GXV_TRACE(s)
Definition: gxvcommn.h:304
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLenum GLsizei GLenum GLenum const GLvoid * table
Definition: glext.h:5644
void(* GXV_Validate_Func)(FT_Bytes table, FT_Bytes limit, GXV_Validator gxvalid)
Definition: gxvcommn.h:82
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_mort_subtable_type5_validate(FT_Bytes table, FT_Bytes limit, GXV_Validator gxvalid)
Definition: gxvmort5.c:203
smooth NULL
Definition: ftsmooth.c:416
#define GXV_EXIT
Definition: gxvcommn.h:302
gxv_mort_coverage_validate(FT_UShort coverage, GXV_Validator gxvalid)
Definition: gxvmort.c:122
gxv_mort_subtable_type0_validate(FT_Bytes table, FT_Bytes limit, GXV_Validator gxvalid)
Definition: gxvmort0.c:127
GLenum GLuint GLenum GLsizei length
Definition: glext.h:5579
gxv_mort_subtable_type1_validate(FT_Bytes table, FT_Bytes limit, GXV_Validator gxvalid)
Definition: gxvmort1.c:225
const FT_Byte * FT_Bytes
Definition: fttypes.h:165
gxv_mort_subtable_type2_validate(FT_Bytes table, FT_Bytes limit, GXV_Validator gxvalid)
Definition: gxvmort2.c:277
#define FT_NEXT_USHORT(buffer)
Definition: ftstream.h:226
unsigned int FT_UInt
Definition: fttypes.h:231
#define FT_NEXT_ULONG(buffer)
Definition: ftstream.h:238
FT_ULong subtable_length
Definition: gxvcommn.h:244
GLfloat GLfloat p
Definition: glext.h:8902
unsigned short FT_UShort
Definition: fttypes.h:209
gxv_mort_subtable_type4_validate(FT_Bytes table, FT_Bytes limit, GXV_Validator gxvalid)
Definition: gxvmort4.c:106
#define GXV_LIMIT_CHECK(_count)
Definition: gxvcommn.h:272

Referenced by gxv_mort_chain_validate().

◆ gxv_mort_validate()

gxv_mort_validate ( FT_Bytes  table,
FT_Face  face,
FT_Validator  ftvalid 
)

Definition at line 261 of file gxvmort.c.

264  {
265  GXV_ValidatorRec gxvalidrec;
266  GXV_Validator gxvalid = &gxvalidrec;
267  FT_Bytes p = table;
268  FT_Bytes limit = 0;
270  FT_ULong nChains;
271  FT_ULong i;
272 
273 
274  gxvalid->root = ftvalid;
275  gxvalid->face = face;
276  limit = gxvalid->root->limit;
277 
278  FT_TRACE3(( "validating `mort' table\n" ));
279  GXV_INIT;
280 
281  GXV_LIMIT_CHECK( 4 + 4 );
282  version = FT_NEXT_ULONG( p );
283  nChains = FT_NEXT_ULONG( p );
284 
285  if (version != 0x00010000UL)
287 
288  for ( i = 0; i < nChains; i++ )
289  {
290  GXV_TRACE(( "validating chain %d/%d\n", i + 1, nChains ));
292  gxv_mort_chain_validate( p, limit, gxvalid );
293  p += gxvalid->subtable_length;
294  }
295 
296  FT_TRACE4(( "\n" ));
297  }
unsigned long FT_ULong
Definition: fttypes.h:253
#define FT_INVALID_FORMAT
Definition: ftvalid.h:142
#define GXV_TRACE(s)
Definition: gxvcommn.h:304
GLenum GLsizei GLenum GLenum const GLvoid * table
Definition: glext.h:5644
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
#define FT_TRACE4(varformat)
Definition: ftdebug.h:161
static const WCHAR version[]
Definition: asmname.c:66
static void gxv_mort_chain_validate(FT_Bytes table, FT_Bytes limit, GXV_Validator gxvalid)
Definition: gxvmort.c:224
FT_Validator root
Definition: gxvcommn.h:239
#define GXV_32BIT_ALIGNMENT_VALIDATE(a)
Definition: gxvcommn.h:317
WORD face[3]
Definition: mesh.c:4747
const FT_Byte * FT_Bytes
Definition: fttypes.h:165
#define FT_TRACE3(varformat)
Definition: ftdebug.h:160
#define FT_NEXT_ULONG(buffer)
Definition: ftstream.h:238
FT_ULong subtable_length
Definition: gxvcommn.h:244
GLfloat GLfloat p
Definition: glext.h:8902
#define GXV_INIT
Definition: gxvcommn.h:300
#define GXV_LIMIT_CHECK(_count)
Definition: gxvcommn.h:272