[Mac] Some ligatures are applied across different fronts
authorrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 12 Apr 2013 16:54:01 +0000 (16:54 +0000)
committerrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 12 Apr 2013 16:54:01 +0000 (16:54 +0000)
https://bugs.webkit.org/show_bug.cgi?id=113604

Reviewed by Darin Adler.

The bug was caused by applyFontTransforms applying ligatures without updating the font data in the glyph buffer.

Suppose we have characters AB and A uses font X and B uses font Y. Further suppose that we have ligatures for AB
in Y. The problem was that WithIterator::advanceInternal calls applyFontTransforms on AB to apply this ligature
even though A and B use different fonts. Since X doesn't contain the same ligature for A to be paired with that
of B in X, we get a blank A.

Fixed the bug by resetting lastGlyphCount after calling applyFontTransforms. This ensures that we don't call
applyFontTransforms across different fonts.

No new tests since this requires a variant of Osaka font that doesn't come with OS X.

The bug 114482 tracks the effort to add a test for this bug fix. I've already asked someone to create a custom
font for us so that we can test this bug fix but that's going to a while.

* platform/graphics/WidthIterator.cpp:
(WebCore::WidthIterator::advanceInternal):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@148283 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/WidthIterator.cpp

index 2acf6c2499067bca03d9827aa3cebc4312ebd202..f3a8180f282980389662e53a91fd6f32a5d03d29 100644 (file)
@@ -1,3 +1,28 @@
+2013-04-12  Ryosuke Niwa  <rniwa@webkit.org>
+
+        [Mac] Some ligatures are applied across different fronts
+        https://bugs.webkit.org/show_bug.cgi?id=113604
+
+        Reviewed by Darin Adler.
+
+        The bug was caused by applyFontTransforms applying ligatures without updating the font data in the glyph buffer.
+
+        Suppose we have characters AB and A uses font X and B uses font Y. Further suppose that we have ligatures for AB
+        in Y. The problem was that WithIterator::advanceInternal calls applyFontTransforms on AB to apply this ligature
+        even though A and B use different fonts. Since X doesn't contain the same ligature for A to be paired with that
+        of B in X, we get a blank A.
+
+        Fixed the bug by resetting lastGlyphCount after calling applyFontTransforms. This ensures that we don't call
+        applyFontTransforms across different fonts.
+
+        No new tests since this requires a variant of Osaka font that doesn't come with OS X.
+
+        The bug 114482 tracks the effort to add a test for this bug fix. I've already asked someone to create a custom
+        font for us so that we can test this bug fix but that's going to a while.
+
+        * platform/graphics/WidthIterator.cpp:
+        (WebCore::WidthIterator::advanceInternal):
+
 2013-04-12  Ryosuke Niwa  <rniwa@webkit.org>
 
         [Mac] Enable spellchecking tests added in r141471
index 027bfe62d0e2012048bfa2af5c4322a792b4bee2..f5beb91927cf71bf7b541db05e59308377a47fd1 100644 (file)
@@ -189,8 +189,10 @@ inline unsigned WidthIterator::advanceInternal(TextIterator& textIterator, Glyph
         }
 
         if (fontData != lastFontData && width) {
-            if (shouldApplyFontTransforms())
+            if (shouldApplyFontTransforms()) {
                 m_runWidthSoFar += applyFontTransforms(glyphBuffer, m_run.ltr(), lastGlyphCount, lastFontData, m_typesettingFeatures, charactersTreatedAsSpace);
+                lastGlyphCount = glyphBuffer->size(); // applyFontTransforms doesn't update when there had been only one glyph.
+            }
 
             lastFontData = fontData;
             if (m_fallbackFonts && fontData != primaryFont) {