* 0x00010000 or 0x00020000 */
ULONG numFonts; /* Number of fonts in TTC */
ULONG offsetTable[]; /* Array of offsets to the OffsetTable for each font
- * from the beginning of the file.
- * numFonts entries long. */
+ * from the beginning of the file */
};
USHORT scriptCount; /* Number of ScriptRecords */
ScriptRecord scriptRecord[]; /* Array of ScriptRecords--listed alphabetically
- * by ScriptTag. scriptCount entries long */
+ * by ScriptTag */
};
struct Script {
USHORT featureCount; /* Number of FeatureRecords in this table */
FeatureRecord featureRecord[];/* Array of FeatureRecords--zero-based (first
* feature has FeatureIndex = 0)--listed
- * alphabetically by FeatureTag. featureCount
- * entries long */
+ * alphabetically by FeatureTag */
};
struct Feature {
* feature */
USHORT lookupIndex[]; /* Array of LookupList indices for this
* feature--zero-based (first lookup is
- * LookupListIndex = 0). lookupCount
- * entries long */
+ * LookupListIndex = 0) */
};
struct LookupList {
USHORT lookupCount; /* Number of lookups in this table */
Offset lookupOffset[]; /* Array of offsets to Lookup tables--from
* beginning of LookupList--zero based (first
- * lookup is Lookup index = 0). lookupCount
- * entries long */
+ * lookup is Lookup index = 0) */
};
struct LookupFlag : USHORT {
USHORT lookupFlag; /* Lookup qualifiers */
USHORT subTableCount; /* Number of SubTables for this lookup */
Offset subTableOffset[];/* Array of offsets to SubTables-from
- * beginning of Lookup table. subTableCount
- * entries long. */
+ * beginning of Lookup table */
};
/*
/* GlyphIDs, in sorted numerical order */
DEFINE_ARRAY_TYPE (GlyphID, glyphArray, glyphCount);
- inline unsigned int get_coverage (uint16_t glyph_id) const {
+ inline int get_coverage (uint16_t glyph_id) const {
GlyphID gid (glyph_id);
// TODO: bsearch
for (int i = 0; i < glyphCount; i++)
return -1;
}
- USHORT coverageFormat; /* Format identifier--format = 1 */
- USHORT glyphCount; /* Number of glyphs in the GlyphArray */
- GlyphID glyphArray[]; /* Array of GlyphIDs--in numerical
- * order. glyphCount entries long */
+ USHORT coverageFormat; /* Format identifier--format = 1 */
+ USHORT glyphCount; /* Number of glyphs in the GlyphArray */
+ GlyphID glyphArray[]; /* Array of GlyphIDs--in numerical order */
};
struct CoverageRangeRecord {
- inline unsigned int get_coverage (uint16_t glyph_id) const {
+
+ inline int get_coverage (uint16_t glyph_id) const {
if (glyph_id >= start && glyph_id <= end)
return startCoverageIndex + (glyph_id - start);
return -1;
/* CoverageRangeRecords, in sorted numerical start order */
DEFINE_ARRAY_TYPE (CoverageRangeRecord, rangeRecord, rangeCount);
- inline unsigned int get_coverage (uint16_t glyph_id) const {
+ inline int get_coverage (uint16_t glyph_id) const {
// TODO: bsearch
for (int i = 0; i < rangeCount; i++) {
int coverage = rangeRecord[i].get_coverage (glyph_id);
return -1;
}
- USHORT coverageFormat; /* Format identifier--format = 2 */
- USHORT rangeCount; /* Number of CoverRangeRecords */
- CoverageRangeRecord rangeRecord[]; /* Array of glyph ranges--ordered by
+ USHORT coverageFormat; /* Format identifier--format = 2 */
+ USHORT rangeCount; /* Number of CoverageRangeRecords */
+ CoverageRangeRecord rangeRecord[]; /* Array of glyph ranges--ordered by
* Start GlyphID. rangeCount entries
* long */
};
switch (coverageFormat) {
case 1: return ((const CoverageFormat1&)*this).get_size ();
case 2: return ((const CoverageFormat2&)*this).get_size ();
- default: return sizeof (Coverage);
+ default:return sizeof (Coverage);
}
}
/* Returns -1 if not covered. */
- inline unsigned int get_coverage (uint16_t glyph_id) const {
+ inline int get_coverage (uint16_t glyph_id) const {
switch (coverageFormat) {
case 1: return ((const CoverageFormat1&)*this).get_coverage(glyph_id);
case 2: return ((const CoverageFormat2&)*this).get_coverage(glyph_id);
- default: return -1;
+ default:return -1;
}
}
USHORT coverageFormat; /* Format identifier */
};
+/*
+ * Class Definition
+ */
+
+struct ClassDefFormat1 {
+ /* GlyphIDs, in sorted numerical order */
+ DEFINE_ARRAY_TYPE (USHORT, classValueArray, glyphCount);
+
+ inline int get_class (uint16_t glyph_id) const {
+ if (glyph_id >= startGlyph && glyph_id < startGlyph + glyphCount)
+ return classValueArray[glyph_id - startGlyph];
+ return 0;
+ }
+
+ USHORT classFormat; /* Format identifier--format = 1 */
+ GlyphID startGlyph; /* First GlyphID of the classValueArray */
+ USHORT glyphCount; /* Size of the classValueArray */
+ USHORT classValueArray[]; /* Array of Class Values--one per GlyphID */
+};
+
+struct ClassRangeRecord {
+
+ inline int get_class (uint16_t glyph_id) const {
+ if (glyph_id >= start && glyph_id <= end)
+ return classValue;
+ return 0;
+ }
+
+ GlyphID start; /* First GlyphID in the range */
+ GlyphID end; /* Last GlyphID in the range */
+ USHORT classValue; /* Applied to all glyphs in the range
+ */
+};
+
+struct ClassDefFormat2 {
+ /* ClassRangeRecords, in sorted numerical start order */
+ DEFINE_ARRAY_TYPE (ClassRangeRecord, rangeRecord, rangeCount);
+
+ inline int get_class (uint16_t glyph_id) const {
+ // TODO: bsearch
+ for (int i = 0; i < rangeCount; i++) {
+ int classValue = rangeRecord[i].get_class (glyph_id);
+ if (classValue > 0)
+ return classValue;
+ }
+ return 0;
+ }
+
+ USHORT classFormat; /* Format identifier--format = 2 */
+ USHORT rangeCount; /* Number of Number of ClassRangeRecords */
+ ClassRangeRecord rangeRecord[]; /* Array of glyph ranges--ordered by
+ * Start GlyphID */
+};
+
+struct ClassDef {
+ DEFINE_NON_INSTANTIABLE(ClassDef);
+
+ inline unsigned int get_size (void) const {
+ switch (classFormat) {
+ case 1: return ((const ClassDefFormat1&)*this).get_size ();
+ case 2: return ((const ClassDefFormat2&)*this).get_size ();
+ default:return sizeof (ClassDef);
+ }
+ }
+
+ /* Returns 0 if not found. */
+ inline int get_class (uint16_t glyph_id) const {
+ switch (classFormat) {
+ case 1: return ((const ClassDefFormat1&)*this).get_class(glyph_id);
+ case 2: return ((const ClassDefFormat2&)*this).get_class(glyph_id);
+ default:return 0;
+ }
+ }
+
+ USHORT classFormat; /* Format identifier */
+};
+
+