[GDEF] Finish internal API
authorBehdad Esfahbod <behdad@behdad.org>
Fri, 25 Jan 2008 00:38:56 +0000 (19:38 -0500)
committerBehdad Esfahbod <behdad@behdad.org>
Fri, 25 Jan 2008 00:39:49 +0000 (19:39 -0500)
src/hb-ot-layout-private.h
src/hb-ot-layout.cc
src/hb-ot-layout.h

index f5fc30e..e0b7be0 100644 (file)
 #include "hb-private.h"
 #include "hb-ot-layout.h"
 
+/* XXX */
+#include "harfbuzz-buffer.h"
+
+
 typedef uint16_t hb_ot_layout_class_t;
 typedef uint16_t hb_ot_layout_glyph_properties_t;
+typedef uint16_t hb_ot_layout_lookup_flags_t;
 typedef int hb_ot_layout_coverage_t;   /* -1 is not covered, >= 0 otherwise */
 
 
 HB_BEGIN_DECLS();
 
+static hb_bool_t
+_hb_ot_layout_has_new_glyph_classes (HB_OT_Layout *layout);
+
 static hb_ot_layout_glyph_properties_t
 _hb_ot_layout_get_glyph_properties (HB_OT_Layout *layout,
                                    hb_glyph_t    glyph);
 
-static hb_bool_t
-_hb_ot_layout_has_new_glyph_classes (HB_OT_Layout *layout);
+static bool
+_hb_ot_layout_check_glyph_properties (HB_OT_Layout                    *layout,
+                                     HB_GlyphItem                     gitem,
+                                     hb_ot_layout_lookup_flags_t      lookup_flags,
+                                     hb_ot_layout_glyph_properties_t *property);
 
 HB_END_DECLS();
 
index 8b9b905..faad280 100644 (file)
@@ -1,4 +1,6 @@
 /*
+ * Copyright (C) 1998-2004  David Turner and Werner Lemberg
+ * Copyright (C) 2006  Behdad Esfahbod
  * Copyright (C) 2007,2008  Red Hat, Inc.
  *
  *  This is part of HarfBuzz, an OpenType Layout engine library.
@@ -33,6 +35,7 @@
 #include "hb-ot-layout-gdef-private.h"
 #include "hb-ot-layout-gsub-private.h"
 
+
 #include <stdlib.h>
 #include <string.h>
 
@@ -114,63 +117,55 @@ _hb_ot_layout_get_glyph_properties (HB_OT_Layout *layout,
   }
 }
 
-#if 0
 static bool
-_hb_ot_layout_check_glyph_properties (HB_OT_Layout *layout,
-                                     HB_GlyphItem  gitem,
-                                     HB_UShort     flags,
-                                     HB_UShort*    property)
+_hb_ot_layout_check_glyph_properties (HB_OT_Layout                    *layout,
+                                     HB_GlyphItem                     gitem,
+                                     hb_ot_layout_lookup_flags_t      lookup_flags,
+                                     hb_ot_layout_glyph_properties_t *property)
 {
-  HB_Error  error;
+  /* TODO ugh, clean this mess up */
+  hb_ot_layout_glyph_class_t basic_glyph_class;
+  hb_ot_layout_glyph_properties_t desired_attachment_class;
+
+  if (gitem->gproperties == HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED)
+  {
+    gitem->gproperties = _hb_ot_layout_get_glyph_properties (layout, gitem->gindex);
+    if (gitem->gproperties == HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED)
+      return false;
+  }
 
