Title: [279868] trunk
Revision
279868
Author
[email protected]
Date
2021-07-13 00:52:36 -0700 (Tue, 13 Jul 2021)

Log Message

PUA characters have the wrong advance in the fast text codepath
https://bugs.webkit.org/show_bug.cgi?id=227896
<rdar://problem/80037103>

Reviewed by Tim Horton.

Source/WebCore:

There were 2 problems:
1. We were passing a UChar32 to this function:
       static bool treatAsSpace(UChar c) { return c == ' ' ... }
       This means that passing in U+10020 erroneously returns true
2. Because of https://bugs.webkit.org/show_bug.cgi?id=221356,
       if the prevous character is in SMP, our logic to determine
       the previous advance would erroneously return 0.

Test: fast/text/pua-charactersTreatedAsSpace.html

* platform/graphics/FontCascade.h:
(WebCore::FontCascade::treatAsSpace):
(WebCore::FontCascade::treatAsZeroWidthSpace):
(WebCore::FontCascade::treatAsZeroWidthSpaceInComplexScript):
* platform/graphics/WidthIterator.cpp:
(WebCore::WidthIterator::advanceInternal):

LayoutTests:

* fast/text/pua-charactersTreatedAsSpace-expected.html: Added.
* fast/text/pua-charactersTreatedAsSpace.html: Added.
* fast/text/resources/Ahem-10000A.ttf: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (279867 => 279868)


--- trunk/LayoutTests/ChangeLog	2021-07-13 07:39:34 UTC (rev 279867)
+++ trunk/LayoutTests/ChangeLog	2021-07-13 07:52:36 UTC (rev 279868)
@@ -1,3 +1,15 @@
+2021-07-13  Myles C. Maxfield  <[email protected]>
+
+        PUA characters have the wrong advance in the fast text codepath
+        https://bugs.webkit.org/show_bug.cgi?id=227896
+        <rdar://problem/80037103>
+
+        Reviewed by Tim Horton.
+
+        * fast/text/pua-charactersTreatedAsSpace-expected.html: Added.
+        * fast/text/pua-charactersTreatedAsSpace.html: Added.
+        * fast/text/resources/Ahem-10000A.ttf: Added.
+
 2021-07-12 Eric Hutchison <[email protected]>
 
         REGRESSION (r279806):[iOS Mac wk2 ] fast/canvas/canvas-path-addPath.html is a flaky timeout.

Added: trunk/LayoutTests/fast/text/pua-charactersTreatedAsSpace-expected.html (0 => 279868)


--- trunk/LayoutTests/fast/text/pua-charactersTreatedAsSpace-expected.html	                        (rev 0)
+++ trunk/LayoutTests/fast/text/pua-charactersTreatedAsSpace-expected.html	2021-07-13 07:52:36 UTC (rev 279868)
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<style>
+@font-face {
+    font-family: "WebFont";
+    src: url("resources/Ahem-10000A.ttf") format("truetype");
+}
+div {
+    font-family: "WebFont";
+}
+</style>
+</head>
+<body>
+This test passes if you see a particular pattern of black boxes below.
+<div>ab</div>
+<div>a a</div>
+</body>
+</html>

Added: trunk/LayoutTests/fast/text/pua-charactersTreatedAsSpace.html (0 => 279868)


--- trunk/LayoutTests/fast/text/pua-charactersTreatedAsSpace.html	                        (rev 0)
+++ trunk/LayoutTests/fast/text/pua-charactersTreatedAsSpace.html	2021-07-13 07:52:36 UTC (rev 279868)
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<style>
+@font-face {
+    font-family: "WebFont";
+    src: url("resources/Ahem-10000A.ttf") format("truetype");
+}
+div {
+    font-family: "WebFont";
+}
+</style>
+</head>
+<body>
+This test passes if you see a particular pattern of black boxes below.
+<div>􀀄􀀊</div>
+<div>􀀄&nbsp;a</div>
+</body>
+</html>

Added: trunk/LayoutTests/fast/text/resources/Ahem-10000A.ttf (0 => 279868)


