diff --git a/src/OT/glyf/Glyph.hh b/src/OT/glyf/Glyph.hh index 826cc1cb2..9c2ce9a93 100644 --- a/src/OT/glyf/Glyph.hh +++ b/src/OT/glyf/Glyph.hh @@ -104,6 +104,9 @@ struct Glyph if (hori_aw < 0) hori_aw = 0; int lsb = roundf (xMin - leftSideX); plan->hmtx_map.set (new_gid, hb_pair ((unsigned) hori_aw, lsb)); + //flag value should be computed using non-empty glyphs + if (type != EMPTY && lsb != xMin) + plan->head_maxp_info.allXMinIsLsb = false; signed vert_aw = roundf (topSideY - bottomSideY); if (vert_aw < 0) vert_aw = 0; diff --git a/src/OT/glyf/glyf-helpers.hh b/src/OT/glyf/glyf-helpers.hh index 7b4ba274c..30106b2b9 100644 --- a/src/OT/glyf/glyf-helpers.hh +++ b/src/OT/glyf/glyf-helpers.hh @@ -50,6 +50,13 @@ _add_head_and_set_loca_version (hb_subset_plan_t *plan, bool use_short_loca) head_prime->xMax = plan->head_maxp_info.xMax; head_prime->yMin = plan->head_maxp_info.yMin; head_prime->yMax = plan->head_maxp_info.yMax; + + unsigned orig_flag = head_prime->flags; + if (plan->head_maxp_info.allXMinIsLsb) + orig_flag |= 1 << 1; + else + orig_flag &= ~(1 << 1); + head_prime->flags = orig_flag; } bool success = plan->add_table (HB_OT_TAG_head, head_prime_blob); diff --git a/src/hb-ot-head-table.hh b/src/hb-ot-head-table.hh index c2dceb2d0..798e82da6 100644 --- a/src/hb-ot-head-table.hh +++ b/src/hb-ot-head-table.hh @@ -97,6 +97,7 @@ struct head * entire font as HBUINT32, then store * 0xB1B0AFBAu - sum. */ HBUINT32 magicNumber; /* Set to 0x5F0F3CF5u. */ + public: HBUINT16 flags; /* Bit 0: Baseline for font at y=0; * Bit 1: Left sidebearing point at x=0; * Bit 2: Instructions may depend on point size; @@ -141,6 +142,7 @@ struct head * encoded in the cmap subtables represent proper * support for those code points. * Bit 15: Reserved, set to 0. */ + protected: HBUINT16 unitsPerEm; /* Valid range is from 16 to 16384. This value * should be a power of 2 for fonts that have * TrueType outlines. */ diff --git a/src/hb-subset-plan.hh b/src/hb-subset-plan.hh index c5db27cc2..c0a85e12d 100644 --- a/src/hb-subset-plan.hh +++ b/src/hb-subset-plan.hh @@ -49,7 +49,8 @@ struct head_maxp_info_t maxCompositePoints (0), maxCompositeContours (0), maxComponentElements (0), - maxComponentDepth (0) {} + maxComponentDepth (0), + allXMinIsLsb (true) {} int xMin; int xMax; @@ -61,6 +62,7 @@ struct head_maxp_info_t unsigned maxCompositeContours; unsigned maxComponentElements; unsigned maxComponentDepth; + bool allXMinIsLsb; }; typedef struct head_maxp_info_t head_maxp_info_t;