[OSX] Some words are placed on top of each other in complex text layout
authormmaxfield@apple.com <mmaxfield@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 10 Nov 2014 18:55:08 +0000 (18:55 +0000)
committermmaxfield@apple.com <mmaxfield@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 10 Nov 2014 18:55:08 +0000 (18:55 +0000)
https://bugs.webkit.org/show_bug.cgi?id=138348

Reviewed by Simon Fraser.

Source/WebCore:

Some complex text layouts have lots of diacritics being placed all over the place.
CoreText sometimes compensates for this by adjusting the advances of the glyphs
throughout the string to make glyphs appear in the correct place. This means that
we can't naively cache the width of a space character; instead, we must obey
CoreText when it gives us an advance for a space.

Test: fast/text/large-space-width-complex.html

* platform/graphics/mac/ComplexTextController.cpp:
(WebCore::ComplexTextController::adjustGlyphsAndAdvances):

LayoutTests:

Updating tests to not use cached space width.

* fast/text/large-space-width-complex-expected.html: Added.
* fast/text/large-space-width-complex.html: Added.
* fast/text/resources/NotoNastaliqUrduDraft.ttf: Added.
* platform/mac-mavericks/fast/text/emphasis-expected.png:
* platform/mac-mavericks/fast/text/emphasis-expected.txt: This test is orthogonal to space widths.
* platform/mac-mountainlion/fast/text/emphasis-expected.png:
* platform/mac-mountainlion/fast/text/emphasis-expected.txt:
* platform/mac/fast/text/emphasis-expected.png:
* platform/mac/fast/text/emphasis-expected.txt:
* platform/mac/fast/text/sticky-typesetting-features-expected.png:
* platform/mac/fast/text/sticky-typesetting-features-expected.txt: Ditto.
* platform/mac/fast/writing-mode/text-orientation-basic-expected.png:
* platform/mac/fast/writing-mode/text-orientation-basic-expected.txt: This test actually is improved with
this patch. Instead of a weirdly wide space width, the two words are spaced appropriately now.

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

16 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/text/large-space-width-complex-expected.html [new file with mode: 0644]
LayoutTests/fast/text/large-space-width-complex.html [new file with mode: 0644]
LayoutTests/fast/text/resources/NotoNastaliqUrduDraft.ttf [new file with mode: 0644]
LayoutTests/platform/mac-mavericks/fast/text/emphasis-expected.png [new file with mode: 0644]
LayoutTests/platform/mac-mavericks/fast/text/emphasis-expected.txt
LayoutTests/platform/mac-mountainlion/fast/text/emphasis-expected.png [new file with mode: 0644]
LayoutTests/platform/mac-mountainlion/fast/text/emphasis-expected.txt [new file with mode: 0644]
LayoutTests/platform/mac/fast/text/emphasis-expected.png
LayoutTests/platform/mac/fast/text/emphasis-expected.txt
LayoutTests/platform/mac/fast/text/sticky-typesetting-features-expected.png
LayoutTests/platform/mac/fast/text/sticky-typesetting-features-expected.txt
LayoutTests/platform/mac/fast/writing-mode/text-orientation-basic-expected.png
LayoutTests/platform/mac/fast/writing-mode/text-orientation-basic-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/mac/ComplexTextController.cpp

