From b9d7688fb3d45894901484b74095c4f11cab6196 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 23 Jan 2008 01:38:10 -0500 Subject: [PATCH] Finish and test GDEF --- src/harfbuzz-gdef-private.h | 72 ++++++++++++++++++++++++++++++++------------- src/harfbuzz-open-private.h | 23 ++++++++------- src/harfbuzz-open.h | 4 +++ src/main.cc | 10 +++++++ 4 files changed, 77 insertions(+), 32 deletions(-) diff --git a/src/harfbuzz-gdef-private.h b/src/harfbuzz-gdef-private.h index 135f1c4..1820127 100644 --- a/src/harfbuzz-gdef-private.h +++ b/src/harfbuzz-gdef-private.h @@ -3,27 +3,6 @@ #include "harfbuzz-open-private.h" -struct GDEFHeader { - /* TODO */ - - private: - 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) */ -}; -ASSERT_SIZE (GDEFHeader, 12); - struct GlyphClassDef : ClassDef { static const uint16_t BaseGlyph = 0x0001u; static const uint16_t LigatureGlyph = 0x0002u; @@ -180,4 +159,55 @@ struct CaretValue { } u; }; + +#define DEFINE_ACCESSOR0(const, Type, name, Name) \ + inline const Type* name (void) const { \ + if (!Name) return NULL; \ + return (const Type *)((const char*)this + Name); \ + } +#define DEFINE_ACCESSOR(Type, name, Name) \ + DEFINE_ACCESSOR0(const, Type, name, Name) \ + DEFINE_ACCESSOR0( , Type, name, Name) + +struct GDEFHeader { + + DEFINE_ACCESSOR (ClassDef, get_glyph_class_def, glyphClassDef); + DEFINE_ACCESSOR (AttachList, get_attach_list, attachList); + DEFINE_ACCESSOR (LigCaretList, get_lig_caret_list, ligCaretList); + DEFINE_ACCESSOR (ClassDef, get_mark_attach_class_def, markAttachClassDef); + + /* Returns 0 if not found. */ + inline int get_glyph_class (uint16_t glyph_id) const { + const ClassDef *class_def = get_glyph_class_def (); + if (!class_def) return 0; + return class_def->get_class (glyph_id); + } + + /* Returns 0 if not found. */ + inline int get_mark_attachment_type (uint16_t glyph_id) const { + const ClassDef *class_def = get_mark_attach_class_def (); + if (!class_def) return 0; + return class_def->get_class (glyph_id); + } + + /* TODO get_attach and get_lig_caret */ + + private: + 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) */ +}; +ASSERT_SIZE (GDEFHeader, 12); + #endif /* HARFBUZZ_GDEF_PRIVATE_H */ diff --git a/src/harfbuzz-open-private.h b/src/harfbuzz-open-private.h index ded36ac..57f1bd3 100644 --- a/src/harfbuzz-open-private.h +++ b/src/harfbuzz-open-private.h @@ -175,6 +175,7 @@ struct Tag { inline Tag (const char *c) { v[0] = c[0]; v[1] = c[1]; v[2] = c[2]; v[3] = c[3]; } inline bool operator== (Tag o) const { return v[0]==o.v[0]&&v[1]==o.v[1]&&v[2]==o.v[2]&&v[3]==o.v[3]; } inline bool operator== (const char *c) const { return v[0]==c[0]&&v[1]==c[1]&&v[2]==c[2]&&v[3]==c[3]; } + inline bool operator== (uint32_t i) const { return i == (uint32_t) *this; } inline operator uint32_t(void) const { return (v[0]<<24)+(v[1]<<16) +(v[2]<<8)+v[3]; } /* What the char* converters return is NOT nul-terminated. Print using "%.4s" */ inline operator const char* (void) const { return (const char *)this; } @@ -399,6 +400,8 @@ struct Script { return (LangSys *)((char*)this + defaultLangSys); } + /* TODO implement find_language_system based on find_tag */ + private: Offset defaultLangSys; /* Offset to DefaultLangSys table--from * beginning of Script table--may be NULL */ @@ -420,6 +423,8 @@ struct LangSys { return reqFeatureIndex;; } + /* TODO implement find_feature */ + private: Offset lookupOrder; /* = NULL (reserved for an offset to a * reordering table) */ @@ -674,8 +679,8 @@ struct ClassDef { /* Returns 0 if not found. */ inline int get_class (uint16_t glyph_id) const { switch (u.classFormat) { - case 1: u.format1.get_class(glyph_id); - case 2: u.format2.get_class(glyph_id); + case 1: return u.format1.get_class(glyph_id); + case 2: return u.format2.get_class(glyph_id); default:return 0; } } @@ -740,7 +745,7 @@ ASSERT_SIZE (Device, 6); assert (name##List); \ return (const Type##List *)((const char*)this + name##List); \ } \ - inline const Type& name (unsigned int i) const { \ + inline const Type& get_##name (unsigned int i) const { \ return (*get_##name##_list())[i]; \ } #define DEFINE_LIST_ACCESSOR(Type, name) \ @@ -749,15 +754,11 @@ ASSERT_SIZE (Device, 6); struct GSUBGPOSHeader { -/* - inline unsigned int get_size (void) const { - return offsetof (GSUBGPOSHeader, padding); - } - */ + DEFINE_LIST_ACCESSOR(Script, script); /* get_script_list, get_script(i) */ + DEFINE_LIST_ACCESSOR(Feature, feature);/* get_feature_list, get_feature(i) */ + DEFINE_LIST_ACCESSOR(Lookup, lookup); /* get_lookup_list, get_lookup(i) */ - DEFINE_LIST_ACCESSOR(Script, script); /* get_script_list and script(i) */ - DEFINE_LIST_ACCESSOR(Feature, feature);/* get_feature_list and feature(i) */ - DEFINE_LIST_ACCESSOR(Lookup, lookup); /* get_lookup_list and lookup(i) */ + /* TODO implement find_script */ private: Fixed_Version version; /* Version of the GSUB/GPOS table--initially set diff --git a/src/harfbuzz-open.h b/src/harfbuzz-open.h index f52fda7..370bbdf 100644 --- a/src/harfbuzz-open.h +++ b/src/harfbuzz-open.h @@ -7,6 +7,10 @@ HARFBUZZ_BEGIN_DECLS(); typedef uint32_t hb_tag_t; #define HB_TAG(a,b,c,d) ((hb_tag_t)(((uint8_t)a<<24)|((uint8_t)b<<16)|((uint8_t)c<<8)|(uint8_t)d)) +#define HB_TAG_STR(s) (HB_TAG(((const char *) s)[0], \ + ((const char *) s)[1], \ + ((const char *) s)[2], \ + ((const char *) s)[3])) HARFBUZZ_END_DECLS(); diff --git a/src/main.cc b/src/main.cc index dd2990b..62e7cf0 100644 --- a/src/main.cc +++ b/src/main.cc @@ -91,6 +91,16 @@ main (int argc, char **argv) printf (" Lookup %2d of %2d: type %d, flags %04x\n", n_lookup+1, num_lookups, lookup.get_type(), lookup.get_flag()); } + } else if (table.get_tag() == "GDEF") { + const GDEFHeader &gdef = (const GDEFHeader&)*ot[table]; + + /* + for (int glyph = 0; glyph < 1000; glyph++) + printf (" glyph %d has class %d and mark attachment type %d\n", + glyph, + gdef.get_glyph_class (glyph), + gdef.get_mark_attachment_type (glyph)); + */ } } } -- 2.7.4