Disable GSUB feature when text contains surrogates
authorEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@nokia.com>
Tue, 22 May 2012 10:29:54 +0000 (12:29 +0200)
committerQt by Nokia <qt-info@nokia.com>
Tue, 29 May 2012 09:35:21 +0000 (11:35 +0200)
This is a work-around for a feature missing in Harfbuzz that
can make a text run that contains a surrogate and a ligature
crash. This will potentially cause the ligatures to break up
if you combine them with a surrogate, causing visual changes
to the text, but the scripts that require GSUB should not be
affected by this, since they will not use surrogates. Still,
it's not a permanent fix, but will serve as a bandaid for the
crash until the underlying problem has been fixed.

Task-number: QTBUG-22275
Change-Id: I90c37fba76bc7d1f369f3afddd1bd0dc306f5750
Reviewed-by: Jiang Jiang <jiang.jiang@nokia.com>
src/3rdparty/harfbuzz/src/harfbuzz-shaper.cpp

index 2e1b532..6f663d5 100644 (file)
@@ -882,6 +882,17 @@ HB_Bool HB_SelectScript(HB_ShaperItem *shaper_item, const HB_OpenTypeFeature *fe
     return true;
 }
 
+static HB_Bool containsSurrogates(HB_ShaperItem *item)
+{
+    for (hb_uint32 i=0; i<item->stringLength; ++i) {
+        HB_UChar16 ucs = item->string[i];
+        if ( HB_IsHighSurrogate(ucs) || HB_IsLowSurrogate(ucs) )
+            return true;
+    }
+
+    return false;
+}
+
 HB_Bool HB_OpenTypeShape(HB_ShaperItem *item, const hb_uint32 *properties)
 {
     HB_GlyphAttributes *tmpAttributes;
@@ -921,7 +932,7 @@ HB_Bool HB_OpenTypeShape(HB_ShaperItem *item, const hb_uint32 *properties)
 #endif
 
     face->glyphs_substituted = false;
-    if (face->gsub) {
+    if (face->gsub && !containsSurrogates(item)) {
         unsigned int error = HB_GSUB_Apply_String(face->gsub, face->buffer);
         if (error && error != HB_Err_Not_Covered)
             return false;