summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@behdad.org>2007-07-06 11:29:21 -0400
committerBehdad Esfahbod <behdad@behdad.org>2007-07-06 11:29:21 -0400
commit4c2556cb4c38a56c3a5087deb54aa6262ab3aff9 (patch)
tree65b11bb3d33a870a1b0770542fbe6b31dd8394f3
parent5b2e947fd2b7c5ea49b2bef1e0190d99a525058c (diff)
downloadharfbuzz-4c2556cb4c38a56c3a5087deb54aa6262ab3aff9.tar.gz
[gdef] Initial implementation
-rw-r--r--src/harfbuzz-gdef-private.h144
1 files changed, 142 insertions, 2 deletions
diff --git a/src/harfbuzz-gdef-private.h b/src/harfbuzz-gdef-private.h
index 0d95dad5..91083c09 100644
--- a/src/harfbuzz-gdef-private.h
+++ b/src/harfbuzz-gdef-private.h
@@ -1,8 +1,148 @@
#ifndef HARFBUZZ_GDEF_PRIVATE_H
#define HARFBUZZ_GDEF_PRIVATE_H
-#include "harfbuzz-private.h"
-#include "harfbuzz-gdef.h"
+#include "harfbuzz-open-private.h"
+struct GDEFHeader {
+ Fixed version; /* Version of the GDEF table--initially
+ * 0x00010000 */
+ Offset glyphClassDef; /* Offset to class definition table
+ * for glyph type--from beginning of
+ * GDEF header (may be NULL) */
+ Offset attachList; /* Offset to list of glyphs with
+ * attachment points--from beginning
+ * of GDEF header (may be NULL) */
+ Offset ligCaretList; /* Offset to list of positioning points
+ * for ligature carets--from beginning
+ * of GDEF header (may be NULL) */
+ Offset markAttachClassDef; /* Offset to class definition table for
+ * mark attachment type--from beginning
+ * of GDEF header (may be NULL) */
+};
+
+struct GlyphClassDef : ClassDef {
+ static const uint16_t BaseGlyph = 0x0001u;
+ static const uint16_t LigatureGlyph = 0x0002u;
+ static const uint16_t MarkGlyph = 0x0003u;
+ static const uint16_t ComponentGlyph = 0x0004u;
+};
+
+
+struct AttachList {
+ /* XXX */
+
+ Offset coverage; /* Offset to Coverage table -- from
+ * beginning of AttachList table */
+ USHORT glyphCount; /* Number of glyphs with attachment
+ * points */
+ Offset attachPoint[]; /* Array of offsets to AttachPoint
+ * tables--from beginning of AttachList
+ * table--in Coverage Index order */
+};
+
+struct AttachPoint {
+ /* XXX */
+
+ USHORT pointCount; /* Number of attachment points on
+ * this glyph */
+ USHORT pointIndex[]; /* Array of contour point indices--in
+ * increasing numerical order */
+};
+
+/*
+ * Ligature Caret Table
+ */
+
+struct CaretValue;
+
+struct LigCaretList {
+ /* XXX */
+
+ Offset coverage; /* Offset to Coverage table--from
+ * beginning of LigCaretList table */
+ USHORT ligGlyphCount; /* Number of ligature glyphs */
+ Offset ligGlyph[]; /* Array of offsets to LigGlyph
+ * tables--from beginning of
+ * LigCaretList table--in Coverage
+ * Index order */
+};
+
+struct LigGlyph {
+ /* Caret value tables, in increasing coordinate order */
+ DEFINE_OFFSET_ARRAY_TYPE (CaretValue, caretValue, caretCount);
+ /* XXX */
+
+ USHORT caretCount; /* Number of CaretValues for this
+ * ligature (components - 1) */
+ Offset caretValue[]; /* Array of offsets to CaretValue
+ * tables--from beginning of LigGlyph
+ * table--in increasing coordinate
+ * order */
+};
+
+struct CaretValueFormat1 {
+ USHORT caretValueFormat; /* Format identifier--format = 1 */
+ SHORT coordinate; /* X or Y value, in design units */
+
+ inline int get_caret_value (int ppem) const {
+ return /* XXX garbage */ coordinate / ppem;
+ }
+};
+
+struct CaretValueFormat2 {
+ USHORT caretValueFormat; /* Format identifier--format = 2 */
+ USHORT caretValuePoint; /* Contour point index on glyph */
+
+ inline int get_caret_value (int ppem) const {
+ return /* XXX garbage */ 0 / ppem;
+ }
+};
+
+struct CaretValueFormat3 {
+ inline const Device* get_device (void) const {
+ return (const Device*)((const char*)this + deviceTable);
+ }
+
+ USHORT caretValueFormat; /* Format identifier--format = 3 */
+ SHORT coordinate; /* X or Y value, in design units */
+ Offset deviceTable; /* Offset to Device table for X or Y
+ * value--from beginning of CaretValue
+ * table */
+
+ inline int get_caret_value (int ppem) const {
+ return /* XXX garbage */ (coordinate + get_device()->get_delta (ppem)) / ppem;
+ }
+};
+
+struct CaretValue {
+ DEFINE_NON_INSTANTIABLE(CaretValue);
+
+ inline unsigned int get_size (void) const {
+ switch (u.caretValueFormat) {
+ case 1: return sizeof (u.format1);
+ case 2: return sizeof (u.format2);
+ case 3: return sizeof (u.format3);
+ default:return sizeof (u.caretValueFormat);
+ }
+ }
+
+ /* XXX we need access to a load-contour-point vfunc here */
+ inline int get_caret_value (int ppem) const {
+ switch (u.caretValueFormat) {
+ case 1: return u.format1.get_caret_value(ppem);
+ case 2: return u.format2.get_caret_value(ppem);
+ case 3: return u.format3.get_caret_value(ppem);
+ default:return 0;
+ }
+ }
+
+ union {
+ USHORT caretValueFormat; /* Format identifier */
+ CaretValueFormat1 format1;
+ CaretValueFormat2 format2;
+ CaretValueFormat3 format3;
+ /* XXX old HarfBuzz code has a format 4 here! */
+ } u;
+};
#endif /* HARFBUZZ_GDEF_PRIVATE_H */