33#define FT_COMPONENT sfwoff
36#define WRITE_USHORT( p, v ) \
39 *(p)++ = (FT_Byte)( (v) >> 8 ); \
40 *(p)++ = (FT_Byte)( (v) >> 0 ); \
44#define WRITE_ULONG( p, v ) \
47 *(p)++ = (FT_Byte)( (v) >> 24 ); \
48 *(p)++ = (FT_Byte)( (v) >> 16 ); \
49 *(p)++ = (FT_Byte)( (v) >> 8 ); \
50 *(p)++ = (FT_Byte)( (v) >> 0 ); \
80 if ( offset1 > offset2 )
82 else if ( offset1 < offset2 )
117#define FT_STRUCTURE WOFF_HeaderRec
149 woff.num_tables == 0 ||
150 44 + woff.num_tables * 20UL >= woff.length ||
151 12 + woff.num_tables * 16UL >= woff.totalSfntSize ||
152 ( woff.totalSfntSize & 3 ) != 0 ||
153 ( woff.metaOffset == 0 && ( woff.metaLength != 0 ||
154 woff.metaOrigLength != 0 ) ) ||
155 ( woff.metaLength != 0 && woff.metaOrigLength == 0 ) ||
156 ( woff.privOffset == 0 && woff.privLength != 0 ) )
158 FT_ERROR((
"woff_font_open: invalid WOFF header\n" ));
171 FT_UInt searchRange, entrySelector, rangeShift,
x;
183 searchRange = ( 1 << entrySelector ) * 16;
184 rangeShift = woff.num_tables * 16 - searchRange;
202 " tag offset compLen origLen checksum\n"
203 " -------------------------------------------\n" ));
208 for ( nn = 0; nn < woff.num_tables; nn++ )
218 FT_TRACE2((
" %c%c%c%c %08lx %08lx %08lx %08lx\n",
228 if (
table->Tag <= old_tag )
232 FT_ERROR((
"woff_font_open: table tags are not sorted\n" ));
237 old_tag =
table->Tag;
252 woff_offset = 44 + woff.num_tables * 20L;
253 sfnt_offset = 12 + woff.num_tables * 16L;
255 for ( nn = 0; nn < woff.num_tables; nn++ )
260 if (
table->Offset != woff_offset ||
261 table->CompLength > woff.length ||
262 table->Offset > woff.length -
table->CompLength ||
263 table->OrigLength > woff.totalSfntSize ||
264 sfnt_offset > woff.totalSfntSize -
table->OrigLength ||
267 FT_ERROR((
"woff_font_open: invalid table offsets\n" ));
272 table->OrigOffset = sfnt_offset;
275 woff_offset += (
table->CompLength + 3 ) & ~3U;
276 sfnt_offset += (
table->OrigLength + 3 ) & ~3U;
288 if ( woff.metaOffset )
290 if ( woff.metaOffset != woff_offset ||
291 woff.metaOffset + woff.metaLength > woff.length )
294 " invalid `metadata' offset or length\n" ));
300 woff_offset += woff.metaLength;
303 if ( woff.privOffset )
306 woff_offset = ( woff_offset + 3 ) & ~3U;
308 if ( woff.privOffset != woff_offset ||
309 woff.privOffset + woff.privLength > woff.length )
311 FT_ERROR((
"woff_font_open: invalid `private' offset or length\n" ));
317 woff_offset += woff.privLength;
320 if ( sfnt_offset != woff.totalSfntSize ||
321 woff_offset != woff.length )
323 FT_ERROR((
"woff_font_open: invalid `sfnt' table structure\n" ));
330 12 + woff.num_tables * 16UL,
331 woff.totalSfntSize ) )
334 sfnt_header =
sfnt + 12;
338 for ( nn = 0; nn < woff.num_tables; nn++ )
363#ifdef FT_CONFIG_OPTION_USE_ZLIB
374 if ( output_len !=
table->OrigLength )
376 FT_ERROR((
"woff_font_open: compressed table length mismatch\n" ));
393 sfnt_offset =
table->OrigOffset +
table->OrigLength;
394 while ( sfnt_offset & 3 )
396 sfnt[sfnt_offset] =
'\0';
410 face->root.stream = sfnt_stream;
412 face->root.face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM;
#define FT_CALLBACK_DEF(x)
struct nls_table * tables
#define FT_FACE_FLAG_EXTERNAL_STREAM
#define FT_ASSERT(condition)
#define FT_ERROR(varformat)
#define FT_TRACE2(varformat)
FT_Gzip_Uncompress(FT_Memory memory, FT_Byte *output, FT_ULong *output_len, const FT_Byte *input, FT_ULong input_len)
#define FT_REALLOC(ptr, cursz, newsz)
#define FT_NEW_ARRAY(ptr, count)
#define FT_ALLOC(ptr, size)
#define FT_FRAME_ENTER(size)
#define FT_STREAM_SEEK(position)
FT_Stream_Close(FT_Stream stream)
#define FT_FRAME_ULONG(f)
#define FT_STREAM_READ_FIELDS(fields, object)
FT_Stream_Free(FT_Stream stream, FT_Int external)
#define FT_FRAME_START(size)
FT_Stream_OpenMemory(FT_Stream stream, const FT_Byte *base, FT_ULong size)
#define FT_FRAME_USHORT(f)
typedefFT_BEGIN_HEADER struct FT_MemoryRec_ * FT_Memory
GLint GLint GLint GLint GLint x
GLuint GLuint GLsizei GLenum const GLvoid * indices
GLenum GLuint GLint GLenum face
GLboolean GLboolean GLboolean b
GLuint GLsizei GLsizei * length
GLboolean GLboolean GLboolean GLboolean a
static char memory[1024 *256]
#define WRITE_ULONG(p, v)
compare_offsets(const void *a, const void *b)
static void sfnt_stream_close(FT_Stream stream)
woff_open_font(FT_Stream stream, TT_Face face)
#define WRITE_USHORT(p, v)
FT_Stream_CloseFunc close
FT_BEGIN_HEADER struct WOFF_HeaderRec_ WOFF_HeaderRec
ActualNumberDriverObjects * sizeof(PDRIVER_OBJECT)) PDRIVER_OBJECT *DriverObjectList