w32tex
About: TeX Live provides a comprehensive TeX system including all the major TeX-related programs, macro packages, and fonts that are free software. Windows sources.
  Fossies Dox: w32tex-src.tar.xz  ("unofficial" and yet experimental doxygen-generated source code documentation)  

hb-open-file.hh
Go to the documentation of this file.
1 /*
2  * Copyright © 2007,2008,2009 Red Hat, Inc.
3  * Copyright © 2012 Google, Inc.
4  *
5  * This is part of HarfBuzz, a text shaping library.
6  *
7  * Permission is hereby granted, without written agreement and without
8  * license or royalty fees, to use, copy, modify, and distribute this
9  * software and its documentation for any purpose, provided that the
10  * above copyright notice and the following two paragraphs appear in
11  * all copies of this software.
12  *
13  * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
14  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
15  * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
16  * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
17  * DAMAGE.
18  *
19  * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
20  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
21  * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
22  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
23  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
24  *
25  * Red Hat Author(s): Behdad Esfahbod
26  * Google Author(s): Behdad Esfahbod
27  */
28 
29 #ifndef HB_OPEN_FILE_HH
30 #define HB_OPEN_FILE_HH
31 
32 #include "hb-open-type.hh"
33 #include "hb-ot-head-table.hh"
34 
35 
36 namespace OT {
37 
38 
39 /*
40  *
41  * The OpenType Font File
42  *
43  */
44 
45 
46 /*
47  * Organization of an OpenType Font
48  */
49 
50 struct OpenTypeFontFile;
51 struct OffsetTable;
52 struct TTCHeader;
53 
54 
55 typedef struct TableRecord
56 {
57  int cmp (Tag t) const { return -t.cmp (tag); }
58 
59  HB_INTERNAL static int cmp (const void *pa, const void *pb)
60  {
61  const TableRecord *a = (const TableRecord *) pa;
62  const TableRecord *b = (const TableRecord *) pb;
63  return b->cmp (a->tag);
64  }
65 
67  {
68  TRACE_SANITIZE (this);
69  return_trace (c->check_struct (this));
70  }
71 
72  Tag tag; /* 4-byte identifier. */
73  CheckSum checkSum; /* CheckSum for this table. */
74  Offset32 offset; /* Offset from beginning of TrueType font
75  * file. */
76  HBUINT32 length; /* Length of this table. */
77  public:
80 
81 typedef struct OffsetTable
82 {
83  friend struct OpenTypeFontFile;
84 
85  unsigned int get_table_count () const { return tables.len; }
86  const TableRecord& get_table (unsigned int i) const
87  { return tables[i]; }
88  unsigned int get_table_tags (unsigned int start_offset,
89  unsigned int *table_count, /* IN/OUT */
90  hb_tag_t *table_tags /* OUT */) const
91  {
92  if (table_count)
93  {
94  + tables.sub_array (start_offset, table_count)
96  | hb_sink (hb_array (table_tags, *table_count))
97  ;
98  }
99  return tables.len;
100  }
101  bool find_table_index (hb_tag_t tag, unsigned int *table_index) const
102  {
103  Tag t;
104  t = tag;
105  return tables.bfind (t, table_index, HB_BFIND_NOT_FOUND_STORE, Index::NOT_FOUND_INDEX);
106  }
108  {
109  unsigned int table_index;
110  find_table_index (tag, &table_index);
111  return get_table (table_index);
112  }
113 
114  public:
115 
116  template <typename item_t>
118  hb_tag_t sfnt_tag,
120  {
121  TRACE_SERIALIZE (this);
122  /* Alloc 12 for the OTHeader. */
123  if (unlikely (!c->extend_min (*this))) return_trace (false);
124  /* Write sfntVersion (bytes 0..3). */
125  sfnt_version = sfnt_tag;
126  /* Take space for numTables, searchRange, entrySelector, RangeShift
127  * and the TableRecords themselves. */
128  if (unlikely (!tables.serialize (c, items.length))) return_trace (false);
129 
130  const char *dir_end = (const char *) c->head;
131  HBUINT32 *checksum_adjustment = nullptr;
132 
133  /* Write OffsetTables, alloc for and write actual table blobs. */
134  for (unsigned int i = 0; i < tables.len; i++)
135  {
136  TableRecord &rec = tables.arrayZ[i];
137  hb_blob_t *blob = items[i].blob;
138  rec.tag = items[i].tag;
139  rec.length = blob->length;
140  rec.offset.serialize (c, this);
141 
142  /* Allocate room for the table and copy it. */
143  char *start = (char *) c->allocate_size<void> (rec.length);
144  if (unlikely (!start)) return false;
145 
146  if (likely (rec.length))
147  memcpy (start, blob->data, rec.length);
148 
149  /* 4-byte alignment. */
150  c->align (4);
151  const char *end = (const char *) c->head;
152 
153  if (items[i].tag == HB_OT_TAG_head &&
154  (unsigned) (end - start) >= head::static_size)
155  {
156  head *h = (head *) start;
157  checksum_adjustment = &h->checkSumAdjustment;
158  *checksum_adjustment = 0;
159  }
160 
162  }
163 
164  tables.qsort ();
165 
166  if (checksum_adjustment)
167  {
169 
170  /* The following line is a slower version of the following block. */
171  //checksum.set_for_data (this, (const char *) c->head - (const char *) this);
172  checksum.set_for_data (this, dir_end - (const char *) this);
173  for (unsigned int i = 0; i < items.length; i++)
174  {
175  TableRecord &rec = tables.arrayZ[i];
176  checksum = checksum + rec.checkSum;
177  }
178 
179  *checksum_adjustment = 0xB1B0AFBAu - checksum;
180  }
181 
182  return_trace (true);
183  }
184 
186  {
187  TRACE_SANITIZE (this);
188  return_trace (c->check_struct (this) && tables.sanitize (c));
189  }
190 
191  protected:
192  Tag sfnt_version; /* '\0\001\0\00' if TrueType / 'OTTO' if CFF */
195  public:
198 
199 
200 /*
201  * TrueType Collections
202  */
203 
205 {
206  friend struct TTCHeader;
207 
208  unsigned int get_face_count () const { return table.len; }
209  const OpenTypeFontFace& get_face (unsigned int i) const { return this+table[i]; }
210 
212  {
213  TRACE_SANITIZE (this);
214  return_trace (table.sanitize (c, this));
215  }
216 
217  protected:
218  Tag ttcTag; /* TrueType Collection ID string: 'ttcf' */
219  FixedVersion<>version; /* Version of the TTC Header (1.0),
220  * 0x00010000u */
222  table; /* Array of offsets to the OffsetTable for each font
223  * from the beginning of the file */
224  public:
226 };
227 
228 struct TTCHeader
229 {
230  friend struct OpenTypeFontFile;
231 
232  private:
233 
234  unsigned int get_face_count () const
235  {
236  switch (u.header.version.major) {
237  case 2: /* version 2 is compatible with version 1 */
238  case 1: return u.version1.get_face_count ();
239  default:return 0;
240  }
241  }
242  const OpenTypeFontFace& get_face (unsigned int i) const
243  {
244  switch (u.header.version.major) {
245  case 2: /* version 2 is compatible with version 1 */
246  case 1: return u.version1.get_face (i);
247  default:return Null (OpenTypeFontFace);
248  }
249  }
250 
252  {
253  TRACE_SANITIZE (this);
254  if (unlikely (!u.header.version.sanitize (c))) return_trace (false);
255  switch (u.header.version.major) {
256  case 2: /* version 2 is compatible with version 1 */
257  case 1: return_trace (u.version1.sanitize (c));
258  default:return_trace (true);
259  }
260  }
261 
262  protected:
263  union {
264  struct {
265  Tag ttcTag; /* TrueType Collection ID string: 'ttcf' */
266  FixedVersion<>version; /* Version of the TTC Header (1.0 or 2.0),
267  * 0x00010000u or 0x00020000u */
270  } u;
271 };
272 
273 /*
274  * Mac Resource Fork
275  *
276  * http://mirror.informatimago.com/next/developer.apple.com/documentation/mac/MoreToolbox/MoreToolbox-99.html
277  */
278 
280 {
281  const OpenTypeFontFace & get_face (const void *data_base) const
282  { return * reinterpret_cast<const OpenTypeFontFace *> ((data_base+offset).arrayZ); }
283 
285  const void *data_base) const
286  {
287  TRACE_SANITIZE (this);
288  return_trace (c->check_struct (this) &&
289  offset.sanitize (c, data_base) &&
290  get_face (data_base).sanitize (c));
291  }
292 
293  protected:
294  HBUINT16 id; /* Resource ID. */
295  HBINT16 nameOffset; /* Offset from beginning of resource name list
296  * to resource name, -1 means there is none. */
297  HBUINT8 attrs; /* Resource attributes */
299  offset; /* Offset from beginning of data block to
300  * data for this resource */
301  HBUINT32 reserved; /* Reserved for handle to resource */
302  public:
304 };
305 
306 #define HB_TAG_sfnt HB_TAG ('s','f','n','t')
307 
309 {
310  unsigned int get_resource_count () const
311  { return tag == HB_TAG_sfnt ? resCountM1 + 1 : 0; }
312 
313  bool is_sfnt () const { return tag == HB_TAG_sfnt; }
314 
315  const ResourceRecord& get_resource_record (unsigned int i,
316  const void *type_base) const
317  { return (type_base+resourcesZ).as_array (get_resource_count ())[i]; }
318 
320  const void *type_base,
321  const void *data_base) const
322  {
323  TRACE_SANITIZE (this);
324  return_trace (c->check_struct (this) &&
325  resourcesZ.sanitize (c, type_base,
327  data_base));
328  }
329 
330  protected:
331  Tag tag; /* Resource type. */
332  HBUINT16 resCountM1; /* Number of resources minus 1. */
334  resourcesZ; /* Offset from beginning of resource type list
335  * to reference item list for this type. */
336  public:
338 };
339 
341 {
342  unsigned int get_face_count () const
343  {
344  unsigned int count = get_type_count ();
345  for (unsigned int i = 0; i < count; i++)
346  {
348  if (type.is_sfnt ())
349  return type.get_resource_count ();
350  }
351  return 0;
352  }
353 
354  const OpenTypeFontFace& get_face (unsigned int idx,
355  const void *data_base) const
356  {
357  unsigned int count = get_type_count ();
358  for (unsigned int i = 0; i < count; i++)
359  {
361  /* The check for idx < count is here because ResourceRecord is NOT null-safe.
362  * Because an offset of 0 there does NOT mean null. */
363  if (type.is_sfnt () && idx < type.get_resource_count ())
364  return type.get_resource_record (idx, &(this+typeList)).get_face (data_base);
365  }
366  return Null (OpenTypeFontFace);
367  }
368 
369  bool sanitize (hb_sanitize_context_t *c, const void *data_base) const
370  {
371  TRACE_SANITIZE (this);
372  return_trace (c->check_struct (this) &&
373  typeList.sanitize (c, this,
374  &(this+typeList),
375  data_base));
376  }
377 
378  private:
379  unsigned int get_type_count () const { return (this+typeList).lenM1 + 1; }
380 
381  const ResourceTypeRecord& get_type_record (unsigned int i) const
382  { return (this+typeList)[i]; }
383 
384  protected:
385  HBUINT8 reserved0[16]; /* Reserved for copy of resource header */
386  HBUINT32 reserved1; /* Reserved for handle to next resource map */
387  HBUINT16 resreved2; /* Reserved for file reference number */
388  HBUINT16 attrs; /* Resource fork attribute */
390  typeList; /* Offset from beginning of map to
391  * resource type list */
392  Offset16 nameList; /* Offset from beginning of map to
393  * resource name list */
394  public:
396 };
397 
399 {
400  unsigned int get_face_count () const
401  { return (this+map).get_face_count (); }
402 
403  const OpenTypeFontFace& get_face (unsigned int idx,
404  unsigned int *base_offset = nullptr) const
405  {
406  const OpenTypeFontFace &face = (this+map).get_face (idx, &(this+data));
407  if (base_offset)
408  *base_offset = (const char *) &face - (const char *) this;
409  return face;
410  }
411 
413  {
414  TRACE_SANITIZE (this);
415  return_trace (c->check_struct (this) &&
416  data.sanitize (c, this, dataLen) &&
417  map.sanitize (c, this, &(this+data)));
418  }
419 
420  protected:
422  data; /* Offset from beginning of resource fork
423  * to resource data */
425  map; /* Offset from beginning of resource fork
426  * to resource map */
427  HBUINT32 dataLen; /* Length of resource data */
428  HBUINT32 mapLen; /* Length of resource map */
429  public:
431 };
432 
433 /*
434  * OpenType Font File
435  */
436 
438 {
439  enum {
440  CFFTag = HB_TAG ('O','T','T','O'), /* OpenType with Postscript outlines */
441  TrueTypeTag = HB_TAG ( 0 , 1 , 0 , 0 ), /* OpenType with TrueType outlines */
442  TTCTag = HB_TAG ('t','t','c','f'), /* TrueType Collection */
443  DFontTag = HB_TAG ( 0 , 0 , 1 , 0 ), /* DFont Mac Resource Fork */
444  TrueTag = HB_TAG ('t','r','u','e'), /* Obsolete Apple TrueType */
445  Typ1Tag = HB_TAG ('t','y','p','1') /* Obsolete Apple Type1 font in SFNT container */
446  };
447 
448  hb_tag_t get_tag () const { return u.tag; }
449 
450  unsigned int get_face_count () const
451  {
452  switch (u.tag) {
453  case CFFTag: /* All the non-collection tags */
454  case TrueTag:
455  case Typ1Tag:
456  case TrueTypeTag: return 1;
457  case TTCTag: return u.ttcHeader.get_face_count ();
458  case DFontTag: return u.rfHeader.get_face_count ();
459  default: return 0;
460  }
461  }
462  const OpenTypeFontFace& get_face (unsigned int i, unsigned int *base_offset = nullptr) const
463  {
464  if (base_offset)
465  *base_offset = 0;
466  switch (u.tag) {
467  /* Note: for non-collection SFNT data we ignore index. This is because
468  * Apple dfont container is a container of SFNT's. So each SFNT is a
469  * non-TTC, but the index is more than zero. */
470  case CFFTag: /* All the non-collection tags */
471  case TrueTag:
472  case Typ1Tag:
473  case TrueTypeTag: return u.fontFace;
474  case TTCTag: return u.ttcHeader.get_face (i);
475  case DFontTag: return u.rfHeader.get_face (i, base_offset);
476  default: return Null (OpenTypeFontFace);
477  }
478  }
479 
480  template <typename item_t>
482  hb_tag_t sfnt_tag,
484  {
485  TRACE_SERIALIZE (this);
486  assert (sfnt_tag != TTCTag);
487  if (unlikely (!c->extend_min (*this))) return_trace (false);
488  return_trace (u.fontFace.serialize (c, sfnt_tag, items));
489  }
490 
492  {
493  TRACE_SANITIZE (this);
494  if (unlikely (!u.tag.sanitize (c))) return_trace (false);
495  switch (u.tag) {
496  case CFFTag: /* All the non-collection tags */
497  case TrueTag:
498  case Typ1Tag:
499  case TrueTypeTag: return_trace (u.fontFace.sanitize (c));
500  case TTCTag: return_trace (u.ttcHeader.sanitize (c));
501  case DFontTag: return_trace (u.rfHeader.sanitize (c));
502  default: return_trace (true);
503  }
504  }
505 
506  protected:
507  union {
508  Tag tag; /* 4-byte identifier. */
512  } u;
513  public:
515 };
516 
517 
518 } /* namespace OT */
519 
520 
521 #endif /* HB_OPEN_FILE_HH */
#define type(a)
Definition: aptex-macros.h:171
#define count(a)
Definition: aptex-macros.h:781
#define b
Definition: jpegint.h:372
int h
Definition: dviconv.c:9
#define t
Definition: afcover.h:96
#define c(n)
Definition: gpos-common.c:150
#define a(n)
Definition: gpos-common.c:148
#define memcpy(d, s, n)
Definition: gsftopk.c:64
assert(pcxLoadImage24((char *)((void *) 0), fp, pinfo, hdr))
#define likely(x)
Definition: jbig2arith.cc:115
#define unlikely(x)
Definition: jbig2arith.cc:116
small capitals from c petite p scientific i
Definition: afcover.h:80
for(n=0;n< outline->n_points;n++)
Definition: ftbbox.c:494
FT_UInt idx
Definition: cffcmap.c:135
FT_Face face
Definition: cffdrivr.c:659
Definition: hb-iter.hh:336
struct OT::TableRecord OpenTypeTable
struct OT::OffsetTable OpenTypeFontFace
static auto end(Iterable &&iterable) -> decltype((hb_iter(iterable).end()))
Definition: hb-iter.hh:344
integer checksum
Definition: pbmtopk.c:63
static int items
Definition: pgmtofs.c:86
set set set set set set set macro pixldst1 abits if abits op else op endif endm macro pixldst2 abits if abits op else op endif endm macro pixldst4 abits if abits op else op endif endm macro pixldst0 abits op endm macro pixldst3 mem_operand op endm macro pixldst30 mem_operand op endm macro pixldst abits if abits elseif abits elseif abits elseif abits elseif abits pixldst0 abits else pixldst0 abits pixldst0 abits pixldst0 abits pixldst0 abits endif elseif abits else pixldst0 abits pixldst0 abits endif elseif abits else error unsupported bpp *numpix else pixst endif endm macro pixld1_s mem_operand if asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl elseif asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl else error unsupported endif endm macro pixld2_s mem_operand if mov asr add asl add asl mov asr sub UNIT_X add asl mov asr add asl add asl mov asr add UNIT_X add asl else pixld1_s mem_operand pixld1_s mem_operand endif endm macro pixld0_s mem_operand if asr adds SRC_WIDTH_FIXED bpl add asl elseif asr adds SRC_WIDTH_FIXED bpl add asl endif endm macro pixld_s_internal mem_operand if mem_operand pixld2_s mem_operand pixdeinterleave basereg elseif mem_operand elseif mem_operand elseif mem_operand elseif mem_operand pixld0_s mem_operand else pixld0_s mem_operand pixld0_s mem_operand pixld0_s mem_operand pixld0_s mem_operand endif elseif mem_operand else pixld0_s mem_operand pixld0_s mem_operand endif elseif mem_operand else error unsupported mem_operand if bpp mem_operand endif endm macro vuzp8 reg2 vuzp d d &reg2 endm macro vzip8 reg2 vzip d d &reg2 endm macro pixdeinterleave basereg basereg basereg basereg basereg endif endm macro pixinterleave basereg basereg basereg basereg basereg endif endm macro PF boost_increment endif if endif PF tst PF addne PF subne PF cmp ORIG_W if endif if endif if endif PF subge ORIG_W PF subges if endif if endif if endif endif endm macro cache_preload_simple endif if dst_r_bpp pld[DST_R, #(PREFETCH_DISTANCE_SIMPLE *dst_r_bpp/8)] endif if mask_bpp pld if[MASK, #(PREFETCH_DISTANCE_SIMPLE *mask_bpp/8)] endif endif endm macro fetch_mask_pixblock pixld mask_basereg pixblock_size MASK endm macro ensure_destination_ptr_alignment process_pixblock_tail_head if beq irp skip1(dst_w_bpp<=(lowbit *8)) &&((lowbit *8)<(pixblock_size *dst_w_bpp)) .if lowbit< 16 tst DST_R
hb_array_t< T > hb_array(T *array, unsigned int length)
Definition: hb-array.hh:263
@ HB_BFIND_NOT_FOUND_STORE
Definition: hb-array.hh:272
#define HB_TAG(c1, c2, c3, c4)
Definition: hb-common.h:155
uint32_t hb_tag_t
Definition: hb-common.h:147
#define TRACE_SERIALIZE(this)
Definition: hb-debug.hh:426
#define TRACE_SANITIZE(this)
Definition: hb-debug.hh:414
#define return_trace(RET)
Definition: hb-debug.hh:349
struct @1054 hb_sink
struct @1041 hb_map
#define DEFINE_SIZE_STATIC(size)
Definition: hb-machinery.hh:98
#define DEFINE_SIZE_UNION(size, _member)
#define DEFINE_SIZE_ARRAY(size, array)
#define Null(Type)
Definition: hb-null.hh:94
#define HB_TAG_sfnt
#define HB_OT_TAG_head
static const hb_tag_t table_tags[2]
Definition: hb-ot-map.hh:40
#define HB_INTERNAL
Definition: hb.hh:265
void set_for_data(const void *data, unsigned int length)
static constexpr unsigned NOT_FOUND_INDEX
bool find_table_index(hb_tag_t tag, unsigned int *table_index) const
bool serialize(hb_serialize_context_t *c, hb_tag_t sfnt_tag, hb_array_t< item_t > items)
bool sanitize(hb_sanitize_context_t *c) const
unsigned int get_table_count() const
Definition: hb-open-file.hh:85
BinSearchArrayOf< TableRecord > tables
const TableRecord & get_table(unsigned int i) const
Definition: hb-open-file.hh:86
unsigned int get_table_tags(unsigned int start_offset, unsigned int *table_count, hb_tag_t *table_tags) const
Definition: hb-open-file.hh:88
const TableRecord & get_table_by_tag(hb_tag_t tag) const
void * serialize(hb_serialize_context_t *c, const void *base)
unsigned int get_face_count() const
bool sanitize(hb_sanitize_context_t *c) const
hb_tag_t get_tag() const
OpenTypeFontFace fontFace
union OT::OpenTypeFontFile::@1066 u
ResourceForkHeader rfHeader
const OpenTypeFontFace & get_face(unsigned int i, unsigned int *base_offset=nullptr) const
bool serialize_single(hb_serialize_context_t *c, hb_tag_t sfnt_tag, hb_array_t< item_t > items)
bool sanitize(hb_sanitize_context_t *c) const
LNNOffsetTo< ResourceMap > map
unsigned int get_face_count() const
const OpenTypeFontFace & get_face(unsigned int idx, unsigned int *base_offset=nullptr) const
LNNOffsetTo< UnsizedArrayOf< HBUINT8 > > data
HBUINT8 reserved0[16]
bool sanitize(hb_sanitize_context_t *c, const void *data_base) const
HBUINT32 reserved1
const ResourceTypeRecord & get_type_record(unsigned int i) const
HBUINT16 resreved2
unsigned int get_face_count() const
const OpenTypeFontFace & get_face(unsigned int idx, const void *data_base) const
unsigned int get_type_count() const
NNOffsetTo< ArrayOfM1< ResourceTypeRecord > > typeList
const OpenTypeFontFace & get_face(const void *data_base) const
bool sanitize(hb_sanitize_context_t *c, const void *data_base) const
NNOffsetTo< LArrayOf< HBUINT8 >, HBUINT24 > offset
bool sanitize(hb_sanitize_context_t *c, const void *type_base, const void *data_base) const
NNOffsetTo< UnsizedArrayOf< ResourceRecord > > resourcesZ
unsigned int get_resource_count() const
const ResourceRecord & get_resource_record(unsigned int i, const void *type_base) const
unsigned int get_face_count() const
bool sanitize(hb_sanitize_context_t *c) const
const OpenTypeFontFace & get_face(unsigned int i) const
LArrayOf< LOffsetTo< OffsetTable > > table
union OT::TTCHeader::@1063 u
FixedVersion version
unsigned int get_face_count() const
const OpenTypeFontFace & get_face(unsigned int i) const
struct OT::TTCHeader::@1063::@1064 header
bool sanitize(hb_sanitize_context_t *c) const
TTCHeaderVersion1 version1
bool sanitize(hb_sanitize_context_t *c) const
Definition: hb-open-file.hh:66
int cmp(Tag t) const
Definition: hb-open-file.hh:57
CheckSum checkSum
Definition: hb-open-file.hh:73
static int cmp(const void *pa, const void *pb)
Definition: hb-open-file.hh:59
static constexpr unsigned static_size
Definition: ttc.h:9
unsigned int length
Definition: hb-blob.hh:65
const char * data
Definition: hb-blob.hh:64
Definition: dvips.h:235
Definition: table.h:30
Definition: xmlparse.c:179
tag int tag
Definition: tex4ht.c:2554
@ start
Definition: preamble.c:52