-  if ( gdef )
+  *property = gitem->gproperties;
+
+  /* If the glyph was found in the MarkAttachmentClass table,
+   * then that class value is the high byte of the result,
+   * otherwise the low byte contains the basic type of the glyph
+   * as defined by the GlyphClassDef table.
+   */
+  if (*property & LookupFlag::MarkAttachmentType)
+    basic_glyph_class = HB_OT_LAYOUT_GLYPH_CLASS_MARK;
+  else
+    basic_glyph_class = (hb_ot_layout_glyph_class_t) *property;
+
+  /* Not covered, if, for example, basic_glyph_class
+   * is HB_GDEF_LIGATURE and lookup_flags includes LookupFlags::IgnoreLigatures
+   */
+  if (lookup_flags & basic_glyph_class)
+    return false;
+
+  /* The high byte of lookup_flags has the meaning
+   * "ignore marks of attachment type different than
+   * the attachment type specified."
+   */
+  desired_attachment_class = lookup_flags & LookupFlag::MarkAttachmentType;
+  if (desired_attachment_class)
   {
-    HB_UShort basic_glyph_class;
-    HB_UShort desired_attachment_class;
-
-    if ( gitem->gproperties == HB_GLYPH_PROPERTIES_UNKNOWN )
-    {
-      error = HB_GDEF_Get_Glyph_Property( gdef, gitem->gindex, &gitem->gproperties );
-      if ( error )
-       return error;
-    }
-
-    *property = gitem->gproperties;
-
-    /* If the glyph was found in the MarkAttachmentClass table,
-     * then that class value is the high byte of the result,
-     * otherwise the low byte contains the basic type of the glyph
-     * as defined by the GlyphClassDef table.
-     */
-    if ( *property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS  )
-      basic_glyph_class = HB_GDEF_MARK;
-    else
-      basic_glyph_class = *property;
-
-    /* Return Not_Covered, if, for example, basic_glyph_class
-     * is HB_GDEF_LIGATURE and LookFlags includes HB_LOOKUP_FLAG_IGNORE_LIGATURES
-     */
-    if ( flags & basic_glyph_class )
-      return HB_Err_Not_Covered;
-
-    /* The high byte of LookupFlags has the meaning
-     * "ignore marks of attachment type different than
-     * the attachment type specified."
-     */
-    desired_attachment_class = flags & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS;
-    if ( desired_attachment_class )
-    {
-      if ( basic_glyph_class == HB_GDEF_MARK &&
-          *property != desired_attachment_class )
-       return HB_Err_Not_Covered;
-    }
-  } else {
-      *property = 0;
+    if (basic_glyph_class == HB_OT_LAYOUT_GLYPH_CLASS_MARK &&
+        *property != desired_attachment_class )
+      return false;
   }
 
-  return HB_Err_Ok;
+  return true;
 }
-#endif
 
 
 hb_ot_layout_glyph_class_t
index 4ac6e38..fefe24f 100644 (file)
 
 HB_BEGIN_DECLS();
 
-typedef enum {
-  HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED        = 0x0000,
-  HB_OT_LAYOUT_GLYPH_CLASS_BASE_GLYPH  = 0x0002,
-  HB_OT_LAYOUT_GLYPH_CLASS_LIGATURE    = 0x0004,
-  HB_OT_LAYOUT_GLYPH_CLASS_MARK                = 0x0008,
-  HB_OT_LAYOUT_GLYPH_CLASS_COMPONENT   = 0x0010
-} hb_ot_layout_glyph_class_t;
-
 /*
  * HB_OT_Layout
  */
@@ -62,6 +54,14 @@ hb_ot_layout_create_sanitize (char *data,
  * GDEF
  */
 
+typedef enum {
+  HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED        = 0x0000,
+  HB_OT_LAYOUT_GLYPH_CLASS_BASE_GLYPH  = 0x0002,
+  HB_OT_LAYOUT_GLYPH_CLASS_LIGATURE    = 0x0004,
+  HB_OT_LAYOUT_GLYPH_CLASS_MARK                = 0x0008,
+  HB_OT_LAYOUT_GLYPH_CLASS_COMPONENT   = 0x0010
+} hb_ot_layout_glyph_class_t;
+
 hb_bool_t
 hb_ot_layout_has_font_glyph_classes (HB_OT_Layout              *layout);