Text with "text-overflow:ellipsis" and an SVG font do not render correctly
authorddkilzer@apple.com <ddkilzer@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 15 Jul 2013 20:07:42 +0000 (20:07 +0000)
committerddkilzer@apple.com <ddkilzer@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 15 Jul 2013 20:07:42 +0000 (20:07 +0000)
https://bugs.webkit.org/show_bug.cgi?id=118669

Patch by Antoine Quint <graouts@apple.com> on 2013-07-15
Reviewed by David Kilzer.

Source/WebCore:

Partial runs may be routed through the complex path in several Font functions. While incomplete,
we can check for a non-NULL run.renderingContext() and exempt runs that have it from being forced
down the complex path. A more thorough fix is already tracked by http://webkit.org/b/100050.

Adding a new testcase which is a copy of svg/text/text-overflow-ellipsis-svgfont.html with kerning
and ligatures turned on explicitly since DRT runs with those off by default and this option is required
to be on for the issue to reproduce.

Fix courtesy of Dan Bernstein.

Test: svg/text/text-overflow-ellipsis-svgfont-kerning-ligatures.html

* platform/graphics/Font.cpp:
(WebCore::Font::drawText):
(WebCore::Font::drawEmphasisMarks):
(WebCore::Font::selectionRectForText):

LayoutTests:

* platform/mac/svg/text/text-overflow-ellipsis-svgfont-kerning-ligatures-expected.png: Added.
* platform/mac/svg/text/text-overflow-ellipsis-svgfont-kerning-ligatures-expected.txt: Added.
* svg/text/text-overflow-ellipsis-svgfont-kerning-ligatures.html: Added.

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

LayoutTests/ChangeLog
LayoutTests/platform/mac/svg/text/text-overflow-ellipsis-svgfont-kerning-ligatures-expected.png [new file with mode: 0644]
LayoutTests/platform/mac/svg/text/text-overflow-ellipsis-svgfont-kerning-ligatures-expected.txt [new file with mode: 0644]
LayoutTests/svg/text/text-overflow-ellipsis-svgfont-kerning-ligatures.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/Font.cpp

index 2c1f232a749fddbb43315648ffc859a0b38a9f3a..813ee0e5697986c0724cd78ee73447d46970eed3 100644 (file)
@@ -1,3 +1,14 @@
+2013-07-15  Antoine Quint  <graouts@apple.com>
+
+        Text with "text-overflow:ellipsis" and an SVG font do not render correctly
+        https://bugs.webkit.org/show_bug.cgi?id=118669
+
+        Reviewed by David Kilzer.
+
+        * platform/mac/svg/text/text-overflow-ellipsis-svgfont-kerning-ligatures-expected.png: Added.
+        * platform/mac/svg/text/text-overflow-ellipsis-svgfont-kerning-ligatures-expected.txt: Added.
+        * svg/text/text-overflow-ellipsis-svgfont-kerning-ligatures.html: Added.
+
 2013-07-14  Jon Lee  <jonlee@apple.com>
 
         [WK2] Calling Notification.requestPermission() without a callback crashes
