[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 b3569e33c4d7b274bf9a44da791354d79c483927..d776abaccba0e5b29b78d62013dcbed31e21aeb0 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 f7adaf89a79a8abc797ea2eba0c53e73701ce8e1..7844228185d5da73abfe725f828cc5f03d7c3a92 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 879ab261ae22f630526a6925009f7e2e8a574de9..2f8ecff945351038bc6330d510d21b4ae3744998 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 034c9b70975e1eacdc561e952b7dadf7554bc708..2eb213f1eb8f7287c6265f95d609d40f54198ff4 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 17c48e0bbd8651eb0cb9928f2ec302fd737f70f7..dfe2da2bf6327f0d3effcee6c3288ddb83556b56 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 5a406a4653baadfb1e3ceca9972c9c764e7118bd..3a1b8aa800d770dceeaa1c6178b6ac0ec35125d1 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 5936c7761be8e6326318dd553e8aa84209dc4e5b..20acbe279fd5e6a331fe531b0f7d29666b19074c 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 b10705dc1f51d4bec9f1699147cbb32a090f50af..22aa99dcd42af883507378fddf63738d6f4be633 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 0e95243dbefc307d1fa3af9ac5b6a4a56c755e0f..5c31cfafea568229b93ae9cf5f752fa27762e9b5 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 5ebd43e78331bb0536e4f85f9fe3507a50dcf017..59824398424ce22ad59a2bb93c7109f03ecb5a3a 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);