From 6f425b11799aa20dab553085f05744191b7318e2 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 24 Jan 2008 19:38:56 -0500 Subject: [PATCH] [GDEF] Finish internal API --- src/hb-ot-layout-private.h | 15 +++++- src/hb-ot-layout.cc | 95 ++++++++++++++++++-------------------- src/hb-ot-layout.h | 16 +++---- 3 files changed, 66 insertions(+), 60 deletions(-) diff --git a/src/hb-ot-layout-private.h b/src/hb-ot-layout-private.h index f5fc30e14..e0b7be03c 100644 --- a/src/hb-ot-layout-private.h +++ b/src/hb-ot-layout-private.h @@ -34,19 +34,30 @@ #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(); diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 8b9b90541..faad280db 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -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 #include @@ -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 ( gdef ) + if (gitem->gproperties == HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED) { - 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; + gitem->gproperties = _hb_ot_layout_get_glyph_properties (layout, gitem->gindex); + if (gitem->gproperties == HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED) + return false; } - return HB_Err_Ok; + *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) + { + if (basic_glyph_class == HB_OT_LAYOUT_GLYPH_CLASS_MARK && + *property != desired_attachment_class ) + return false; + } + + return true; } -#endif hb_ot_layout_glyph_class_t diff --git a/src/hb-ot-layout.h b/src/hb-ot-layout.h index 4ac6e380f..fefe24f38 100644 --- a/src/hb-ot-layout.h +++ b/src/hb-ot-layout.h @@ -31,14 +31,6 @@ 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);