Title: [288944] trunk
Revision
288944
Author
[email protected]
Date
2022-02-01 21:50:59 -0800 (Tue, 01 Feb 2022)

Log Message

[LFC][IFC] Using Fontcascade::spaceWidth to subtract the trailing space width may result in incorrect layout
https://bugs.webkit.org/show_bug.cgi?id=235937
<rdar://88059633>

Reviewed by Antti Koivisto and Simon Fraser.

Source/WebCore:

Since Fontcascade::spaceWidth always consult the primary font, it may return unexpected width value when (in rare cases)
the primary font does not have a space glyph. Legacy line layout works as expected as it always runs a full width
computation on the space character (instead of directly calling FontCascade::spaceWidth).

* layout/formattingContexts/inline/InlineItemsBuilder.cpp:
(WebCore::Layout::InlineItemsBuilder::computeInlineTextItemWidths):
* layout/formattingContexts/inline/text/TextUtil.cpp:
(WebCore::Layout::TextUtil::width):
(WebCore::Layout::TextUtil::spaceWidth):
* layout/formattingContexts/inline/text/TextUtil.h:

LayoutTests:

* platform/mac-bigsur/fonts/monospace-expected.txt: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (288943 => 288944)


--- trunk/LayoutTests/ChangeLog	2022-02-02 05:38:23 UTC (rev 288943)
+++ trunk/LayoutTests/ChangeLog	2022-02-02 05:50:59 UTC (rev 288944)
@@ -1,3 +1,13 @@
+2022-02-01  Alan Bujtas  <[email protected]>
+
+        [LFC][IFC] Using Fontcascade::spaceWidth to subtract the trailing space width may result in incorrect layout
+        https://bugs.webkit.org/show_bug.cgi?id=235937
+        <rdar://88059633>
+
+        Reviewed by Antti Koivisto and Simon Fraser.
+
+        * platform/mac-bigsur/fonts/monospace-expected.txt: Added.
+
 2022-02-01  Commit Queue  <[email protected]>
 
         Unreviewed, reverting r288914.

Added: trunk/LayoutTests/platform/mac-bigsur/fonts/monospace-expected.txt (0 => 288944)


