#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();
/*
+ * 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.
#include "hb-ot-layout-gdef-private.h"
#include "hb-ot-layout-gsub-private.h"
+
#include <stdlib.h>
#include <string.h>
}
}
-#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
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
*/
* 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);