Coverage.
diff --git a/src/harfbuzz-ng.cc b/src/harfbuzz-ng.cc
index ed817c5..7fdefd6 100644
--- a/src/harfbuzz-ng.cc
+++ b/src/harfbuzz-ng.cc
@@ -169,8 +169,9 @@
};
/* Glyph index number, same as uint16 (length = 16 bits) */
-struct GlyphID : USHORT {
-};
+//struct GlyphID : USHORT {
+//};
+DEFINE_INT_TYPE (GlyphID, u, 16); /* 16-bit unsigned integer. */
/* Offset to a table, same as uint16 (length = 16 bits), NULL offset = 0x0000 */
struct Offset : USHORT {
@@ -219,7 +220,6 @@
} OpenTypeTable;
typedef struct OffsetTable {
- DEFINE_NOT_INSTANTIABLE(OffsetTable);
/* OpenTypeTables, in no particular order */
DEFINE_ARRAY_TYPE (TableDirectory, tableDir, numTables);
// TODO: Implement find_table
@@ -237,7 +237,6 @@
*/
struct TTCHeader {
- DEFINE_NOT_INSTANTIABLE(TTCHeader);
/* OpenTypeFonts, in no particular order */
DEFINE_OFFSET_ARRAY_TYPE (OffsetTable, offsetTable, numFonts);
@@ -255,7 +254,7 @@
* OpenType Font File
*/
-typedef struct OpenTypeFontFile {
+struct OpenTypeFontFile {
DEFINE_NOT_INSTANTIABLE(OpenTypeFontFile);
static const hb_tag_t TrueTypeTag = HB_TAG ( 0 , 1 , 0 , 0 );
static const hb_tag_t CFFTag = HB_TAG ('O','T','T','O');
@@ -322,7 +321,6 @@
} ScriptRecord, LangSysRecord, FeatureRecord;
struct ScriptList {
- DEFINE_NOT_INSTANTIABLE(ScriptList);
/* Scripts, in sorted alphabetical tag order */
DEFINE_RECORD_ARRAY_TYPE (Script, scriptRecord, scriptCount);
@@ -332,7 +330,6 @@
};
struct Script {
- DEFINE_NOT_INSTANTIABLE(Script);
/* LangSys', in sorted alphabetical tag order */
DEFINE_RECORD_ARRAY_TYPE (LangSys, langSysRecord, langSysCount);
@@ -357,7 +354,6 @@
};
struct LangSys {
- DEFINE_NOT_INSTANTIABLE(LangSys);
/* Feature indices, in no particular order */
DEFINE_ARRAY_TYPE (USHORT, featureIndex, featureCount);
@@ -381,7 +377,6 @@
};
struct FeatureList {
- DEFINE_NOT_INSTANTIABLE(FeatureList);
/* Feature indices, in sorted alphabetical tag order */
DEFINE_RECORD_ARRAY_TYPE (Feature, featureRecord, featureCount);
@@ -393,7 +388,6 @@
};
struct Feature {
- DEFINE_NOT_INSTANTIABLE(Feature);
/* LookupList indices, in no particular order */
DEFINE_ARRAY_TYPE (USHORT, lookupIndex, lookupCount);
@@ -412,7 +406,6 @@
};
struct LookupList {
- DEFINE_NOT_INSTANTIABLE(LookupList);
/* Lookup indices, in sorted alphabetical tag order */
DEFINE_OFFSET_ARRAY_TYPE (Lookup, lookupOffset, lookupCount);
@@ -433,7 +426,6 @@
};
struct Lookup {
- DEFINE_NOT_INSTANTIABLE(Lookup);
/* SubTables, in the desired order */
DEFINE_OFFSET_ARRAY_TYPE (SubTable, subTableOffset, subTableCount);
@@ -451,6 +443,81 @@
* entries long. */
};
+struct CoverageFormat1 {
+ /* GlyphIDs, in sorted numerical order */
+ DEFINE_ARRAY_TYPE (GlyphID, glyphArray, glyphCount);
+
+ inline unsigned int get_coverage (uint16_t glyph_id) const {
+ GlyphID gid (glyph_id);
+ // TODO: bsearch
+ for (int i = 0; i < glyphCount; i++)
+ if (gid == glyphArray[i])
+ return 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 */
+};
+
+struct RangeRecord {
+ inline unsigned int get_coverage (uint16_t glyph_id) const {
+ if (glyph_id >= start && glyph_id <= end)
+ return startCoverageIndex + (glyph_id - start);
+ return -1;
+ }
+
+ GlyphID start; /* First GlyphID in the range */
+ GlyphID end; /* Last GlyphID in the range */
+ USHORT startCoverageIndex; /* Coverage Index of first GlyphID in
+ * range */
+};
+
+struct CoverageFormat2 {
+ /* RangeRecords, in sorted numerical start order */
+ DEFINE_ARRAY_TYPE (RangeRecord, rangeRecord, rangeCount);
+
+ inline unsigned 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);
+ if (coverage >= 0)
+ return coverage;
+ }
+ return -1;
+ }
+
+ USHORT coverageFormat; /* Format identifier--format = 2 */
+ USHORT rangeCount; /* Number of RangeRecords */
+ RangeRecord rangeRecord[]; /* Array of glyph ranges--ordered by
+ * Start GlyphID. rangeCount entries
+ * long */
+};
+
+struct CoverageFormat {
+ DEFINE_NOT_INSTANTIABLE(CoverageFormat);
+
+ inline unsigned int get_size (void) const {
+ switch (coverageFormat) {
+ case 1: return ((const CoverageFormat1&)*this).get_size ();
+ case 2: return ((const CoverageFormat2&)*this).get_size ();
+ default: return sizeof (coverageFormat);
+ }
+ }
+
+ /* Returns -1 if not covered. */
+ inline unsigned 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;
+ }
+ }
+
+ USHORT coverageFormat; /* Format identifier */
+};