&& (version < 0x00010002 || markGlyphSetsDef[0].sanitize (c, this));
}
+
+ /* glyph_props is a 16-bit integer where the lower 8-bit have bits representing
+ * glyph class and other bits, and high 8-bit gthe mark attachment type (if any).
+ * Not to be confused with lookup_props which is very similar. */
+ inline unsigned int get_glyph_props (hb_codepoint_t glyph) const
+ {
+ unsigned int klass = get_glyph_class (glyph);
+
+ switch (klass) {
+ default:
+ case UnclassifiedGlyph: return HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED;
+ case BaseGlyph: return HB_OT_LAYOUT_GLYPH_CLASS_BASE_GLYPH;
+ case LigatureGlyph: return HB_OT_LAYOUT_GLYPH_CLASS_LIGATURE;
+ case ComponentGlyph: return HB_OT_LAYOUT_GLYPH_CLASS_COMPONENT;
+ case MarkGlyph:
+ klass = get_mark_attachment_type (glyph);
+ return HB_OT_LAYOUT_GLYPH_CLASS_MARK | (klass << 8);
+ }
+ }
+
+
private:
FixedVersion version; /* Version of the GDEF table--currently
* 0x00010002 */
#define cursive_chain() var.i16[1] /* character to which this connects, may be positive or negative */
typedef enum {
+ HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED = 0x0001,
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_UNCLASSIFIED = 0x0020
+ HB_OT_LAYOUT_GLYPH_CLASS_COMPONENT = 0x0010
} hb_ot_layout_glyph_class_t;
* GDEF
*/
+HB_INTERNAL unsigned int
+_hb_ot_layout_get_glyph_property (hb_face_t *face,
+ hb_glyph_info_t *info);
+
HB_INTERNAL hb_bool_t
_hb_ot_layout_check_glyph_property (hb_face_t *face,
hb_glyph_info_t *ginfo,
unsigned int lookup_props,
unsigned int *property);
-HB_INTERNAL hb_bool_t
+static inline hb_bool_t
_hb_ot_layout_skip_mark (hb_face_t *face,
hb_glyph_info_t *ginfo,
unsigned int lookup_props,
- unsigned int *property);
+ unsigned int *property_out)
+{
+ unsigned int property;
+
+ property = _hb_ot_layout_get_glyph_property (face, ginfo);
+ if (property_out)
+ *property_out = property;
+
+ /* If it's a mark, skip it we don't accept it. */
+ if (property & HB_OT_LAYOUT_GLYPH_CLASS_MARK)
+ return !_hb_ot_layout_check_glyph_property (face, ginfo, lookup_props, NULL);
+
+ /* If not a mark, don't skip. */
+ return false;
+}
+
HB_END_DECLS
free (layout);
}
-static const GDEF&
+static inline const GDEF&
_get_gdef (hb_face_t *face)
{
return likely (face->ot_layout && face->ot_layout->gdef) ? *face->ot_layout->gdef : Null(GDEF);
}
-static const GSUB&
+static inline const GSUB&
_get_gsub (hb_face_t *face)
{
return likely (face->ot_layout && face->ot_layout->gsub) ? *face->ot_layout->gsub : Null(GSUB);
}
-static const GPOS&
+static inline const GPOS&
_get_gpos (hb_face_t *face)
{
return likely (face->ot_layout && face->ot_layout->gpos) ? *face->ot_layout->gpos : Null(GPOS);
return _get_gdef (face).has_glyph_classes ();
}
-static unsigned int
-_hb_ot_layout_get_glyph_property_from_gdef (hb_face_t *face,
- hb_glyph_info_t *info)
-{
- hb_codepoint_t glyph = info->codepoint;
-
- unsigned int klass;
- const GDEF &gdef = _get_gdef (face);
-
- klass = gdef.get_glyph_class (glyph);
-
- switch (klass) {
- default:
- case GDEF::UnclassifiedGlyph: return HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED;
- case GDEF::BaseGlyph: return HB_OT_LAYOUT_GLYPH_CLASS_BASE_GLYPH;
- case GDEF::LigatureGlyph: return HB_OT_LAYOUT_GLYPH_CLASS_LIGATURE;
- case GDEF::ComponentGlyph: return HB_OT_LAYOUT_GLYPH_CLASS_COMPONENT;
- case GDEF::MarkGlyph:
- klass = gdef.get_mark_attachment_type (glyph);
- return HB_OT_LAYOUT_GLYPH_CLASS_MARK | (klass << 8);
- }
-}
-
-static inline unsigned int
+unsigned int
_hb_ot_layout_get_glyph_property (hb_face_t *face,
hb_glyph_info_t *info)
{
if (!info->gproperty())
- info->gproperty() = _hb_ot_layout_get_glyph_property_from_gdef (face, info);
+ {
+ const GDEF &gdef = _get_gdef (face);
+ info->gproperty() = gdef.get_glyph_props (info->codepoint);
+ }
return info->gproperty();
}
return true;
}
-hb_bool_t
-_hb_ot_layout_skip_mark (hb_face_t *face,
- hb_glyph_info_t *ginfo,
- unsigned int lookup_props,
- unsigned int *property_out)
-{
- unsigned int property;
-
- property = _hb_ot_layout_get_glyph_property (face, ginfo);
- if (property_out)
- *property_out = property;
-
- /* If it's a mark, skip it we don't accept it. */
- if (property & HB_OT_LAYOUT_GLYPH_CLASS_MARK)
- return !_hb_ot_layout_check_glyph_property (face, ginfo, lookup_props, NULL);
-
- /* If not a mark, don't skip. */
- return false;
-}
-
unsigned int
hb_ot_layout_get_attach_points (hb_face_t *face,
hb_codepoint_t glyph,