diff --git a/third_party/txt/src/minikin/GraphemeBreak.cpp b/third_party/txt/src/minikin/GraphemeBreak.cpp index 6a7775a9e6f3e816245cec280b826f7cc1fcb93a..7e907352537c99a563b442d3135db6eebfe76cfe 100644 --- a/third_party/txt/src/minikin/GraphemeBreak.cpp +++ b/third_party/txt/src/minikin/GraphemeBreak.cpp @@ -113,8 +113,7 @@ bool GraphemeBreak::isGraphemeBreak(const float* advances, return false; } // Rule GB9, x (Extend | ZWJ); Rule GB9a, x SpacingMark; Rule GB9b, Prepend x - // TODO(abarth): Add U_GCB_ZWJ once we update ICU. - if (p2 == U_GCB_EXTEND || /* p2 == U_GCB_ZWJ || */ p2 == U_GCB_SPACING_MARK || + if (p2 == U_GCB_EXTEND || p2 == U_GCB_ZWJ || p2 == U_GCB_SPACING_MARK || p1 == U_GCB_PREPEND) { return false; } @@ -158,25 +157,26 @@ bool GraphemeBreak::isGraphemeBreak(const float* advances, } } - // TODO(abarth): Enablet his code once we update ICU. // Tailored version of Rule GB11, ZWJ × (Glue_After_Zwj | EBG) // We try to make emoji sequences with ZWJ a single grapheme cluster, but only // if they actually merge to one cluster. So we are more relaxed than the UAX // #29 rules in accepting any emoji character after the ZWJ, but are tighter // in that we only treat it as one cluster if a ligature is actually formed - // and we also require the character before the ZWJ to also be an emoji. if - // (p1 == U_GCB_ZWJ && isEmoji(c2) && offset_back > start) { - // // look at character before ZWJ to see that both can participate in an - // emoji zwj sequence uint32_t c0 = 0; size_t offset_backback = - // offset_back; U16_PREV(buf, start, offset_backback, c0); if (c0 == - // 0xFE0F && offset_backback > start) { - // // skip over emoji variation selector - // U16_PREV(buf, start, offset_backback, c0); - // } - // if (isEmoji(c0)) { - // return false; - // } - // } + // and we also require the character before the ZWJ to also be an emoji. + if (p1 == U_GCB_ZWJ && isEmoji(c2) && offset_back > start) { + // look at character before ZWJ to see that both can participate in an + // emoji zwj sequence + uint32_t c0 = 0; + size_t offset_backback = offset_back; + U16_PREV(buf, start, offset_backback, c0); + if (c0 == 0xFE0F && offset_backback > start) { + // skip over emoji variation selector + U16_PREV(buf, start, offset_backback, c0); + } + if (isEmoji(c0)) { + return false; + } + } // Tailored version of Rule GB12 and Rule GB13 that look at even-odd cases. // sot (RI RI)* RI x RI diff --git a/third_party/txt/src/minikin/HbFontCache.cpp b/third_party/txt/src/minikin/HbFontCache.cpp index a78ee7a0d346074ff2c115d6c7c63b98d4832802..d60fcc73730e0126aaeed1859330037b5f330cd6 100644 --- a/third_party/txt/src/minikin/HbFontCache.cpp +++ b/third_party/txt/src/minikin/HbFontCache.cpp @@ -103,12 +103,11 @@ hb_font_t* getHbFontLocked(const MinikinFont* minikinFont) { hb_font_set_scale(parent_font, upem, upem); font = hb_font_create_sub_font(parent_font); - // TODO(abarth): Enable this code once we update harfbuzz. - // std::vector variations; - // for (const FontVariation& variation : minikinFont->GetAxes()) { - // variations.push_back({variation.axisTag, variation.value}); - // } - // hb_font_set_variations(font, variations.data(), variations.size()); + std::vector variations; + for (const FontVariation& variation : minikinFont->GetAxes()) { + variations.push_back({variation.axisTag, variation.value}); + } + hb_font_set_variations(font, variations.data(), variations.size()); hb_font_destroy(parent_font); hb_face_destroy(face); fontCache->put(fontId, font);