--- trunk/LayoutTests/platform/mac-bigsur/fonts/monospace-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/platform/mac-bigsur/fonts/monospace-expected.txt	2022-02-02 05:50:59 UTC (rev 288944)
@@ -0,0 +1,916 @@
+layer at (0,0) size 785x4757
+  RenderView at (0,0) size 785x600
+layer at (0,0) size 785x4757
+  RenderBlock {HTML} at (0,0) size 785x4757
+    RenderBody {BODY} at (8,8) size 769x4733
+      RenderBlock (anonymous) at (0,0) size 769x18
+        RenderText {#text} at (0,0) size 360x18
+          text run at (0,0) width 360: "This tests font choices and metrics for monospace fonts."
+      RenderBlock {P} at (0,34) size 769x210
+        RenderInline {FONT} at (0,0) size 759x209
+          RenderText {#text} at (0,0) size 58x20
+            text run at (0,0) width 58: "Monaco"
+          RenderBR {BR} at (57,0) size 1x20
+          RenderText {#text} at (0,21) size 759x62
+            text run at (0,21) width 759: "  ! \" # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G"
+            text run at (0,42) width 759: "H I J K L M N O P Q R S T U V W X Y Z [ \\ ] ^ _ ` a b c d e f g h i j k l m n o"
+            text run at (0,63) width 279: "p q r s t u v w x y z { | } >"
+          RenderBR {BR} at (278,63) size 1x20
+          RenderInline {B} at (0,0) size 753x62
+            RenderText {#text} at (0,84) size 753x62
+              text run at (0,84) width 753: "  ! \" # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C"
+              text run at (0,105) width 753: "D E F G H I J K L M N O P Q R S T U V W X Y Z [ \\ ] ^ _ ` a b c d e f g"
+              text run at (0,126) width 488: "h i j k l m n o p q r s t u v w x y z { | } > "
+          RenderBR {BR} at (487,126) size 1x20
+          RenderInline {I} at (0,0) size 759x62
+            RenderText {#text} at (0,147) size 759x62
+              text run at (0,147) width 759: "  ! \" # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G"
+              text run at (0,168) width 759: "H I J K L M N O P Q R S T U V W X Y Z [ \\ ] ^ _ ` a b c d e f g h i j k l m n o"
+              text run at (0,189) width 279: "p q r s t u v w x y z { | } >"
+          RenderText {#text} at (0,0) size 0x0
+        RenderText {#text} at (0,0) size 0x0
+      RenderBlock {P} at (0,260) size 769x180
+        RenderInline {FONT} at (0,0) size 759x180
+          RenderText {#text} at (0,0) size 68x18
+            text run at (0,0) width 68: "Courier"
+          RenderBR {BR} at (67,0) size 1x18
+          RenderText {#text} at (0,18) size 759x54
+            text run at (0,18) width 759: "  ! \" # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G"
+            text run at (0,36) width 759: "H I J K L M N O P Q R S T U V W X Y Z [ \\ ] ^ _ ` a b c d e f g h i j k l m n o"
+            text run at (0,54) width 279: "p q r s t u v w x y z { | } >"
+          RenderBR {BR} at (278,54) size 1x18
+          RenderInline {B} at (0,0) size 759x54
+            RenderText {#text} at (0,72) size 759x54
+              text run at (0,72) width 759: "  ! \" # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G"
+              text run at (0,90) width 759: "H I J K L M N O P Q R S T U V W X Y Z [ \\ ] ^ _ ` a b c d e f g h i j k l m n o"
+              text run at (0,108) width 289: "p q r s t u v w x y z { | } > "
+          RenderBR {BR} at (288,108) size 1x18
+          RenderInline {I} at (0,0) size 759x54
+            RenderText {#text} at (0,126) size 759x54
+              text run at (0,126) width 759: "  ! \" # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G"
+              text run at (0,144) width 759: "H I J K L M N O P Q R S T U V W X Y Z [ \\ ] ^ _ ` a b c d e f g h i j k l m n o"
+              text run at (0,162) width 279: "p q r s t u v w x y z { | } >"
+          RenderText {#text} at (0,0) size 0x0
+        RenderText {#text} at (0,0) size 0x0
+      RenderBlock {P} at (0,456) size 769x1425
+        RenderInline {FONT} at (0,0) size 71x1425
+          RenderText {#text} at (0,0) size 71x15
+            text run at (0,0) width 71: "monospace"
+          RenderBR {BR} at (70,0) size 1x15
+          RenderText {#text} at (0,15) size 32x15
+            text run at (0,15) width 32: "    "
+          RenderBR {BR} at (31,15) size 1x15
+          RenderText {#text} at (0,30) size 32x15
+            text run at (0,30) width 32: "!!!!"
+          RenderBR {BR} at (31,30) size 1x15
+          RenderText {#text} at (0,45) size 32x15
+            text run at (0,45) width 32: "\"\"\"\""
+          RenderBR {BR} at (31,45) size 1x15
+          RenderText {#text} at (0,60) size 32x15
+            text run at (0,60) width 32: "####"
+          RenderBR {BR} at (31,60) size 1x15
+          RenderText {#text} at (0,75) size 32x15
+            text run at (0,75) width 32: "$$$$"
+          RenderBR {BR} at (31,75) size 1x15
+          RenderText {#text} at (0,90) size 32x15
+            text run at (0,90) width 32: "%%%%"
+          RenderBR {BR} at (31,90) size 1x15
+          RenderText {#text} at (0,105) size 32x15
+            text run at (0,105) width 32: "&&&&"
+          RenderBR {BR} at (31,105) size 1x15
+          RenderText {#text} at (0,120) size 32x15
+            text run at (0,120) width 32: "''''"
+          RenderBR {BR} at (31,120) size 1x15
+          RenderText {#text} at (0,135) size 32x15
+            text run at (0,135) width 32: "(((("
+          RenderBR {BR} at (31,135) size 1x15
+          RenderText {#text} at (0,150) size 32x15
+            text run at (0,150) width 32: "))))"
+          RenderBR {BR} at (31,150) size 1x15
+          RenderText {#text} at (0,165) size 32x15
+            text run at (0,165) width 32: "****"
+          RenderBR {BR} at (31,165) size 1x15
+          RenderText {#text} at (0,180) size 32x15
+            text run at (0,180) width 32: "++++"
+          RenderBR {BR} at (31,180) size 1x15
+          RenderText {#text} at (0,195) size 32x15
+            text run at (0,195) width 32: ",,,,"
+          RenderBR {BR} at (31,195) size 1x15
+          RenderText {#text} at (0,210) size 32x15
+            text run at (0,210) width 32: "----"
+          RenderBR {BR} at (31,210) size 1x15
+          RenderText {#text} at (0,225) size 32x15
+            text run at (0,225) width 32: "...."
+          RenderBR {BR} at (31,225) size 1x15
+          RenderText {#text} at (0,240) size 32x15
+            text run at (0,240) width 32: "////"
+          RenderBR {BR} at (31,240) size 1x15
+          RenderText {#text} at (0,255) size 32x15
+            text run at (0,255) width 32: "0000"
+          RenderBR {BR} at (31,255) size 1x15
+          RenderText {#text} at (0,270) size 32x15
+            text run at (0,270) width 32: "1111"
+          RenderBR {BR} at (31,270) size 1x15
+          RenderText {#text} at (0,285) size 32x15
+            text run at (0,285) width 32: "2222"
+          RenderBR {BR} at (31,285) size 1x15
+          RenderText {#text} at (0,300) size 32x15
+            text run at (0,300) width 32: "3333"
+          RenderBR {BR} at (31,300) size 1x15
+          RenderText {#text} at (0,315) size 32x15
+            text run at (0,315) width 32: "4444"
+          RenderBR {BR} at (31,315) size 1x15
+          RenderText {#text} at (0,330) size 32x15
+            text run at (0,330) width 32: "5555"
+          RenderBR {BR} at (31,330) size 1x15
+          RenderText {#text} at (0,345) size 32x15
+            text run at (0,345) width 32: "6666"
+          RenderBR {BR} at (31,345) size 1x15
+          RenderText {#text} at (0,360) size 32x15
+            text run at (0,360) width 32: "7777"
+          RenderBR {BR} at (31,360) size 1x15
+          RenderText {#text} at (0,375) size 32x15
+            text run at (0,375) width 32: "8888"
+          RenderBR {BR} at (31,375) size 1x15
+          RenderText {#text} at (0,390) size 32x15
+            text run at (0,390) width 32: "9999"
+          RenderBR {BR} at (31,390) size 1x15
+          RenderText {#text} at (0,405) size 32x15
+            text run at (0,405) width 32: "::::"
+          RenderBR {BR} at (31,405) size 1x15
+          RenderText {#text} at (0,420) size 32x15
+            text run at (0,420) width 32: ";;;;"
+          RenderBR {BR} at (31,420) size 1x15
+          RenderText {#text} at (0,435) size 32x15
+            text run at (0,435) width 32: "<<<<"
+          RenderBR {BR} at (31,435) size 1x15
+          RenderText {#text} at (0,450) size 32x15
+            text run at (0,450) width 32: "===="
+          RenderBR {BR} at (31,450) size 1x15
+          RenderText {#text} at (0,465) size 32x15
+            text run at (0,465) width 32: ">>>>"
+          RenderBR {BR} at (31,465) size 1x15
+          RenderText {#text} at (0,480) size 32x15
+            text run at (0,480) width 32: "????"
+          RenderBR {BR} at (31,480) size 1x15
+          RenderText {#text} at (0,495) size 32x15
+            text run at (0,495) width 32: "@@@@"
+          RenderBR {BR} at (31,495) size 1x15
+          RenderText {#text} at (0,510) size 32x15
+            text run at (0,510) width 32: "AAAA"
+          RenderBR {BR} at (31,510) size 1x15
+          RenderText {#text} at (0,525) size 32x15
+            text run at (0,525) width 32: "BBBB"
+          RenderBR {BR} at (31,525) size 1x15
+          RenderText {#text} at (0,540) size 32x15
+            text run at (0,540) width 32: "CCCC"
+          RenderBR {BR} at (31,540) size 1x15
+          RenderText {#text} at (0,555) size 32x15
+            text run at (0,555) width 32: "DDDD"
+          RenderBR {BR} at (31,555) size 1x15
+          RenderText {#text} at (0,570) size 32x15
+            text run at (0,570) width 32: "EEEE"
+          RenderBR {BR} at (31,570) size 1x15
+          RenderText {#text} at (0,585) size 32x15
+            text run at (0,585) width 32: "FFFF"
+          RenderBR {BR} at (31,585) size 1x15
+          RenderText {#text} at (0,600) size 32x15
+            text run at (0,600) width 32: "GGGG"
+          RenderBR {BR} at (31,600) size 1x15
+          RenderText {#text} at (0,615) size 32x15
+            text run at (0,615) width 32: "HHHH"
+          RenderBR {BR} at (31,615) size 1x15
+          RenderText {#text} at (0,630) size 32x15
+            text run at (0,630) width 32: "IIII"
+          RenderBR {BR} at (31,630) size 1x15
+          RenderText {#text} at (0,645) size 32x15
+            text run at (0,645) width 32: "JJJJ"
+          RenderBR {BR} at (31,645) size 1x15
+          RenderText {#text} at (0,660) size 32x15
+            text run at (0,660) width 32: "KKKK"
+          RenderBR {BR} at (31,660) size 1x15
+          RenderText {#text} at (0,675) size 32x15
+            text run at (0,675) width 32: "LLLL"
+          RenderBR {BR} at (31,675) size 1x15
+          RenderText {#text} at (0,690) size 32x15
+            text run at (0,690) width 32: "MMMM"
+          RenderBR {BR} at (31,690) size 1x15
+          RenderText {#text} at (0,705) size 32x15
+            text run at (0,705) width 32: "NNNN"
+          RenderBR {BR} at (31,705) size 1x15
+          RenderText {#text} at (0,720) size 32x15
+            text run at (0,720) width 32: "OOOO"
+          RenderBR {BR} at (31,720) size 1x15
+          RenderText {#text} at (0,735) size 32x15
+            text run at (0,735) width 32: "PPPP"
+          RenderBR {BR} at (31,735) size 1x15
+          RenderText {#text} at (0,750) size 32x15
+            text run at (0,750) width 32: "QQQQ"
+          RenderBR {BR} at (31,750) size 1x15
+          RenderText {#text} at (0,765) size 32x15
+            text run at (0,765) width 32: "RRRR"
+          RenderBR {BR} at (31,765) size 1x15
+          RenderText {#text} at (0,780) size 32x15
+            text run at (0,780) width 32: "SSSS"
+          RenderBR {BR} at (31,780) size 1x15
+          RenderText {#text} at (0,795) size 32x15
+            text run at (0,795) width 32: "TTTT"
+          RenderBR {BR} at (31,795) size 1x15
+          RenderText {#text} at (0,810) size 32x15
+            text run at (0,810) width 32: "UUUU"
+          RenderBR {BR} at (31,810) size 1x15
+          RenderText {#text} at (0,825) size 32x15
+            text run at (0,825) width 32: "VVVV"
+          RenderBR {BR} at (31,825) size 1x15
+          RenderText {#text} at (0,840) size 32x15
+            text run at (0,840) width 32: "WWWW"
+          RenderBR {BR} at (31,840) size 1x15
+          RenderText {#text} at (0,855) size 32x15
+            text run at (0,855) width 32: "XXXX"
+          RenderBR {BR} at (31,855) size 1x15
+          RenderText {#text} at (0,870) size 32x15
+            text run at (0,870) width 32: "YYYY"
+          RenderBR {BR} at (31,870) size 1x15
+          RenderText {#text} at (0,885) size 32x15
+            text run at (0,885) width 32: "ZZZZ"
+          RenderBR {BR} at (31,885) size 1x15
+          RenderText {#text} at (0,900) size 32x15
+            text run at (0,900) width 32: "[[[["
+          RenderBR {BR} at (31,900) size 1x15
+          RenderText {#text} at (0,915) size 32x15
+            text run at (0,915) width 32: "\\\\\\\\"
+          RenderBR {BR} at (31,915) size 1x15
+          RenderText {#text} at (0,930) size 32x15
+            text run at (0,930) width 32: "]]]]"
+          RenderBR {BR} at (31,930) size 1x15
+          RenderText {#text} at (0,945) size 32x15
+            text run at (0,945) width 32: "^^^^"
+          RenderBR {BR} at (31,945) size 1x15
+          RenderText {#text} at (0,960) size 32x15
+            text run at (0,960) width 32: "____"
+          RenderBR {BR} at (31,960) size 1x15
+          RenderText {#text} at (0,975) size 32x15
+            text run at (0,975) width 32: "````"
+          RenderBR {BR} at (31,975) size 1x15
+          RenderText {#text} at (0,990) size 32x15
+            text run at (0,990) width 32: "aaaa"
+          RenderBR {BR} at (31,990) size 1x15
+          RenderText {#text} at (0,1005) size 32x15
+            text run at (0,1005) width 32: "bbbb"
+          RenderBR {BR} at (31,1005) size 1x15
+          RenderText {#text} at (0,1020) size 32x15
+            text run at (0,1020) width 32: "cccc"
+          RenderBR {BR} at (31,1020) size 1x15
+          RenderText {#text} at (0,1035) size 32x15
+            text run at (0,1035) width 32: "dddd"
+          RenderBR {BR} at (31,1035) size 1x15
+          RenderText {#text} at (0,1050) size 32x15
+            text run at (0,1050) width 32: "eeee"
+          RenderBR {BR} at (31,1050) size 1x15
+          RenderText {#text} at (0,1065) size 32x15
+            text run at (0,1065) width 32: "ffff"
+          RenderBR {BR} at (31,1065) size 1x15
+          RenderText {#text} at (0,1080) size 32x15
+            text run at (0,1080) width 32: "gggg"
+          RenderBR {BR} at (31,1080) size 1x15
+          RenderText {#text} at (0,1095) size 32x15
+            text run at (0,1095) width 32: "hhhh"
+          RenderBR {BR} at (31,1095) size 1x15
+          RenderText {#text} at (0,1110) size 32x15
+            text run at (0,1110) width 32: "iiii"
+          RenderBR {BR} at (31,1110) size 1x15
+          RenderText {#text} at (0,1125) size 32x15
+            text run at (0,1125) width 32: "jjjj"
+          RenderBR {BR} at (31,1125) size 1x15
+          RenderText {#text} at (0,1140) size 32x15
+            text run at (0,1140) width 32: "kkkk"
+          RenderBR {BR} at (31,1140) size 1x15
+          RenderText {#text} at (0,1155) size 32x15
+            text run at (0,1155) width 32: "llll"
+          RenderBR {BR} at (31,1155) size 1x15
+          RenderText {#text} at (0,1170) size 32x15
+            text run at (0,1170) width 32: "mmmm"
+          RenderBR {BR} at (31,1170) size 1x15
+          RenderText {#text} at (0,1185) size 32x15
+            text run at (0,1185) width 32: "nnnn"
+          RenderBR {BR} at (31,1185) size 1x15
+          RenderText {#text} at (0,1200) size 32x15
+            text run at (0,1200) width 32: "oooo"
+          RenderBR {BR} at (31,1200) size 1x15
+          RenderText {#text} at (0,1215) size 32x15
+            text run at (0,1215) width 32: "pppp"
+          RenderBR {BR} at (31,1215) size 1x15
+          RenderText {#text} at (0,1230) size 32x15
+            text run at (0,1230) width 32: "qqqq"
+          RenderBR {BR} at (31,1230) size 1x15
+          RenderText {#text} at (0,1245) size 32x15
+            text run at (0,1245) width 32: "rrrr"
+          RenderBR {BR} at (31,1245) size 1x15
+          RenderText {#text} at (0,1260) size 32x15
+            text run at (0,1260) width 32: "ssss"
+          RenderBR {BR} at (31,1260) size 1x15
+          RenderText {#text} at (0,1275) size 32x15
+            text run at (0,1275) width 32: "tttt"
+          RenderBR {BR} at (31,1275) size 1x15
+          RenderText {#text} at (0,1290) size 32x15
+            text run at (0,1290) width 32: "uuuu"
+          RenderBR {BR} at (31,1290) size 1x15
+          RenderText {#text} at (0,1305) size 32x15
+            text run at (0,1305) width 32: "vvvv"
+          RenderBR {BR} at (31,1305) size 1x15
+          RenderText {#text} at (0,1320) size 32x15
+            text run at (0,1320) width 32: "wwww"
+          RenderBR {BR} at (31,1320) size 1x15
+          RenderText {#text} at (0,1335) size 32x15
+            text run at (0,1335) width 32: "xxxx"
+          RenderBR {BR} at (31,1335) size 1x15
+          RenderText {#text} at (0,1350) size 32x15
+            text run at (0,1350) width 32: "yyyy"
+          RenderBR {BR} at (31,1350) size 1x15
+          RenderText {#text} at (0,1365) size 32x15
+            text run at (0,1365) width 32: "zzzz"
+          RenderBR {BR} at (31,1365) size 1x15
+          RenderText {#text} at (0,1380) size 32x15
+            text run at (0,1380) width 32: "{{{{"
+          RenderBR {BR} at (31,1380) size 1x15
+          RenderText {#text} at (0,1395) size 32x15
+            text run at (0,1395) width 32: "||||"
+          RenderBR {BR} at (31,1395) size 1x15
+          RenderText {#text} at (0,1410) size 32x15
+            text run at (0,1410) width 32: "}}}}"
+          RenderBR {BR} at (31,1410) size 1x15
+      RenderBlock {P} at (0,1897) size 769x1410
+        RenderInline {FONT} at (0,0) size 32x1410
+          RenderText {#text} at (0,0) size 0x0
+          RenderInline {B} at (0,0) size 32x1410
+            RenderText {#text} at (0,0) size 32x15
+              text run at (0,0) width 32: "    "
+            RenderBR {BR} at (31,0) size 1x15
+            RenderText {#text} at (0,15) size 32x15
+              text run at (0,15) width 32: "!!!!"
+            RenderBR {BR} at (31,15) size 1x15
+            RenderText {#text} at (0,30) size 32x15
+              text run at (0,30) width 32: "\"\"\"\""
+            RenderBR {BR} at (31,30) size 1x15
+            RenderText {#text} at (0,45) size 32x15
+              text run at (0,45) width 32: "####"
+            RenderBR {BR} at (31,45) size 1x15
+            RenderText {#text} at (0,60) size 32x15
+              text run at (0,60) width 32: "$$$$"
+            RenderBR {BR} at (31,60) size 1x15
+            RenderText {#text} at (0,75) size 32x15
+              text run at (0,75) width 32: "%%%%"
+            RenderBR {BR} at (31,75) size 1x15
+            RenderText {#text} at (0,90) size 32x15
+              text run at (0,90) width 32: "&&&&"
+            RenderBR {BR} at (31,90) size 1x15
+            RenderText {#text} at (0,105) size 32x15
+              text run at (0,105) width 32: "''''"
+            RenderBR {BR} at (31,105) size 1x15
+            RenderText {#text} at (0,120) size 32x15
+              text run at (0,120) width 32: "(((("
+            RenderBR {BR} at (31,120) size 1x15
+            RenderText {#text} at (0,135) size 32x15
+              text run at (0,135) width 32: "))))"
+            RenderBR {BR} at (31,135) size 1x15
+            RenderText {#text} at (0,150) size 32x15
+              text run at (0,150) width 32: "****"
+            RenderBR {BR} at (31,150) size 1x15
+            RenderText {#text} at (0,165) size 32x15
+              text run at (0,165) width 32: "++++"
+            RenderBR {BR} at (31,165) size 1x15
+            RenderText {#text} at (0,180) size 32x15
+              text run at (0,180) width 32: ",,,,"
+            RenderBR {BR} at (31,180) size 1x15
+            RenderText {#text} at (0,195) size 32x15
+              text run at (0,195) width 32: "----"
+            RenderBR {BR} at (31,195) size 1x15
+            RenderText {#text} at (0,210) size 32x15
+              text run at (0,210) width 32: "...."
+            RenderBR {BR} at (31,210) size 1x15
+            RenderText {#text} at (0,225) size 32x15
+              text run at (0,225) width 32: "////"
+            RenderBR {BR} at (31,225) size 1x15
+            RenderText {#text} at (0,240) size 32x15
+              text run at (0,240) width 32: "0000"
+            RenderBR {BR} at (31,240) size 1x15
+            RenderText {#text} at (0,255) size 32x15
+              text run at (0,255) width 32: "1111"
+            RenderBR {BR} at (31,255) size 1x15
+            RenderText {#text} at (0,270) size 32x15
+              text run at (0,270) width 32: "2222"
+            RenderBR {BR} at (31,270) size 1x15
+            RenderText {#text} at (0,285) size 32x15
+              text run at (0,285) width 32: "3333"
+            RenderBR {BR} at (31,285) size 1x15
+            RenderText {#text} at (0,300) size 32x15
+              text run at (0,300) width 32: "4444"
+            RenderBR {BR} at (31,300) size 1x15
+            RenderText {#text} at (0,315) size 32x15
+              text run at (0,315) width 32: "5555"
+            RenderBR {BR} at (31,315) size 1x15
+            RenderText {#text} at (0,330) size 32x15
+              text run at (0,330) width 32: "6666"
+            RenderBR {BR} at (31,330) size 1x15
+            RenderText {#text} at (0,345) size 32x15
+              text run at (0,345) width 32: "7777"
+            RenderBR {BR} at (31,345) size 1x15
+            RenderText {#text} at (0,360) size 32x15
+              text run at (0,360) width 32: "8888"
+            RenderBR {BR} at (31,360) size 1x15
+            RenderText {#text} at (0,375) size 32x15
+              text run at (0,375) width 32: "9999"
+            RenderBR {BR} at (31,375) size 1x15
+            RenderText {#text} at (0,390) size 32x15
+              text run at (0,390) width 32: "::::"
+            RenderBR {BR} at (31,390) size 1x15
+            RenderText {#text} at (0,405) size 32x15
+              text run at (0,405) width 32: ";;;;"
+            RenderBR {BR} at (31,405) size 1x15
+            RenderText {#text} at (0,420) size 32x15
+              text run at (0,420) width 32: "<<<<"
+            RenderBR {BR} at (31,420) size 1x15
+            RenderText {#text} at (0,435) size 32x15
+              text run at (0,435) width 32: "===="
+            RenderBR {BR} at (31,435) size 1x15
+            RenderText {#text} at (0,450) size 32x15
+              text run at (0,450) width 32: ">>>>"
+            RenderBR {BR} at (31,450) size 1x15
+            RenderText {#text} at (0,465) size 32x15
+              text run at (0,465) width 32: "????"
+            RenderBR {BR} at (31,465) size 1x15
+            RenderText {#text} at (0,480) size 32x15
+              text run at (0,480) width 32: "@@@@"
+            RenderBR {BR} at (31,480) size 1x15
+            RenderText {#text} at (0,495) size 32x15
+              text run at (0,495) width 32: "AAAA"
+            RenderBR {BR} at (31,495) size 1x15
+            RenderText {#text} at (0,510) size 32x15
+              text run at (0,510) width 32: "BBBB"
+            RenderBR {BR} at (31,510) size 1x15
+            RenderText {#text} at (0,525) size 32x15
+              text run at (0,525) width 32: "CCCC"
+            RenderBR {BR} at (31,525) size 1x15
+            RenderText {#text} at (0,540) size 32x15
+              text run at (0,540) width 32: "DDDD"
+            RenderBR {BR} at (31,540) size 1x15
+            RenderText {#text} at (0,555) size 32x15
+              text run at (0,555) width 32: "EEEE"
+            RenderBR {BR} at (31,555) size 1x15
+            RenderText {#text} at (0,570) size 32x15
+              text run at (0,570) width 32: "FFFF"
+            RenderBR {BR} at (31,570) size 1x15
+            RenderText {#text} at (0,585) size 32x15
+              text run at (0,585) width 32: "GGGG"
+            RenderBR {BR} at (31,585) size 1x15
+            RenderText {#text} at (0,600) size 32x15
+              text run at (0,600) width 32: "HHHH"
+            RenderBR {BR} at (31,600) size 1x15
+            RenderText {#text} at (0,615) size 32x15
+              text run at (0,615) width 32: "IIII"
+            RenderBR {BR} at (31,615) size 1x15
+            RenderText {#text} at (0,630) size 32x15
+              text run at (0,630) width 32: "JJJJ"
+            RenderBR {BR} at (31,630) size 1x15
+            RenderText {#text} at (0,645) size 32x15
+              text run at (0,645) width 32: "KKKK"
+            RenderBR {BR} at (31,645) size 1x15
+            RenderText {#text} at (0,660) size 32x15
+              text run at (0,660) width 32: "LLLL"
+            RenderBR {BR} at (31,660) size 1x15
+            RenderText {#text} at (0,675) size 32x15
+              text run at (0,675) width 32: "MMMM"
+            RenderBR {BR} at (31,675) size 1x15
+            RenderText {#text} at (0,690) size 32x15
+              text run at (0,690) width 32: "NNNN"
+            RenderBR {BR} at (31,690) size 1x15
+            RenderText {#text} at (0,705) size 32x15
+              text run at (0,705) width 32: "OOOO"
+            RenderBR {BR} at (31,705) size 1x15
+            RenderText {#text} at (0,720) size 32x15
+              text run at (0,720) width 32: "PPPP"
+            RenderBR {BR} at (31,720) size 1x15
+            RenderText {#text} at (0,735) size 32x15
+              text run at (0,735) width 32: "QQQQ"
+            RenderBR {BR} at (31,735) size 1x15
+            RenderText {#text} at (0,750) size 32x15
+              text run at (0,750) width 32: "RRRR"
+            RenderBR {BR} at (31,750) size 1x15
+            RenderText {#text} at (0,765) size 32x15
+              text run at (0,765) width 32: "SSSS"
+            RenderBR {BR} at (31,765) size 1x15
+            RenderText {#text} at (0,780) size 32x15
+              text run at (0,780) width 32: "TTTT"
+            RenderBR {BR} at (31,780) size 1x15
+            RenderText {#text} at (0,795) size 32x15
+              text run at (0,795) width 32: "UUUU"
+            RenderBR {BR} at (31,795) size 1x15
+            RenderText {#text} at (0,810) size 32x15
+              text run at (0,810) width 32: "VVVV"
+            RenderBR {BR} at (31,810) size 1x15
+            RenderText {#text} at (0,825) size 32x15
+              text run at (0,825) width 32: "WWWW"
+            RenderBR {BR} at (31,825) size 1x15
+            RenderText {#text} at (0,840) size 32x15
+              text run at (0,840) width 32: "XXXX"
+            RenderBR {BR} at (31,840) size 1x15
+            RenderText {#text} at (0,855) size 32x15
+              text run at (0,855) width 32: "YYYY"
+            RenderBR {BR} at (31,855) size 1x15
+            RenderText {#text} at (0,870) size 32x15
+              text run at (0,870) width 32: "ZZZZ"
+            RenderBR {BR} at (31,870) size 1x15
+            RenderText {#text} at (0,885) size 32x15
+              text run at (0,885) width 32: "[[[["
+            RenderBR {BR} at (31,885) size 1x15
+            RenderText {#text} at (0,900) size 32x15
+              text run at (0,900) width 32: "\\\\\\\\"
+            RenderBR {BR} at (31,900) size 1x15
+            RenderText {#text} at (0,915) size 32x15
+              text run at (0,915) width 32: "]]]]"
+            RenderBR {BR} at (31,915) size 1x15
+            RenderText {#text} at (0,930) size 32x15
+              text run at (0,930) width 32: "^^^^"
+            RenderBR {BR} at (31,930) size 1x15
+            RenderText {#text} at (0,945) size 32x15
+              text run at (0,945) width 32: "____"
+            RenderBR {BR} at (31,945) size 1x15
+            RenderText {#text} at (0,960) size 32x15
+              text run at (0,960) width 32: "````"
+            RenderBR {BR} at (31,960) size 1x15
+            RenderText {#text} at (0,975) size 32x15
+              text run at (0,975) width 32: "aaaa"
+            RenderBR {BR} at (31,975) size 1x15
+            RenderText {#text} at (0,990) size 32x15
+              text run at (0,990) width 32: "bbbb"
+            RenderBR {BR} at (31,990) size 1x15
+            RenderText {#text} at (0,1005) size 32x15
+              text run at (0,1005) width 32: "cccc"
+            RenderBR {BR} at (31,1005) size 1x15
+            RenderText {#text} at (0,1020) size 32x15
+              text run at (0,1020) width 32: "dddd"
+            RenderBR {BR} at (31,1020) size 1x15
+            RenderText {#text} at (0,1035) size 32x15
+              text run at (0,1035) width 32: "eeee"
+            RenderBR {BR} at (31,1035) size 1x15
+            RenderText {#text} at (0,1050) size 32x15
+              text run at (0,1050) width 32: "ffff"
+            RenderBR {BR} at (31,1050) size 1x15
+            RenderText {#text} at (0,1065) size 32x15
+              text run at (0,1065) width 32: "gggg"
+            RenderBR {BR} at (31,1065) size 1x15
+            RenderText {#text} at (0,1080) size 32x15
+              text run at (0,1080) width 32: "hhhh"
+            RenderBR {BR} at (31,1080) size 1x15
+            RenderText {#text} at (0,1095) size 32x15
+              text run at (0,1095) width 32: "iiii"
+            RenderBR {BR} at (31,1095) size 1x15
+            RenderText {#text} at (0,1110) size 32x15
+              text run at (0,1110) width 32: "jjjj"
+            RenderBR {BR} at (31,1110) size 1x15
+            RenderText {#text} at (0,1125) size 32x15
+              text run at (0,1125) width 32: "kkkk"
+            RenderBR {BR} at (31,1125) size 1x15
+            RenderText {#text} at (0,1140) size 32x15
+              text run at (0,1140) width 32: "llll"
+            RenderBR {BR} at (31,1140) size 1x15
+            RenderText {#text} at (0,1155) size 32x15
+              text run at (0,1155) width 32: "mmmm"
+            RenderBR {BR} at (31,1155) size 1x15
+            RenderText {#text} at (0,1170) size 32x15
+              text run at (0,1170) width 32: "nnnn"
+            RenderBR {BR} at (31,1170) size 1x15
+            RenderText {#text} at (0,1185) size 32x15
+              text run at (0,1185) width 32: "oooo"
+            RenderBR {BR} at (31,1185) size 1x15
+            RenderText {#text} at (0,1200) size 32x15
+              text run at (0,1200) width 32: "pppp"
+            RenderBR {BR} at (31,1200) size 1x15
+            RenderText {#text} at (0,1215) size 32x15
+              text run at (0,1215) width 32: "qqqq"
+            RenderBR {BR} at (31,1215) size 1x15
+            RenderText {#text} at (0,1230) size 32x15
+              text run at (0,1230) width 32: "rrrr"
+            RenderBR {BR} at (31,1230) size 1x15
+            RenderText {#text} at (0,1245) size 32x15
+              text run at (0,1245) width 32: "ssss"
+            RenderBR {BR} at (31,1245) size 1x15
+            RenderText {#text} at (0,1260) size 32x15
+              text run at (0,1260) width 32: "tttt"
+            RenderBR {BR} at (31,1260) size 1x15
+            RenderText {#text} at (0,1275) size 32x15
+              text run at (0,1275) width 32: "uuuu"
+            RenderBR {BR} at (31,1275) size 1x15
+            RenderText {#text} at (0,1290) size 32x15
+              text run at (0,1290) width 32: "vvvv"
+            RenderBR {BR} at (31,1290) size 1x15
+            RenderText {#text} at (0,1305) size 32x15
+              text run at (0,1305) width 32: "wwww"
+            RenderBR {BR} at (31,1305) size 1x15
+            RenderText {#text} at (0,1320) size 32x15
+              text run at (0,1320) width 32: "xxxx"
+            RenderBR {BR} at (31,1320) size 1x15
+            RenderText {#text} at (0,1335) size 32x15
+              text run at (0,1335) width 32: "yyyy"
+            RenderBR {BR} at (31,1335) size 1x15
+            RenderText {#text} at (0,1350) size 32x15
+              text run at (0,1350) width 32: "zzzz"
+            RenderBR {BR} at (31,1350) size 1x15
+            RenderText {#text} at (0,1365) size 32x15
+              text run at (0,1365) width 32: "{{{{"
+            RenderBR {BR} at (31,1365) size 1x15
+            RenderText {#text} at (0,1380) size 32x15
+              text run at (0,1380) width 32: "||||"
+            RenderBR {BR} at (31,1380) size 1x15
+            RenderText {#text} at (0,1395) size 32x15
+              text run at (0,1395) width 32: "}}}}"
+            RenderBR {BR} at (31,1395) size 1x15
+          RenderText {#text} at (0,0) size 0x0
+      RenderBlock {P} at (0,3323) size 769x1410
+        RenderInline {FONT} at (0,0) size 32x1410
+          RenderText {#text} at (0,0) size 0x0
+          RenderInline {I} at (0,0) size 32x1410
+            RenderText {#text} at (0,0) size 32x15
+              text run at (0,0) width 32: "    "
+            RenderBR {BR} at (31,0) size 1x15
+            RenderText {#text} at (0,15) size 32x15
+              text run at (0,15) width 32: "!!!!"
+            RenderBR {BR} at (31,15) size 1x15
+            RenderText {#text} at (0,30) size 32x15
+              text run at (0,30) width 32: "\"\"\"\""
+            RenderBR {BR} at (31,30) size 1x15
+            RenderText {#text} at (0,45) size 32x15
+              text run at (0,45) width 32: "####"
+            RenderBR {BR} at (31,45) size 1x15
+            RenderText {#text} at (0,60) size 32x15
+              text run at (0,60) width 32: "$$$$"
+            RenderBR {BR} at (31,60) size 1x15
+            RenderText {#text} at (0,75) size 32x15
+              text run at (0,75) width 32: "%%%%"
+            RenderBR {BR} at (31,75) size 1x15
+            RenderText {#text} at (0,90) size 32x15
+              text run at (0,90) width 32: "&&&&"
+            RenderBR {BR} at (31,90) size 1x15
+            RenderText {#text} at (0,105) size 32x15
+              text run at (0,105) width 32: "''''"
+            RenderBR {BR} at (31,105) size 1x15
+            RenderText {#text} at (0,120) size 32x15
+              text run at (0,120) width 32: "(((("
+            RenderBR {BR} at (31,120) size 1x15
+            RenderText {#text} at (0,135) size 32x15
+              text run at (0,135) width 32: "))))"
+            RenderBR {BR} at (31,135) size 1x15
+            RenderText {#text} at (0,150) size 32x15
+              text run at (0,150) width 32: "****"
+            RenderBR {BR} at (31,150) size 1x15
+            RenderText {#text} at (0,165) size 32x15
+              text run at (0,165) width 32: "++++"
+            RenderBR {BR} at (31,165) size 1x15
+            RenderText {#text} at (0,180) size 32x15
+              text run at (0,180) width 32: ",,,,"
+            RenderBR {BR} at (31,180) size 1x15
+            RenderText {#text} at (0,195) size 32x15
+              text run at (0,195) width 32: "----"
+            RenderBR {BR} at (31,195) size 1x15
+            RenderText {#text} at (0,210) size 32x15
+              text run at (0,210) width 32: "...."
+            RenderBR {BR} at (31,210) size 1x15
+            RenderText {#text} at (0,225) size 32x15
+              text run at (0,225) width 32: "////"
+            RenderBR {BR} at (31,225) size 1x15
+            RenderText {#text} at (0,240) size 32x15
+              text run at (0,240) width 32: "0000"
+            RenderBR {BR} at (31,240) size 1x15
+            RenderText {#text} at (0,255) size 32x15
+              text run at (0,255) width 32: "1111"
+            RenderBR {BR} at (31,255) size 1x15
+            RenderText {#text} at (0,270) size 32x15
+              text run at (0,270) width 32: "2222"
+            RenderBR {BR} at (31,270) size 1x15
+            RenderText {#text} at (0,285) size 32x15
+              text run at (0,285) width 32: "3333"
+            RenderBR {BR} at (31,285) size 1x15
+            RenderText {#text} at (0,300) size 32x15
+              text run at (0,300) width 32: "4444"
+            RenderBR {BR} at (31,300) size 1x15
+            RenderText {#text} at (0,315) size 32x15
+              text run at (0,315) width 32: "5555"
+            RenderBR {BR} at (31,315) size 1x15
+            RenderText {#text} at (0,330) size 32x15
+              text run at (0,330) width 32: "6666"
+            RenderBR {BR} at (31,330) size 1x15
+            RenderText {#text} at (0,345) size 32x15
+              text run at (0,345) width 32: "7777"
+            RenderBR {BR} at (31,345) size 1x15
+            RenderText {#text} at (0,360) size 32x15
+              text run at (0,360) width 32: "8888"
+            RenderBR {BR} at (31,360) size 1x15
+            RenderText {#text} at (0,375) size 32x15
+              text run at (0,375) width 32: "9999"
+            RenderBR {BR} at (31,375) size 1x15
+            RenderText {#text} at (0,390) size 32x15
+              text run at (0,390) width 32: "::::"
+            RenderBR {BR} at (31,390) size 1x15
+            RenderText {#text} at (0,405) size 32x15
+              text run at (0,405) width 32: ";;;;"
+            RenderBR {BR} at (31,405) size 1x15
+            RenderText {#text} at (0,420) size 32x15
+              text run at (0,420) width 32: "<<<<"
+            RenderBR {BR} at (31,420) size 1x15
+            RenderText {#text} at (0,435) size 32x15
+              text run at (0,435) width 32: "===="
+            RenderBR {BR} at (31,435) size 1x15
+            RenderText {#text} at (0,450) size 32x15
+              text run at (0,450) width 32: ">>>>"
+            RenderBR {BR} at (31,450) size 1x15
+            RenderText {#text} at (0,465) size 32x15
+              text run at (0,465) width 32: "????"
+            RenderBR {BR} at (31,465) size 1x15
+            RenderText {#text} at (0,480) size 32x15
+              text run at (0,480) width 32: "@@@@"
+            RenderBR {BR} at (31,480) size 1x15
+            RenderText {#text} at (0,495) size 32x15
+              text run at (0,495) width 32: "AAAA"
+            RenderBR {BR} at (31,495) size 1x15
+            RenderText {#text} at (0,510) size 32x15
+              text run at (0,510) width 32: "BBBB"
+            RenderBR {BR} at (31,510) size 1x15
+            RenderText {#text} at (0,525) size 32x15
+              text run at (0,525) width 32: "CCCC"
+            RenderBR {BR} at (31,525) size 1x15
+            RenderText {#text} at (0,540) size 32x15
+              text run at (0,540) width 32: "DDDD"
+            RenderBR {BR} at (31,540) size 1x15
+            RenderText {#text} at (0,555) size 32x15
+              text run at (0,555) width 32: "EEEE"
+            RenderBR {BR} at (31,555) size 1x15
+            RenderText {#text} at (0,570) size 32x15
+              text run at (0,570) width 32: "FFFF"
+            RenderBR {BR} at (31,570) size 1x15
+            RenderText {#text} at (0,585) size 32x15
+              text run at (0,585) width 32: "GGGG"
+            RenderBR {BR} at (31,585) size 1x15
+            RenderText {#text} at (0,600) size 32x15
+              text run at (0,600) width 32: "HHHH"
+            RenderBR {BR} at (31,600) size 1x15
+            RenderText {#text} at (0,615) size 32x15
+              text run at (0,615) width 32: "IIII"
+            RenderBR {BR} at (31,615) size 1x15
+            RenderText {#text} at (0,630) size 32x15
+              text run at (0,630) width 32: "JJJJ"
+            RenderBR {BR} at (31,630) size 1x15
+            RenderText {#text} at (0,645) size 32x15
+              text run at (0,645) width 32: "KKKK"
+            RenderBR {BR} at (31,645) size 1x15
+            RenderText {#text} at (0,660) size 32x15
+              text run at (0,660) width 32: "LLLL"
+            RenderBR {BR} at (31,660) size 1x15
+            RenderText {#text} at (0,675) size 32x15
+              text run at (0,675) width 32: "MMMM"
+            RenderBR {BR} at (31,675) size 1x15
+            RenderText {#text} at (0,690) size 32x15
+              text run at (0,690) width 32: "NNNN"
+            RenderBR {BR} at (31,690) size 1x15
+            RenderText {#text} at (0,705) size 32x15
+              text run at (0,705) width 32: "OOOO"
+            RenderBR {BR} at (31,705) size 1x15
+            RenderText {#text} at (0,720) size 32x15
+              text run at (0,720) width 32: "PPPP"
+            RenderBR {BR} at (31,720) size 1x15
+            RenderText {#text} at (0,735) size 32x15
+              text run at (0,735) width 32: "QQQQ"
+            RenderBR {BR} at (31,735) size 1x15
+            RenderText {#text} at (0,750) size 32x15
+              text run at (0,750) width 32: "RRRR"
+            RenderBR {BR} at (31,750) size 1x15
+            RenderText {#text} at (0,765) size 32x15
+              text run at (0,765) width 32: "SSSS"
+            RenderBR {BR} at (31,765) size 1x15
+            RenderText {#text} at (0,780) size 32x15
+              text run at (0,780) width 32: "TTTT"
+            RenderBR {BR} at (31,780) size 1x15
+            RenderText {#text} at (0,795) size 32x15
+              text run at (0,795) width 32: "UUUU"
+            RenderBR {BR} at (31,795) size 1x15
+            RenderText {#text} at (0,810) size 32x15
+              text run at (0,810) width 32: "VVVV"
+            RenderBR {BR} at (31,810) size 1x15
+            RenderText {#text} at (0,825) size 32x15
+              text run at (0,825) width 32: "WWWW"
+            RenderBR {BR} at (31,825) size 1x15
+            RenderText {#text} at (0,840) size 32x15
+              text run at (0,840) width 32: "XXXX"
+            RenderBR {BR} at (31,840) size 1x15
+            RenderText {#text} at (0,855) size 32x15
+              text run at (0,855) width 32: "YYYY"
+            RenderBR {BR} at (31,855) size 1x15
+            RenderText {#text} at (0,870) size 32x15
+              text run at (0,870) width 32: "ZZZZ"
+            RenderBR {BR} at (31,870) size 1x15
+            RenderText {#text} at (0,885) size 32x15
+              text run at (0,885) width 32: "[[[["
+            RenderBR {BR} at (31,885) size 1x15
+            RenderText {#text} at (0,900) size 32x15
+              text run at (0,900) width 32: "\\\\\\\\"
+            RenderBR {BR} at (31,900) size 1x15
+            RenderText {#text} at (0,915) size 32x15
+              text run at (0,915) width 32: "]]]]"
+            RenderBR {BR} at (31,915) size 1x15
+            RenderText {#text} at (0,930) size 32x15
+              text run at (0,930) width 32: "^^^^"
+            RenderBR {BR} at (31,930) size 1x15
+            RenderText {#text} at (0,945) size 32x15
+              text run at (0,945) width 32: "____"
+            RenderBR {BR} at (31,945) size 1x15
+            RenderText {#text} at (0,960) size 32x15
+              text run at (0,960) width 32: "````"
+            RenderBR {BR} at (31,960) size 1x15
+            RenderText {#text} at (0,975) size 32x15
+              text run at (0,975) width 32: "aaaa"
+            RenderBR {BR} at (31,975) size 1x15
+            RenderText {#text} at (0,990) size 32x15
+              text run at (0,990) width 32: "bbbb"
+            RenderBR {BR} at (31,990) size 1x15
+            RenderText {#text} at (0,1005) size 32x15
+              text run at (0,1005) width 32: "cccc"
+            RenderBR {BR} at (31,1005) size 1x15
+            RenderText {#text} at (0,1020) size 32x15
+              text run at (0,1020) width 32: "dddd"
+            RenderBR {BR} at (31,1020) size 1x15
+            RenderText {#text} at (0,1035) size 32x15
+              text run at (0,1035) width 32: "eeee"
+            RenderBR {BR} at (31,1035) size 1x15
+            RenderText {#text} at (0,1050) size 32x15
+              text run at (0,1050) width 32: "ffff"
+            RenderBR {BR} at (31,1050) size 1x15
+            RenderText {#text} at (0,1065) size 32x15
+              text run at (0,1065) width 32: "gggg"
+            RenderBR {BR} at (31,1065) size 1x15
+            RenderText {#text} at (0,1080) size 32x15
+              text run at (0,1080) width 32: "hhhh"
+            RenderBR {BR} at (31,1080) size 1x15
+            RenderText {#text} at (0,1095) size 32x15
+              text run at (0,1095) width 32: "iiii"
+            RenderBR {BR} at (31,1095) size 1x15
+            RenderText {#text} at (0,1110) size 32x15
+              text run at (0,1110) width 32: "jjjj"
+            RenderBR {BR} at (31,1110) size 1x15
+            RenderText {#text} at (0,1125) size 32x15
+              text run at (0,1125) width 32: "kkkk"
+            RenderBR {BR} at (31,1125) size 1x15
+            RenderText {#text} at (0,1140) size 32x15
+              text run at (0,1140) width 32: "llll"
+            RenderBR {BR} at (31,1140) size 1x15
+            RenderText {#text} at (0,1155) size 32x15
+              text run at (0,1155) width 32: "mmmm"
+            RenderBR {BR} at (31,1155) size 1x15
+            RenderText {#text} at (0,1170) size 32x15
+              text run at (0,1170) width 32: "nnnn"
+            RenderBR {BR} at (31,1170) size 1x15
+            RenderText {#text} at (0,1185) size 32x15
+              text run at (0,1185) width 32: "oooo"
+            RenderBR {BR} at (31,1185) size 1x15
+            RenderText {#text} at (0,1200) size 32x15
+              text run at (0,1200) width 32: "pppp"
+            RenderBR {BR} at (31,1200) size 1x15
+            RenderText {#text} at (0,1215) size 32x15
+              text run at (0,1215) width 32: "qqqq"
+            RenderBR {BR} at (31,1215) size 1x15
+            RenderText {#text} at (0,1230) size 32x15
+              text run at (0,1230) width 32: "rrrr"
+            RenderBR {BR} at (31,1230) size 1x15
+            RenderText {#text} at (0,1245) size 32x15
+              text run at (0,1245) width 32: "ssss"
+            RenderBR {BR} at (31,1245) size 1x15
+            RenderText {#text} at (0,1260) size 32x15
+              text run at (0,1260) width 32: "tttt"
+            RenderBR {BR} at (31,1260) size 1x15
+            RenderText {#text} at (0,1275) size 32x15
+              text run at (0,1275) width 32: "uuuu"
+            RenderBR {BR} at (31,1275) size 1x15
+            RenderText {#text} at (0,1290) size 32x15
+              text run at (0,1290) width 32: "vvvv"
+            RenderBR {BR} at (31,1290) size 1x15
+            RenderText {#text} at (0,1305) size 32x15
+              text run at (0,1305) width 32: "wwww"
+            RenderBR {BR} at (31,1305) size 1x15
+            RenderText {#text} at (0,1320) size 32x15
+              text run at (0,1320) width 32: "xxxx"
+            RenderBR {BR} at (31,1320) size 1x15
+            RenderText {#text} at (0,1335) size 32x15
+              text run at (0,1335) width 32: "yyyy"
+            RenderBR {BR} at (31,1335) size 1x15
+            RenderText {#text} at (0,1350) size 32x15
+              text run at (0,1350) width 32: "zzzz"
+            RenderBR {BR} at (31,1350) size 1x15
+            RenderText {#text} at (0,1365) size 32x15
+              text run at (0,1365) width 32: "{{{{"
+            RenderBR {BR} at (31,1365) size 1x15
+            RenderText {#text} at (0,1380) size 32x15
+              text run at (0,1380) width 32: "||||"
+            RenderBR {BR} at (31,1380) size 1x15
+            RenderText {#text} at (0,1395) size 32x15
+              text run at (0,1395) width 32: "}}}}"
+            RenderBR {BR} at (31,1395) size 1x15
+          RenderText {#text} at (0,0) size 0x0
+        RenderText {#text} at (0,0) size 0x0

Modified: trunk/Source/WebCore/ChangeLog (288943 => 288944)


--- trunk/Source/WebCore/ChangeLog	2022-02-02 05:38:23 UTC (rev 288943)
+++ trunk/Source/WebCore/ChangeLog	2022-02-02 05:50:59 UTC (rev 288944)
@@ -1,3 +1,22 @@
+2022-02-01  Alan Bujtas  <[email protected]>
+
+        [LFC][IFC] Using Fontcascade::spaceWidth to subtract the trailing space width may result in incorrect layout
+        https://bugs.webkit.org/show_bug.cgi?id=235937
+        <rdar://88059633>
+
+        Reviewed by Antti Koivisto and Simon Fraser.
+
+        Since Fontcascade::spaceWidth always consult the primary font, it may return unexpected width value when (in rare cases)
+        the primary font does not have a space glyph. Legacy line layout works as expected as it always runs a full width
+        computation on the space character (instead of directly calling FontCascade::spaceWidth).
+
+        * layout/formattingContexts/inline/InlineItemsBuilder.cpp:
+        (WebCore::Layout::InlineItemsBuilder::computeInlineTextItemWidths):
+        * layout/formattingContexts/inline/text/TextUtil.cpp:
+        (WebCore::Layout::TextUtil::width):
+        (WebCore::Layout::TextUtil::spaceWidth):
+        * layout/formattingContexts/inline/text/TextUtil.h:
+
 2022-02-01  Myles C. Maxfield  <[email protected]>
 
         Rename FontCascade::fontMetrics() and RenderStyle::fontMetrics() to fontMetricsOfPrimaryFont()

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.cpp (288943 => 288944)


--- trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.cpp	2022-02-02 05:38:23 UTC (rev 288943)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/InlineItemsBuilder.cpp	2022-02-02 05:50:59 UTC (rev 288944)
@@ -469,7 +469,7 @@
         auto width = [&]() -> std::optional<InlineLayoutUnit> {
             auto singleWhiteSpace = inlineTextItem.isWhitespace() && (!TextUtil::shouldPreserveSpacesAndTabs(inlineTextBox) || (length == 1 && inlineTextBox.canUseSimplifiedContentMeasuring()));
             if (singleWhiteSpace)
-                return inlineTextItem.style().fontCascade().spaceWidth();
+                return TextUtil::spaceWidth(inlineTextItem.style().fontCascade());
             if (length && !inlineTextItem.isZeroWidthSpaceSeparator())
                 return TextUtil::width(inlineTextBox, inlineTextItem.style().fontCascade(), start, start + length, { });
             return { };

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.cpp (288943 => 288944)


--- trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.cpp	2022-02-02 05:38:23 UTC (rev 288943)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.cpp	2022-02-02 05:50:59 UTC (rev 288944)
@@ -52,7 +52,7 @@
     RELEASE_ASSERT(from >= inlineTextItem.start());
     RELEASE_ASSERT(to <= inlineTextItem.end());
     if (inlineTextItem.isWhitespace() && !TextUtil::shouldPreserveSpacesAndTabs(inlineTextItem.layoutBox())) {
-        auto spaceWidth = fontCascade.spaceWidth();
+        auto spaceWidth = TextUtil::spaceWidth(fontCascade);
         return std::isnan(spaceWidth) ? 0.0f : std::isinf(spaceWidth) ? maxInlineLayoutUnit() : spaceWidth;
     }
     return TextUtil::width(inlineTextItem.inlineTextBox(), fontCascade, from, to, contentLogicalLeft);
@@ -84,11 +84,16 @@
     }
 
     if (extendedMeasuring)
-        width -= (fontCascade.spaceWidth() + fontCascade.wordSpacing());
+        width -= (spaceWidth(fontCascade) + fontCascade.wordSpacing());
 
     return std::isnan(width) ? 0.0f : std::isinf(width) ? maxInlineLayoutUnit() : width;
 }
 
+InlineLayoutUnit TextUtil::spaceWidth(const FontCascade& fontCascade)
+{
+    return fontCascade.width(TextRun { String { &space, 1 } });
+}
+
 InlineLayoutUnit TextUtil::trailingWhitespaceWidth(const InlineTextBox& inlineTextBox, const FontCascade& fontCascade, size_t startPosition, size_t endPosition)
 {
     auto text = inlineTextBox.content();

Modified: trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.h (288943 => 288944)


--- trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.h	2022-02-02 05:38:23 UTC (rev 288943)
+++ trunk/Source/WebCore/layout/formattingContexts/inline/text/TextUtil.h	2022-02-02 05:50:59 UTC (rev 288944)
@@ -49,6 +49,7 @@
 
     enum class UseTrailingWhitespaceMeasuringOptimization : uint8_t { Yes, No };
     static InlineLayoutUnit width(const InlineTextBox&, const FontCascade&, unsigned from, unsigned to, InlineLayoutUnit contentLogicalLeft, UseTrailingWhitespaceMeasuringOptimization = UseTrailingWhitespaceMeasuringOptimization::Yes);
+    static InlineLayoutUnit spaceWidth(const FontCascade&);
 
     static InlineLayoutUnit trailingWhitespaceWidth(const InlineTextBox&, const FontCascade&, size_t startPosition, size_t endPosition);
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to