index b3569e3..d776aba 100644 (file)
@@ -1,3 +1,27 @@
+2014-11-10  Myles C. Maxfield  <mmaxfield@apple.com>
+
+        [OSX] Some words are placed on top of each other in complex text layout
+        https://bugs.webkit.org/show_bug.cgi?id=138348
+
+        Reviewed by Simon Fraser.
+
+        Updating tests to not use cached space width.
+
+        * fast/text/large-space-width-complex-expected.html: Added.
+        * fast/text/large-space-width-complex.html: Added.
+        * fast/text/resources/NotoNastaliqUrduDraft.ttf: Added.
+        * platform/mac-mavericks/fast/text/emphasis-expected.png:
+        * platform/mac-mavericks/fast/text/emphasis-expected.txt: This test is orthogonal to space widths.
+        * platform/mac-mountainlion/fast/text/emphasis-expected.png:
+        * platform/mac-mountainlion/fast/text/emphasis-expected.txt:
+        * platform/mac/fast/text/emphasis-expected.png:
+        * platform/mac/fast/text/emphasis-expected.txt:
+        * platform/mac/fast/text/sticky-typesetting-features-expected.png:
+        * platform/mac/fast/text/sticky-typesetting-features-expected.txt: Ditto.
+        * platform/mac/fast/writing-mode/text-orientation-basic-expected.png:
+        * platform/mac/fast/writing-mode/text-orientation-basic-expected.txt: This test actually is improved with
+        this patch. Instead of a weirdly wide space width, the two words are spaced appropriately now.
+
 2014-11-10  Csaba Osztrogon√°c  <ossy@webkit.org>
 
         Crash in WebCore::Node::getFlag