diff --git a/LayoutTests/platform/mac/svg/text/text-overflow-ellipsis-svgfont-kerning-ligatures-expected.png b/LayoutTests/platform/mac/svg/text/text-overflow-ellipsis-svgfont-kerning-ligatures-expected.png
new file mode 100644 (file)
index 0000000..562a144
Binary files /dev/null and b/LayoutTests/platform/mac/svg/text/text-overflow-ellipsis-svgfont-kerning-ligatures-expected.png differ
diff --git a/LayoutTests/platform/mac/svg/text/text-overflow-ellipsis-svgfont-kerning-ligatures-expected.txt b/LayoutTests/platform/mac/svg/text/text-overflow-ellipsis-svgfont-kerning-ligatures-expected.txt
new file mode 100644 (file)
index 0000000..51561eb
--- /dev/null
@@ -0,0 +1,19 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 800x138
+  RenderBlock {HTML} at (0,0) size 800x138
+    RenderBody {BODY} at (8,8) size 784x110
+      RenderBlock (anonymous) at (0,0) size 784x90
+        RenderText {#text} at (0,0) size 762x36
+          text run at (0,0) width 762: "This test checks that the text-overflow: ellipsis property is handled correctly when using an SVG font and having kerning"
+          text run at (0,18) width 104: "and ligatures on."
+        RenderBR {BR} at (104,18) size 0x18
+        RenderBR {BR} at (0,36) size 0x18
+        RenderText {#text} at (0,54) size 517x18
+          text run at (0,54) width 517: "Pass if some text is shown followed by an ellipsis (NOT just the ellipsis by itself). "
+        RenderBR {BR} at (517,54) size 0x18
+        RenderBR {BR} at (0,72) size 0x18
+layer at (8,98) size 182x20 clip at (9,99) size 180x18 scrollWidth 334
+  RenderBlock {DIV} at (0,90) size 182x20 [border: (1px solid #000000)]
+    RenderText {#text} at (1,2) size 334x16
+      text run at (1,2) width 334: "abc abc abc abc abc abc abc abc abc abc"
diff --git a/LayoutTests/svg/text/text-overflow-ellipsis-svgfont-kerning-ligatures.html b/LayoutTests/svg/text/text-overflow-ellipsis-svgfont-kerning-ligatures.html
new file mode 100644 (file)
index 0000000..5ea816f
--- /dev/null
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Test for text-overflow: ellipsis using SVG font with kerning and ligatures on</title>
+<style>
+
+@font-face {
+    font-family: 'ABCFont';
+    src: local('☺'), url('../../svg/custom/resources/ABCFont.svg#ABCFont') format('svg');
+    font-weight: normal;
+    font-style: normal;
+}
+
+.ellipsis {
+    width: 180px;
+    margin: 0 0 20px 0;
+    border: 1px solid black;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    white-space: nowrap;
+}
+
+.svgfont {
+       font-family: 'ABCFont';
+    -webkit-font-kerning: normal;
+}
+</style>
+</head>
+<body>
+
+This test checks that the text-overflow: ellipsis property is handled correctly when using an SVG font and having kerning and ligatures on.<br><br>
+
+Pass if some text is shown followed by an ellipsis (NOT just the ellipsis by itself).
+<br><br>
+
+<div class="ellipsis svgfont">
+       abc abc abc abc abc abc abc abc abc abc
+</div>
+
+</body>
+</html>
index c0fabdea439ce30761463bc6fcf42e389a176437..3affe207722a4a7b634fc393bfa088650c9b6e9d 100644 (file)
@@ -1,3 +1,27 @@
+2013-07-15  Antoine Quint  <graouts@apple.com>
+
+        Text with "text-overflow:ellipsis" and an SVG font do not render correctly
+        https://bugs.webkit.org/show_bug.cgi?id=118669
+
+        Reviewed by David Kilzer.
+
+        Partial runs may be routed through the complex path in several Font functions. While incomplete,
+        we can check for a non-NULL run.renderingContext() and exempt runs that have it from being forced
+        down the complex path. A more thorough fix is already tracked by http://webkit.org/b/100050.
+
+        Adding a new testcase which is a copy of svg/text/text-overflow-ellipsis-svgfont.html with kerning
+        and ligatures turned on explicitly since DRT runs with those off by default and this option is required
+        to be on for the issue to reproduce.
+
+        Fix courtesy of Dan Bernstein.
+
+        Test: svg/text/text-overflow-ellipsis-svgfont-kerning-ligatures.html
+
+        * platform/graphics/Font.cpp:
+        (WebCore::Font::drawText):
+        (WebCore::Font::drawEmphasisMarks):
+        (WebCore::Font::selectionRectForText):
+
 2013-07-15  peavo@outlook.com  <peavo@outlook.com>
 
         [Curl] Download does not replace existing file.
index 9cbd20024c3e3e87f562b7a33ee5e7fba4c3571e..56601d554afb2027ef7c82385b4ecddff89e34a3 100644 (file)
@@ -266,7 +266,7 @@ void Font::drawText(GraphicsContext* context, const TextRun& run, const FloatPoi
 
     CodePath codePathToUse = codePath(run);
     // FIXME: Use the fast code path once it handles partial runs with kerning and ligatures. See http://webkit.org/b/100050
-    if (codePathToUse != Complex && typesettingFeatures() && (from || to != run.length()))
+    if (codePathToUse != Complex && typesettingFeatures() && (from || to != run.length()) && !run.renderingContext())
         codePathToUse = Complex;
 
     if (codePathToUse != Complex)
@@ -285,7 +285,7 @@ void Font::drawEmphasisMarks(GraphicsContext* context, const TextRun& run, const
 
     CodePath codePathToUse = codePath(run);
     // FIXME: Use the fast code path once it handles partial runs with kerning and ligatures. See http://webkit.org/b/100050
-    if (codePathToUse != Complex && typesettingFeatures() && (from || to != run.length()))
+    if (codePathToUse != Complex && typesettingFeatures() && (from || to != run.length()) && !run.renderingContext())
         codePathToUse = Complex;
 
     if (codePathToUse != Complex)
@@ -362,7 +362,7 @@ FloatRect Font::selectionRectForText(const TextRun& run, const FloatPoint& point
 
     CodePath codePathToUse = codePath(run);
     // FIXME: Use the fast code path once it handles partial runs with kerning and ligatures. See http://webkit.org/b/100050
-    if (codePathToUse != Complex && typesettingFeatures() && (from || to != run.length()))
+    if (codePathToUse != Complex && typesettingFeatures() && (from || to != run.length()) && !run.renderingContext())
         codePathToUse = Complex;
 
     if (codePathToUse != Complex)