diff --git a/src/hb-aat-fdsc-table.hh b/src/hb-aat-fdsc-table.hh index 136172c40..c3bc1d551 100644 --- a/src/hb-aat-fdsc-table.hh +++ b/src/hb-aat-fdsc-table.hh @@ -26,6 +26,7 @@ #define HB_AAT_FDSC_TABLE_HH #include "hb-aat-layout-common.hh" +#include "hb-open-type.hh" /* * fdsc -- Font descriptors @@ -37,17 +38,36 @@ namespace AAT { -struct GXFontDescriptor +struct FontDescriptor { + inline bool has_data () const { return tag; } + + inline int cmp (hb_tag_t a) const { return tag.cmp (a); } + + inline float get_value () const { return u.value.to_float (); } + + enum non_alphabetic_value_t { + Alphabetic = 0, + Dingbats = 1, + PiCharacters = 2, + Fleurons = 3, + DecorativeBorders = 4, + InternationalSymbols= 5, + MathSymbols = 6 + }; + inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this)); } - public: + protected: Tag tag; /* The 4-byte table tag name. */ + union { Fixed value; /* The value for the descriptor tag. */ + HBUINT32 nalfType; /* If the tag is `nalf`, see non_alphabetic_value_t */ + } u; public: DEFINE_SIZE_STATIC (8); }; @@ -77,6 +97,9 @@ struct fdsc * (default value: 0) */ }; + inline const FontDescriptor &get_descriptor (hb_tag_t style) const + { return descriptors.lsearch (style); } + inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); @@ -87,7 +110,7 @@ struct fdsc protected: Fixed version; /* Version number of the font descriptors * table (0x00010000 for the current version). */ - LArrayOf + LArrayOf descriptors; /* List of tagged-coordinate pairs style descriptors * that will be included to characterize this font. * Each descriptor consists of a pair. diff --git a/src/hb-aat-layout-common.hh b/src/hb-aat-layout-common.hh index 57228c410..74c70ded9 100644 --- a/src/hb-aat-layout-common.hh +++ b/src/hb-aat-layout-common.hh @@ -28,6 +28,7 @@ #define HB_AAT_LAYOUT_COMMON_HH #include "hb-aat-layout.hh" +#include "hb-open-type.hh" namespace AAT { diff --git a/src/hb-ot-head-table.hh b/src/hb-ot-head-table.hh index 931ccd40c..85867dbb9 100644 --- a/src/hb-ot-head-table.hh +++ b/src/hb-ot-head-table.hh @@ -54,6 +54,19 @@ struct head return 16 <= upem && upem <= 16384 ? upem : 1000; } + enum mac_style_flag_t { + BOLD = 1u<<0, + ITALIC = 1u<<1, + UNDERLINE = 1u<<2, + OUTLINE = 1u<<3, + SHADOW = 1u<<4, + CONDENSED = 1u<<5 + }; + + inline bool is_bold (void) const { return macStyle & BOLD; } + inline bool is_italic (void) const { return macStyle & ITALIC; } + inline bool is_condensed (void) const { return macStyle & CONDENSED; } + inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); diff --git a/src/hb-ot-os2-table.hh b/src/hb-ot-os2-table.hh index 46e8b708c..e06ed57a8 100644 --- a/src/hb-ot-os2-table.hh +++ b/src/hb-ot-os2-table.hh @@ -93,10 +93,56 @@ struct OS2 { enum { tableTag = HB_OT_TAG_OS2 }; + inline bool has_data () const { return this != &Null (OS2); } + inline const OS2V1Tail &v1 (void) const { return version >= 1 ? v1X : Null (OS2V1Tail); } inline const OS2V2Tail &v2 (void) const { return version >= 2 ? v2X : Null (OS2V2Tail); } inline const OS2V5Tail &v5 (void) const { return version >= 5 ? v5X : Null (OS2V5Tail); } + enum fs_selection_flag_t { + ITALIC = 1u<<0, + UNDERSCORE = 1u<<1, + NEGATIVE = 1u<<2, + OUTLINED = 1u<<3, + STRIKEOUT = 1u<<4, + BOLD = 1u<<5, + REGULAR = 1u<<6, + USE_TYPO_METRICS = 1u<<7, + WWS = 1u<<8, + OBLIQUE = 1u<<9 + }; + + inline bool is_italic (void) const { return fsSelection & ITALIC; } + inline bool is_oblique (void) const { return fsSelection & OBLIQUE; } + + enum us_width_class_t { + FWIDTH_ULTRA_CONDENSED = 1, /* 50% */ + FWIDTH_EXTRA_CONDENSED = 2, /* 62.5% */ + FWIDTH_CONDENSED = 3, /* 75% */ + FWIDTH_SEMI_CONDENSED = 4, /* 87.5% */ + FWIDTH_NORMAL = 5, /* 100% */ + FWIDTH_SEMI_EXPANDED = 6, /* 112.5% */ + FWIDTH_EXPANDED = 7, /* 125% */ + FWIDTH_EXTRA_EXPANDED = 8, /* 150% */ + FWIDTH_ULTRA_EXPANDED = 9 /* 200% */ + }; + + inline float get_width () const + { + switch (usWidthClass) { + case FWIDTH_ULTRA_CONDENSED:return 50.f; + case FWIDTH_EXTRA_CONDENSED:return 62.5f; + case FWIDTH_CONDENSED: return 75.f; + case FWIDTH_SEMI_CONDENSED: return 87.5f; + default: + case FWIDTH_NORMAL: return 100.f; + case FWIDTH_SEMI_EXPANDED: return 112.5f; + case FWIDTH_EXPANDED: return 125.f; + case FWIDTH_EXTRA_EXPANDED: return 150.f; + case FWIDTH_ULTRA_EXPANDED: return 200.f; + } + } + inline bool subset (hb_subset_plan_t *plan) const { hb_blob_t *os2_blob = hb_sanitize_context_t ().reference_table (plan->source); diff --git a/src/hb-ot-stat-table.hh b/src/hb-ot-stat-table.hh index 7ad45db20..e18ff1ec5 100644 --- a/src/hb-ot-stat-table.hh +++ b/src/hb-ot-stat-table.hh @@ -57,25 +57,6 @@ enum // Reserved = 0xFFFC /* Reserved for future use — set to zero. */ }; -struct StatAxisRecord -{ - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (likely (c->check_struct (this))); - } - - protected: - Tag axisTag; /* A tag identifying the axis of design variation. */ - NameID axisNameID; /* The name ID for entries in the 'name' table that - * provide a display string for this axis. */ - HBUINT16 axisOrdering; /* A value that applications can use to determine - * primary sorting of face names, or for ordering - * of descriptors when composing family or face names. */ - public: - DEFINE_SIZE_STATIC (8); -}; - struct AxisValueFormat1 { inline bool sanitize (hb_sanitize_context_t *c) const @@ -223,6 +204,25 @@ struct AxisValue DEFINE_SIZE_UNION (2, format); }; +struct StatAxisRecord +{ + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (likely (c->check_struct (this))); + } + + protected: + Tag tag; /* A tag identifying the axis of design variation. */ + NameID nameID; /* The name ID for entries in the 'name' table that + * provide a display string for this axis. */ + HBUINT16 ordering; /* A value that applications can use to determine + * primary sorting of face names, or for ordering + * of descriptors when composing family or face names. */ + public: + DEFINE_SIZE_STATIC (8); +}; + struct STAT { enum { tableTag = HB_OT_TAG_STAT };