Define get_for_data() factories
authorBehdad Esfahbod <behdad@behdad.org>
Wed, 23 Jan 2008 07:01:37 +0000 (02:01 -0500)
committerBehdad Esfahbod <behdad@behdad.org>
Wed, 23 Jan 2008 07:01:37 +0000 (02:01 -0500)
src/harfbuzz-gdef-private.h
src/harfbuzz-open-private.h
src/main.cc

index 1820127..db3ab98 100644 (file)
@@ -170,6 +170,9 @@ struct CaretValue {
        DEFINE_ACCESSOR0(     , Type, name, Name)
 
 struct GDEFHeader {
+  static const hb_tag_t GDEFTag                = HB_TAG ('G','D','E','F');
+
+  STATIC_DEFINE_GET_FOR_DATA (GDEFHeader);
 
   DEFINE_ACCESSOR (ClassDef, get_glyph_class_def, glyphClassDef);
   DEFINE_ACCESSOR (AttachList, get_attach_list, attachList);
index 57f1bd3..4633ef1 100644 (file)
   DEFINE_LEN(Type, array, num) \
   DEFINE_SIZE(Type, array, num)
 
-#define DEFINE_NON_INSTANTIABLE(Type) \
-  private: inline Type() {} /* cannot be instantiated */ \
-  public:
-
 /* An array type is one that contains a variable number of objects
  * as its last item.  An array object is extended with len() and size()
  * methods, as well as overloaded [] operator. */
 
 
 
+
+/*
+ * Class features
+ */
+
+/* makes class uninstantiable.  should be used for union classes that don't
+ * contain any complete type */
+#define DEFINE_NON_INSTANTIABLE(Type) \
+  private: inline Type() {} /* cannot be instantiated */ \
+  public:
+
+/* get_for_data() is a static class method returning a reference to an
+ * instance of Type located at the input data location.  It's just a
+ * fancy cast! */
+#define STATIC_DEFINE_GET_FOR_DATA0(const, Type) \
+  static inline const Type& get_for_data (const char *data) { \
+    return *(const Type*)data; \
+  }
+#define STATIC_DEFINE_GET_FOR_DATA(Type) \
+       STATIC_DEFINE_GET_FOR_DATA0(const, Type) \
+       STATIC_DEFINE_GET_FOR_DATA0(     , Type)
+
+
+
 /*
  *
  * The OpenType Font File
@@ -293,15 +313,7 @@ struct OpenTypeFontFile {
   static const hb_tag_t CFFTag         = HB_TAG ('O','T','T','O');
   static const hb_tag_t TTCTag         = HB_TAG ('t','t','c','f');
 
-  /* Factory: ::get(font_data)
-   * This is how you get a handle to one of these
-   */
-  static inline const OpenTypeFontFile& get (const char *font_data) {
-    return (const OpenTypeFontFile&)*font_data;
-  }
-  static inline OpenTypeFontFile& get (char *font_data) {
-    return (OpenTypeFontFile&)*font_data;
-  }
+  STATIC_DEFINE_GET_FOR_DATA (OpenTypeFontFile);
 
   /* This is how you get a table */
   inline const char* get_table (const OpenTypeTable& table) const {
@@ -753,6 +765,10 @@ ASSERT_SIZE (Device, 6);
        DEFINE_LIST_ACCESSOR0(     , Type, name)
 
 struct GSUBGPOSHeader {
+  static const hb_tag_t GSUBTag                = HB_TAG ('G','S','U','B');
+  static const hb_tag_t GPOSTag                = HB_TAG ('G','P','O','S');
+
+  STATIC_DEFINE_GET_FOR_DATA (GSUBGPOSHeader);
 
   DEFINE_LIST_ACCESSOR(Script, script);         /* get_script_list, get_script(i) */
   DEFINE_LIST_ACCESSOR(Feature, feature);/* get_feature_list, get_feature(i) */
index 62e7cf0..313723e 100644 (file)
@@ -18,7 +18,7 @@ main (int argc, char **argv)
   
   printf ("Opened font file %s: %d bytes long\n", argv[1], len);
   
-  const OpenTypeFontFile &ot = OpenTypeFontFile::get (font_data);
+  const OpenTypeFontFile &ot = OpenTypeFontFile::get_for_data (font_data);
 
   switch (ot.get_tag()) {
   case OpenTypeFontFile::TrueTypeTag:
@@ -49,7 +49,7 @@ main (int argc, char **argv)
              (const char *)table.get_tag(), table.get_offset(), table.get_length());
 
       if (table.get_tag() == "GSUB" || table.get_tag() == "GPOS") {
-        const GSUBGPOSHeader &g = (const GSUBGPOSHeader&)*ot[table];
+        const GSUBGPOSHeader &g = GSUBGPOSHeader::get_for_data (ot[table]);
 
        const ScriptList &scripts = *g.get_script_list();
        int num_scripts = scripts.get_len ();
@@ -92,15 +92,13 @@ main (int argc, char **argv)
                  lookup.get_type(), lookup.get_flag());
        }
       } else if (table.get_tag() == "GDEF") {
-        const GDEFHeader &gdef = (const GDEFHeader&)*ot[table];
+        const GDEFHeader &gdef = GDEFHeader::get_for_data (ot[table]);
 
-       /*
-       for (int glyph = 0; glyph < 1000; glyph++)
+       for (int glyph = 0; glyph < 1; 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));
-        */
       }
     }
   }