[pango/harfbuzz-ng: 2/17] Implement the first substitute()
- From: Behdad Esfahbod <behdad src gnome org>
- To: svn-commits-list gnome org
- Subject: [pango/harfbuzz-ng: 2/17] Implement the first substitute()
- Date: Tue, 12 May 2009 03:30:28 -0400 (EDT)
commit 6c68a82054505d3d1c8101cdb534fc8843354804
Author: Behdad Esfahbod <behdad behdad org>
Date: Wed Apr 15 22:56:15 2009 -0400
Implement the first substitute()
---
pango/opentype/harfbuzz-buffer-private.h | 8 +-
pango/opentype/harfbuzz-buffer.c | 4 +-
pango/opentype/harfbuzz-buffer.h | 2 +-
pango/opentype/harfbuzz-gdef-private.h | 4 +-
pango/opentype/harfbuzz-gdef.c | 6 +-
pango/opentype/harfbuzz-gdef.h | 2 +-
pango/opentype/harfbuzz-gpos.c | 8 +-
pango/opentype/harfbuzz-gpos.h | 2 +-
pango/opentype/harfbuzz-gsub.h | 2 +-
pango/opentype/hb-ot-layout-gsub-private.h | 88 +++++++++++++++++++++++++---
pango/opentype/hb-ot-layout-open-private.h | 2 +-
pango/opentype/hb-ot-layout-private.h | 23 ++++---
pango/opentype/hb-ot-layout.cc | 54 ++++++++++++-----
pango/opentype/hb-ot-layout.h | 2 +-
14 files changed, 151 insertions(+), 56 deletions(-)
diff --git a/pango/opentype/harfbuzz-buffer-private.h b/pango/opentype/harfbuzz-buffer-private.h
index 02ae336..dbecc7a 100644
--- a/pango/opentype/harfbuzz-buffer-private.h
+++ b/pango/opentype/harfbuzz-buffer-private.h
@@ -33,7 +33,7 @@
HB_BEGIN_HEADER
-#define HB_GLYPH_PROPERTIES_UNKNOWN 0xFFFF
+#define HB_GLYPH_PROPERTY_UNKNOWN 0xFFFF
HB_INTERNAL void
_hb_buffer_swap( HB_Buffer buffer );
@@ -83,9 +83,9 @@ _hb_buffer_allocate_ligid( HB_Buffer buffer );
#define OUT_GLYPH( pos ) (buffer->out_string[(pos)].gindex)
#define OUT_ITEM( pos ) (&buffer->out_string[(pos)])
-#define CHECK_Property( layout, index, flags, property ) \
- (error = _hb_ot_layout_check_glyph_properties((layout), (index), (flags), (property)) \
- ? HB_Err_Ok : HB_Err_Not_Covered)
+#define CHECK_Property( layout, index, flags, properties ) \
+ ({unsigned int _p; error = _hb_ot_layout_check_glyph_property((layout), (index), (flags), (&_p)) \
+ ? HB_Err_Ok : HB_Err_Not_Covered, *(properties) = _p; error;})
#define ADD_String( buffer, num_in, num_out, glyph_data, component, ligID ) \
( ( error = _hb_buffer_add_output_glyphs( (buffer), \
diff --git a/pango/opentype/harfbuzz-buffer.c b/pango/opentype/harfbuzz-buffer.c
index 568fbd8..3008c93 100644
--- a/pango/opentype/harfbuzz-buffer.c
+++ b/pango/opentype/harfbuzz-buffer.c
@@ -187,7 +187,7 @@ hb_buffer_add_glyph( HB_Buffer buffer,
glyph->cluster = cluster;
glyph->component = 0;
glyph->ligID = 0;
- glyph->gproperties = HB_GLYPH_PROPERTIES_UNKNOWN;
+ glyph->gproperty = HB_GLYPH_PROPERTY_UNKNOWN;
buffer->in_length++;
@@ -304,7 +304,7 @@ _hb_buffer_add_output_glyphs( HB_Buffer buffer,
item->cluster = cluster;
item->component = component;
item->ligID = ligID;
- item->gproperties = HB_GLYPH_PROPERTIES_UNKNOWN;
+ item->gproperty = HB_GLYPH_PROPERTY_UNKNOWN;
}
buffer->in_pos += num_in;
diff --git a/pango/opentype/harfbuzz-buffer.h b/pango/opentype/harfbuzz-buffer.h
index b134407..b89b3c4 100644
--- a/pango/opentype/harfbuzz-buffer.h
+++ b/pango/opentype/harfbuzz-buffer.h
@@ -38,7 +38,7 @@ typedef struct HB_GlyphItemRec_ {
HB_UInt cluster;
HB_UShort component;
HB_UShort ligID;
- HB_UShort gproperties;
+ HB_UShort gproperty;
} HB_GlyphItemRec, *HB_GlyphItem;
typedef struct HB_PositionRec_ {
diff --git a/pango/opentype/harfbuzz-gdef-private.h b/pango/opentype/harfbuzz-gdef-private.h
index 4a57520..e22b1b2 100644
--- a/pango/opentype/harfbuzz-gdef-private.h
+++ b/pango/opentype/harfbuzz-gdef-private.h
@@ -105,13 +105,13 @@ struct HB_LigGlyph_
HB_INTERNAL HB_Error
_HB_GDEF_Add_Glyph_Property( HB_GDEFHeader* gdef,
HB_UShort glyphID,
- HB_UShort property );
+ HB_UShort properties );
HB_INTERNAL HB_Error
_HB_GDEF_Check_Property( HB_GDEFHeader* gdef,
HB_GlyphItem item,
HB_UShort flags,
- HB_UShort* property );
+ HB_UShort* properties );
HB_INTERNAL HB_Error
_HB_GDEF_LoadMarkAttachClassDef_From_LookupFlags( HB_GDEFHeader* gdef,
diff --git a/pango/opentype/harfbuzz-gdef.c b/pango/opentype/harfbuzz-gdef.c
index 8fecf4c..1bda907 100644
--- a/pango/opentype/harfbuzz-gdef.c
+++ b/pango/opentype/harfbuzz-gdef.c
@@ -1074,14 +1074,14 @@ _HB_GDEF_Check_Property( HB_GDEFHeader* gdef,
HB_UShort basic_glyph_class;
HB_UShort desired_attachment_class;
- if ( gitem->gproperties == HB_GLYPH_PROPERTIES_UNKNOWN )
+ if ( gitem->gproperty == HB_GLYPH_PROPERTY_UNKNOWN )
{
- error = HB_GDEF_Get_Glyph_Property( gdef, gitem->gindex, &gitem->gproperties );
+ error = HB_GDEF_Get_Glyph_Property( gdef, gitem->gindex, &gitem->gproperty );
if ( error )
return error;
}
- *property = gitem->gproperties;
+ *property = gitem->gproperty;
/* If the glyph was found in the MarkAttachmentClass table,
* then that class value is the high byte of the result,
diff --git a/pango/opentype/harfbuzz-gdef.h b/pango/opentype/harfbuzz-gdef.h
index 84afe17..dc33d21 100644
--- a/pango/opentype/harfbuzz-gdef.h
+++ b/pango/opentype/harfbuzz-gdef.h
@@ -121,7 +121,7 @@ HB_Error HB_Done_GDEF_Table ( HB_GDEFHeader* gdef );
HB_Error HB_GDEF_Get_Glyph_Property( HB_GDEFHeader* gdef,
HB_UShort glyphID,
- HB_UShort* property );
+ HB_UShort* properties );
HB_Error HB_GDEF_Build_ClassDefinition( HB_GDEFHeader* gdef,
HB_UShort num_glyphs,
diff --git a/pango/opentype/harfbuzz-gpos.c b/pango/opentype/harfbuzz-gpos.c
index 560a291..c4e8a78 100644
--- a/pango/opentype/harfbuzz-gpos.c
+++ b/pango/opentype/harfbuzz-gpos.c
@@ -1783,7 +1783,7 @@ static HB_Error Lookup_CursivePos( GPOS_Instance* gpi,
return HB_Err_Not_Covered;
}
- /* Glyphs not having the right GDEF properties will be ignored, i.e.,
+ /* Glyphs not having the right GDEF property will be ignored, i.e.,
gpi->last won't be reset (contrary to user defined properties). */
if ( CHECK_Property( gpos->layout, IN_CURITEM(), flags, &property ) )
@@ -2224,7 +2224,7 @@ static HB_Error Lookup_MarkBasePos( GPOS_Instance* gpi,
while ( i <= buffer->in_pos )
{
- property = _hb_ot_layout_get_glyph_properties (gpos->layout, IN_GLYPH(j));
+ property = _hb_ot_layout_get_glyph_property (gpos->layout, IN_GLYPH(j));
if ( !property )
return HB_Err_Not_Covered;
@@ -2633,7 +2633,7 @@ static HB_Error Lookup_MarkLigPos( GPOS_Instance* gpi,
while ( i <= buffer->in_pos )
{
- property = _hb_ot_layout_get_glyph_properties (gpos->layout, IN_GLYPH(j));
+ property = _hb_ot_layout_get_glyph_property (gpos->layout, IN_GLYPH(j));
if ( !property )
return HB_Err_Not_Covered;
@@ -2960,7 +2960,7 @@ static HB_Error Lookup_MarkMarkPos( GPOS_Instance* gpi,
j = buffer->in_pos - 1;
while ( i <= buffer->in_pos )
{
- property = _hb_ot_layout_get_glyph_properties (gpos->layout, IN_GLYPH(j));
+ property = _hb_ot_layout_get_glyph_property (gpos->layout, IN_GLYPH(j));
if ( !property )
return HB_Err_Not_Covered;
diff --git a/pango/opentype/harfbuzz-gpos.h b/pango/opentype/harfbuzz-gpos.h
index b1aa135..0460e2b 100644
--- a/pango/opentype/harfbuzz-gpos.h
+++ b/pango/opentype/harfbuzz-gpos.h
@@ -145,7 +145,7 @@ HB_Error HB_GPOS_Query_Features( HB_GPOSHeader* gpos,
HB_Error HB_GPOS_Add_Feature( HB_GPOSHeader* gpos,
HB_UShort feature_index,
- HB_UInt property );
+ HB_UInt properties );
HB_Error HB_GPOS_Clear_Features( HB_GPOSHeader* gpos );
diff --git a/pango/opentype/harfbuzz-gsub.h b/pango/opentype/harfbuzz-gsub.h
index b1e78ce..f4deac1 100644
--- a/pango/opentype/harfbuzz-gsub.h
+++ b/pango/opentype/harfbuzz-gsub.h
@@ -121,7 +121,7 @@ HB_Error HB_GSUB_Query_Features( HB_GSUBHeader* gsub,
HB_Error HB_GSUB_Add_Feature( HB_GSUBHeader* gsub,
HB_UShort feature_index,
- HB_UInt property );
+ HB_UInt properties );
HB_Error HB_GSUB_Clear_Features( HB_GSUBHeader* gsub );
diff --git a/pango/opentype/hb-ot-layout-gsub-private.h b/pango/opentype/hb-ot-layout-gsub-private.h
index c8d5405..d8c1d8d 100644
--- a/pango/opentype/hb-ot-layout-gsub-private.h
+++ b/pango/opentype/hb-ot-layout-gsub-private.h
@@ -32,19 +32,89 @@
#include "hb-ot-layout-open-private.h"
#include "hb-ot-layout-gdef-private.h"
+#include "harfbuzz-buffer-private.h" /* XXX */
+
+#define DEFINE_GET_GLYPH_COVERAGE(name) \
+ inline hb_ot_layout_coverage_t get_##name (hb_codepoint_t glyph) const { \
+ const Coverage &c = get_coverage (); \
+ return c.get_coverage (glyph); \
+ }
+
+#define SUBTABLE_SUBSTITUTE \
+ bool substitute (hb_ot_layout_t *layout, \
+ hb_buffer_t *buffer, \
+ unsigned int context_length, \
+ unsigned int nesting_level_left, \
+ unsigned int lookup_flag) const
struct SingleSubstFormat1 {
friend struct SingleSubst;
private:
- inline bool substitute (hb_ot_layout_t *layout,
- hb_buffer_t *buffer,
- unsigned int context_length,
- unsigned int nesting_level_left) const {
-// if (get_coverage (IN_CURGLYPH()))
-// return ;
+ DEFINE_GET_ACCESSOR (Coverage, coverage, coverage);
+ DEFINE_GET_GLYPH_COVERAGE (glyph_coverage);
+
+ inline SUBTABLE_SUBSTITUTE {
+ hb_codepoint_t glyph_id;
+ hb_ot_layout_coverage_t index;
+ unsigned int property;
+
+ HB_UNUSED (nesting_level_left);
+
+ if (HB_UNLIKELY (context_length < 1))
+ return false;
+
+ if (!_hb_ot_layout_check_glyph_property (layout, IN_CURITEM (), lookup_flag, &property))
+ return false;
+
+ glyph_id = IN_CURGLYPH ();
+
+ index = get_glyph_coverage (glyph_id);
+ if (-1 == index)
+ return false;
+
+ glyph_id += deltaGlyphID;
+ _hb_buffer_replace_output_glyph (buffer, glyph_id, context_length == NO_CONTEXT);
+
+ if ( _hb_ot_layout_has_new_glyph_classes (layout) )
+ {
+ /* we inherit the old glyph class to the substituted glyph */
+ _hb_ot_layout_set_glyph_property (layout, glyph_id, property);
+ }
+
+ return true;
+}
+
+#if 0
+
+ switch ( ss->SubstFormat )
+ {
+ case 1:
+ value = (IN_CURGLYPH() + ss->ssf.ssf1.DeltaGlyphID ) & 0xFFFF;
+ if ( REPLACE_Glyph( buffer, value, nesting_level ) )
+ return error;
+ break;
+
+ case 2:
+ if ( index >= ss->ssf.ssf2.GlyphCount )
+ return ERR(HB_Err_Invalid_SubTable);
+ value = ss->ssf.ssf2.Substitute[index];
+ if ( REPLACE_Glyph( buffer, value, nesting_level ) )
+ return error;
+ break;
+
+ default:
+ return ERR(HB_Err_Invalid_SubTable);
+ }
+
+ if ( _hb_ot_layout_has_new_glyph_classes (layout) )
+ {
+ /* we inherit the old glyph class to the substituted glyph */
+
+ hb_ot_layout_set_glyph_class (layout, value, properties);
}
+#endif
private:
USHORT substFormat; /* Format identifier--format = 1 */
@@ -490,7 +560,8 @@ struct SubstLookupSubTable {
hb_buffer_t *buffer,
unsigned int context_length,
unsigned int nesting_level_left,
- unsigned int lookup_type) const {
+ unsigned int lookup_type,
+ unsigned int lookup_flag) const {
}
private:
@@ -545,6 +616,7 @@ struct SubstLookup : Lookup {
unsigned int context_length,
unsigned int nesting_level_left) const {
unsigned int lookup_type = get_type ();
+ unsigned int lookup_flag = get_flag ();
if (HB_UNLIKELY (nesting_level_left == 0))
return false;
@@ -553,7 +625,7 @@ struct SubstLookup : Lookup {
for (unsigned int i = 0; i < get_subtable_count (); i++)
if (get_subtable (i).substitute (layout, buffer,
context_length, nesting_level_left,
- lookup_type))
+ lookup_type, lookup_flag))
return true;
return false;
diff --git a/pango/opentype/hb-ot-layout-open-private.h b/pango/opentype/hb-ot-layout-open-private.h
index d5ca810..4123a43 100644
--- a/pango/opentype/hb-ot-layout-open-private.h
+++ b/pango/opentype/hb-ot-layout-open-private.h
@@ -671,7 +671,7 @@ struct Lookup {
inline bool ignore_base_glyphs(void) const { return lookupFlag & LookupFlag::IgnoreBaseGlyphs; }
inline bool ignore_ligatures (void) const { return lookupFlag & LookupFlag::IgnoreLigatures; }
inline bool ignore_marks (void) const { return lookupFlag & LookupFlag::IgnoreMarks; }
- inline bool get_mark_attachment_type (void) const { return lookupFlag & LookupFlag::MarkAttachmentType; }
+ inline unsigned int get_mark_attachment_type (void) const { return lookupFlag & LookupFlag::MarkAttachmentType; }
inline unsigned int get_type (void) const { return lookupType; }
inline unsigned int get_flag (void) const { return lookupFlag; }
diff --git a/pango/opentype/hb-ot-layout-private.h b/pango/opentype/hb-ot-layout-private.h
index a1be8aa..ae728eb 100644
--- a/pango/opentype/hb-ot-layout-private.h
+++ b/pango/opentype/hb-ot-layout-private.h
@@ -34,9 +34,7 @@
#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 unsigned int hb_ot_layout_class_t;
typedef int hb_ot_layout_coverage_t; /* -1 is not covered, >= 0 otherwise */
/* XXX #define HB_OT_LAYOUT_INTERNAL static */
@@ -51,15 +49,20 @@ HB_BEGIN_DECLS();
HB_OT_LAYOUT_INTERNAL hb_bool_t
_hb_ot_layout_has_new_glyph_classes (hb_ot_layout_t *layout);
-HB_OT_LAYOUT_INTERNAL hb_ot_layout_glyph_properties_t
-_hb_ot_layout_get_glyph_properties (hb_ot_layout_t *layout,
- hb_codepoint_t glyph);
+HB_OT_LAYOUT_INTERNAL unsigned int
+_hb_ot_layout_get_glyph_property (hb_ot_layout_t *layout,
+ hb_codepoint_t glyph);
+
+HB_OT_LAYOUT_INTERNAL void
+_hb_ot_layout_set_glyph_property (hb_ot_layout_t *layout,
+ hb_codepoint_t glyph,
+ unsigned int property);
HB_OT_LAYOUT_INTERNAL hb_bool_t
-_hb_ot_layout_check_glyph_properties (hb_ot_layout_t *layout,
- HB_GlyphItem gitem,
- hb_ot_layout_lookup_flags_t lookup_flags,
- hb_ot_layout_glyph_properties_t *property);
+_hb_ot_layout_check_glyph_property (hb_ot_layout_t *layout,
+ HB_GlyphItem gitem,
+ unsigned int lookup_flags,
+ unsigned int *property);
HB_END_DECLS();
diff --git a/pango/opentype/hb-ot-layout.cc b/pango/opentype/hb-ot-layout.cc
index 01923db..5a5e176 100644
--- a/pango/opentype/hb-ot-layout.cc
+++ b/pango/opentype/hb-ot-layout.cc
@@ -98,6 +98,8 @@ hb_ot_layout_destroy (hb_ot_layout_t *layout)
* GDEF
*/
+/* XXX the public class_t is a mess */
+
hb_bool_t
hb_ot_layout_has_font_glyph_classes (hb_ot_layout_t *layout)
{
@@ -110,9 +112,9 @@ _hb_ot_layout_has_new_glyph_classes (hb_ot_layout_t *layout)
return layout->new_gdef.len > 0;
}
-HB_OT_LAYOUT_INTERNAL hb_ot_layout_glyph_properties_t
-_hb_ot_layout_get_glyph_properties (hb_ot_layout_t *layout,
- hb_codepoint_t glyph)
+HB_OT_LAYOUT_INTERNAL unsigned int
+_hb_ot_layout_get_glyph_property (hb_ot_layout_t *layout,
+ hb_codepoint_t glyph)
{
hb_ot_layout_class_t klass;
@@ -138,22 +140,22 @@ _hb_ot_layout_get_glyph_properties (hb_ot_layout_t *layout,
}
HB_OT_LAYOUT_INTERNAL hb_bool_t
-_hb_ot_layout_check_glyph_properties (hb_ot_layout_t *layout,
- HB_GlyphItem gitem,
- hb_ot_layout_lookup_flags_t lookup_flags,
- hb_ot_layout_glyph_properties_t *property)
+_hb_ot_layout_check_glyph_property (hb_ot_layout_t *layout,
+ HB_GlyphItem gitem,
+ unsigned int lookup_flags,
+ unsigned int *property)
{
hb_ot_layout_glyph_class_t basic_glyph_class;
- hb_ot_layout_glyph_properties_t desired_attachment_class;
+ unsigned int desired_attachment_class;
- if (gitem->gproperties == HB_BUFFER_GLYPH_PROPERTIES_UNKNOWN)
+ if (gitem->gproperty == HB_BUFFER_GLYPH_PROPERTIES_UNKNOWN)
{
- gitem->gproperties = *property = _hb_ot_layout_get_glyph_properties (layout, gitem->gindex);
- if (gitem->gproperties == HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED)
+ gitem->gproperty = *property = _hb_ot_layout_get_glyph_property (layout, gitem->gindex);
+ if (gitem->gproperty == HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED)
return false;
}
- *property = gitem->gproperties;
+ *property = gitem->gproperty;
/* If the glyph was found in the MarkAttachmentClass table,
* then that class value is the high byte of the result,
@@ -179,27 +181,42 @@ _hb_ot_layout_check_glyph_properties (hb_ot_layout_t *layout,
if (desired_attachment_class)
{
if (basic_glyph_class == HB_OT_LAYOUT_GLYPH_CLASS_MARK &&
- *property != desired_attachment_class )
+ *property != desired_attachment_class)
return false;
}
return true;
}
+HB_OT_LAYOUT_INTERNAL void
+_hb_ot_layout_set_glyph_property (hb_ot_layout_t *layout,
+ hb_codepoint_t glyph,
+ unsigned int property)
+{
+ hb_ot_layout_glyph_class_t klass;
+
+ if (property & LookupFlag::MarkAttachmentType)
+ klass = HB_OT_LAYOUT_GLYPH_CLASS_MARK;
+ else
+ klass = (hb_ot_layout_glyph_class_t) property;
+
+ hb_ot_layout_set_glyph_class (layout, glyph, klass);
+}
+
hb_ot_layout_glyph_class_t
hb_ot_layout_get_glyph_class (hb_ot_layout_t *layout,
hb_codepoint_t glyph)
{
- hb_ot_layout_glyph_properties_t properties;
+ unsigned int property;
hb_ot_layout_class_t klass;
- properties = _hb_ot_layout_get_glyph_properties (layout, glyph);
+ property = _hb_ot_layout_get_glyph_property (layout, glyph);
- if (properties & 0xFF00)
+ if (property & LookupFlag::MarkAttachmentType)
return HB_OT_LAYOUT_GLYPH_CLASS_MARK;
- return (hb_ot_layout_glyph_class_t) properties;
+ return (hb_ot_layout_glyph_class_t) property;
}
void
@@ -212,6 +229,9 @@ hb_ot_layout_set_glyph_class (hb_ot_layout_t *layout,
hb_ot_layout_class_t gdef_klass;
int len = layout->new_gdef.len;
+ if (G_UNLIKELY (glyph > 65535))
+ return;
+
if (glyph >= len) {
int new_len;
unsigned char *new_klasses;
diff --git a/pango/opentype/hb-ot-layout.h b/pango/opentype/hb-ot-layout.h
index c29485c..a6b9d37 100644
--- a/pango/opentype/hb-ot-layout.h
+++ b/pango/opentype/hb-ot-layout.h
@@ -91,7 +91,7 @@ typedef enum {
HB_OT_LAYOUT_TABLE_TYPE_NONE
} hb_ot_layout_table_type_t;
-typedef uint16_t hb_ot_layout_feature_mask_t;
+typedef uint32_t hb_ot_layout_feature_mask_t;
#define HB_OT_LAYOUT_MAX_NESTING_LEVEL 100
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]