--- trunk/LayoutTests/fast/text/resources/Ahem-10000A.ttf	                        (rev 0)
+++ trunk/LayoutTests/fast/text/resources/Ahem-10000A.ttf	2021-07-13 07:52:36 UTC (rev 279868)
@@ -0,0 +1,51 @@
+����������\x80����0OS/2sf\xF9������\xBC������`cmap��m\xAC\xC0��������\x98gasp����	����\xB4������glyf4a@\x86����\xC4����head\xDBP͵����#\xD4������6hhea
+;����$������$hmtx(\xA6\xD5����$0����hloca\xD9\xCA\xD3����(\x98����6maxp��	����*\xD0������ nameO\xE3F\xE0����*\xF0����1\x9Apost	I\x94����\\x8C����\xAD��\xD6\x90������\xBC\x8A������\x8F\xBC\x8A����\xC5��2��������������������\x80����\xAF�� H����������������W3C ��@�� \xFF\xFF \xFF8���� ��\xC8\xFF\xFC����\xFF\xFF  ������ ��������������������������
+����������������\x84��������������\x9F������ ������&������������(������~������
+������\xA0������\xA0������\x99������\xA1������\xA1������\x95������\xA2������\xA3������\x82������\xA4������\xA4������\xA1������\xA5������\xA5������\x8E������\xA6������\xA6������\xBD������\xA7������\xA7������\x84������\xA8������\xA8������\x8A������\xA9������\xA9������\x88������\xAA������\xAA������\x90������\xAB������\xAB������\x97������\xAC������\xAC������\x96������\xAD������\xAD������\xC4������\xAE������\xAE������\x87������\xAF������\xAF������\xB5������\xB0������\xB0������\x81������\xB1������\xB1������\x8D������\xB2������\xB3������\xC7������\xB4������\xB4������\x89������\xB5������\xB5������\x8F������\xB6������\xB6������\x85������\xB7������\xB7������\xA2������\xB8������\xB8������\xB9������\xB9������\xB9������\xC6������\xBA������\xBA������\x91������\xBB������\xBB������\x98������\xBC������\xBC������\xCA������\xBD������\xBD������\xC9������\xBE������\xBE������\xCB������\xBF������\xBF������\x94������\xC0������\xC0������\x9A������\xC1������\xC1������\xA5������\xC2������\xC2������\xA3������\
 xC3������\xC3������\x9B������\xC4������\xC5������a������\xC6������\xC6������\x8B������\xC7������\xC7������c������\xC8������\xC8������\xA7������\xC9������\xC9������d������\xCA������\xCA������\xA4������\xCB������\xCB������\xA6������\xCC������\xCC������\xAB������\xCD������\xCF������\xA8������\xD0������\xD0������\xBE������\xD1������\xD1������e������\xD2������\xD2������\xAE������\xD3������\xD4������\xAC������\xD5������\xD5������\x9C��
 ����\xD6������\xD6������f������\xD7������\xD7������\xC5������\xD8������\xD8������\x8C������\xD9������\xD9������\xB1������\xDA������\xDB������\xAF������\xDC������\xDC������g������\xDD������\xDD������\xC0������\xDE������\xDE������\xC2������\xDF������\xDF������\x86������\xE0������\xE0������i������\xE1������\xE1������h������\xE2������\xE2������j������\xE3������\xE3������l������\xE4������\xE4������k������\xE5������\xE5������m������\xE6������\xE6������\x92������\xE7������\xE7������n������\xE8������\xE8������p������\xE9������\xE9������o������\xEA������\xEB������q������\xEC������\xEC������t������\xED������\xED������s������\xEE������\xEF������u������\xF0������\xF0������\xBF������\xF1������\xF1������w������\xF2������\xF2������y������\xF3������\xF3������x������\xF4������\xF4������z������\xF5������\xF5������|������\xF6������\xF6������{������\xF7������\xF7������\x9F������\xF8������\xF8������\x93������\xF9������\xF9������~������\xFA������\xFA������}������\xFB������\xFC������������\xFD������\xFD�
 �����\xC1������\xFE������\xFE������\xC3������\xFF������\xFF������\xA0����1����1������\xB2����R����S������\xCE����x����x������\xD0����\x92����\x92������\xD1����\xC6����\xC6������\xB3����\xC7����\xC7������\xBC����\xC9����\xC9������\xB5����\xD8����\xDA������\xB6����\xDB����\xDB������\xBB����\xDC����\xDC������\xB4����\xDD����\xDD������\xBA����\x94����\x94������\xD2����\xA5����\xA5��������\xA7����\xA7��������
 \xA9����\xA9������\xD3����\xBC����\xBC������\x8F����\xC0����\xC0������\xD4���� ���� ������\xF6���� 	���� ������\xFB���� ���� +������\xFF���� ���� ���������� ���� ������\xD5���� ���� ������\x9D���� ���� ������\xD7���� ���� ������\xD8����  ���� "������\xDB���� &���� &������\xDE���� 0���� 0������\xDF���� 9���� :������\xE0���� D���� D������\xE2����!"����!"������\xE3����!&����!&������\xD3����"����"������\xE4����"����"������\xD2����"����"������\xE5����"����"������\xE6����"����"������\xC4����"����"������\xA2����"����"������\xE7����"����"������\xE8����"+����"+������\xE9����"H����"H������\xED����"`����"`������\xEA����"d����"e������\xEB����"\xF2����"\xF2������\xED����%\xCA����%\xCA������\xEE����0������0��������\xFE����0����0��������N������N����������N����N��������N	����N	��������N]����N
 ]����	����N\x8C����N\x8C��������N\x94����N\x94��������Qk����Qk��������Qm����Qm��������SA����SA����
+����V\xD7����V\xD7��������V\xDB����V\xDB��������W����W��������g(����g(��������j*����j*��������l4����l4��������pk����pk����+����~\xB5����~\xB5��������\x91\xD1����\x91\xD1��������\xF0������\xF0������\xEF����\xFE\xFF����\xFE\xFF������\xF5����������������������������
+����
+������������������\xFF\xFF������}����k ��������3!%!!}\xEE\xFD\x8F\xF4\xFE \xFC\xE0}&������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC 
 \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������
 \xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8
  ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ��
 ����!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!
 \xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\
 xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8����������1!!\xE8\xFC\xC8��������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xF
 C������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������
 \xFF8\xE8 ������!!\xE8\xFC \xFC����������\xE8 ������!!\xE8\xFC \xFC\xE0������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\x
 E8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ��
 ����!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!
 \xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\
 xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC
 ������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC��
 ����\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8
 \xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8
  ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!
 !\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE
 8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \x
 FC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC
 ������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC \xFC������\x90\xE8X������!!\xE8\xFCX\xC8��������\x90\xE8X������!!\xE8\xFCX\xC8������\xC8\xFF8\x90 ������3#\xC8\xC8\xC8 \xFC������\xC8\xFF8\x90 ������3#\xC8\xC8\xC8 \xFC��������\x90\xE8X������!!\xE8\xFCX\
 xC8������\xC8\xFF8\x90 ������3#\xC8\xC8\xC8 \xFC��������\xFF8\xE8 ������!!\xE8\xFC \xFC������\xFF8\xE8 ������!!\xE8\xFC 
 \xFC��������\x80��opê_<\xF5��	\xE8��������\xB3o_Y��������\xC4ݫ$����\xFF8\xE8 ���������������������������� \xFF8����\xE8��������\xE8������������������������������\xE8��}��������\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8���
 �\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\
 xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����
 \xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8������������\xF4����\xE8����M������\xFA������\xA7������\xC8������d������������\xE8��������������������\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\
 xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8����\xE8��\xC8\xE8��\xC8\xE8����\xE8��\xC8\xE8����\xE8������������������!��.��;��H��U��b��o��|��\x89��\x96��\xA3��\xB0��\xBD��\xCA��\xD7��\xE4��\xF1��\xFE%2?LYfs\x80\x8D\x9A\xA7\xB4\xC1\xCE\xDB\xE8\xF5)6CP]jw\x84\x91\x9E\xAB\xB8\xC5\xD2\xDF\xEC\xF9 -:GTan{\x88\x95\xA2\xAF\xBC\xC9\xD6\xE3\xF0\xFD
+#0=JWdq~\x8B\x98\xA5\xB2\xBF\xCC\xD9\xE6\xF3��+'4AN[hu\x82\x8F\x9C\xA9\xB6\xC3\xD0\xDD\xEA\xF7+8ER_ly\x86\x93\xA0\xAD\xBA\xC7\xD4\xE1\xEE\xFB"/<IVcp}\x8A\x97\xA4\xA4\xB1\xBE\xCB\xD8\xE5\xF2\xFF&3@MZgt\x81\x8E\x9B\xA8\xB5\xC2\xCF\xDC\xE9\xF6				*	7	D	Q	^	k	x	\x85	\x92	\x9F	\xAC	\xB9	\xC6	\xD3	\xE0	\xED	\xFA
+
+
+!
+.
+;
+H
+U
+b
+o
+|
+\x89
+\x96
+\xA3
+\xB0
+\xBD
+\xCA
+\xD7
+\xE4
+\xF1
+\xFE%2?LYfs\x80\x8D\x9A\xA7\xB4\xC1\xCE\xDB\xE8\xF5)6CCCCCCCCCCCCCP]jw\x84\x91\x9E\xAB\xB8\xC5\xD2\xDF\xEC\xF9+++ +-+:+G+T+a+n+{+\x88��������������������������������������������������������������$\xB6����������������\xF0��������������������\xF0����������������\xF8����������������"����������������(����������������0����������������H��������������
+PP����������������$\xA0����������������R\xC4����������������\xF8��������������������������������������������������������*��������������.��������������:������������
+(>��������������f��������������)x��������������\xA1��������������\xA5��������������\xAC����	����\xF0\xB0����	����\xA0����	����\xA8����	����"\xB6����	����\xD8����	����\xE0����	����\xF8����	��
+P������	����$/P����	����R/t����	����/\xC6����	����/\xCE����	����/\xDC��T��h��e�� ��A��h��e��m�� ��f��o��n��t�� ��b��e��l��o��n��g��s�� ��t��o�� ��t��h��e�� ��p��u��b��l��i��c�� ��d��o��m��a��i��n��.�� ��I��n�� ��j��u��r��i��s��d��i��c��t��i��o��n��s�� ��t��h��a��t�� ��d��o�� ��n��o��t�� ��r��e��c��o��g��n��i��z��e�� ��p��u��b��l��i��c�� ��d��o��m��a��i��n�� ��o��w��n��e��r��s��h��i��p�� ��o��f�� ��t��h��e��s��e�� ��f��i��l��e��s��,�� ��t��h��e�� ��f��o��l��l��o��w��i��n��g�� ��C��r��e��a��t��i��v��e�� ��C��o��m��m��o��n��s�� ��Z��e��r��o�� ��d��e��c��l��a��r��a��t��i��o��n�� ��a��p��p��l��i��e��s��:�� ��h��t��t��p��:��/��/��l��a��b��s��.��c��r��e��a��t��i��v��e��c��o��m��m��o��n��s��.��o��r��g��/��l��i��c��e��n��s��e��s��/��z��e��r��o��-��w��a��i��v��e��/��1��.��0��/��u��s��/��l��e��g��a��l��c��o��d��e��A��h��e��m��R��e��g��u��l��a��r��V��e��r��s��i��o��n�� ��1��.��5��0�� ��A��h��e��m��A��h��e��m��V��e��r��s��i��o��n�� ��1��.��5��0��A��h��e��m��T��h��e�� ��A
 ��h��e��m�� ��f��o��n��t�� ��w��a��s�� ��d��e��v��e��l��o��p��e��d�� ��b��y�� ��T��o��d��d�� ��F��a��h��r��n��e��r�� ��a��n��d�� ��M��y��l��e��s�� ��C��.�� ��M��a��x��f��i��e��l��d�� ��t��o�� ��h��e��l��p�� ��t��e��s��t�� ��w��r��i��t��e��r��s�� ��d��e��v��e��l��o��p�� ��p��r��e��d��i��c��t��a��b��l��e�� ��t��e��s��t��s��.�� ��T��h��e�� ��u��n��i��t��s�� ��p��e��r�� ��e��m�� ��i��s�� ��1��0��0��0��,�� ��t��h��e�� ��a��d��v��a��n��c��e�� ��i��s�� ��8��0��0��,�� ��a��n��d�� ��t��h
 ��e�� ��d��e��s��c��e��n��t�� ��i��s�� ��2��0��0��,�� ��t��h��e��r��e��b��y�� ��m��a��k��i��n��g�� ��t��h��e�� ��e��m�� ��s��q��u��a��r��e�� ��e��x��a��c��t��l��y�� ��s��q��u��a��r��e��.�� ��T��h��e�� ��g��l��y��p��h��s�� ��f��o��r�� ��m��o��s��t�� ��c��h��a��r��a��c��t��e��r��s�� ��i��s�� ��s��i��m��p��l��y�� ��a�� ��b��o��x�� ��w��h��i��c��h�� ��f��i��l��l��s�� ��t��h��i��s�� ��s��q��u��a��r��e��.�� ��T��h��e�� ��c��o��d��e��p��o��i��n��t��s�� ��m��a��p��p��e��d�� ��t��o�� ��t��h��i��s�� ��f��u��l��l�� ��s��q��u��a��r��e�� ��w��i��t��h�� ��a�� ��f��u��l��l�� ��a��d��v��a��n��c��e�� ��a��r��e�� ��t��h��e�� ��f��o��l��l��o��w��i��n��g�� ��r��a��n��g��e��s��:�� ��U��+��2��0��-��U��+��2��6��,�� ��U��+��2��8��-��U��+��6��F��,�� ��U��+��7��1��-��U��+��7��E��,�� ��U��+��A��0��-��U��+��C��8��,�� ��U��+��C��A��-��U��+��F��F��,�� ��U��+��1��3��1��,�� ��U��+��1��5��2��-��U��+��1��5��3��,�� ��U��+��1��7��8��,�� ��U��+��1��9��2��,�� ��U��+��2��C��6��-��U��+��2��C��7��,�� ��U��+��2��C��9��,�� �
 �U��+��2��D��8��-��U��+��2��D��D��,�� ��U��+��3��9��4��,�� ��U��+��3��A��5��,�� ��U��+��3��A��7��,�� ��U��+��3��A��9��,�� ��U��+��3��B��C��,�� ��U��+��3��C��0��,�� ��U��+��2��0��1��3��-��U��+��2��0��1��4��,�� ��U��+��2��0��1��8��-��U��+��2��0��1��A��,�� ��U��+��2��0��1��C��-��U��+��2��0��1��E��,�� ��U��+��2��0��2��0��-��U��+��2��0��2��2��,�� ��U��+��2��0��2��6��,�� ��U��+��2��0��3��0��,�� ��U��+��2��0��3��9��-��U��+��2��0��3��A��,�� ��U��+��2��0��4��4��,�� ��U��+��2��1��2��2��,�� ��U��+��2��1��
 2��6��,�� ��U��+��2��2��0��2��,�� ��U��+��2��2��0��6��,�� ��U��+��2��2��0��F��,�� ��U��+��2��2��1��1��-��U��+��2��2��1��2��,�� ��U��+��2��2��1��9��-��U��+��2��2��1��A��,�� ��U��+��2��2��1��E��,�� ��U��+��2��2��2��B��,�� ��U��+��2��2��4��8��,�� ��U��+��2��2��6��0��,�� ��U��+��2��2��6��4��-��U��+��2��2��6��5��,�� ��U��+��2��2��F��2��,�� ��U��+��2��5��C��A��,�� ��U��+��3��0��0��7��,�� ��U��+��4��E��0��0��,�� ��U��+��4��E��0��3��,�� ��U��+��4��E��0��9��,�� ��U��+��4��E��5��D��,�� ��U��+��4��E��8��C��,�� ��U��+��4��E��9��4��,�� ��U��+��5��1��6��B��,�� ��U��+��5��1��6��D��,�� ��U��+��5��3��4��1��,�� ��U��+��5��6��D��7��,�� ��U��+��5��6��D��B��,�� ��U��+��5��7��1��F��,�� ��U��+��6��7��2��8��,�� ��U��+��6��C��3��4��,�� ��U��+��7��0��6��B��,�� ��U��+��9��1��D��1��,�� ��U��+��F��0��0��0��-��U��+��F��0��0��2��.�� ��T��h��e�� ��c��o��d��e��p��o��i��n��t��s�� ��w��h��i��c��h�� ��a��r��e�� ��m��a��p��p��e��d�� ��t��o�� ��s��o��m��e��t��h��i��n��g�� ��e��l��s��e�� ��a��r��e�� ��t��h��e�� ��f��o��l
 ��l��o��w��i��n��g��:�� ��"�� ��"�� ��(��U��+��2��0��)��:�� ��N��o�� ��p��a��t��h�� ��b��u��t�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��"��p��"�� ��(��U��+��7��0��)��:�� ��P��a��t��h�� ��h��a��s�� ��0�� ��a��s��c��e��n��t�� ��b��u��t�� ��f��u��l��l�� ��d��e��s��c��e��n��t��;�� ��"��\xC9��"�� ��(��U��+��C��9��)��:�� ��P��a��t��h�� ��h��a��s�� ��0�� ��d��e��s��c��e��n��t�� ��b��u��t�� ��f��u��l��l�� ��a��s��c��e��n��t��;�� ��N��o��n��-��b��r��e��
 a��k��i��n��g�� ��s��p��a��c��e�� ��(��U��+��A��0��)��:�� ��N��o�� ��p��a��t��h�� ��b��u��t�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��Z��e��r��o��-��w��i��d��t��h�� ��n��o��n��-��b��r��e��a��k��i��n��g�� ��s��p��a��c��e�� ��(��U��+��F��E��F��F��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��0�� ��a��d��v��a��n��c��e��;�� ��E��n�� ��s��p��a��c��e�� ��(��U��+��2��0��0��2��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��h��a��l��f�� ��a��d��v��a��n��c��e��;�� ��E��m�� ��s��p��a��c��e�� ��(��U��+��2��0��0��3��)��:�� ��N��o�� ��p��a��t��h�� ��b��u��t�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��T��h��r��e��e��-��p��e��r��-��e��m�� ��s��p��a��c��e�� ��(��U��+��2��0��0��4��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��o��n��e�� ��t��h��i��r��d�� ��a��d��v��a��n��c��e��;�� ��F��o��u��r��-��p��e��r��-��e��m�� ��s��p��a��c��e�� ��(��U��+��2��0��0��5��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��o��n��e�� ��q��u��a��r��t��e��r�� ��a��d��v��a��n��c��e��;�� ��S��i��x��-��p��e��r��-��e��m�� ��s��p
 ��a��c��e�� ��(��U��+��2��0��0��6��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��o��n��e�� ��s��i��x��t��h�� ��a��d��v��a��n��c��e��;�� ��T��h��i��n�� ��s��p��a��c��e�� ��(��U��+��2��0��0��9��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��o��n��e�� ��f��i��f��t��h�� ��a��d��v��a��n��c��e��;�� ��H��a��i��r�� ��s��p��a��c��e�� ��(��U��+��2��0��0��A��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��o��n��e�� ��t��e��n��t��h�� ��a��d��v��a��n��c��e��;�� ��Z��e��r��o�� ��w��i��d��t��h�� ��s��p��a��c��e�� 
 ��(��U��+��2��0��0��B��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��n��o�� ��a��d��v��a��n��c��e��;�� ��I��d��e��o��g��r��a��p��h��i��c�� ��s��p��a��c��e�� ��(��U��+��3��0��0��0��)��:�� ��N��o�� ��p��a��t��h�� ��b��u��t�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��Z��e��r��o�� ��w��i��d��t��h�� ��n��o��n��-��j��o��i��n��e��r�� ��(��U��+��2��0��0��C��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��n��o�� ��a��d��v��a��n��c��e��;�� ��Z��e��r��o�� ��w��i��d��t��h�� ��j��o��i��n��e��r�� ��(��U��+��2��0��0��D��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��n��o�� ��a��d��v��a��n��c��e��;�� ��G��r��e��e��k�� ��c��a��p��i��t��a��l�� ��l��e��t��t��e��r�� ��C��h��i�� ��(��U��+��3��A��7��)��:�� ��T��h��i��n�� ��h��o��r��i��z��o��n��t��a��l�� ��s��t��r��i��p��e�� ��a��n��d�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��U��+��6��A��2��A��:�� ��T��h��i��n�� ��h��o��r��i��z��o��n��t��a��l�� ��s��t��r��i��p��e�� ��a��n��d�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��G��r��e��e��k�� ��c��a��p��i��t��a�
 �l�� ��l��e��t��t��e��r�� ��U��p��s��i��l��o��n�� ��(��U��+��3��A��5��)��:�� ��T��h��i��n�� ��v��e��r��t��i��c��a��l�� ��s��t��r��i��p��e�� ��a��n��d�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��U��+��7��E��B��5��:�� ��T��h��i��n�� ��v��e��r��t��i��c��a��l�� ��s��t��r��i��p��e�� ��a��n��d�� ��f��u��l��l�� ��a��d��v��a��n��c��e��.��h��t��t��p��:��/��/��w��w��w��.��w��3��c��.��o��r��g��h��t��t��p��:��/��/��d��e��v��.��w��3��.��o��r��g��/��C��S��S��/��f��o��n��t��s��/��a��h��e��m��/��C��O��P��Y��
 I��N��G��
+The Ahem font belongs to the public domain. In jurisdictions that do not recognize public domain ownership of these files, the following Creative Commons Zero declaration applies: http://labs.creativecommons.org/licenses/zero-waive/1.0/us/legalcodeAhemRegularVersion 1.50 AhemAhemVersion 1.50AhemThe Ahem font was developed by Todd Fahrner and Myles C. Maxfield to help test writers develop predictable tests. The units per em is 1000, the advance is 800, and the descent is 200, thereby making the em square exactly square. The glyphs for most characters is simply a box which fills this square. The codepoints mapped to this full square with a full advance are the following ranges: U+20-U+26, U+28-U+6F, U+71-U+7E, U+A0-U+C8, U+CA-U+FF, U+131, U+152-U+153, U+178, U+192, U+2C6-U+2C7, U+2C9, U+2D8-U+2DD, U+394, U+3A5, U+3A7, U+3A9, U+3BC, U+3C0, U+2013-U+2014, U+2018-U+201A, U+201C-U+201E, U+2020-U+2022, U+2026, U+2030, U+2039-U+203A, U+2044, U+2122, U+2126, U+2202, U+2206, U+220F, U+2211-U+
 2212, U+2219-U+221A, U+221E, U+222B, U+2248, U+2260, U+2264-U+2265, U+22F2, U+25CA, U+3007, U+4E00, U+4E03, U+4E09, U+4E5D, U+4E8C, U+4E94, U+516B, U+516D, U+5341, U+56D7, U+56DB, U+571F, U+6728, U+6C34, U+706B, U+91D1, U+F000-U+F002. The codepoints which are mapped to something else are the following: " " (U+20): No path but full advance; "p" (U+70): Path has 0 ascent but full descent; "\x83" (U+C9): Path has 0 descent but full ascent; Non-breaking space (U+A0): No path but full advance; Zero-width non-breaking space (U+FEFF): No path and 0 advance; En space (U+2002): No path and half advance; Em space (U+2003): No path but full advance; Three-per-em space (U+2004): No path and one third advance; Four-per-em space (U+2005): No path and one quarter advance; Six-per-em space (U+2006): No path and one sixth advance; Thin space (U+2009): No path and one fifth advance; Hair space (U+200A): No path and one tenth advance; Zero width space (U+200B): No path an
 d no advance; Ideographic space (U+3000): No path but full advance; Zero width non-joiner (U+200C): No path and no advance; Zero width joiner (U+200D): No path and no advance; Greek capital letter Chi (U+3A7): Thin horizontal stripe and full advance; U+6A2A: Thin horizontal stripe and full advance; Greek capital letter Upsilon (U+3A5): Thin vertical stripe and full advance; U+7EB5: Thin vertical stripe and full advance.http://www.w3c.orghttp://dev.w3.org/CSS/fonts/ahem/COPYING
+AhemRegularAhem��T��h��e�� ��A��h��e��m�� ��f��o��n��t�� ��b��e��l��o��n��g��s�� ��t��o�� ��t��h��e�� ��p��u��b��l��i��c�� ��d��o��m��a��i��n��.�� ��I��n�� ��j��u��r��i��s��d��i��c��t��i��o��n��s�� ��t��h��a��t�� ��d��o�� ��n��o��t�� ��r��e��c��o��g��n��i��z��e�� ��p��u��b��l��i��c�� ��d��o��m��a��i��n�� ��o��w��n��e��r��s��h��i��p�� ��o��f�� ��t��h��e��s��e�� ��f��i��l��e��s��,�� ��t��h��e�� ��f��o��l��l��o��w��i��n��g�� ��C��r��e��a��t��i��v��e�� ��C��o��m��m��o��n��s�� ��Z��e��r��o�� ��d��e��c��l��a��r��a��t��i��o��n�� ��a��p��p��l��i��e��s��:�� ��h��t��t��p��:��/��/��l��a��b��s��.��c��r��e��a��t��i��v��e��c��o��m��m��o��n��s��.��o��r��g��/��l��i��c��e��n��s��e��s��/��z��e��r��o��-��w��a��i��v��e��/��1��.��0��/��u��s��/��l��e��g��a��l��c��o��d��e��A��h��e��m��R��e��g��u��l��a��r��V��e��r��s��i��o��n�� ��1��.��5��0�� ��A��h��e��m��A��h��e��m��V��e��r��s��i��o��n�� ��1��.��5��0��A��h��e��m��T��h��e�� ��A��h��e��m�� ��f��o��n��t�� ��w��a��s�� ��d��e��v��e��l��o��p��e��d�� ��b��y�� �
 �T��o��d��d�� ��F��a��h��r��n��e��r�� ��a��n��d�� ��M��y��l��e��s�� ��C��.�� ��M��a��x��f��i��e��l��d�� ��t��o�� ��h��e��l��p�� ��t��e��s��t�� ��w��r��i��t��e��r��s�� ��d��e��v��e��l��o��p�� ��p��r��e��d��i��c��t��a��b��l��e�� ��t��e��s��t��s��.�� ��T��h��e�� ��u��n��i��t��s�� ��p��e��r�� ��e��m�� ��i��s�� ��1��0��0��0��,�� ��t��h��e�� ��a��d��v��a��n��c��e�� ��i��s�� ��8��0��0��,�� ��a��n��d�� ��t��h��e�� ��d��e��s��c��e��n��t�� ��i��s�� ��2��0��0��,�� ��t��h��e��r��e��b��y�� ��m��a��k
 ��i��n��g�� ��t��h��e�� ��e��m�� ��s��q��u��a��r��e�� ��e��x��a��c��t��l��y�� ��s��q��u��a��r��e��.�� ��T��h��e�� ��g��l��y��p��h��s�� ��f��o��r�� ��m��o��s��t�� ��c��h��a��r��a��c��t��e��r��s�� ��i��s�� ��s��i��m��p��l��y�� ��a�� ��b��o��x�� ��w��h��i��c��h�� ��f��i��l��l��s�� ��t��h��i��s�� ��s��q��u��a��r��e��.�� ��T��h��e�� ��c��o��d��e��p��o��i��n��t��s�� ��m��a��p��p��e��d�� ��t��o�� ��t��h��i��s�� ��f��u��l��l�� ��s��q��u��a��r��e�� ��w��i��t��h�� ��a�� ��f��u��l��l�� ��a��d��v��a��n��c��e�� ��a��r��e�� ��t��h��e�� ��f��o��l��l��o��w��i��n��g�� ��r��a��n��g��e��s��:�� ��U��+��2��0��-��U��+��2��6��,�� ��U��+��2��8��-��U��+��6��F��,�� ��U��+��7��1��-��U��+��7��E��,�� ��U��+��A��0��-��U��+��C��8��,�� ��U��+��C��A��-��U��+��F��F��,�� ��U��+��1��3��1��,�� ��U��+��1��5��2��-��U��+��1��5��3��,�� ��U��+��1��7��8��,�� ��U��+��1��9��2��,�� ��U��+��2��C��6��-��U��+��2��C��7��,�� ��U��+��2��C��9��,�� ��U��+��2��D��8��-��U��+��2��D��D��,�� ��U��+��3��9��4��,�� ��U��+��3��A��5��,�� ��U��+�
 �3��A��7��,�� ��U��+��3��A��9��,�� ��U��+��3��B��C��,�� ��U��+��3��C��0��,�� ��U��+��2��0��1��3��-��U��+��2��0��1��4��,�� ��U��+��2��0��1��8��-��U��+��2��0��1��A��,�� ��U��+��2��0��1��C��-��U��+��2��0��1��E��,�� ��U��+��2��0��2��0��-��U��+��2��0��2��2��,�� ��U��+��2��0��2��6��,�� ��U��+��2��0��3��0��,�� ��U��+��2��0��3��9��-��U��+��2��0��3��A��,�� ��U��+��2��0��4��4��,�� ��U��+��2��1��2��2��,�� ��U��+��2��1��2��6��,�� ��U��+��2��2��0��2��,�� ��U��+��2��2��0��6��,�� ��U��+��2��2��0��F��,�� ��U��
 +��2��2��1��1��-��U��+��2��2��1��2��,�� ��U��+��2��2��1��9��-��U��+��2��2��1��A��,�� ��U��+��2��2��1��E��,�� ��U��+��2��2��2��B��,�� ��U��+��2��2��4��8��,�� ��U��+��2��2��6��0��,�� ��U��+��2��2��6��4��-��U��+��2��2��6��5��,�� ��U��+��2��2��F��2��,�� ��U��+��2��5��C��A��,�� ��U��+��3��0��0��7��,�� ��U��+��4��E��0��0��,�� ��U��+��4��E��0��3��,�� ��U��+��4��E��0��9��,�� ��U��+��4��E��5��D��,�� ��U��+��4��E��8��C��,�� ��U��+��4��E��9��4��,�� ��U��+��5��1��6��B��,�� ��U��+��5��1��6��D��,�� ��U��+��5��3��4��1��,�� ��U��+��5��6��D��7��,�� ��U��+��5��6��D��B��,�� ��U��+��5��7��1��F��,�� ��U��+��6��7��2��8��,�� ��U��+��6��C��3��4��,�� ��U��+��7��0��6��B��,�� ��U��+��9��1��D��1��,�� ��U��+��F��0��0��0��-��U��+��F��0��0��2��.�� ��T��h��e�� ��c��o��d��e��p��o��i��n��t��s�� ��w��h��i��c��h�� ��a��r��e�� ��m��a��p��p��e��d�� ��t��o�� ��s��o��m��e��t��h��i��n��g�� ��e��l��s��e�� ��a��r��e�� ��t��h��e�� ��f��o��l��l��o��w��i��n��g��:�� ��"�� ��"�� ��(��U��+��2��0��)��:�� ��N��o�� ��p��a��
 t��h�� ��b��u��t�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��"��p��"�� ��(��U��+��7��0��)��:�� ��P��a��t��h�� ��h��a��s�� ��0�� ��a��s��c��e��n��t�� ��b��u��t�� ��f��u��l��l�� ��d��e��s��c��e��n��t��;�� ��"��\xC9��"�� ��(��U��+��C��9��)��:�� ��P��a��t��h�� ��h��a��s�� ��0�� ��d��e��s��c��e��n��t�� ��b��u��t�� ��f��u��l��l�� ��a��s��c��e��n��t��;�� ��N��o��n��-��b��r��e��a��k��i��n��g�� ��s��p��a��c��e�� ��(��U��+��A��0��)��:�� ��N��o�� ��p��a��t��h�� ��b��
 u��t�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��Z��e��r��o��-��w��i��d��t��h�� ��n��o��n��-��b��r��e��a��k��i��n��g�� ��s��p��a��c��e�� ��(��U��+��F��E��F��F��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��0�� ��a��d��v��a��n��c��e��;�� ��E��n�� ��s��p��a��c��e�� ��(��U��+��2��0��0��2��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��h��a��l��f�� ��a��d��v��a��n��c��e��;�� ��E��m�� ��s��p��a��c��e�� ��(��U��+��2��0��0��3��)��:�� ��N��o�� ��p��a��t��h�� ��b��u��t�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��T��h��r��e��e��-��p��e��r��-��e��m�� ��s��p��a��c��e�� ��(��U��+��2��0��0��4��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��o��n��e�� ��t��h��i��r��d�� ��a��d��v��a��n��c��e��;�� ��F��o��u��r��-��p��e��r��-��e��m�� ��s��p��a��c��e�� ��(��U��+��2��0��0��5��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��o��n��e�� ��q��u��a��r��t��e��r�� ��a��d��v��a��n��c��e��;�� ��S��i��x��-��p��e��r��-��e��m�� ��s��p��a��c��e�� ��(��U��+��2��0��0��6��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��o��n��e
 �� ��s��i��x��t��h�� ��a��d��v��a��n��c��e��;�� ��T��h��i��n�� ��s��p��a��c��e�� ��(��U��+��2��0��0��9��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��o��n��e�� ��f��i��f��t��h�� ��a��d��v��a��n��c��e��;�� ��H��a��i��r�� ��s��p��a��c��e�� ��(��U��+��2��0��0��A��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��o��n��e�� ��t��e��n��t��h�� ��a��d��v��a��n��c��e��;�� ��Z��e��r��o�� ��w��i��d��t��h�� ��s��p��a��c��e�� ��(��U��+��2��0��0��B��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��n��o�� ��a��d��v��a
 ��n��c��e��;�� ��I��d��e��o��g��r��a��p��h��i��c�� ��s��p��a��c��e�� ��(��U��+��3��0��0��0��)��:�� ��N��o�� ��p��a��t��h�� ��b��u��t�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��Z��e��r��o�� ��w��i��d��t��h�� ��n��o��n��-��j��o��i��n��e��r�� ��(��U��+��2��0��0��C��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��n��o�� ��a��d��v��a��n��c��e��;�� ��Z��e��r��o�� ��w��i��d��t��h�� ��j��o��i��n��e��r�� ��(��U��+��2��0��0��D��)��:�� ��N��o�� ��p��a��t��h�� ��a��n��d�� ��n��o�� ��a��d��v��a��n��c��e��;�� ��G��r��e��e��k�� ��c��a��p��i��t��a��l�� ��l��e��t��t��e��r�� ��C��h��i�� ��(��U��+��3��A��7��)��:�� ��T��h��i��n�� ��h��o��r��i��z��o��n��t��a��l�� ��s��t��r��i��p��e�� ��a��n��d�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��U��+��6��A��2��A��:�� ��T��h��i��n�� ��h��o��r��i��z��o��n��t��a��l�� ��s��t��r��i��p��e�� ��a��n��d�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��G��r��e��e��k�� ��c��a��p��i��t��a��l�� ��l��e��t��t��e��r�� ��U��p��s��i��l��o��n�� ��(��U��+��3��A��5��)��:�� ��T��h��i�
 �n�� ��v��e��r��t��i��c��a��l�� ��s��t��r��i��p��e�� ��a��n��d�� ��f��u��l��l�� ��a��d��v��a��n��c��e��;�� ��U��+��7��E��B��5��:�� ��T��h��i��n�� ��v��e��r��t��i��c��a��l�� ��s��t��r��i��p��e�� ��a��n��d�� ��f��u��l��l�� ��a��d��v��a��n��c��e��.��h��t��t��p��:��/��/��w��w��w��.��w��3��c��.��o��r��g��h��t��t��p��:��/��/��d��e��v��.��w��3��.��o��r��g��/��C��S��S��/��f��o��n��t��s��/��a��h��e��m��/��C��O��P��Y��I��N��G��
+��A��h��e��m��R��e��g��u��l��a��r��A��h��e��m������������������\xFF{������������������������������������������������������������	������+�������������������������������������� ��!��"��#��$��%��&��'��(��)��*��+��,��-��.��/��0��1��2��3��4��5��6��7��8��9��:��;��<��=��>��?��@��A��B��C��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��h��i��j��k��l��m��n��o��p��q��r��s��t��u��v��w��x��y��z��{��|��}��~����\x80��\x81��\x83��\x84��\x85��\x86��\x88��\x89��\x8A��\x8B��\x8D��\x8E��\x90��\x91��\x93��\x96��\x97��\x9D��\x9E��\xA0��\xA1��\xA2��\xA3��\xA4��\xA9��\xAA��\xAC��\xAD��\xAE��\xAF��\xB6��\xB7��\xB8��\xBA��\xBD��\xC3��\xC7��\xC8��\xC9��\xCA��\xCB��\xCC��\xCD��\xCE��\xCF��\xD0��\xD1��\xD3��\xD4��\xD5��\xD6��\xD7��\xD8��\xD9��\xDA��\xDB��\xDC��\xDD��\xDE��\xDF��\xE0��\xE1��\xE8��\xE9��\xEA��\xEB��\xEC��\xED��\xEE��\xEF��\xF0��\xF1��\xF2��\xF3��\xF4��\xF5��\xF6��\xB0��\xB1��\xBB��\x
 A6��\xA8��\x9F��\x9B��\xB2��\xB3��\xC4��\xB4��\xB5��\xC5��\x82��\xC2��\x87��\xAB��\xC6��\xBE��\xBF��\xBC��\x8C��\x98��\x9A��\x99��\xA5��\x92��\x9C��\x8F��\x94��\x95��\xA7��\xB9��\xD2��\xC0��\xC1��	
++ !"#$%&'()*+,NULLglyph243glyph204glyph205HTDELuniFEFFuni2002uni2003uni2004uni2005uni2006uni2009uni200Auni200Buni3000	afii61664afii301uni4E00uni4E8Cuni4E09uni56DBuni4E94uni516Duni4E03uni516Buni4E5Duni5341uni3007uni56D7uni706Buni6C34uni6728uni91D1uni571Funi03A7uni6A2Auni03A5uni7EB5uni2000Buni2000C	uni100004	uni10000A������
\ No newline at end of file

Modified: trunk/Source/WebCore/ChangeLog (279867 => 279868)


--- trunk/Source/WebCore/ChangeLog	2021-07-13 07:39:34 UTC (rev 279867)
+++ trunk/Source/WebCore/ChangeLog	2021-07-13 07:52:36 UTC (rev 279868)
@@ -1,5 +1,30 @@
 2021-07-13  Myles C. Maxfield  <[email protected]>
 
+        PUA characters have the wrong advance in the fast text codepath
+        https://bugs.webkit.org/show_bug.cgi?id=227896
+        <rdar://problem/80037103>
+
+        Reviewed by Tim Horton.
+
+        There were 2 problems:
+        1. We were passing a UChar32 to this function:
+               static bool treatAsSpace(UChar c) { return c == ' ' ... }
+               This means that passing in U+10020 erroneously returns true
+        2. Because of https://bugs.webkit.org/show_bug.cgi?id=221356,
+               if the prevous character is in SMP, our logic to determine
+               the previous advance would erroneously return 0.
+
+        Test: fast/text/pua-charactersTreatedAsSpace.html
+
+        * platform/graphics/FontCascade.h:
+        (WebCore::FontCascade::treatAsSpace):
+        (WebCore::FontCascade::treatAsZeroWidthSpace):
+        (WebCore::FontCascade::treatAsZeroWidthSpaceInComplexScript):
+        * platform/graphics/WidthIterator.cpp:
+        (WebCore::WidthIterator::advanceInternal):
+
+2021-07-13  Myles C. Maxfield  <[email protected]>
+
         Fix the Apple internal iOS Simulator build
 
         Unreviewed.

Modified: trunk/Source/WebCore/platform/graphics/FontCascade.h (279867 => 279868)


--- trunk/Source/WebCore/platform/graphics/FontCascade.h	2021-07-13 07:39:34 UTC (rev 279867)
+++ trunk/Source/WebCore/platform/graphics/FontCascade.h	2021-07-13 07:52:36 UTC (rev 279868)
@@ -251,9 +251,9 @@
     static CodePath s_codePath;
 
     FontSelector* fontSelector() const;
-    static bool treatAsSpace(UChar c) { return c == ' ' || c == '\t' || c == '\n' || c == noBreakSpace; }
-    static bool treatAsZeroWidthSpace(UChar c) { return treatAsZeroWidthSpaceInComplexScript(c) || c == 0x200c || c == 0x200d; }
-    static bool treatAsZeroWidthSpaceInComplexScript(UChar c) { return c < 0x20 || (c >= 0x7F && c < 0xA0) || c == softHyphen || c == zeroWidthSpace || (c >= 0x200e && c <= 0x200f) || (c >= 0x202a && c <= 0x202e) || c == zeroWidthNoBreakSpace || c == objectReplacementCharacter; }
+    static bool treatAsSpace(UChar32 c) { return c == ' ' || c == '\t' || c == '\n' || c == noBreakSpace; }
+    static bool treatAsZeroWidthSpace(UChar32 c) { return treatAsZeroWidthSpaceInComplexScript(c) || c == 0x200c || c == 0x200d; }
+    static bool treatAsZeroWidthSpaceInComplexScript(UChar32 c) { return c < 0x20 || (c >= 0x7F && c < 0xA0) || c == softHyphen || c == zeroWidthSpace || (c >= 0x200e && c <= 0x200f) || (c >= 0x202a && c <= 0x202e) || c == zeroWidthNoBreakSpace || c == objectReplacementCharacter; }
     static bool canReceiveTextEmphasis(UChar32);
 
     static inline UChar normalizeSpaces(UChar character)

Modified: trunk/Source/WebCore/platform/graphics/WidthIterator.cpp (279867 => 279868)


--- trunk/Source/WebCore/platform/graphics/WidthIterator.cpp	2021-07-13 07:39:34 UTC (rev 279867)
+++ trunk/Source/WebCore/platform/graphics/WidthIterator.cpp	2021-07-13 07:52:36 UTC (rev 279868)
@@ -204,6 +204,8 @@
 
     auto currentCharacterIndex = textIterator.currentIndex();
     UChar32 character = 0;
+    float width = 0;
+    float previousWidth = 0;
     unsigned clusterLength = 0;
     CharactersTreatedAsSpace charactersTreatedAsSpace;
     float widthOfCurrentFontRange = 0;
@@ -234,7 +236,8 @@
         const Font* font = glyphData.font ? glyphData.font : &m_font.primaryFont();
         ASSERT(font);
 
-        float width = font->widthForGlyph(glyph);
+        previousWidth = width;
+        width = font->widthForGlyph(glyph);
 
         if (font != lastFontData) {
             commitCurrentFontRange(glyphBuffer, lastGlyphCount, currentCharacterIndex, *lastFontData, primaryFont, character, widthOfCurrentFontRange, charactersTreatedAsSpace);
@@ -249,7 +252,7 @@
             charactersTreatedAsSpace.constructAndAppend(
                 currentCharacterIndex,
                 character == ' ',
-                glyphBuffer.size() ? WebCore::width(glyphBuffer.advanceAt(glyphBuffer.size() - 1)) : 0,
+                previousWidth,
                 width);
         }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to