diff --git a/LayoutTests/fast/text/large-space-width-complex-expected.html b/LayoutTests/fast/text/large-space-width-complex-expected.html
new file mode 100644 (file)
index 0000000..0d4ad73
--- /dev/null
@@ -0,0 +1,15 @@
+<html dir="rtl" xml:lang="ur">
+<head>
+  <style>
+    @font-face {
+      font-family: NotoNastaliqUrduDraft;
+      src: url("resources/NotoNastaliqUrduDraft.ttf");
+    }
+  </style>
+</head>
+<body>
+<div style="font: 64px NotoNastaliqUrduDraft;">
+<span>&#x644;&#x6d2;</span> &#x622;
+</div>
+</body>
+</html>
diff --git a/LayoutTests/fast/text/large-space-width-complex.html b/LayoutTests/fast/text/large-space-width-complex.html
new file mode 100644 (file)
index 0000000..2d88ec5
--- /dev/null
@@ -0,0 +1,15 @@
+<html dir="rtl" xml:lang="ur">
+<head>
+  <style>
+    @font-face {
+      font-family: NotoNastaliqUrduDraft;
+      src: url("resources/NotoNastaliqUrduDraft.ttf");
+    }
+  </style>
+</head>
+<body>
+<div style="font: 64px NotoNastaliqUrduDraft;">
+&#x644;&#x6d2; &#x622;
+</div>
+</body>
+</html>
diff --git a/LayoutTests/fast/text/resources/NotoNastaliqUrduDraft.ttf b/LayoutTests/fast/text/resources/NotoNastaliqUrduDraft.ttf
new file mode 100644 (file)
index 0000000..e313116
Binary files /dev/null and b/LayoutTests/fast/text/resources/NotoNastaliqUrduDraft.ttf differ
diff --git a/LayoutTests/platform/mac-mavericks/fast/text/emphasis-expected.png b/LayoutTests/platform/mac-mavericks/fast/text/emphasis-expected.png
new file mode 100644 (file)
index 0000000..1528711
Binary files /dev/null and b/LayoutTests/platform/mac-mavericks/fast/text/emphasis-expected.png differ
index f7adaf8..7844228 100644 (file)
@@ -25,9 +25,9 @@ layer at (0,0) size 800x562
         RenderInline {SPAN} at (0,0) size 217x28
           RenderText {#text} at (3,45) size 217x28
             text run at (3,45) width 217: "consectetur adipiscing"
-        RenderText {#text} at (220,45) size 135x28
+        RenderText {#text} at (220,45) size 134x28
           text run at (220,45) width 6: " "
-          text run at (226,45) width 129: "elit. Aliquam"
+          text run at (226,45) width 128: "elit. Aliquam"
         RenderInline {SPAN} at (0,0) size 111x28
           RenderText {#text} at (3,73) size 111x28
             text run at (3,73) width 111: "odio sa\x{300}pien"
diff --git a/LayoutTests/platform/mac-mountainlion/fast/text/emphasis-expected.png b/LayoutTests/platform/mac-mountainlion/fast/text/emphasis-expected.png
new file mode 100644 (file)
index 0000000..1528711
Binary files /dev/null and b/LayoutTests/platform/mac-mountainlion/fast/text/emphasis-expected.png differ
diff --git a/LayoutTests/platform/mac-mountainlion/fast/text/emphasis-expected.txt b/LayoutTests/platform/mac-mountainlion/fast/text/emphasis-expected.txt
new file mode 100644 (file)
index 0000000..7844228
--- /dev/null
@@ -0,0 +1,191 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 800x562
+  RenderBlock {HTML} at (0,0) size 800x562
+    RenderBody {BODY} at (8,8) size 784x0
+      RenderBlock (floating) {DIV} at (8,8) size 366x146 [border: (3px solid #000000)]
+        RenderText {#text} at (3,3) size 276x28
+          text run at (3,3) width 276: "Lorem ipsum dolor sit amet,"
+        RenderInline {SPAN} at (0,0) size 217x28
+          RenderText {#text} at (3,45) size 217x28
+            text run at (3,45) width 217: "consectetur adipiscing"
+        RenderText {#text} at (220,45) size 135x28
+          text run at (220,45) width 6: " "
+          text run at (226,45) width 129: "elit. Aliquam"
+        RenderInline {SPAN} at (0,0) size 111x28
+          RenderText {#text} at (3,73) size 111x28
+            text run at (3,73) width 111: "odio sapien"
+        RenderText {#text} at (114,73) size 338x70
+          text run at (114,73) width 12: ", "
+          text run at (126,73) width 215: "lobortis eu iaculis vel,"
+          text run at (3,115) width 211: "scelerisque nec dolor."
+      RenderBlock (floating) {DIV} at (390,8) size 366x146 [border: (3px solid #000000)]
+        RenderText {#text} at (3,3) size 276x28
+          text run at (3,3) width 276: "Lorem ipsum dolor sit amet,"
+        RenderInline {SPAN} at (0,0) size 217x28
+          RenderText {#text} at (3,45) size 217x28
+            text run at (3,45) width 217: "consectetur adipiscing"
+        RenderText {#text} at (220,45) size 134x28
+          text run at (220,45) width 6: " "
+          text run at (226,45) width 128: "elit. Aliquam"
+        RenderInline {SPAN} at (0,0) size 111x28
+          RenderText {#text} at (3,73) size 111x28
+            text run at (3,73) width 111: "odio sa\x{300}pien"
+        RenderText {#text} at (114,73) size 338x70
+          text run at (114,73) width 12: ", "
+          text run at (126,73) width 215: "lobortis eu iaculis vel,"
+          text run at (3,115) width 210: "scelerisque nec dolor."
+      RenderBlock (floating) {DIV} at (8,170) size 366x162 [border: (3px solid #000000)]
+        RenderText {#text} at (3,18) size 71x28
+          text run at (3,18) width 71: "Lorem "
+        RenderInline {SPAN} at (0,0) size 59x28
+          RenderText {#text} at (74,18) size 59x28
+            text run at (74,18) width 59: "ipsum"
+        RenderText {#text} at (133,18) size 6x28
+          text run at (133,18) width 6: " "
+        RenderInline {SPAN} at (0,0) size 51x28
+          RenderText {#text} at (139,18) size 51x28
+            text run at (139,18) width 51: "dolor"
+        RenderText {#text} at (190,18) size 6x28
+          text run at (190,18) width 6: " "
+        RenderInline {SPAN} at (0,0) size 23x28
+          RenderText {#text} at (196,18) size 23x28
+            text run at (196,18) width 23: "sit"
+        RenderText {#text} at (219,18) size 6x28
+          text run at (219,18) width 6: " "
+        RenderInline {SPAN} at (0,0) size 48x28
+          RenderText {#text} at (225,18) size 48x28
+            text run at (225,18) width 48: "amet"
+        RenderText {#text} at (273,18) size 6x28
+          text run at (273,18) width 6: ","
+        RenderInline {SPAN} at (0,0) size 111x28
+          RenderText {#text} at (3,61) size 111x28
+            text run at (3,61) width 111: "consectetur"
+        RenderText {#text} at (114,61) size 6x28
+          text run at (114,61) width 6: " "
+        RenderInline {SPAN} at (0,0) size 100x28
+          RenderText {#text} at (120,61) size 100x28
+            text run at (120,61) width 100: "adipiscing"
+        RenderText {#text} at (220,61) size 6x28
+          text run at (220,61) width 6: " "
+        RenderInline {SPAN} at (0,0) size 32x28
+          RenderText {#text} at (226,61) size 32x28
+            text run at (226,61) width 32: "elit"
+        RenderText {#text} at (258,61) size 12x28
+          text run at (258,61) width 12: ". "
+        RenderInline {SPAN} at (0,0) size 85x28
+          RenderText {#text} at (270,61) size 85x28
+            text run at (270,61) width 85: "Aliquam"
+        RenderText {#text} at (355,61) size 6x28
+          text run at (355,61) width 6: ","
+        RenderInline {SPAN} at (0,0) size 43x28
+          RenderText {#text} at (3,103) size 43x28
+            text run at (3,103) width 43: "odio"
+        RenderText {#text} at (46,103) size 6x28
+          text run at (46,103) width 6: " "
+        RenderInline {SPAN} at (0,0) size 62x28
+          RenderText {#text} at (52,103) size 62x28
+            text run at (52,103) width 62: "sapien"
+        RenderText {#text} at (114,103) size 12x28
+          text run at (114,103) width 12: ", "
+        RenderInline {SPAN} at (0,0) size 74x28
+          RenderText {#text} at (126,103) size 74x28
+            text run at (126,103) width 74: "lobortis"
+        RenderText {#text} at (200,103) size 338x56
+          text run at (200,103) width 6: " "
+          text run at (206,103) width 135: "eu iaculis vel,"
+          text run at (3,131) width 211: "scelerisque nec dolor."
+      RenderBlock (floating) {DIV} at (390,170) size 366x162 [border: (3px solid #000000)]
+        RenderText {#text} at (3,3) size 71x28
+          text run at (3,3) width 71: "Lorem "
+        RenderInline {SPAN} at (0,0) size 59x28
+          RenderText {#text} at (74,3) size 59x28
+            text run at (74,3) width 59: "ipsum"
+        RenderText {#text} at (133,3) size 6x28
+          text run at (133,3) width 6: " "
+        RenderInline {SPAN} at (0,0) size 51x28
+          RenderText {#text} at (139,3) size 51x28
+            text run at (139,3) width 51: "dolor"
+        RenderText {#text} at (190,3) size 6x28
+          text run at (190,3) width 6: " "
+        RenderInline {SPAN} at (0,0) size 23x28
+          RenderText {#text} at (196,3) size 23x28
+            text run at (196,3) width 23: "sit"
+        RenderText {#text} at (219,3) size 6x28
+          text run at (219,3) width 6: " "
+        RenderInline {SPAN} at (0,0) size 48x28
+          RenderText {#text} at (225,3) size 48x28
+            text run at (225,3) width 48: "amet"
+        RenderText {#text} at (273,3) size 6x28
+          text run at (273,3) width 6: ","
+        RenderInline {SPAN} at (0,0) size 111x28
+          RenderText {#text} at (3,46) size 111x28
+            text run at (3,46) width 111: "consectetur"
+        RenderText {#text} at (114,46) size 6x28
+          text run at (114,46) width 6: " "
+        RenderInline {SPAN} at (0,0) size 100x28
+          RenderText {#text} at (120,46) size 100x28
+            text run at (120,46) width 100: "adipiscing"
+        RenderText {#text} at (220,46) size 6x28
+          text run at (220,46) width 6: " "
+        RenderInline {SPAN} at (0,0) size 32x28
+          RenderText {#text} at (226,46) size 32x28
+            text run at (226,46) width 32: "elit"
+        RenderText {#text} at (258,46) size 12x28
+          text run at (258,46) width 12: ". "
+        RenderInline {SPAN} at (0,0) size 85x28
+          RenderText {#text} at (270,46) size 85x28
+            text run at (270,46) width 85: "Aliquam"
+        RenderText {#text} at (355,46) size 6x28
+          text run at (355,46) width 6: ","
+        RenderInline {SPAN} at (0,0) size 43x28
+          RenderText {#text} at (3,89) size 43x28
+            text run at (3,89) width 43: "odio"
+        RenderText {#text} at (46,89) size 6x28
+          text run at (46,89) width 6: " "
+        RenderInline {SPAN} at (0,0) size 62x28
+          RenderText {#text} at (52,89) size 62x28
+            text run at (52,89) width 62: "sapien"
+        RenderText {#text} at (114,89) size 12x28
+          text run at (114,89) width 12: ", "
+        RenderInline {SPAN} at (0,0) size 74x28
+          RenderText {#text} at (126,89) size 74x28
+            text run at (126,89) width 74: "lobortis"
+        RenderText {#text} at (200,89) size 338x70
+          text run at (200,89) width 6: " "
+          text run at (206,89) width 135: "eu iaculis vel,"
+          text run at (3,131) width 211: "scelerisque nec dolor."
+      RenderBlock (floating) {DIV} at (8,348) size 366x198 [border: (3px solid #000000)]
+        RenderText {#text} at (3,13) size 276x28
+          text run at (3,13) width 276: "Lorem ipsum dolor sit amet,"
+        RenderInline {SPAN} at (0,0) size 217x28
+          RenderText {#text} at (3,61) size 217x28
+            text run at (3,61) width 217: "consectetur adipiscing"
+        RenderText {#text} at (220,61) size 135x28
+          text run at (220,61) width 6: " "
+          text run at (226,61) width 129: "elit. Aliquam"
+        RenderInline {SPAN} at (0,0) size 111x28
+          RenderText {#text} at (3,109) size 111x28
+            text run at (3,109) width 111: "odio sapien"
+        RenderText {#text} at (114,109) size 338x76
+          text run at (114,109) width 12: ", "
+          text run at (126,109) width 215: "lobortis eu iaculis vel,"
+          text run at (3,157) width 211: "scelerisque nec dolor."
+      RenderBlock (floating) {DIV} at (390,348) size 366x146 [border: (3px solid #000000)]
+        RenderText {#text} at (3,3) size 276x28
+          text run at (3,3) width 276: "Lorem ipsum dolor sit amet,"
+        RenderInline {SPAN} at (0,0) size 217x28
+          RenderText {#text} at (3,45) size 217x28
+            text run at (3,45) width 217: "consectetur adipiscing"
+        RenderText {#text} at (220,45) size 135x28
+          text run at (220,45) width 6: " "
+          text run at (226,45) width 129: "elit. Aliquam"
+        RenderInline {SPAN} at (0,0) size 111x28
+          RenderText {#text} at (3,73) size 111x28
+            text run at (3,73) width 111: "odio sapien"
+        RenderText {#text} at (114,73) size 338x70
+          text run at (114,73) width 12: ", "
+          text run at (126,73) width 215: "lobortis eu iaculis vel,"
+          text run at (3,115) width 211: "scelerisque nec dolor."
+selection start: position 10 of child 0 {#text} of child 1 {SPAN} of child 10 {DIV} of body
+selection end:   position 7 of child 0 {#text} of child 3 {SPAN} of child 10 {DIV} of body
index 879ab26..2f8ecff 100644 (file)
Binary files a/LayoutTests/platform/mac/fast/text/emphasis-expected.png and b/LayoutTests/platform/mac/fast/text/emphasis-expected.png differ
index 034c9b7..2eb213f 100644 (file)
@@ -25,9 +25,9 @@ layer at (0,0) size 800x567
         RenderInline {SPAN} at (0,0) size 217x28
           RenderText {#text} at (3,45) size 217x28
             text run at (3,45) width 217: "consectetur adipiscing"
-        RenderText {#text} at (220,45) size 135x28
+        RenderText {#text} at (220,45) size 134x28
           text run at (220,45) width 6: " "
-          text run at (226,45) width 129: "elit. Aliquam"
+          text run at (226,45) width 128: "elit. Aliquam"
         RenderInline {SPAN} at (0,0) size 111x28
           RenderText {#text} at (3,73) size 111x28
             text run at (3,73) width 111: "odio sa\x{300}pien"
index 17c48e0..dfe2da2 100644 (file)
Binary files a/LayoutTests/platform/mac/fast/text/sticky-typesetting-features-expected.png and b/LayoutTests/platform/mac/fast/text/sticky-typesetting-features-expected.png differ
index 5a406a4..3a1b8aa 100644 (file)
@@ -13,5 +13,5 @@ layer at (0,0) size 800x600
         RenderText {#text} at (0,0) size 324x18
           text run at (0,0) width 324: "This should be rendered with kerning and ligatures:"
       RenderBlock {DIV} at (0,250) size 784x166
-        RenderText {#text} at (0,0) size 754x166
-          text run at (0,0) width 754: "Office Today"
+        RenderText {#text} at (0,0) size 751x166
+          text run at (0,0) width 751: "Office Today"
index 5936c77..20acbe2 100644 (file)
Binary files a/LayoutTests/platform/mac/fast/writing-mode/text-orientation-basic-expected.png and b/LayoutTests/platform/mac/fast/writing-mode/text-orientation-basic-expected.png differ
index b10705d..22aa99d 100644 (file)
@@ -49,8 +49,8 @@ layer at (0,0) size 785x704
             RenderText {#text} at (94,1) size 36x197
               text run at (94,1) width 197: "Hello world"
           RenderBR {BR} at (112,198) size 0x0
-          RenderInline {SPAN} at (0,0) size 36x221
-            RenderText {#text} at (148,1) size 36x221
-              text run at (148,1) width 221: "Hello world"
-          RenderBR {BR} at (166,222) size 0x0
+          RenderInline {SPAN} at (0,0) size 36x197
+            RenderText {#text} at (148,1) size 36x197
+              text run at (148,1) width 197: "Hello world"
+          RenderBR {BR} at (166,198) size 0x0
         RenderText {#text} at (0,0) size 0x0
index 0e95243..5c31cfa 100644 (file)
@@ -1,3 +1,21 @@
+2014-11-10  Myles C. Maxfield  <mmaxfield@apple.com>
+
+        [OSX] Some words are placed on top of each other in complex text layout
+        https://bugs.webkit.org/show_bug.cgi?id=138348
+
+        Reviewed by Simon Fraser.
+
+        Some complex text layouts have lots of diacritics being placed all over the place.
+        CoreText sometimes compensates for this by adjusting the advances of the glyphs
+        throughout the string to make glyphs appear in the correct place. This means that
+        we can't naively cache the width of a space character; instead, we must obey
+        CoreText when it gives us an advance for a space.
+
+        Test: fast/text/large-space-width-complex.html
+
+        * platform/graphics/mac/ComplexTextController.cpp:
+        (WebCore::ComplexTextController::adjustGlyphsAndAdvances):
+
 2014-11-10  Eric Carlson  <eric.carlson@apple.com>
 
         [iOS] wireless playback placeholder UI doesn't always draw
index 5ebd43e..5982439 100644 (file)
@@ -617,7 +617,7 @@ void ComplexTextController::adjustGlyphsAndAdvances()
 
             bool treatAsSpace = Font::treatAsSpace(ch);
             CGGlyph glyph = treatAsSpace ? fontData->spaceGlyph() : glyphs[i];
-            CGSize advance = treatAsSpace ? CGSizeMake(spaceWidth, advances[i].height) : advances[i];
+            CGSize advance = advances[i];
 #if PLATFORM(IOS)
             if (isEmoji && advance.width)
                 advance.width = fontData->widthForGlyph(glyph);