Changeset 213163 in webkit


Ignore:
Timestamp:
Feb 28, 2017 12:40:14 PM (7 years ago)
Author:
mmaxfield@apple.com
Message:

[macOS] Migrate off of CTFontCreateForCSS
https://bugs.webkit.org/show_bug.cgi?id=168678

Reviewed by David Hyatt.

Source/WebCore:

This patch implements the Font Matching Algorithm detailed in
https://drafts.csswg.org/css-fonts-4/#font-matching-algorithm
Previously, this was implemented inside Core Text (via
CTFontCreateForCSS()), but that implementation does not understand
variation fonts. Therefore it should move to WebKit (along with
the general fact that CSS algorithms should be implemented in a
CSS engine, not the platform's text engine).

This implementation is not completely divorced from the platform,
however - Core Text exposes font weights on a [-1, 1] range, but
CSS operates on a [1, 999] range. In order to provide the mapping
to CSS weights, Core Text infrastructure is necessary. Therefore,
this new implementation of the matching algorithm is only used
on certain operating systems.

The new implementation of the algorithm is not bug-compatible with
the existing implementation; this patch does represent a behavior
change. However, I have reviewed the differences manually and
believe this algorithm to be a progression over the previous one
(except for one case with Helvetica Neue - see
LayoutTests/ChangeLog for more information about that).

This patch also represents a 27% performance progression on our
standard page load test (just measuring the performance of the font
matching algorithm, and nothing else). (Because font matching is
only a small part of the entire test, the overall progression is
much smaller.)

Tests: FontCacheTest.FontLookupFromFamilyName

FontCacheTest.FontLookupFromPostScriptName

  • platform/graphics/FontCache.h:

(WebCore::FontCache::createFontPlatformDataForTesting): Allow for
unit testing.

  • platform/graphics/cocoa/FontCacheCoreText.cpp:

(WebCore::isSystemFont): Inlined.
(WebCore::FontDatabase::singleton): Cache results of Core Text
lookups.
(WebCore::FontDatabase::Range::Range): Because of variation fonts,
fonts' weights, widths, and slopes need to be represented as a range
instead of an individual value.
(WebCore::FontDatabase::Range::isValid):
(WebCore::FontDatabase::Range::expand):
(WebCore::FontDatabase::Range::includes):
(WebCore::FontDatabase::InstalledFont::InstalledFont): Represents a
Font Descriptor as well as some lookup information about it.
(WebCore::FontDatabase::InstalledFontCollection::InstalledFontCollection):
A collection of installed fonts.
(WebCore::FontDatabase::InstalledFontCollection::insertInstalledFont):
Cache minima and maxima.
(WebCore::FontDatabase::InstalledFontCollection::isEmpty):
(WebCore::FontDatabase::InstalledFontCollection::size):
(WebCore::FontDatabase::lookupFamilyName): Get all the fonts in
the family.
(WebCore::FontDatabase::lookupPostScriptName): Get the font with
the given PostScript name.
(WebCore::FontDatabase::clear):
(WebCore::FontDatabase::FontDatabase): Cache.
(WebCore::iterateActiveFontsWithReturn): The Font Matching Algorithm
works by starting with every font in the family, and the eliminating
items from the set iteratively. Instead of actually removing items
from a vector or linked list, we instead want to treat the collection
as immutable and keep a parallel side-table of which items have been
eliminated (in order to reduce copies and allocations). This makes
sense because most families only have a handful of fonts in them.
This function consults with the side-table to iterate only over the
fonts which have not been eliminated.
(WebCore::iterateActiveFonts): Ditto.
(WebCore::findClosestStretch):
(WebCore::filterStretch): Eliminate fonts based on their stretch
value.
(WebCore::findClosestStyle):
(WebCore::filterStyle): Eliminate fonts based on their style value.
(WebCore::findClosestWeight):
(WebCore::filterWeight): Eliminate fonts based on their weight value.
(WebCore::computeTargetWeight):
(WebCore::findClosestFont): If we have a set of fonts in a family,
select the font in the set which best matches the criteria.
(WebCore::platformFontLookupWithFamily): While findClosestFont()
function satisfies the spec's notion of the font matching algorithm,
WebKit actually claims to be able to look up fonts by their PostScript
name. Therefore, this function has a higher-level of logic to rectify
the confusion that results when the PostScript name doesn't agree with
the other CSS properties (like if you say "Helvetica-Bold" but also say
font-weight: 100).

  • platform/spi/cocoa/CoreTextSPI.h: Add signature for system CSS

font weight support.

Tools:

Exhaustively test the font matching algorithm on Sierra.

  • TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
  • TestWebKitAPI/Tests/WebCore/FontCache.cpp: Added.

(TestWebKitAPI::FontCacheTest::SetUp):
(TestWebKitAPI::createPlatformFont):
(TestWebKitAPI::compareFonts):
(TestWebKitAPI::TEST_F):

LayoutTests:

Updating test results.

Note that there is a slight regression here with Helvetica Neue. In
particular, this family includes a Bold font with a weight of 700,
and a Condensed Black font with a weight of 900. Because we don't
currently have any notion of font-stretch, our model can only
distinguish between these fonts due to their differing weights, not
their widths. This means that requests for weights 800 or 900 will
match the Condensed Black font in accordance with the font matching
algorithm. This gives visually surprising results because weights
100-700 match regular-width fonts.

However, this regression is intentional and temporary - my next task
is to properly implement font-stretch, which will educate our model
on the difference between these two fonts. This will fix the regression
and allow the tests below to be reset to their original expected
results.

  • platform/mac-elcapitan/fast/text/font-weights-expected.png: Copied from LayoutTests/platform/mac/fast/text/font-weights-expected.png.
  • platform/mac-elcapitan/fast/text/font-weights-expected.txt: Copied from LayoutTests/platform/mac/fast/text/font-weights-expected.txt.
  • platform/mac-elcapitan/fast/text/font-weights-zh-expected.png: Copied from LayoutTests/platform/mac/fast/text/font-weights-zh-expected.png.
  • platform/mac-elcapitan/fast/text/font-weights-zh-expected.txt: Copied from LayoutTests/platform/mac/fast/text/font-weights-zh-expected.txt.
  • platform/mac/fast/text/font-weights-expected.png:
  • platform/mac/fast/text/font-weights-expected.txt:
  • platform/mac/fast/text/font-weights-zh-expected.png:
  • platform/mac/fast/text/font-weights-zh-expected.txt:
Location:
trunk
Files:
1 added
13 edited
4 copied

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r213156 r213163  
     12017-02-28  Myles C. Maxfield  <mmaxfield@apple.com>
     2
     3        [macOS] Migrate off of CTFontCreateForCSS
     4        https://bugs.webkit.org/show_bug.cgi?id=168678
     5
     6        Reviewed by David Hyatt.
     7
     8        Updating test results.
     9
     10        Note that there is a slight regression here with Helvetica Neue. In
     11        particular, this family includes a Bold font with a weight of 700,
     12        and a Condensed Black font with a weight of 900. Because we don't
     13        currently have any notion of font-stretch, our model can only
     14        distinguish between these fonts due to their differing weights, not
     15        their widths. This means that requests for weights 800 or 900 will
     16        match the Condensed Black font in accordance with the font matching
     17        algorithm. This gives visually surprising results because weights
     18        100-700 match regular-width fonts.
     19
     20        However, this regression is intentional and temporary - my next task
     21        is to properly implement font-stretch, which will educate our model
     22        on the difference between these two fonts. This will fix the regression
     23        and allow the tests below to be reset to their original expected
     24        results.
     25
     26        * platform/mac-elcapitan/fast/text/font-weights-expected.png: Copied from LayoutTests/platform/mac/fast/text/font-weights-expected.png.
     27        * platform/mac-elcapitan/fast/text/font-weights-expected.txt: Copied from LayoutTests/platform/mac/fast/text/font-weights-expected.txt.
     28        * platform/mac-elcapitan/fast/text/font-weights-zh-expected.png: Copied from LayoutTests/platform/mac/fast/text/font-weights-zh-expected.png.
     29        * platform/mac-elcapitan/fast/text/font-weights-zh-expected.txt: Copied from LayoutTests/platform/mac/fast/text/font-weights-zh-expected.txt.
     30        * platform/mac/fast/text/font-weights-expected.png:
     31        * platform/mac/fast/text/font-weights-expected.txt:
     32        * platform/mac/fast/text/font-weights-zh-expected.png:
     33        * platform/mac/fast/text/font-weights-zh-expected.txt:
     34
    1352017-02-28  Ryan Haddad  <ryanhaddad@apple.com>
    236
  • trunk/LayoutTests/platform/mac/fast/text/font-weights-expected.txt

    r187126 r213163  
    1 layer at (0,0) size 785x6752
     1layer at (0,0) size 785x6763
    22  RenderView at (0,0) size 785x600
    3 layer at (0,0) size 785x6752
    4   RenderBlock {HTML} at (0,0) size 785x6752
    5     RenderBody {BODY} at (8,8) size 769x6736
     3layer at (0,0) size 785x6763
     4  RenderBlock {HTML} at (0,0) size 785x6763
     5    RenderBody {BODY} at (8,8) size 769x6747
    66      RenderBlock (anonymous) at (0,0) size 769x144
    77        RenderText {#text} at (0,0) size 769x72
     
    3737        RenderText {#text} at (0,0) size 355x19
    3838          text run at (0,0) width 355: "Font: Helvetica Neue Weight: 700 Style: normal"
    39       RenderBlock {DIV} at (0,273) size 769x19
    40         RenderText {#text} at (0,0) size 355x19
    41           text run at (0,0) width 355: "Font: Helvetica Neue Weight: 800 Style: normal"
    42       RenderBlock {DIV} at (0,292) size 769x19
    43         RenderText {#text} at (0,0) size 355x19
    44           text run at (0,0) width 355: "Font: Helvetica Neue Weight: 900 Style: normal"
    45       RenderBlock {DIV} at (0,311) size 769x18
     39      RenderBlock {DIV} at (0,273) size 769x20
     40        RenderText {#text} at (0,0) size 309x20
     41          text run at (0,0) width 309: "Font: Helvetica Neue Weight: 800 Style: normal"
     42      RenderBlock {DIV} at (0,293) size 769x20
     43        RenderText {#text} at (0,0) size 309x20
     44          text run at (0,0) width 309: "Font: Helvetica Neue Weight: 900 Style: normal"
     45      RenderBlock {DIV} at (0,313) size 769x18
    4646        RenderText {#text} at (0,0) size 362x18
    4747          text run at (0,0) width 362: "Font: HelveticaNeue-UltraLight Weight: 100 Style: normal"
    48       RenderBlock {DIV} at (0,329) size 769x18
     48      RenderBlock {DIV} at (0,331) size 769x18
    4949        RenderText {#text} at (0,0) size 362x18
    5050          text run at (0,0) width 362: "Font: HelveticaNeue-UltraLight Weight: 200 Style: normal"
    51       RenderBlock {DIV} at (0,347) size 769x18
     51      RenderBlock {DIV} at (0,349) size 769x18
    5252        RenderText {#text} at (0,0) size 362x18
    5353          text run at (0,0) width 362: "Font: HelveticaNeue-UltraLight Weight: 300 Style: normal"
    54       RenderBlock {DIV} at (0,365) size 769x18
     54      RenderBlock {DIV} at (0,367) size 769x18
    5555        RenderText {#text} at (0,0) size 362x18
    5656          text run at (0,0) width 362: "Font: HelveticaNeue-UltraLight Weight: 400 Style: normal"
    57       RenderBlock {DIV} at (0,383) size 769x18
     57      RenderBlock {DIV} at (0,385) size 769x18
    5858        RenderText {#text} at (0,0) size 362x18
    5959          text run at (0,0) width 362: "Font: HelveticaNeue-UltraLight Weight: 500 Style: normal"
    60       RenderBlock {DIV} at (0,401) size 769x19
     60      RenderBlock {DIV} at (0,403) size 769x19
    6161        RenderText {#text} at (0,0) size 433x19
    6262          text run at (0,0) width 433: "Font: HelveticaNeue-UltraLight Weight: 600 Style: normal"
    63       RenderBlock {DIV} at (0,420) size 769x19
     63      RenderBlock {DIV} at (0,422) size 769x19
    6464        RenderText {#text} at (0,0) size 433x19
    6565          text run at (0,0) width 433: "Font: HelveticaNeue-UltraLight Weight: 700 Style: normal"
    66       RenderBlock {DIV} at (0,439) size 769x19
    67         RenderText {#text} at (0,0) size 433x19
    68           text run at (0,0) width 433: "Font: HelveticaNeue-UltraLight Weight: 800 Style: normal"
    69       RenderBlock {DIV} at (0,458) size 769x19
    70         RenderText {#text} at (0,0) size 433x19
    71           text run at (0,0) width 433: "Font: HelveticaNeue-UltraLight Weight: 900 Style: normal"
    72       RenderBlock {DIV} at (0,477) size 769x18
     66      RenderBlock {DIV} at (0,441) size 769x20
     67        RenderText {#text} at (0,0) size 376x20
     68          text run at (0,0) width 376: "Font: HelveticaNeue-UltraLight Weight: 800 Style: normal"
     69      RenderBlock {DIV} at (0,461) size 769x20
     70        RenderText {#text} at (0,0) size 376x20
     71          text run at (0,0) width 376: "Font: HelveticaNeue-UltraLight Weight: 900 Style: normal"
     72      RenderBlock {DIV} at (0,481) size 769x18
    7373        RenderText {#text} at (0,0) size 361x18
    7474          text run at (0,0) width 361: "Font: HelveticaNeue-Light Weight: 100 Style: normal"
    75       RenderBlock {DIV} at (0,495) size 769x18
     75      RenderBlock {DIV} at (0,499) size 769x18
    7676        RenderText {#text} at (0,0) size 361x18
    7777          text run at (0,0) width 361: "Font: HelveticaNeue-Light Weight: 200 Style: normal"
    78       RenderBlock {DIV} at (0,513) size 769x18
     78      RenderBlock {DIV} at (0,517) size 769x18
    7979        RenderText {#text} at (0,0) size 361x18
    8080          text run at (0,0) width 361: "Font: HelveticaNeue-Light Weight: 300 Style: normal"
    81       RenderBlock {DIV} at (0,531) size 769x18
     81      RenderBlock {DIV} at (0,535) size 769x18
    8282        RenderText {#text} at (0,0) size 361x18
    8383          text run at (0,0) width 361: "Font: HelveticaNeue-Light Weight: 400 Style: normal"
    84       RenderBlock {DIV} at (0,549) size 769x18
     84      RenderBlock {DIV} at (0,553) size 769x18
    8585        RenderText {#text} at (0,0) size 361x18
    8686          text run at (0,0) width 361: "Font: HelveticaNeue-Light Weight: 500 Style: normal"
    87       RenderBlock {DIV} at (0,567) size 769x19
     87      RenderBlock {DIV} at (0,571) size 769x19
    8888        RenderText {#text} at (0,0) size 396x19
    8989          text run at (0,0) width 396: "Font: HelveticaNeue-Light Weight: 600 Style: normal"
    90       RenderBlock {DIV} at (0,586) size 769x19
     90      RenderBlock {DIV} at (0,590) size 769x19
    9191        RenderText {#text} at (0,0) size 396x19
    9292          text run at (0,0) width 396: "Font: HelveticaNeue-Light Weight: 700 Style: normal"
    93       RenderBlock {DIV} at (0,605) size 769x19
    94         RenderText {#text} at (0,0) size 396x19
    95           text run at (0,0) width 396: "Font: HelveticaNeue-Light Weight: 800 Style: normal"
    96       RenderBlock {DIV} at (0,624) size 769x19
    97         RenderText {#text} at (0,0) size 396x19
    98           text run at (0,0) width 396: "Font: HelveticaNeue-Light Weight: 900 Style: normal"
    99       RenderBlock {DIV} at (0,643) size 769x18
     93      RenderBlock {DIV} at (0,609) size 769x20
     94        RenderText {#text} at (0,0) size 344x20
     95          text run at (0,0) width 344: "Font: HelveticaNeue-Light Weight: 800 Style: normal"
     96      RenderBlock {DIV} at (0,629) size 769x20
     97        RenderText {#text} at (0,0) size 344x20
     98          text run at (0,0) width 344: "Font: HelveticaNeue-Light Weight: 900 Style: normal"
     99      RenderBlock {DIV} at (0,649) size 769x18
    100100        RenderText {#text} at (0,0) size 333x18
    101101          text run at (0,0) width 333: "Font: HelveticaNeue Weight: 100 Style: normal"
    102       RenderBlock {DIV} at (0,661) size 769x18
     102      RenderBlock {DIV} at (0,667) size 769x18
    103103        RenderText {#text} at (0,0) size 333x18
    104104          text run at (0,0) width 333: "Font: HelveticaNeue Weight: 200 Style: normal"
    105       RenderBlock {DIV} at (0,679) size 769x18
     105      RenderBlock {DIV} at (0,685) size 769x18
    106106        RenderText {#text} at (0,0) size 333x18
    107107          text run at (0,0) width 333: "Font: HelveticaNeue Weight: 300 Style: normal"
    108       RenderBlock {DIV} at (0,697) size 769x18
     108      RenderBlock {DIV} at (0,703) size 769x18
    109109        RenderText {#text} at (0,0) size 333x18
    110110          text run at (0,0) width 333: "Font: HelveticaNeue Weight: 400 Style: normal"
    111       RenderBlock {DIV} at (0,715) size 769x18
     111      RenderBlock {DIV} at (0,721) size 769x18
    112112        RenderText {#text} at (0,0) size 333x18
    113113          text run at (0,0) width 333: "Font: HelveticaNeue Weight: 500 Style: normal"
    114       RenderBlock {DIV} at (0,733) size 769x19
     114      RenderBlock {DIV} at (0,739) size 769x19
    115115        RenderText {#text} at (0,0) size 351x19
    116116          text run at (0,0) width 351: "Font: HelveticaNeue Weight: 600 Style: normal"
    117       RenderBlock {DIV} at (0,752) size 769x19
     117      RenderBlock {DIV} at (0,758) size 769x19
    118118        RenderText {#text} at (0,0) size 351x19
    119119          text run at (0,0) width 351: "Font: HelveticaNeue Weight: 700 Style: normal"
    120       RenderBlock {DIV} at (0,771) size 769x19
    121         RenderText {#text} at (0,0) size 351x19
    122           text run at (0,0) width 351: "Font: HelveticaNeue Weight: 800 Style: normal"
    123       RenderBlock {DIV} at (0,790) size 769x19
    124         RenderText {#text} at (0,0) size 351x19
    125           text run at (0,0) width 351: "Font: HelveticaNeue Weight: 900 Style: normal"
    126       RenderBlock {DIV} at (0,809) size 769x19
     120      RenderBlock {DIV} at (0,777) size 769x20
     121        RenderText {#text} at (0,0) size 305x20
     122          text run at (0,0) width 305: "Font: HelveticaNeue Weight: 800 Style: normal"
     123      RenderBlock {DIV} at (0,797) size 769x20
     124        RenderText {#text} at (0,0) size 305x20
     125          text run at (0,0) width 305: "Font: HelveticaNeue Weight: 900 Style: normal"
     126      RenderBlock {DIV} at (0,817) size 769x19
    127127        RenderText {#text} at (0,0) size 409x19
    128128          text run at (0,0) width 409: "Font: HelveticaNeue-Medium Weight: 100 Style: normal"
    129       RenderBlock {DIV} at (0,828) size 769x19
     129      RenderBlock {DIV} at (0,836) size 769x19
    130130        RenderText {#text} at (0,0) size 409x19
    131131          text run at (0,0) width 409: "Font: HelveticaNeue-Medium Weight: 200 Style: normal"
    132       RenderBlock {DIV} at (0,847) size 769x19
     132      RenderBlock {DIV} at (0,855) size 769x19
    133133        RenderText {#text} at (0,0) size 409x19
    134134          text run at (0,0) width 409: "Font: HelveticaNeue-Medium Weight: 300 Style: normal"
    135       RenderBlock {DIV} at (0,866) size 769x19
     135      RenderBlock {DIV} at (0,874) size 769x19
    136136        RenderText {#text} at (0,0) size 409x19
    137137          text run at (0,0) width 409: "Font: HelveticaNeue-Medium Weight: 400 Style: normal"
    138       RenderBlock {DIV} at (0,885) size 769x19
     138      RenderBlock {DIV} at (0,893) size 769x19
    139139        RenderText {#text} at (0,0) size 409x19
    140140          text run at (0,0) width 409: "Font: HelveticaNeue-Medium Weight: 500 Style: normal"
    141       RenderBlock {DIV} at (0,904) size 769x19
     141      RenderBlock {DIV} at (0,912) size 769x19
    142142        RenderText {#text} at (0,0) size 419x19
    143143          text run at (0,0) width 419: "Font: HelveticaNeue-Medium Weight: 600 Style: normal"
    144       RenderBlock {DIV} at (0,923) size 769x19
     144      RenderBlock {DIV} at (0,931) size 769x19
    145145        RenderText {#text} at (0,0) size 419x19
    146146          text run at (0,0) width 419: "Font: HelveticaNeue-Medium Weight: 700 Style: normal"
    147       RenderBlock {DIV} at (0,942) size 769x19
    148         RenderText {#text} at (0,0) size 419x19
    149           text run at (0,0) width 419: "Font: HelveticaNeue-Medium Weight: 800 Style: normal"
    150       RenderBlock {DIV} at (0,961) size 769x19
    151         RenderText {#text} at (0,0) size 419x19
    152           text run at (0,0) width 419: "Font: HelveticaNeue-Medium Weight: 900 Style: normal"
    153       RenderBlock {DIV} at (0,980) size 769x19
     147      RenderBlock {DIV} at (0,950) size 769x20
     148        RenderText {#text} at (0,0) size 364x20
     149          text run at (0,0) width 364: "Font: HelveticaNeue-Medium Weight: 800 Style: normal"
     150      RenderBlock {DIV} at (0,970) size 769x20
     151        RenderText {#text} at (0,0) size 364x20
     152          text run at (0,0) width 364: "Font: HelveticaNeue-Medium Weight: 900 Style: normal"
     153      RenderBlock {DIV} at (0,990) size 769x19
    154154        RenderText {#text} at (0,0) size 392x19
    155155          text run at (0,0) width 392: "Font: HelveticaNeue-Bold Weight: 100 Style: normal"
    156       RenderBlock {DIV} at (0,999) size 769x19
     156      RenderBlock {DIV} at (0,1009) size 769x19
    157157        RenderText {#text} at (0,0) size 392x19
    158158          text run at (0,0) width 392: "Font: HelveticaNeue-Bold Weight: 200 Style: normal"
    159       RenderBlock {DIV} at (0,1018) size 769x19
     159      RenderBlock {DIV} at (0,1028) size 769x19
    160160        RenderText {#text} at (0,0) size 392x19
    161161          text run at (0,0) width 392: "Font: HelveticaNeue-Bold Weight: 300 Style: normal"
    162       RenderBlock {DIV} at (0,1037) size 769x19
     162      RenderBlock {DIV} at (0,1047) size 769x19
    163163        RenderText {#text} at (0,0) size 392x19
    164164          text run at (0,0) width 392: "Font: HelveticaNeue-Bold Weight: 400 Style: normal"
    165       RenderBlock {DIV} at (0,1056) size 769x19
     165      RenderBlock {DIV} at (0,1066) size 769x19
    166166        RenderText {#text} at (0,0) size 392x19
    167167          text run at (0,0) width 392: "Font: HelveticaNeue-Bold Weight: 500 Style: normal"
    168       RenderBlock {DIV} at (0,1075) size 769x19
     168      RenderBlock {DIV} at (0,1085) size 769x19
    169169        RenderText {#text} at (0,0) size 392x19
    170170          text run at (0,0) width 392: "Font: HelveticaNeue-Bold Weight: 600 Style: normal"
    171       RenderBlock {DIV} at (0,1094) size 769x19
     171      RenderBlock {DIV} at (0,1104) size 769x19
    172172        RenderText {#text} at (0,0) size 392x19
    173173          text run at (0,0) width 392: "Font: HelveticaNeue-Bold Weight: 700 Style: normal"
    174       RenderBlock {DIV} at (0,1113) size 769x19
     174      RenderBlock {DIV} at (0,1123) size 769x19
    175175        RenderText {#text} at (0,0) size 392x19
    176176          text run at (0,0) width 392: "Font: HelveticaNeue-Bold Weight: 800 Style: normal"
    177       RenderBlock {DIV} at (0,1132) size 769x19
     177      RenderBlock {DIV} at (0,1142) size 769x19
    178178        RenderText {#text} at (0,0) size 392x19
    179179          text run at (0,0) width 392: "Font: HelveticaNeue-Bold Weight: 900 Style: normal"
    180       RenderBlock {DIV} at (0,1151) size 769x18
     180      RenderBlock {DIV} at (0,1161) size 769x18
    181181        RenderText {#text} at (0,0) size 388x18
    182182          text run at (0,0) width 388: "Font: HelveticaNeue-UltraLightItalic Weight: 100 Style: normal"
    183       RenderBlock {DIV} at (0,1169) size 769x18
     183      RenderBlock {DIV} at (0,1179) size 769x18
    184184        RenderText {#text} at (0,0) size 388x18
    185185          text run at (0,0) width 388: "Font: HelveticaNeue-UltraLightItalic Weight: 200 Style: normal"
    186       RenderBlock {DIV} at (0,1187) size 769x18
     186      RenderBlock {DIV} at (0,1197) size 769x18
    187187        RenderText {#text} at (0,0) size 388x18
    188188          text run at (0,0) width 388: "Font: HelveticaNeue-UltraLightItalic Weight: 300 Style: normal"
    189       RenderBlock {DIV} at (0,1205) size 769x18
     189      RenderBlock {DIV} at (0,1215) size 769x18
    190190        RenderText {#text} at (0,0) size 388x18
    191191          text run at (0,0) width 388: "Font: HelveticaNeue-UltraLightItalic Weight: 400 Style: normal"
    192       RenderBlock {DIV} at (0,1223) size 769x18
     192      RenderBlock {DIV} at (0,1233) size 769x18
    193193        RenderText {#text} at (0,0) size 388x18
    194194          text run at (0,0) width 388: "Font: HelveticaNeue-UltraLightItalic Weight: 500 Style: normal"
    195       RenderBlock {DIV} at (0,1241) size 769x19
    196         RenderText {#text} at (0,0) size 472x19
    197           text run at (0,0) width 472: "Font: HelveticaNeue-UltraLightItalic Weight: 600 Style: normal"
    198       RenderBlock {DIV} at (0,1260) size 769x19
    199         RenderText {#text} at (0,0) size 472x19
    200           text run at (0,0) width 472: "Font: HelveticaNeue-UltraLightItalic Weight: 700 Style: normal"
    201       RenderBlock {DIV} at (0,1279) size 769x19
    202         RenderText {#text} at (0,0) size 472x19
    203           text run at (0,0) width 472: "Font: HelveticaNeue-UltraLightItalic Weight: 800 Style: normal"
    204       RenderBlock {DIV} at (0,1298) size 769x19
    205         RenderText {#text} at (0,0) size 472x19
    206           text run at (0,0) width 472: "Font: HelveticaNeue-UltraLightItalic Weight: 900 Style: normal"
    207       RenderBlock {DIV} at (0,1317) size 769x18
     195      RenderBlock {DIV} at (0,1251) size 769x19
     196        RenderText {#text} at (0,0) size 470x19
     197          text run at (0,0) width 470: "Font: HelveticaNeue-UltraLightItalic Weight: 600 Style: normal"
     198      RenderBlock {DIV} at (0,1270) size 769x19
     199        RenderText {#text} at (0,0) size 470x19
     200          text run at (0,0) width 470: "Font: HelveticaNeue-UltraLightItalic Weight: 700 Style: normal"
     201      RenderBlock {DIV} at (0,1289) size 769x20
     202        RenderText {#text} at (0,0) size 409x20
     203          text run at (0,0) width 409: "Font: HelveticaNeue-UltraLightItalic Weight: 800 Style: normal"
     204      RenderBlock {DIV} at (0,1309) size 769x20
     205        RenderText {#text} at (0,0) size 409x20
     206          text run at (0,0) width 409: "Font: HelveticaNeue-UltraLightItalic Weight: 900 Style: normal"
     207      RenderBlock {DIV} at (0,1329) size 769x18
    208208        RenderText {#text} at (0,0) size 391x18
    209209          text run at (0,0) width 391: "Font: HelveticaNeue-LightItalic Weight: 100 Style: normal"
    210       RenderBlock {DIV} at (0,1335) size 769x18
     210      RenderBlock {DIV} at (0,1347) size 769x18
    211211        RenderText {#text} at (0,0) size 391x18
    212212          text run at (0,0) width 391: "Font: HelveticaNeue-LightItalic Weight: 200 Style: normal"
    213       RenderBlock {DIV} at (0,1353) size 769x18
     213      RenderBlock {DIV} at (0,1365) size 769x18
    214214        RenderText {#text} at (0,0) size 391x18
    215215          text run at (0,0) width 391: "Font: HelveticaNeue-LightItalic Weight: 300 Style: normal"
    216       RenderBlock {DIV} at (0,1371) size 769x18
     216      RenderBlock {DIV} at (0,1383) size 769x18
    217217        RenderText {#text} at (0,0) size 391x18
    218218          text run at (0,0) width 391: "Font: HelveticaNeue-LightItalic Weight: 400 Style: normal"
    219       RenderBlock {DIV} at (0,1389) size 769x18
     219      RenderBlock {DIV} at (0,1401) size 769x18
    220220        RenderText {#text} at (0,0) size 391x18
    221221          text run at (0,0) width 391: "Font: HelveticaNeue-LightItalic Weight: 500 Style: normal"
    222       RenderBlock {DIV} at (0,1407) size 769x19
    223         RenderText {#text} at (0,0) size 435x19
    224           text run at (0,0) width 435: "Font: HelveticaNeue-LightItalic Weight: 600 Style: normal"
    225       RenderBlock {DIV} at (0,1426) size 769x19
    226         RenderText {#text} at (0,0) size 435x19
    227           text run at (0,0) width 435: "Font: HelveticaNeue-LightItalic Weight: 700 Style: normal"
    228       RenderBlock {DIV} at (0,1445) size 769x19
    229         RenderText {#text} at (0,0) size 435x19
    230           text run at (0,0) width 435: "Font: HelveticaNeue-LightItalic Weight: 800 Style: normal"
    231       RenderBlock {DIV} at (0,1464) size 769x19
    232         RenderText {#text} at (0,0) size 435x19
    233           text run at (0,0) width 435: "Font: HelveticaNeue-LightItalic Weight: 900 Style: normal"
    234       RenderBlock {DIV} at (0,1483) size 769x18
     222      RenderBlock {DIV} at (0,1419) size 769x19
     223        RenderText {#text} at (0,0) size 433x19
     224          text run at (0,0) width 433: "Font: HelveticaNeue-LightItalic Weight: 600 Style: normal"
     225      RenderBlock {DIV} at (0,1438) size 769x19
     226        RenderText {#text} at (0,0) size 433x19
     227          text run at (0,0) width 433: "Font: HelveticaNeue-LightItalic Weight: 700 Style: normal"
     228      RenderBlock {DIV} at (0,1457) size 769x20
     229        RenderText {#text} at (0,0) size 377x20
     230          text run at (0,0) width 377: "Font: HelveticaNeue-LightItalic Weight: 800 Style: normal"
     231      RenderBlock {DIV} at (0,1477) size 769x20
     232        RenderText {#text} at (0,0) size 377x20
     233          text run at (0,0) width 377: "Font: HelveticaNeue-LightItalic Weight: 900 Style: normal"
     234      RenderBlock {DIV} at (0,1497) size 769x18
    235235        RenderText {#text} at (0,0) size 371x18
    236236          text run at (0,0) width 371: "Font: HelveticaNeue-Italic Weight: 100 Style: normal"
    237       RenderBlock {DIV} at (0,1501) size 769x18
     237      RenderBlock {DIV} at (0,1515) size 769x18
    238238        RenderText {#text} at (0,0) size 371x18
    239239          text run at (0,0) width 371: "Font: HelveticaNeue-Italic Weight: 200 Style: normal"
    240       RenderBlock {DIV} at (0,1519) size 769x18
     240      RenderBlock {DIV} at (0,1533) size 769x18
    241241        RenderText {#text} at (0,0) size 371x18
    242242          text run at (0,0) width 371: "Font: HelveticaNeue-Italic Weight: 300 Style: normal"
    243       RenderBlock {DIV} at (0,1537) size 769x18
     243      RenderBlock {DIV} at (0,1551) size 769x18
    244244        RenderText {#text} at (0,0) size 371x18
    245245          text run at (0,0) width 371: "Font: HelveticaNeue-Italic Weight: 400 Style: normal"
    246       RenderBlock {DIV} at (0,1555) size 769x18
     246      RenderBlock {DIV} at (0,1569) size 769x18
    247247        RenderText {#text} at (0,0) size 371x18
    248248          text run at (0,0) width 371: "Font: HelveticaNeue-Italic Weight: 500 Style: normal"
    249       RenderBlock {DIV} at (0,1573) size 769x19
    250         RenderText {#text} at (0,0) size 396x19
    251           text run at (0,0) width 396: "Font: HelveticaNeue-Italic Weight: 600 Style: normal"
    252       RenderBlock {DIV} at (0,1592) size 769x19
    253         RenderText {#text} at (0,0) size 396x19
    254           text run at (0,0) width 396: "Font: HelveticaNeue-Italic Weight: 700 Style: normal"
    255       RenderBlock {DIV} at (0,1611) size 769x19
    256         RenderText {#text} at (0,0) size 396x19
    257           text run at (0,0) width 396: "Font: HelveticaNeue-Italic Weight: 800 Style: normal"
    258       RenderBlock {DIV} at (0,1630) size 769x19
    259         RenderText {#text} at (0,0) size 396x19
    260           text run at (0,0) width 396: "Font: HelveticaNeue-Italic Weight: 900 Style: normal"
    261       RenderBlock {DIV} at (0,1649) size 769x19
     249      RenderBlock {DIV} at (0,1587) size 769x19
     250        RenderText {#text} at (0,0) size 394x19
     251          text run at (0,0) width 394: "Font: HelveticaNeue-Italic Weight: 600 Style: normal"
     252      RenderBlock {DIV} at (0,1606) size 769x19
     253        RenderText {#text} at (0,0) size 394x19
     254          text run at (0,0) width 394: "Font: HelveticaNeue-Italic Weight: 700 Style: normal"
     255      RenderBlock {DIV} at (0,1625) size 769x20
     256        RenderText {#text} at (0,0) size 344x20
     257          text run at (0,0) width 344: "Font: HelveticaNeue-Italic Weight: 800 Style: normal"
     258      RenderBlock {DIV} at (0,1645) size 769x20
     259        RenderText {#text} at (0,0) size 344x20
     260          text run at (0,0) width 344: "Font: HelveticaNeue-Italic Weight: 900 Style: normal"
     261      RenderBlock {DIV} at (0,1665) size 769x19
    262262        RenderText {#text} at (0,0) size 431x19
    263263          text run at (0,0) width 431: "Font: HelveticaNeue-BoldItalic Weight: 100 Style: normal"
    264       RenderBlock {DIV} at (0,1668) size 769x19
     264      RenderBlock {DIV} at (0,1684) size 769x19
    265265        RenderText {#text} at (0,0) size 431x19
    266266          text run at (0,0) width 431: "Font: HelveticaNeue-BoldItalic Weight: 200 Style: normal"
    267       RenderBlock {DIV} at (0,1687) size 769x19
     267      RenderBlock {DIV} at (0,1703) size 769x19
    268268        RenderText {#text} at (0,0) size 431x19
    269269          text run at (0,0) width 431: "Font: HelveticaNeue-BoldItalic Weight: 300 Style: normal"
    270       RenderBlock {DIV} at (0,1706) size 769x19
     270      RenderBlock {DIV} at (0,1722) size 769x19
    271271        RenderText {#text} at (0,0) size 431x19
    272272          text run at (0,0) width 431: "Font: HelveticaNeue-BoldItalic Weight: 400 Style: normal"
    273       RenderBlock {DIV} at (0,1725) size 769x19
     273      RenderBlock {DIV} at (0,1741) size 769x19
    274274        RenderText {#text} at (0,0) size 431x19
    275275          text run at (0,0) width 431: "Font: HelveticaNeue-BoldItalic Weight: 500 Style: normal"
    276       RenderBlock {DIV} at (0,1744) size 769x19
     276      RenderBlock {DIV} at (0,1760) size 769x19
    277277        RenderText {#text} at (0,0) size 431x19
    278278          text run at (0,0) width 431: "Font: HelveticaNeue-BoldItalic Weight: 600 Style: normal"
    279       RenderBlock {DIV} at (0,1763) size 769x19
     279      RenderBlock {DIV} at (0,1779) size 769x19
    280280        RenderText {#text} at (0,0) size 431x19
    281281          text run at (0,0) width 431: "Font: HelveticaNeue-BoldItalic Weight: 700 Style: normal"
    282       RenderBlock {DIV} at (0,1782) size 769x19
     282      RenderBlock {DIV} at (0,1798) size 769x19
    283283        RenderText {#text} at (0,0) size 431x19
    284284          text run at (0,0) width 431: "Font: HelveticaNeue-BoldItalic Weight: 800 Style: normal"
    285       RenderBlock {DIV} at (0,1801) size 769x19
     285      RenderBlock {DIV} at (0,1817) size 769x19
    286286        RenderText {#text} at (0,0) size 431x19
    287287          text run at (0,0) width 431: "Font: HelveticaNeue-BoldItalic Weight: 900 Style: normal"
    288       RenderBlock {DIV} at (0,1820) size 769x18
     288      RenderBlock {DIV} at (0,1836) size 769x18
    289289        RenderText {#text} at (0,0) size 287x18
    290290          text run at (0,0) width 287: "Font: Helvetica Neue Weight: 100 Style: italic"
    291       RenderBlock {DIV} at (0,1838) size 769x18
     291      RenderBlock {DIV} at (0,1854) size 769x18
    292292        RenderText {#text} at (0,0) size 299x18
    293293          text run at (0,0) width 299: "Font: Helvetica Neue Weight: 200 Style: italic"
    294       RenderBlock {DIV} at (0,1856) size 769x18
     294      RenderBlock {DIV} at (0,1872) size 769x18
    295295        RenderText {#text} at (0,0) size 308x18
    296296          text run at (0,0) width 308: "Font: Helvetica Neue Weight: 300 Style: italic"
    297       RenderBlock {DIV} at (0,1874) size 769x18
     297      RenderBlock {DIV} at (0,1890) size 769x18
    298298        RenderText {#text} at (0,0) size 320x18
    299299          text run at (0,0) width 320: "Font: Helvetica Neue Weight: 400 Style: italic"
    300       RenderBlock {DIV} at (0,1892) size 769x19
     300      RenderBlock {DIV} at (0,1908) size 769x19
    301301        RenderText {#text} at (0,0) size 329x19
    302302          text run at (0,0) width 329: "Font: Helvetica Neue Weight: 500 Style: italic"
    303       RenderBlock {DIV} at (0,1911) size 769x19
     303      RenderBlock {DIV} at (0,1927) size 769x19
    304304        RenderText {#text} at (0,0) size 340x19
    305305          text run at (0,0) width 340: "Font: Helvetica Neue Weight: 600 Style: italic"
    306       RenderBlock {DIV} at (0,1930) size 769x19
     306      RenderBlock {DIV} at (0,1946) size 769x19
    307307        RenderText {#text} at (0,0) size 340x19
    308308          text run at (0,0) width 340: "Font: Helvetica Neue Weight: 700 Style: italic"
    309       RenderBlock {DIV} at (0,1949) size 769x19
     309      RenderBlock {DIV} at (0,1965) size 769x19
    310310        RenderText {#text} at (0,0) size 340x19
    311311          text run at (0,0) width 340: "Font: Helvetica Neue Weight: 800 Style: italic"
    312       RenderBlock {DIV} at (0,1968) size 769x19
     312      RenderBlock {DIV} at (0,1984) size 769x19
    313313        RenderText {#text} at (0,0) size 340x19
    314314          text run at (0,0) width 340: "Font: Helvetica Neue Weight: 900 Style: italic"
    315       RenderBlock {DIV} at (0,1987) size 769x18
     315      RenderBlock {DIV} at (0,2003) size 769x18
    316316        RenderText {#text} at (0,0) size 345x18
    317317          text run at (0,0) width 345: "Font: HelveticaNeue-UltraLight Weight: 100 Style: italic"
    318       RenderBlock {DIV} at (0,2005) size 769x18
    319         RenderText {#text} at (0,0) size 345x18
    320           text run at (0,0) width 345: "Font: HelveticaNeue-UltraLight Weight: 200 Style: italic"
    321       RenderBlock {DIV} at (0,2023) size 769x18
    322         RenderText {#text} at (0,0) size 345x18
    323           text run at (0,0) width 345: "Font: HelveticaNeue-UltraLight Weight: 300 Style: italic"
    324       RenderBlock {DIV} at (0,2041) size 769x18
    325         RenderText {#text} at (0,0) size 345x18
    326           text run at (0,0) width 345: "Font: HelveticaNeue-UltraLight Weight: 400 Style: italic"
    327       RenderBlock {DIV} at (0,2059) size 769x18
    328         RenderText {#text} at (0,0) size 345x18
    329           text run at (0,0) width 345: "Font: HelveticaNeue-UltraLight Weight: 500 Style: italic"
    330       RenderBlock {DIV} at (0,2077) size 769x19
     318      RenderBlock {DIV} at (0,2021) size 769x18
     319        RenderText {#text} at (0,0) size 361x18
     320          text run at (0,0) width 361: "Font: HelveticaNeue-UltraLight Weight: 200 Style: italic"
     321      RenderBlock {DIV} at (0,2039) size 769x18
     322        RenderText {#text} at (0,0) size 376x18
     323          text run at (0,0) width 376: "Font: HelveticaNeue-UltraLight Weight: 300 Style: italic"
     324      RenderBlock {DIV} at (0,2057) size 769x18
     325        RenderText {#text} at (0,0) size 391x18
     326          text run at (0,0) width 391: "Font: HelveticaNeue-UltraLight Weight: 400 Style: italic"
     327      RenderBlock {DIV} at (0,2075) size 769x19
     328        RenderText {#text} at (0,0) size 404x19
     329          text run at (0,0) width 404: "Font: HelveticaNeue-UltraLight Weight: 500 Style: italic"
     330      RenderBlock {DIV} at (0,2094) size 769x19
    331331        RenderText {#text} at (0,0) size 418x19
    332332          text run at (0,0) width 418: "Font: HelveticaNeue-UltraLight Weight: 600 Style: italic"
    333       RenderBlock {DIV} at (0,2096) size 769x19
     333      RenderBlock {DIV} at (0,2113) size 769x19
    334334        RenderText {#text} at (0,0) size 418x19
    335335          text run at (0,0) width 418: "Font: HelveticaNeue-UltraLight Weight: 700 Style: italic"
    336       RenderBlock {DIV} at (0,2115) size 769x19
     336      RenderBlock {DIV} at (0,2132) size 769x19
    337337        RenderText {#text} at (0,0) size 418x19
    338338          text run at (0,0) width 418: "Font: HelveticaNeue-UltraLight Weight: 800 Style: italic"
    339       RenderBlock {DIV} at (0,2134) size 769x19
     339      RenderBlock {DIV} at (0,2151) size 769x19
    340340        RenderText {#text} at (0,0) size 418x19
    341341          text run at (0,0) width 418: "Font: HelveticaNeue-UltraLight Weight: 900 Style: italic"
    342       RenderBlock {DIV} at (0,2153) size 769x18
    343         RenderText {#text} at (0,0) size 344x18
    344           text run at (0,0) width 344: "Font: HelveticaNeue-Light Weight: 100 Style: italic"
    345       RenderBlock {DIV} at (0,2171) size 769x18
    346         RenderText {#text} at (0,0) size 344x18
    347           text run at (0,0) width 344: "Font: HelveticaNeue-Light Weight: 200 Style: italic"
    348       RenderBlock {DIV} at (0,2189) size 769x18
     342      RenderBlock {DIV} at (0,2170) size 769x18
     343        RenderText {#text} at (0,0) size 317x18
     344          text run at (0,0) width 317: "Font: HelveticaNeue-Light Weight: 100 Style: italic"
     345      RenderBlock {DIV} at (0,2188) size 769x18
     346        RenderText {#text} at (0,0) size 331x18
     347          text run at (0,0) width 331: "Font: HelveticaNeue-Light Weight: 200 Style: italic"
     348      RenderBlock {DIV} at (0,2206) size 769x18
    349349        RenderText {#text} at (0,0) size 344x18
    350350          text run at (0,0) width 344: "Font: HelveticaNeue-Light Weight: 300 Style: italic"
    351       RenderBlock {DIV} at (0,2207) size 769x18
    352         RenderText {#text} at (0,0) size 344x18
    353           text run at (0,0) width 344: "Font: HelveticaNeue-Light Weight: 400 Style: italic"
    354       RenderBlock {DIV} at (0,2225) size 769x18
    355         RenderText {#text} at (0,0) size 344x18
    356           text run at (0,0) width 344: "Font: HelveticaNeue-Light Weight: 500 Style: italic"
    357       RenderBlock {DIV} at (0,2243) size 769x19
     351      RenderBlock {DIV} at (0,2224) size 769x18
     352        RenderText {#text} at (0,0) size 357x18
     353          text run at (0,0) width 357: "Font: HelveticaNeue-Light Weight: 400 Style: italic"
     354      RenderBlock {DIV} at (0,2242) size 769x19
     355        RenderText {#text} at (0,0) size 368x19
     356          text run at (0,0) width 368: "Font: HelveticaNeue-Light Weight: 500 Style: italic"
     357      RenderBlock {DIV} at (0,2261) size 769x19
    358358        RenderText {#text} at (0,0) size 381x19
    359359          text run at (0,0) width 381: "Font: HelveticaNeue-Light Weight: 600 Style: italic"
    360       RenderBlock {DIV} at (0,2262) size 769x19
     360      RenderBlock {DIV} at (0,2280) size 769x19
    361361        RenderText {#text} at (0,0) size 381x19
    362362          text run at (0,0) width 381: "Font: HelveticaNeue-Light Weight: 700 Style: italic"
    363       RenderBlock {DIV} at (0,2281) size 769x19
     363      RenderBlock {DIV} at (0,2299) size 769x19
    364364        RenderText {#text} at (0,0) size 381x19
    365365          text run at (0,0) width 381: "Font: HelveticaNeue-Light Weight: 800 Style: italic"
    366       RenderBlock {DIV} at (0,2300) size 769x19
     366      RenderBlock {DIV} at (0,2318) size 769x19
    367367        RenderText {#text} at (0,0) size 381x19
    368368          text run at (0,0) width 381: "Font: HelveticaNeue-Light Weight: 900 Style: italic"
    369       RenderBlock {DIV} at (0,2319) size 769x18
    370         RenderText {#text} at (0,0) size 315x18
    371           text run at (0,0) width 315: "Font: HelveticaNeue Weight: 100 Style: italic"
    372369      RenderBlock {DIV} at (0,2337) size 769x18
    373         RenderText {#text} at (0,0) size 315x18
    374           text run at (0,0) width 315: "Font: HelveticaNeue Weight: 200 Style: italic"
     370        RenderText {#text} at (0,0) size 282x18
     371          text run at (0,0) width 282: "Font: HelveticaNeue Weight: 100 Style: italic"
    375372      RenderBlock {DIV} at (0,2355) size 769x18
    376         RenderText {#text} at (0,0) size 315x18
    377           text run at (0,0) width 315: "Font: HelveticaNeue Weight: 300 Style: italic"
     373        RenderText {#text} at (0,0) size 294x18
     374          text run at (0,0) width 294: "Font: HelveticaNeue Weight: 200 Style: italic"
    378375      RenderBlock {DIV} at (0,2373) size 769x18
     376        RenderText {#text} at (0,0) size 304x18
     377          text run at (0,0) width 304: "Font: HelveticaNeue Weight: 300 Style: italic"
     378      RenderBlock {DIV} at (0,2391) size 769x18
    379379        RenderText {#text} at (0,0) size 315x18
    380380          text run at (0,0) width 315: "Font: HelveticaNeue Weight: 400 Style: italic"
    381       RenderBlock {DIV} at (0,2391) size 769x18
    382         RenderText {#text} at (0,0) size 315x18
    383           text run at (0,0) width 315: "Font: HelveticaNeue Weight: 500 Style: italic"
    384381      RenderBlock {DIV} at (0,2409) size 769x19
     382        RenderText {#text} at (0,0) size 325x19
     383          text run at (0,0) width 325: "Font: HelveticaNeue Weight: 500 Style: italic"
     384      RenderBlock {DIV} at (0,2428) size 769x19
    385385        RenderText {#text} at (0,0) size 336x19
    386386          text run at (0,0) width 336: "Font: HelveticaNeue Weight: 600 Style: italic"
    387       RenderBlock {DIV} at (0,2428) size 769x19
     387      RenderBlock {DIV} at (0,2447) size 769x19
    388388        RenderText {#text} at (0,0) size 336x19
    389389          text run at (0,0) width 336: "Font: HelveticaNeue Weight: 700 Style: italic"
    390       RenderBlock {DIV} at (0,2447) size 769x19
     390      RenderBlock {DIV} at (0,2466) size 769x19
    391391        RenderText {#text} at (0,0) size 336x19
    392392          text run at (0,0) width 336: "Font: HelveticaNeue Weight: 800 Style: italic"
    393       RenderBlock {DIV} at (0,2466) size 769x19
     393      RenderBlock {DIV} at (0,2485) size 769x19
    394394        RenderText {#text} at (0,0) size 336x19
    395395          text run at (0,0) width 336: "Font: HelveticaNeue Weight: 900 Style: italic"
    396       RenderBlock {DIV} at (0,2485) size 769x19
    397         RenderText {#text} at (0,0) size 391x19
    398           text run at (0,0) width 391: "Font: HelveticaNeue-Medium Weight: 100 Style: italic"
    399       RenderBlock {DIV} at (0,2504) size 769x19
    400         RenderText {#text} at (0,0) size 391x19
    401           text run at (0,0) width 391: "Font: HelveticaNeue-Medium Weight: 200 Style: italic"
    402       RenderBlock {DIV} at (0,2523) size 769x19
    403         RenderText {#text} at (0,0) size 391x19
    404           text run at (0,0) width 391: "Font: HelveticaNeue-Medium Weight: 300 Style: italic"
    405       RenderBlock {DIV} at (0,2542) size 769x19
    406         RenderText {#text} at (0,0) size 391x19
    407           text run at (0,0) width 391: "Font: HelveticaNeue-Medium Weight: 400 Style: italic"
    408       RenderBlock {DIV} at (0,2561) size 769x19
     396      RenderBlock {DIV} at (0,2504) size 769x18
     397        RenderText {#text} at (0,0) size 339x18
     398          text run at (0,0) width 339: "Font: HelveticaNeue-Medium Weight: 100 Style: italic"
     399      RenderBlock {DIV} at (0,2522) size 769x18
     400        RenderText {#text} at (0,0) size 354x18
     401          text run at (0,0) width 354: "Font: HelveticaNeue-Medium Weight: 200 Style: italic"
     402      RenderBlock {DIV} at (0,2540) size 769x18
     403        RenderText {#text} at (0,0) size 366x18
     404          text run at (0,0) width 366: "Font: HelveticaNeue-Medium Weight: 300 Style: italic"
     405      RenderBlock {DIV} at (0,2558) size 769x18
     406        RenderText {#text} at (0,0) size 379x18
     407          text run at (0,0) width 379: "Font: HelveticaNeue-Medium Weight: 400 Style: italic"
     408      RenderBlock {DIV} at (0,2576) size 769x19
    409409        RenderText {#text} at (0,0) size 391x19
    410410          text run at (0,0) width 391: "Font: HelveticaNeue-Medium Weight: 500 Style: italic"
    411       RenderBlock {DIV} at (0,2580) size 769x19
     411      RenderBlock {DIV} at (0,2595) size 769x19
    412412        RenderText {#text} at (0,0) size 404x19
    413413          text run at (0,0) width 404: "Font: HelveticaNeue-Medium Weight: 600 Style: italic"
    414       RenderBlock {DIV} at (0,2599) size 769x19
     414      RenderBlock {DIV} at (0,2614) size 769x19
    415415        RenderText {#text} at (0,0) size 404x19
    416416          text run at (0,0) width 404: "Font: HelveticaNeue-Medium Weight: 700 Style: italic"
    417       RenderBlock {DIV} at (0,2618) size 769x19
     417      RenderBlock {DIV} at (0,2633) size 769x19
    418418        RenderText {#text} at (0,0) size 404x19
    419419          text run at (0,0) width 404: "Font: HelveticaNeue-Medium Weight: 800 Style: italic"
    420       RenderBlock {DIV} at (0,2637) size 769x19
     420      RenderBlock {DIV} at (0,2652) size 769x19
    421421        RenderText {#text} at (0,0) size 404x19
    422422          text run at (0,0) width 404: "Font: HelveticaNeue-Medium Weight: 900 Style: italic"
    423       RenderBlock {DIV} at (0,2656) size 769x19
    424         RenderText {#text} at (0,0) size 377x19
    425           text run at (0,0) width 377: "Font: HelveticaNeue-Bold Weight: 100 Style: italic"
    426       RenderBlock {DIV} at (0,2675) size 769x19
    427         RenderText {#text} at (0,0) size 377x19
    428           text run at (0,0) width 377: "Font: HelveticaNeue-Bold Weight: 200 Style: italic"
    429       RenderBlock {DIV} at (0,2694) size 769x19
    430         RenderText {#text} at (0,0) size 377x19
    431           text run at (0,0) width 377: "Font: HelveticaNeue-Bold Weight: 300 Style: italic"
    432       RenderBlock {DIV} at (0,2713) size 769x19
    433         RenderText {#text} at (0,0) size 377x19
    434           text run at (0,0) width 377: "Font: HelveticaNeue-Bold Weight: 400 Style: italic"
    435       RenderBlock {DIV} at (0,2732) size 769x19
    436         RenderText {#text} at (0,0) size 377x19
    437           text run at (0,0) width 377: "Font: HelveticaNeue-Bold Weight: 500 Style: italic"
    438       RenderBlock {DIV} at (0,2751) size 769x19
     423      RenderBlock {DIV} at (0,2671) size 769x18
     424        RenderText {#text} at (0,0) size 316x18
     425          text run at (0,0) width 316: "Font: HelveticaNeue-Bold Weight: 100 Style: italic"
     426      RenderBlock {DIV} at (0,2689) size 769x18
     427        RenderText {#text} at (0,0) size 330x18
     428          text run at (0,0) width 330: "Font: HelveticaNeue-Bold Weight: 200 Style: italic"
     429      RenderBlock {DIV} at (0,2707) size 769x18
     430        RenderText {#text} at (0,0) size 342x18
     431          text run at (0,0) width 342: "Font: HelveticaNeue-Bold Weight: 300 Style: italic"
     432      RenderBlock {DIV} at (0,2725) size 769x18
     433        RenderText {#text} at (0,0) size 355x18
     434          text run at (0,0) width 355: "Font: HelveticaNeue-Bold Weight: 400 Style: italic"
     435      RenderBlock {DIV} at (0,2743) size 769x19
     436        RenderText {#text} at (0,0) size 365x19
     437          text run at (0,0) width 365: "Font: HelveticaNeue-Bold Weight: 500 Style: italic"
     438      RenderBlock {DIV} at (0,2762) size 769x19
    439439        RenderText {#text} at (0,0) size 377x19
    440440          text run at (0,0) width 377: "Font: HelveticaNeue-Bold Weight: 600 Style: italic"
    441       RenderBlock {DIV} at (0,2770) size 769x19
     441      RenderBlock {DIV} at (0,2781) size 769x19
    442442        RenderText {#text} at (0,0) size 377x19
    443443          text run at (0,0) width 377: "Font: HelveticaNeue-Bold Weight: 700 Style: italic"
    444       RenderBlock {DIV} at (0,2789) size 769x19
     444      RenderBlock {DIV} at (0,2800) size 769x19
    445445        RenderText {#text} at (0,0) size 377x19
    446446          text run at (0,0) width 377: "Font: HelveticaNeue-Bold Weight: 800 Style: italic"
    447       RenderBlock {DIV} at (0,2808) size 769x19
     447      RenderBlock {DIV} at (0,2819) size 769x19
    448448        RenderText {#text} at (0,0) size 377x19
    449449          text run at (0,0) width 377: "Font: HelveticaNeue-Bold Weight: 900 Style: italic"
    450       RenderBlock {DIV} at (0,2827) size 769x18
     450      RenderBlock {DIV} at (0,2838) size 769x18
    451451        RenderText {#text} at (0,0) size 372x18
    452452          text run at (0,0) width 372: "Font: HelveticaNeue-UltraLightItalic Weight: 100 Style: italic"
    453       RenderBlock {DIV} at (0,2845) size 769x18
     453      RenderBlock {DIV} at (0,2856) size 769x18
    454454        RenderText {#text} at (0,0) size 372x18
    455455          text run at (0,0) width 372: "Font: HelveticaNeue-UltraLightItalic Weight: 200 Style: italic"
    456       RenderBlock {DIV} at (0,2863) size 769x18
     456      RenderBlock {DIV} at (0,2874) size 769x18
    457457        RenderText {#text} at (0,0) size 372x18
    458458          text run at (0,0) width 372: "Font: HelveticaNeue-UltraLightItalic Weight: 300 Style: italic"
    459       RenderBlock {DIV} at (0,2881) size 769x18
     459      RenderBlock {DIV} at (0,2892) size 769x18
    460460        RenderText {#text} at (0,0) size 372x18
    461461          text run at (0,0) width 372: "Font: HelveticaNeue-UltraLightItalic Weight: 400 Style: italic"
    462       RenderBlock {DIV} at (0,2899) size 769x18
     462      RenderBlock {DIV} at (0,2910) size 769x18
    463463        RenderText {#text} at (0,0) size 372x18
    464464          text run at (0,0) width 372: "Font: HelveticaNeue-UltraLightItalic Weight: 500 Style: italic"
    465       RenderBlock {DIV} at (0,2917) size 769x19
     465      RenderBlock {DIV} at (0,2928) size 769x19
    466466        RenderText {#text} at (0,0) size 455x19
    467467          text run at (0,0) width 455: "Font: HelveticaNeue-UltraLightItalic Weight: 600 Style: italic"
    468       RenderBlock {DIV} at (0,2936) size 769x19
     468      RenderBlock {DIV} at (0,2947) size 769x19
    469469        RenderText {#text} at (0,0) size 455x19
    470470          text run at (0,0) width 455: "Font: HelveticaNeue-UltraLightItalic Weight: 700 Style: italic"
    471       RenderBlock {DIV} at (0,2955) size 769x19
     471      RenderBlock {DIV} at (0,2966) size 769x19
    472472        RenderText {#text} at (0,0) size 455x19
    473473          text run at (0,0) width 455: "Font: HelveticaNeue-UltraLightItalic Weight: 800 Style: italic"
    474       RenderBlock {DIV} at (0,2974) size 769x19
     474      RenderBlock {DIV} at (0,2985) size 769x19
    475475        RenderText {#text} at (0,0) size 455x19
    476476          text run at (0,0) width 455: "Font: HelveticaNeue-UltraLightItalic Weight: 900 Style: italic"
    477       RenderBlock {DIV} at (0,2993) size 769x18
     477      RenderBlock {DIV} at (0,3004) size 769x18
    478478        RenderText {#text} at (0,0) size 375x18
    479479          text run at (0,0) width 375: "Font: HelveticaNeue-LightItalic Weight: 100 Style: italic"
    480       RenderBlock {DIV} at (0,3011) size 769x18
     480      RenderBlock {DIV} at (0,3022) size 769x18
    481481        RenderText {#text} at (0,0) size 375x18
    482482          text run at (0,0) width 375: "Font: HelveticaNeue-LightItalic Weight: 200 Style: italic"
    483       RenderBlock {DIV} at (0,3029) size 769x18
     483      RenderBlock {DIV} at (0,3040) size 769x18
    484484        RenderText {#text} at (0,0) size 375x18
    485485          text run at (0,0) width 375: "Font: HelveticaNeue-LightItalic Weight: 300 Style: italic"
    486       RenderBlock {DIV} at (0,3047) size 769x18
     486      RenderBlock {DIV} at (0,3058) size 769x18
    487487        RenderText {#text} at (0,0) size 375x18
    488488          text run at (0,0) width 375: "Font: HelveticaNeue-LightItalic Weight: 400 Style: italic"
    489       RenderBlock {DIV} at (0,3065) size 769x18
     489      RenderBlock {DIV} at (0,3076) size 769x18
    490490        RenderText {#text} at (0,0) size 375x18
    491491          text run at (0,0) width 375: "Font: HelveticaNeue-LightItalic Weight: 500 Style: italic"
    492       RenderBlock {DIV} at (0,3083) size 769x19
     492      RenderBlock {DIV} at (0,3094) size 769x19
    493493        RenderText {#text} at (0,0) size 418x19
    494494          text run at (0,0) width 418: "Font: HelveticaNeue-LightItalic Weight: 600 Style: italic"
    495       RenderBlock {DIV} at (0,3102) size 769x19
     495      RenderBlock {DIV} at (0,3113) size 769x19
    496496        RenderText {#text} at (0,0) size 418x19
    497497          text run at (0,0) width 418: "Font: HelveticaNeue-LightItalic Weight: 700 Style: italic"
    498       RenderBlock {DIV} at (0,3121) size 769x19
     498      RenderBlock {DIV} at (0,3132) size 769x19
    499499        RenderText {#text} at (0,0) size 418x19
    500500          text run at (0,0) width 418: "Font: HelveticaNeue-LightItalic Weight: 800 Style: italic"
    501       RenderBlock {DIV} at (0,3140) size 769x19
     501      RenderBlock {DIV} at (0,3151) size 769x19
    502502        RenderText {#text} at (0,0) size 418x19
    503503          text run at (0,0) width 418: "Font: HelveticaNeue-LightItalic Weight: 900 Style: italic"
    504       RenderBlock {DIV} at (0,3159) size 769x18
     504      RenderBlock {DIV} at (0,3170) size 769x18
    505505        RenderText {#text} at (0,0) size 355x18
    506506          text run at (0,0) width 355: "Font: HelveticaNeue-Italic Weight: 100 Style: italic"
    507       RenderBlock {DIV} at (0,3177) size 769x18
     507      RenderBlock {DIV} at (0,3188) size 769x18
    508508        RenderText {#text} at (0,0) size 355x18
    509509          text run at (0,0) width 355: "Font: HelveticaNeue-Italic Weight: 200 Style: italic"
    510       RenderBlock {DIV} at (0,3195) size 769x18
     510      RenderBlock {DIV} at (0,3206) size 769x18
    511511        RenderText {#text} at (0,0) size 355x18
    512512          text run at (0,0) width 355: "Font: HelveticaNeue-Italic Weight: 300 Style: italic"
    513       RenderBlock {DIV} at (0,3213) size 769x18
     513      RenderBlock {DIV} at (0,3224) size 769x18
    514514        RenderText {#text} at (0,0) size 355x18
    515515          text run at (0,0) width 355: "Font: HelveticaNeue-Italic Weight: 400 Style: italic"
    516       RenderBlock {DIV} at (0,3231) size 769x18
     516      RenderBlock {DIV} at (0,3242) size 769x18
    517517        RenderText {#text} at (0,0) size 355x18
    518518          text run at (0,0) width 355: "Font: HelveticaNeue-Italic Weight: 500 Style: italic"
    519       RenderBlock {DIV} at (0,3249) size 769x19
     519      RenderBlock {DIV} at (0,3260) size 769x19
    520520        RenderText {#text} at (0,0) size 379x19
    521521          text run at (0,0) width 379: "Font: HelveticaNeue-Italic Weight: 600 Style: italic"
    522       RenderBlock {DIV} at (0,3268) size 769x19
     522      RenderBlock {DIV} at (0,3279) size 769x19
    523523        RenderText {#text} at (0,0) size 379x19
    524524          text run at (0,0) width 379: "Font: HelveticaNeue-Italic Weight: 700 Style: italic"
    525       RenderBlock {DIV} at (0,3287) size 769x19
     525      RenderBlock {DIV} at (0,3298) size 769x19
    526526        RenderText {#text} at (0,0) size 379x19
    527527          text run at (0,0) width 379: "Font: HelveticaNeue-Italic Weight: 800 Style: italic"
    528       RenderBlock {DIV} at (0,3306) size 769x19
     528      RenderBlock {DIV} at (0,3317) size 769x19
    529529        RenderText {#text} at (0,0) size 379x19
    530530          text run at (0,0) width 379: "Font: HelveticaNeue-Italic Weight: 900 Style: italic"
    531       RenderBlock {DIV} at (0,3325) size 769x19
     531      RenderBlock {DIV} at (0,3336) size 769x19
    532532        RenderText {#text} at (0,0) size 414x19
    533533          text run at (0,0) width 414: "Font: HelveticaNeue-BoldItalic Weight: 100 Style: italic"
    534       RenderBlock {DIV} at (0,3344) size 769x19
     534      RenderBlock {DIV} at (0,3355) size 769x19
    535535        RenderText {#text} at (0,0) size 414x19
    536536          text run at (0,0) width 414: "Font: HelveticaNeue-BoldItalic Weight: 200 Style: italic"
    537       RenderBlock {DIV} at (0,3363) size 769x19
     537      RenderBlock {DIV} at (0,3374) size 769x19
    538538        RenderText {#text} at (0,0) size 414x19
    539539          text run at (0,0) width 414: "Font: HelveticaNeue-BoldItalic Weight: 300 Style: italic"
    540       RenderBlock {DIV} at (0,3382) size 769x19
     540      RenderBlock {DIV} at (0,3393) size 769x19
    541541        RenderText {#text} at (0,0) size 414x19
    542542          text run at (0,0) width 414: "Font: HelveticaNeue-BoldItalic Weight: 400 Style: italic"
    543       RenderBlock {DIV} at (0,3401) size 769x19
     543      RenderBlock {DIV} at (0,3412) size 769x19
    544544        RenderText {#text} at (0,0) size 414x19
    545545          text run at (0,0) width 414: "Font: HelveticaNeue-BoldItalic Weight: 500 Style: italic"
    546       RenderBlock {DIV} at (0,3420) size 769x19
     546      RenderBlock {DIV} at (0,3431) size 769x19
    547547        RenderText {#text} at (0,0) size 414x19
    548548          text run at (0,0) width 414: "Font: HelveticaNeue-BoldItalic Weight: 600 Style: italic"
    549       RenderBlock {DIV} at (0,3439) size 769x19
     549      RenderBlock {DIV} at (0,3450) size 769x19
    550550        RenderText {#text} at (0,0) size 414x19
    551551          text run at (0,0) width 414: "Font: HelveticaNeue-BoldItalic Weight: 700 Style: italic"
    552       RenderBlock {DIV} at (0,3458) size 769x19
     552      RenderBlock {DIV} at (0,3469) size 769x19
    553553        RenderText {#text} at (0,0) size 414x19
    554554          text run at (0,0) width 414: "Font: HelveticaNeue-BoldItalic Weight: 800 Style: italic"
    555       RenderBlock {DIV} at (0,3477) size 769x19
     555      RenderBlock {DIV} at (0,3488) size 769x19
    556556        RenderText {#text} at (0,0) size 414x19
    557557          text run at (0,0) width 414: "Font: HelveticaNeue-BoldItalic Weight: 900 Style: italic"
    558       RenderBlock {DIV} at (0,3496) size 769x18
     558      RenderBlock {DIV} at (0,3507) size 769x18
    559559        RenderText {#text} at (0,0) size 254x18
    560560          text run at (0,0) width 254: "Font: Avenir Weight: 100 Style: normal"
    561       RenderBlock {DIV} at (0,3514) size 769x18
     561      RenderBlock {DIV} at (0,3525) size 769x18
    562562        RenderText {#text} at (0,0) size 254x18
    563563          text run at (0,0) width 254: "Font: Avenir Weight: 200 Style: normal"
    564       RenderBlock {DIV} at (0,3532) size 769x18
     564      RenderBlock {DIV} at (0,3543) size 769x18
    565565        RenderText {#text} at (0,0) size 254x18
    566566          text run at (0,0) width 254: "Font: Avenir Weight: 300 Style: normal"
    567       RenderBlock {DIV} at (0,3550) size 769x18
     567      RenderBlock {DIV} at (0,3561) size 769x18
    568568        RenderText {#text} at (0,0) size 254x18
    569569          text run at (0,0) width 254: "Font: Avenir Weight: 400 Style: normal"
    570       RenderBlock {DIV} at (0,3568) size 769x18
     570      RenderBlock {DIV} at (0,3579) size 769x18
    571571        RenderText {#text} at (0,0) size 254x18
    572572          text run at (0,0) width 254: "Font: Avenir Weight: 500 Style: normal"
    573       RenderBlock {DIV} at (0,3586) size 769x18
     573      RenderBlock {DIV} at (0,3597) size 769x18
    574574        RenderText {#text} at (0,0) size 271x18
    575575          text run at (0,0) width 271: "Font: Avenir Weight: 600 Style: normal"
    576       RenderBlock {DIV} at (0,3604) size 769x18
     576      RenderBlock {DIV} at (0,3615) size 769x18
    577577        RenderText {#text} at (0,0) size 271x18
    578578          text run at (0,0) width 271: "Font: Avenir Weight: 700 Style: normal"
    579       RenderBlock {DIV} at (0,3622) size 769x18
     579      RenderBlock {DIV} at (0,3633) size 769x18
    580580        RenderText {#text} at (0,0) size 271x18
    581581          text run at (0,0) width 271: "Font: Avenir Weight: 800 Style: normal"
    582       RenderBlock {DIV} at (0,3640) size 769x18
     582      RenderBlock {DIV} at (0,3651) size 769x18
    583583        RenderText {#text} at (0,0) size 271x18
    584584          text run at (0,0) width 271: "Font: Avenir Weight: 900 Style: normal"
    585       RenderBlock {DIV} at (0,3658) size 769x18
     585      RenderBlock {DIV} at (0,3669) size 769x18
    586586        RenderText {#text} at (0,0) size 294x18
    587587          text run at (0,0) width 294: "Font: Avenir-Light Weight: 100 Style: normal"
    588       RenderBlock {DIV} at (0,3676) size 769x18
     588      RenderBlock {DIV} at (0,3687) size 769x18
    589589        RenderText {#text} at (0,0) size 294x18
    590590          text run at (0,0) width 294: "Font: Avenir-Light Weight: 200 Style: normal"
    591       RenderBlock {DIV} at (0,3694) size 769x18
     591      RenderBlock {DIV} at (0,3705) size 769x18
    592592        RenderText {#text} at (0,0) size 294x18
    593593          text run at (0,0) width 294: "Font: Avenir-Light Weight: 300 Style: normal"
    594       RenderBlock {DIV} at (0,3712) size 769x18
     594      RenderBlock {DIV} at (0,3723) size 769x18
    595595        RenderText {#text} at (0,0) size 294x18
    596596          text run at (0,0) width 294: "Font: Avenir-Light Weight: 400 Style: normal"
    597       RenderBlock {DIV} at (0,3730) size 769x18
     597      RenderBlock {DIV} at (0,3741) size 769x18
    598598        RenderText {#text} at (0,0) size 294x18
    599599          text run at (0,0) width 294: "Font: Avenir-Light Weight: 500 Style: normal"
    600       RenderBlock {DIV} at (0,3748) size 769x18
     600      RenderBlock {DIV} at (0,3759) size 769x18
    601601        RenderText {#text} at (0,0) size 313x18
    602602          text run at (0,0) width 313: "Font: Avenir-Light Weight: 600 Style: normal"
    603       RenderBlock {DIV} at (0,3766) size 769x18
     603      RenderBlock {DIV} at (0,3777) size 769x18
    604604        RenderText {#text} at (0,0) size 313x18
    605605          text run at (0,0) width 313: "Font: Avenir-Light Weight: 700 Style: normal"
    606       RenderBlock {DIV} at (0,3784) size 769x18
     606      RenderBlock {DIV} at (0,3795) size 769x18
    607607        RenderText {#text} at (0,0) size 313x18
    608608          text run at (0,0) width 313: "Font: Avenir-Light Weight: 800 Style: normal"
    609       RenderBlock {DIV} at (0,3802) size 769x18
     609      RenderBlock {DIV} at (0,3813) size 769x18
    610610        RenderText {#text} at (0,0) size 313x18
    611611          text run at (0,0) width 313: "Font: Avenir-Light Weight: 900 Style: normal"
    612       RenderBlock {DIV} at (0,3820) size 769x18
     612      RenderBlock {DIV} at (0,3831) size 769x18
    613613        RenderText {#text} at (0,0) size 294x18
    614614          text run at (0,0) width 294: "Font: Avenir-Book Weight: 100 Style: normal"
    615       RenderBlock {DIV} at (0,3838) size 769x18
     615      RenderBlock {DIV} at (0,3849) size 769x18
    616616        RenderText {#text} at (0,0) size 294x18
    617617          text run at (0,0) width 294: "Font: Avenir-Book Weight: 200 Style: normal"
    618       RenderBlock {DIV} at (0,3856) size 769x18
     618      RenderBlock {DIV} at (0,3867) size 769x18
    619619        RenderText {#text} at (0,0) size 294x18
    620620          text run at (0,0) width 294: "Font: Avenir-Book Weight: 300 Style: normal"
    621       RenderBlock {DIV} at (0,3874) size 769x18
     621      RenderBlock {DIV} at (0,3885) size 769x18
    622622        RenderText {#text} at (0,0) size 294x18
    623623          text run at (0,0) width 294: "Font: Avenir-Book Weight: 400 Style: normal"
    624       RenderBlock {DIV} at (0,3892) size 769x18
     624      RenderBlock {DIV} at (0,3903) size 769x18
    625625        RenderText {#text} at (0,0) size 294x18
    626626          text run at (0,0) width 294: "Font: Avenir-Book Weight: 500 Style: normal"
    627       RenderBlock {DIV} at (0,3910) size 769x18
     627      RenderBlock {DIV} at (0,3921) size 769x18
    628628        RenderText {#text} at (0,0) size 311x18
    629629          text run at (0,0) width 311: "Font: Avenir-Book Weight: 600 Style: normal"
    630       RenderBlock {DIV} at (0,3928) size 769x18
     630      RenderBlock {DIV} at (0,3939) size 769x18
    631631        RenderText {#text} at (0,0) size 311x18
    632632          text run at (0,0) width 311: "Font: Avenir-Book Weight: 700 Style: normal"
    633       RenderBlock {DIV} at (0,3946) size 769x18
     633      RenderBlock {DIV} at (0,3957) size 769x18
    634634        RenderText {#text} at (0,0) size 311x18
    635635          text run at (0,0) width 311: "Font: Avenir-Book Weight: 800 Style: normal"
    636       RenderBlock {DIV} at (0,3964) size 769x18
     636      RenderBlock {DIV} at (0,3975) size 769x18
    637637        RenderText {#text} at (0,0) size 311x18
    638638          text run at (0,0) width 311: "Font: Avenir-Book Weight: 900 Style: normal"
    639       RenderBlock {DIV} at (0,3982) size 769x18
     639      RenderBlock {DIV} at (0,3993) size 769x18
    640640        RenderText {#text} at (0,0) size 314x18
    641641          text run at (0,0) width 314: "Font: Avenir-Medium Weight: 100 Style: normal"
    642       RenderBlock {DIV} at (0,4000) size 769x18
     642      RenderBlock {DIV} at (0,4011) size 769x18
    643643        RenderText {#text} at (0,0) size 314x18
    644644          text run at (0,0) width 314: "Font: Avenir-Medium Weight: 200 Style: normal"
    645       RenderBlock {DIV} at (0,4018) size 769x18
     645      RenderBlock {DIV} at (0,4029) size 769x18
    646646        RenderText {#text} at (0,0) size 314x18
    647647          text run at (0,0) width 314: "Font: Avenir-Medium Weight: 300 Style: normal"
    648       RenderBlock {DIV} at (0,4036) size 769x18
     648      RenderBlock {DIV} at (0,4047) size 769x18
    649649        RenderText {#text} at (0,0) size 314x18
    650650          text run at (0,0) width 314: "Font: Avenir-Medium Weight: 400 Style: normal"
    651       RenderBlock {DIV} at (0,4054) size 769x18
     651      RenderBlock {DIV} at (0,4065) size 769x18
    652652        RenderText {#text} at (0,0) size 314x18
    653653          text run at (0,0) width 314: "Font: Avenir-Medium Weight: 500 Style: normal"
    654       RenderBlock {DIV} at (0,4072) size 769x18
     654      RenderBlock {DIV} at (0,4083) size 769x18
    655655        RenderText {#text} at (0,0) size 333x18
    656656          text run at (0,0) width 333: "Font: Avenir-Medium Weight: 600 Style: normal"
    657       RenderBlock {DIV} at (0,4090) size 769x18
     657      RenderBlock {DIV} at (0,4101) size 769x18
    658658        RenderText {#text} at (0,0) size 333x18
    659659          text run at (0,0) width 333: "Font: Avenir-Medium Weight: 700 Style: normal"
    660       RenderBlock {DIV} at (0,4108) size 769x18
     660      RenderBlock {DIV} at (0,4119) size 769x18
    661661        RenderText {#text} at (0,0) size 333x18
    662662          text run at (0,0) width 333: "Font: Avenir-Medium Weight: 800 Style: normal"
    663       RenderBlock {DIV} at (0,4126) size 769x18
     663      RenderBlock {DIV} at (0,4137) size 769x18
    664664        RenderText {#text} at (0,0) size 333x18
    665665          text run at (0,0) width 333: "Font: Avenir-Medium Weight: 900 Style: normal"
    666       RenderBlock {DIV} at (0,4144) size 769x18
     666      RenderBlock {DIV} at (0,4155) size 769x18
    667667        RenderText {#text} at (0,0) size 297x18
    668668          text run at (0,0) width 297: "Font: Avenir-Black Weight: 100 Style: normal"
    669       RenderBlock {DIV} at (0,4162) size 769x18
     669      RenderBlock {DIV} at (0,4173) size 769x18
    670670        RenderText {#text} at (0,0) size 297x18
    671671          text run at (0,0) width 297: "Font: Avenir-Black Weight: 200 Style: normal"
    672       RenderBlock {DIV} at (0,4180) size 769x18
     672      RenderBlock {DIV} at (0,4191) size 769x18
    673673        RenderText {#text} at (0,0) size 297x18
    674674          text run at (0,0) width 297: "Font: Avenir-Black Weight: 300 Style: normal"
    675       RenderBlock {DIV} at (0,4198) size 769x18
     675      RenderBlock {DIV} at (0,4209) size 769x18
    676676        RenderText {#text} at (0,0) size 297x18
    677677          text run at (0,0) width 297: "Font: Avenir-Black Weight: 400 Style: normal"
    678       RenderBlock {DIV} at (0,4216) size 769x18
     678      RenderBlock {DIV} at (0,4227) size 769x18
    679679        RenderText {#text} at (0,0) size 297x18
    680680          text run at (0,0) width 297: "Font: Avenir-Black Weight: 500 Style: normal"
    681       RenderBlock {DIV} at (0,4234) size 769x18
     681      RenderBlock {DIV} at (0,4245) size 769x18
    682682        RenderText {#text} at (0,0) size 315x18
    683683          text run at (0,0) width 315: "Font: Avenir-Black Weight: 600 Style: normal"
    684       RenderBlock {DIV} at (0,4252) size 769x18
     684      RenderBlock {DIV} at (0,4263) size 769x18
    685685        RenderText {#text} at (0,0) size 315x18
    686686          text run at (0,0) width 315: "Font: Avenir-Black Weight: 700 Style: normal"
    687       RenderBlock {DIV} at (0,4270) size 769x18
     687      RenderBlock {DIV} at (0,4281) size 769x18
    688688        RenderText {#text} at (0,0) size 315x18
    689689          text run at (0,0) width 315: "Font: Avenir-Black Weight: 800 Style: normal"
    690       RenderBlock {DIV} at (0,4288) size 769x18
     690      RenderBlock {DIV} at (0,4299) size 769x18
    691691        RenderText {#text} at (0,0) size 315x18
    692692          text run at (0,0) width 315: "Font: Avenir-Black Weight: 900 Style: normal"
    693       RenderBlock {DIV} at (0,4306) size 769x18
     693      RenderBlock {DIV} at (0,4317) size 769x18
    694694        RenderText {#text} at (0,0) size 301x18
    695695          text run at (0,0) width 301: "Font: Avenir-Heavy Weight: 100 Style: normal"
    696       RenderBlock {DIV} at (0,4324) size 769x18
     696      RenderBlock {DIV} at (0,4335) size 769x18
    697697        RenderText {#text} at (0,0) size 301x18
    698698          text run at (0,0) width 301: "Font: Avenir-Heavy Weight: 200 Style: normal"
    699       RenderBlock {DIV} at (0,4342) size 769x18
     699      RenderBlock {DIV} at (0,4353) size 769x18
    700700        RenderText {#text} at (0,0) size 301x18
    701701          text run at (0,0) width 301: "Font: Avenir-Heavy Weight: 300 Style: normal"
    702       RenderBlock {DIV} at (0,4360) size 769x18
     702      RenderBlock {DIV} at (0,4371) size 769x18
    703703        RenderText {#text} at (0,0) size 301x18
    704704          text run at (0,0) width 301: "Font: Avenir-Heavy Weight: 400 Style: normal"
    705       RenderBlock {DIV} at (0,4378) size 769x18
     705      RenderBlock {DIV} at (0,4389) size 769x18
    706706        RenderText {#text} at (0,0) size 301x18
    707707          text run at (0,0) width 301: "Font: Avenir-Heavy Weight: 500 Style: normal"
    708       RenderBlock {DIV} at (0,4396) size 769x18
     708      RenderBlock {DIV} at (0,4407) size 769x18
    709709        RenderText {#text} at (0,0) size 319x18
    710710          text run at (0,0) width 319: "Font: Avenir-Heavy Weight: 600 Style: normal"
    711       RenderBlock {DIV} at (0,4414) size 769x18
     711      RenderBlock {DIV} at (0,4425) size 769x18
    712712        RenderText {#text} at (0,0) size 319x18
    713713          text run at (0,0) width 319: "Font: Avenir-Heavy Weight: 700 Style: normal"
    714       RenderBlock {DIV} at (0,4432) size 769x18
     714      RenderBlock {DIV} at (0,4443) size 769x18
    715715        RenderText {#text} at (0,0) size 319x18
    716716          text run at (0,0) width 319: "Font: Avenir-Heavy Weight: 800 Style: normal"
    717       RenderBlock {DIV} at (0,4450) size 769x18
     717      RenderBlock {DIV} at (0,4461) size 769x18
    718718        RenderText {#text} at (0,0) size 319x18
    719719          text run at (0,0) width 319: "Font: Avenir-Heavy Weight: 900 Style: normal"
    720       RenderBlock {DIV} at (0,4468) size 769x18
     720      RenderBlock {DIV} at (0,4479) size 769x18
    721721        RenderText {#text} at (0,0) size 346x18
    722722          text run at (0,0) width 346: "Font: Avenir-LightOblique Weight: 100 Style: normal"
    723       RenderBlock {DIV} at (0,4486) size 769x18
     723      RenderBlock {DIV} at (0,4497) size 769x18
    724724        RenderText {#text} at (0,0) size 346x18
    725725          text run at (0,0) width 346: "Font: Avenir-LightOblique Weight: 200 Style: normal"
    726       RenderBlock {DIV} at (0,4504) size 769x18
     726      RenderBlock {DIV} at (0,4515) size 769x18
    727727        RenderText {#text} at (0,0) size 346x18
    728728          text run at (0,0) width 346: "Font: Avenir-LightOblique Weight: 300 Style: normal"
    729       RenderBlock {DIV} at (0,4522) size 769x18
     729      RenderBlock {DIV} at (0,4533) size 769x18
    730730        RenderText {#text} at (0,0) size 346x18
    731731          text run at (0,0) width 346: "Font: Avenir-LightOblique Weight: 400 Style: normal"
    732       RenderBlock {DIV} at (0,4540) size 769x18
     732      RenderBlock {DIV} at (0,4551) size 769x18
    733733        RenderText {#text} at (0,0) size 346x18
    734734          text run at (0,0) width 346: "Font: Avenir-LightOblique Weight: 500 Style: normal"
    735       RenderBlock {DIV} at (0,4558) size 769x18
     735      RenderBlock {DIV} at (0,4569) size 769x18
    736736        RenderText {#text} at (0,0) size 368x18
    737737          text run at (0,0) width 368: "Font: Avenir-LightOblique Weight: 600 Style: normal"
    738       RenderBlock {DIV} at (0,4576) size 769x18
     738      RenderBlock {DIV} at (0,4587) size 769x18
    739739        RenderText {#text} at (0,0) size 368x18
    740740          text run at (0,0) width 368: "Font: Avenir-LightOblique Weight: 700 Style: normal"
    741       RenderBlock {DIV} at (0,4594) size 769x18
     741      RenderBlock {DIV} at (0,4605) size 769x18
    742742        RenderText {#text} at (0,0) size 368x18
    743743          text run at (0,0) width 368: "Font: Avenir-LightOblique Weight: 800 Style: normal"
    744       RenderBlock {DIV} at (0,4612) size 769x18
     744      RenderBlock {DIV} at (0,4623) size 769x18
    745745        RenderText {#text} at (0,0) size 368x18
    746746          text run at (0,0) width 368: "Font: Avenir-LightOblique Weight: 900 Style: normal"
    747       RenderBlock {DIV} at (0,4630) size 769x18
     747      RenderBlock {DIV} at (0,4641) size 769x18
    748748        RenderText {#text} at (0,0) size 346x18
    749749          text run at (0,0) width 346: "Font: Avenir-BookOblique Weight: 100 Style: normal"
    750       RenderBlock {DIV} at (0,4648) size 769x18
     750      RenderBlock {DIV} at (0,4659) size 769x18
    751751        RenderText {#text} at (0,0) size 346x18
    752752          text run at (0,0) width 346: "Font: Avenir-BookOblique Weight: 200 Style: normal"
    753       RenderBlock {DIV} at (0,4666) size 769x18
     753      RenderBlock {DIV} at (0,4677) size 769x18
    754754        RenderText {#text} at (0,0) size 346x18
    755755          text run at (0,0) width 346: "Font: Avenir-BookOblique Weight: 300 Style: normal"
    756       RenderBlock {DIV} at (0,4684) size 769x18
     756      RenderBlock {DIV} at (0,4695) size 769x18
    757757        RenderText {#text} at (0,0) size 346x18
    758758          text run at (0,0) width 346: "Font: Avenir-BookOblique Weight: 400 Style: normal"
    759       RenderBlock {DIV} at (0,4702) size 769x18
     759      RenderBlock {DIV} at (0,4713) size 769x18
    760760        RenderText {#text} at (0,0) size 346x18
    761761          text run at (0,0) width 346: "Font: Avenir-BookOblique Weight: 500 Style: normal"
    762       RenderBlock {DIV} at (0,4720) size 769x18
     762      RenderBlock {DIV} at (0,4731) size 769x18
    763763        RenderText {#text} at (0,0) size 366x18
    764764          text run at (0,0) width 366: "Font: Avenir-BookOblique Weight: 600 Style: normal"
    765       RenderBlock {DIV} at (0,4738) size 769x18
     765      RenderBlock {DIV} at (0,4749) size 769x18
    766766        RenderText {#text} at (0,0) size 366x18
    767767          text run at (0,0) width 366: "Font: Avenir-BookOblique Weight: 700 Style: normal"
    768       RenderBlock {DIV} at (0,4756) size 769x18
     768      RenderBlock {DIV} at (0,4767) size 769x18
    769769        RenderText {#text} at (0,0) size 366x18
    770770          text run at (0,0) width 366: "Font: Avenir-BookOblique Weight: 800 Style: normal"
    771       RenderBlock {DIV} at (0,4774) size 769x18
     771      RenderBlock {DIV} at (0,4785) size 769x18
    772772        RenderText {#text} at (0,0) size 366x18
    773773          text run at (0,0) width 366: "Font: Avenir-BookOblique Weight: 900 Style: normal"
    774       RenderBlock {DIV} at (0,4792) size 769x18
     774      RenderBlock {DIV} at (0,4803) size 769x18
    775775        RenderText {#text} at (0,0) size 365x18
    776776          text run at (0,0) width 365: "Font: Avenir-MediumOblique Weight: 100 Style: normal"
    777       RenderBlock {DIV} at (0,4810) size 769x18
     777      RenderBlock {DIV} at (0,4821) size 769x18
    778778        RenderText {#text} at (0,0) size 365x18
    779779          text run at (0,0) width 365: "Font: Avenir-MediumOblique Weight: 200 Style: normal"
    780       RenderBlock {DIV} at (0,4828) size 769x18
     780      RenderBlock {DIV} at (0,4839) size 769x18
    781781        RenderText {#text} at (0,0) size 365x18
    782782          text run at (0,0) width 365: "Font: Avenir-MediumOblique Weight: 300 Style: normal"
    783       RenderBlock {DIV} at (0,4846) size 769x18
     783      RenderBlock {DIV} at (0,4857) size 769x18
    784784        RenderText {#text} at (0,0) size 365x18
    785785          text run at (0,0) width 365: "Font: Avenir-MediumOblique Weight: 400 Style: normal"
    786       RenderBlock {DIV} at (0,4864) size 769x18
     786      RenderBlock {DIV} at (0,4875) size 769x18
    787787        RenderText {#text} at (0,0) size 365x18
    788788          text run at (0,0) width 365: "Font: Avenir-MediumOblique Weight: 500 Style: normal"
    789       RenderBlock {DIV} at (0,4882) size 769x18
     789      RenderBlock {DIV} at (0,4893) size 769x18
    790790        RenderText {#text} at (0,0) size 388x18
    791791          text run at (0,0) width 388: "Font: Avenir-MediumOblique Weight: 600 Style: normal"
    792       RenderBlock {DIV} at (0,4900) size 769x18
     792      RenderBlock {DIV} at (0,4911) size 769x18
    793793        RenderText {#text} at (0,0) size 388x18
    794794          text run at (0,0) width 388: "Font: Avenir-MediumOblique Weight: 700 Style: normal"
    795       RenderBlock {DIV} at (0,4918) size 769x18
     795      RenderBlock {DIV} at (0,4929) size 769x18
    796796        RenderText {#text} at (0,0) size 388x18
    797797          text run at (0,0) width 388: "Font: Avenir-MediumOblique Weight: 800 Style: normal"
    798       RenderBlock {DIV} at (0,4936) size 769x18
     798      RenderBlock {DIV} at (0,4947) size 769x18
    799799        RenderText {#text} at (0,0) size 388x18
    800800          text run at (0,0) width 388: "Font: Avenir-MediumOblique Weight: 900 Style: normal"
    801       RenderBlock {DIV} at (0,4954) size 769x18
     801      RenderBlock {DIV} at (0,4965) size 769x18
    802802        RenderText {#text} at (0,0) size 348x18
    803803          text run at (0,0) width 348: "Font: Avenir-BlackOblique Weight: 100 Style: normal"
    804       RenderBlock {DIV} at (0,4972) size 769x18
     804      RenderBlock {DIV} at (0,4983) size 769x18
    805805        RenderText {#text} at (0,0) size 348x18
    806806          text run at (0,0) width 348: "Font: Avenir-BlackOblique Weight: 200 Style: normal"
    807       RenderBlock {DIV} at (0,4990) size 769x18
     807      RenderBlock {DIV} at (0,5001) size 769x18
    808808        RenderText {#text} at (0,0) size 348x18
    809809          text run at (0,0) width 348: "Font: Avenir-BlackOblique Weight: 300 Style: normal"
    810       RenderBlock {DIV} at (0,5008) size 769x18
     810      RenderBlock {DIV} at (0,5019) size 769x18
    811811        RenderText {#text} at (0,0) size 348x18
    812812          text run at (0,0) width 348: "Font: Avenir-BlackOblique Weight: 400 Style: normal"
    813       RenderBlock {DIV} at (0,5026) size 769x18
     813      RenderBlock {DIV} at (0,5037) size 769x18
    814814        RenderText {#text} at (0,0) size 348x18
    815815          text run at (0,0) width 348: "Font: Avenir-BlackOblique Weight: 500 Style: normal"
    816       RenderBlock {DIV} at (0,5044) size 769x18
     816      RenderBlock {DIV} at (0,5055) size 769x18
    817817        RenderText {#text} at (0,0) size 370x18
    818818          text run at (0,0) width 370: "Font: Avenir-BlackOblique Weight: 600 Style: normal"
    819       RenderBlock {DIV} at (0,5062) size 769x18
     819      RenderBlock {DIV} at (0,5073) size 769x18
    820820        RenderText {#text} at (0,0) size 370x18
    821821          text run at (0,0) width 370: "Font: Avenir-BlackOblique Weight: 700 Style: normal"
    822       RenderBlock {DIV} at (0,5080) size 769x18
     822      RenderBlock {DIV} at (0,5091) size 769x18
    823823        RenderText {#text} at (0,0) size 370x18
    824824          text run at (0,0) width 370: "Font: Avenir-BlackOblique Weight: 800 Style: normal"
    825       RenderBlock {DIV} at (0,5098) size 769x18
     825      RenderBlock {DIV} at (0,5109) size 769x18
    826826        RenderText {#text} at (0,0) size 370x18
    827827          text run at (0,0) width 370: "Font: Avenir-BlackOblique Weight: 900 Style: normal"
    828       RenderBlock {DIV} at (0,5116) size 769x18
     828      RenderBlock {DIV} at (0,5127) size 769x18
    829829        RenderText {#text} at (0,0) size 240x18
    830830          text run at (0,0) width 240: "Font: Avenir Weight: 100 Style: italic"
    831       RenderBlock {DIV} at (0,5134) size 769x18
     831      RenderBlock {DIV} at (0,5145) size 769x18
    832832        RenderText {#text} at (0,0) size 240x18
    833833          text run at (0,0) width 240: "Font: Avenir Weight: 200 Style: italic"
    834       RenderBlock {DIV} at (0,5152) size 769x18
     834      RenderBlock {DIV} at (0,5163) size 769x18
    835835        RenderText {#text} at (0,0) size 240x18
    836836          text run at (0,0) width 240: "Font: Avenir Weight: 300 Style: italic"
    837       RenderBlock {DIV} at (0,5170) size 769x18
     837      RenderBlock {DIV} at (0,5181) size 769x18
    838838        RenderText {#text} at (0,0) size 240x18
    839839          text run at (0,0) width 240: "Font: Avenir Weight: 400 Style: italic"
    840       RenderBlock {DIV} at (0,5188) size 769x18
     840      RenderBlock {DIV} at (0,5199) size 769x18
    841841        RenderText {#text} at (0,0) size 240x18
    842842          text run at (0,0) width 240: "Font: Avenir Weight: 500 Style: italic"
    843       RenderBlock {DIV} at (0,5206) size 769x18
     843      RenderBlock {DIV} at (0,5217) size 769x18
    844844        RenderText {#text} at (0,0) size 247x18
    845845          text run at (0,0) width 247: "Font: Avenir Weight: 600 Style: italic"
    846       RenderBlock {DIV} at (0,5224) size 769x18
     846      RenderBlock {DIV} at (0,5235) size 769x18
    847847        RenderText {#text} at (0,0) size 247x18
    848848          text run at (0,0) width 247: "Font: Avenir Weight: 700 Style: italic"
    849       RenderBlock {DIV} at (0,5242) size 769x18
     849      RenderBlock {DIV} at (0,5253) size 769x18
    850850        RenderText {#text} at (0,0) size 247x18
    851851          text run at (0,0) width 247: "Font: Avenir Weight: 800 Style: italic"
    852       RenderBlock {DIV} at (0,5260) size 769x18
     852      RenderBlock {DIV} at (0,5271) size 769x18
    853853        RenderText {#text} at (0,0) size 247x18
    854854          text run at (0,0) width 247: "Font: Avenir Weight: 900 Style: italic"
    855       RenderBlock {DIV} at (0,5278) size 769x18
     855      RenderBlock {DIV} at (0,5289) size 769x18
    856856        RenderText {#text} at (0,0) size 279x18
    857857          text run at (0,0) width 279: "Font: Avenir-Light Weight: 100 Style: italic"
    858       RenderBlock {DIV} at (0,5296) size 769x18
     858      RenderBlock {DIV} at (0,5307) size 769x18
    859859        RenderText {#text} at (0,0) size 279x18
    860860          text run at (0,0) width 279: "Font: Avenir-Light Weight: 200 Style: italic"
    861       RenderBlock {DIV} at (0,5314) size 769x18
     861      RenderBlock {DIV} at (0,5325) size 769x18
    862862        RenderText {#text} at (0,0) size 279x18
    863863          text run at (0,0) width 279: "Font: Avenir-Light Weight: 300 Style: italic"
    864       RenderBlock {DIV} at (0,5332) size 769x18
     864      RenderBlock {DIV} at (0,5343) size 769x18
    865865        RenderText {#text} at (0,0) size 279x18
    866866          text run at (0,0) width 279: "Font: Avenir-Light Weight: 400 Style: italic"
    867       RenderBlock {DIV} at (0,5350) size 769x18
     867      RenderBlock {DIV} at (0,5361) size 769x18
    868868        RenderText {#text} at (0,0) size 279x18
    869869          text run at (0,0) width 279: "Font: Avenir-Light Weight: 500 Style: italic"
    870       RenderBlock {DIV} at (0,5368) size 769x18
     870      RenderBlock {DIV} at (0,5379) size 769x18
    871871        RenderText {#text} at (0,0) size 287x18
    872872          text run at (0,0) width 287: "Font: Avenir-Light Weight: 600 Style: italic"
    873       RenderBlock {DIV} at (0,5386) size 769x18
     873      RenderBlock {DIV} at (0,5397) size 769x18
    874874        RenderText {#text} at (0,0) size 287x18
    875875          text run at (0,0) width 287: "Font: Avenir-Light Weight: 700 Style: italic"
    876       RenderBlock {DIV} at (0,5404) size 769x18
     876      RenderBlock {DIV} at (0,5415) size 769x18
    877877        RenderText {#text} at (0,0) size 287x18
    878878          text run at (0,0) width 287: "Font: Avenir-Light Weight: 800 Style: italic"
    879       RenderBlock {DIV} at (0,5422) size 769x18
     879      RenderBlock {DIV} at (0,5433) size 769x18
    880880        RenderText {#text} at (0,0) size 287x18
    881881          text run at (0,0) width 287: "Font: Avenir-Light Weight: 900 Style: italic"
    882       RenderBlock {DIV} at (0,5440) size 769x18
     882      RenderBlock {DIV} at (0,5451) size 769x18
    883883        RenderText {#text} at (0,0) size 278x18
    884884          text run at (0,0) width 278: "Font: Avenir-Book Weight: 100 Style: italic"
    885       RenderBlock {DIV} at (0,5458) size 769x18
     885      RenderBlock {DIV} at (0,5469) size 769x18
    886886        RenderText {#text} at (0,0) size 278x18
    887887          text run at (0,0) width 278: "Font: Avenir-Book Weight: 200 Style: italic"
    888       RenderBlock {DIV} at (0,5476) size 769x18
     888      RenderBlock {DIV} at (0,5487) size 769x18
    889889        RenderText {#text} at (0,0) size 278x18
    890890          text run at (0,0) width 278: "Font: Avenir-Book Weight: 300 Style: italic"
    891       RenderBlock {DIV} at (0,5494) size 769x18
     891      RenderBlock {DIV} at (0,5505) size 769x18
    892892        RenderText {#text} at (0,0) size 278x18
    893893          text run at (0,0) width 278: "Font: Avenir-Book Weight: 400 Style: italic"
    894       RenderBlock {DIV} at (0,5512) size 769x18
     894      RenderBlock {DIV} at (0,5523) size 769x18
    895895        RenderText {#text} at (0,0) size 278x18
    896896          text run at (0,0) width 278: "Font: Avenir-Book Weight: 500 Style: italic"
    897       RenderBlock {DIV} at (0,5530) size 769x18
     897      RenderBlock {DIV} at (0,5541) size 769x18
    898898        RenderText {#text} at (0,0) size 287x18
    899899          text run at (0,0) width 287: "Font: Avenir-Book Weight: 600 Style: italic"
    900       RenderBlock {DIV} at (0,5548) size 769x18
     900      RenderBlock {DIV} at (0,5559) size 769x18
    901901        RenderText {#text} at (0,0) size 287x18
    902902          text run at (0,0) width 287: "Font: Avenir-Book Weight: 700 Style: italic"
    903       RenderBlock {DIV} at (0,5566) size 769x18
     903      RenderBlock {DIV} at (0,5577) size 769x18
    904904        RenderText {#text} at (0,0) size 287x18
    905905          text run at (0,0) width 287: "Font: Avenir-Book Weight: 800 Style: italic"
    906       RenderBlock {DIV} at (0,5584) size 769x18
     906      RenderBlock {DIV} at (0,5595) size 769x18
    907907        RenderText {#text} at (0,0) size 287x18
    908908          text run at (0,0) width 287: "Font: Avenir-Book Weight: 900 Style: italic"
    909       RenderBlock {DIV} at (0,5602) size 769x18
     909      RenderBlock {DIV} at (0,5613) size 769x18
    910910        RenderText {#text} at (0,0) size 298x18
    911911          text run at (0,0) width 298: "Font: Avenir-Medium Weight: 100 Style: italic"
    912       RenderBlock {DIV} at (0,5620) size 769x18
     912      RenderBlock {DIV} at (0,5631) size 769x18
    913913        RenderText {#text} at (0,0) size 298x18
    914914          text run at (0,0) width 298: "Font: Avenir-Medium Weight: 200 Style: italic"
    915       RenderBlock {DIV} at (0,5638) size 769x18
     915      RenderBlock {DIV} at (0,5649) size 769x18
    916916        RenderText {#text} at (0,0) size 298x18
    917917          text run at (0,0) width 298: "Font: Avenir-Medium Weight: 300 Style: italic"
    918       RenderBlock {DIV} at (0,5656) size 769x18
     918      RenderBlock {DIV} at (0,5667) size 769x18
    919919        RenderText {#text} at (0,0) size 298x18
    920920          text run at (0,0) width 298: "Font: Avenir-Medium Weight: 400 Style: italic"
    921       RenderBlock {DIV} at (0,5674) size 769x18
     921      RenderBlock {DIV} at (0,5685) size 769x18
    922922        RenderText {#text} at (0,0) size 298x18
    923923          text run at (0,0) width 298: "Font: Avenir-Medium Weight: 500 Style: italic"
    924       RenderBlock {DIV} at (0,5692) size 769x18
     924      RenderBlock {DIV} at (0,5703) size 769x18
    925925        RenderText {#text} at (0,0) size 307x18
    926926          text run at (0,0) width 307: "Font: Avenir-Medium Weight: 600 Style: italic"
    927       RenderBlock {DIV} at (0,5710) size 769x18
     927      RenderBlock {DIV} at (0,5721) size 769x18
    928928        RenderText {#text} at (0,0) size 307x18
    929929          text run at (0,0) width 307: "Font: Avenir-Medium Weight: 700 Style: italic"
    930       RenderBlock {DIV} at (0,5728) size 769x18
     930      RenderBlock {DIV} at (0,5739) size 769x18
    931931        RenderText {#text} at (0,0) size 307x18
    932932          text run at (0,0) width 307: "Font: Avenir-Medium Weight: 800 Style: italic"
    933       RenderBlock {DIV} at (0,5746) size 769x18
     933      RenderBlock {DIV} at (0,5757) size 769x18
    934934        RenderText {#text} at (0,0) size 307x18
    935935          text run at (0,0) width 307: "Font: Avenir-Medium Weight: 900 Style: italic"
    936       RenderBlock {DIV} at (0,5764) size 769x18
     936      RenderBlock {DIV} at (0,5775) size 769x18
    937937        RenderText {#text} at (0,0) size 282x18
    938938          text run at (0,0) width 282: "Font: Avenir-Black Weight: 100 Style: italic"
    939       RenderBlock {DIV} at (0,5782) size 769x18
     939      RenderBlock {DIV} at (0,5793) size 769x18
    940940        RenderText {#text} at (0,0) size 282x18
    941941          text run at (0,0) width 282: "Font: Avenir-Black Weight: 200 Style: italic"
    942       RenderBlock {DIV} at (0,5800) size 769x18
     942      RenderBlock {DIV} at (0,5811) size 769x18
    943943        RenderText {#text} at (0,0) size 282x18
    944944          text run at (0,0) width 282: "Font: Avenir-Black Weight: 300 Style: italic"
    945       RenderBlock {DIV} at (0,5818) size 769x18
     945      RenderBlock {DIV} at (0,5829) size 769x18
    946946        RenderText {#text} at (0,0) size 282x18
    947947          text run at (0,0) width 282: "Font: Avenir-Black Weight: 400 Style: italic"
    948       RenderBlock {DIV} at (0,5836) size 769x18
     948      RenderBlock {DIV} at (0,5847) size 769x18
    949949        RenderText {#text} at (0,0) size 282x18
    950950          text run at (0,0) width 282: "Font: Avenir-Black Weight: 500 Style: italic"
    951       RenderBlock {DIV} at (0,5854) size 769x18
     951      RenderBlock {DIV} at (0,5865) size 769x18
    952952        RenderText {#text} at (0,0) size 290x18
    953953          text run at (0,0) width 290: "Font: Avenir-Black Weight: 600 Style: italic"
    954       RenderBlock {DIV} at (0,5872) size 769x18
     954      RenderBlock {DIV} at (0,5883) size 769x18
    955955        RenderText {#text} at (0,0) size 290x18
    956956          text run at (0,0) width 290: "Font: Avenir-Black Weight: 700 Style: italic"
    957       RenderBlock {DIV} at (0,5890) size 769x18
     957      RenderBlock {DIV} at (0,5901) size 769x18
    958958        RenderText {#text} at (0,0) size 290x18
    959959          text run at (0,0) width 290: "Font: Avenir-Black Weight: 800 Style: italic"
    960       RenderBlock {DIV} at (0,5908) size 769x18
     960      RenderBlock {DIV} at (0,5919) size 769x18
    961961        RenderText {#text} at (0,0) size 290x18
    962962          text run at (0,0) width 290: "Font: Avenir-Black Weight: 900 Style: italic"
    963       RenderBlock {DIV} at (0,5926) size 769x18
     963      RenderBlock {DIV} at (0,5937) size 769x18
    964964        RenderText {#text} at (0,0) size 286x18
    965965          text run at (0,0) width 286: "Font: Avenir-Heavy Weight: 100 Style: italic"
    966       RenderBlock {DIV} at (0,5944) size 769x18
     966      RenderBlock {DIV} at (0,5955) size 769x18
    967967        RenderText {#text} at (0,0) size 286x18
    968968          text run at (0,0) width 286: "Font: Avenir-Heavy Weight: 200 Style: italic"
    969       RenderBlock {DIV} at (0,5962) size 769x18
     969      RenderBlock {DIV} at (0,5973) size 769x18
    970970        RenderText {#text} at (0,0) size 286x18
    971971          text run at (0,0) width 286: "Font: Avenir-Heavy Weight: 300 Style: italic"
    972       RenderBlock {DIV} at (0,5980) size 769x18
     972      RenderBlock {DIV} at (0,5991) size 769x18
    973973        RenderText {#text} at (0,0) size 286x18
    974974          text run at (0,0) width 286: "Font: Avenir-Heavy Weight: 400 Style: italic"
    975       RenderBlock {DIV} at (0,5998) size 769x18
     975      RenderBlock {DIV} at (0,6009) size 769x18
    976976        RenderText {#text} at (0,0) size 286x18
    977977          text run at (0,0) width 286: "Font: Avenir-Heavy Weight: 500 Style: italic"
    978       RenderBlock {DIV} at (0,6016) size 769x18
     978      RenderBlock {DIV} at (0,6027) size 769x18
    979979        RenderText {#text} at (0,0) size 294x18
    980980          text run at (0,0) width 294: "Font: Avenir-Heavy Weight: 600 Style: italic"
    981       RenderBlock {DIV} at (0,6034) size 769x18
     981      RenderBlock {DIV} at (0,6045) size 769x18
    982982        RenderText {#text} at (0,0) size 294x18
    983983          text run at (0,0) width 294: "Font: Avenir-Heavy Weight: 700 Style: italic"
    984       RenderBlock {DIV} at (0,6052) size 769x18
     984      RenderBlock {DIV} at (0,6063) size 769x18
    985985        RenderText {#text} at (0,0) size 294x18
    986986          text run at (0,0) width 294: "Font: Avenir-Heavy Weight: 800 Style: italic"
    987       RenderBlock {DIV} at (0,6070) size 769x18
     987      RenderBlock {DIV} at (0,6081) size 769x18
    988988        RenderText {#text} at (0,0) size 294x18
    989989          text run at (0,0) width 294: "Font: Avenir-Heavy Weight: 900 Style: italic"
    990       RenderBlock {DIV} at (0,6088) size 769x18
     990      RenderBlock {DIV} at (0,6099) size 769x18
    991991        RenderText {#text} at (0,0) size 331x18
    992992          text run at (0,0) width 331: "Font: Avenir-LightOblique Weight: 100 Style: italic"
    993       RenderBlock {DIV} at (0,6106) size 769x18
     993      RenderBlock {DIV} at (0,6117) size 769x18
    994994        RenderText {#text} at (0,0) size 331x18
    995995          text run at (0,0) width 331: "Font: Avenir-LightOblique Weight: 200 Style: italic"
    996       RenderBlock {DIV} at (0,6124) size 769x18
     996      RenderBlock {DIV} at (0,6135) size 769x18
    997997        RenderText {#text} at (0,0) size 331x18
    998998          text run at (0,0) width 331: "Font: Avenir-LightOblique Weight: 300 Style: italic"
    999       RenderBlock {DIV} at (0,6142) size 769x18
     999      RenderBlock {DIV} at (0,6153) size 769x18
    10001000        RenderText {#text} at (0,0) size 331x18
    10011001          text run at (0,0) width 331: "Font: Avenir-LightOblique Weight: 400 Style: italic"
    1002       RenderBlock {DIV} at (0,6160) size 769x18
     1002      RenderBlock {DIV} at (0,6171) size 769x18
    10031003        RenderText {#text} at (0,0) size 331x18
    10041004          text run at (0,0) width 331: "Font: Avenir-LightOblique Weight: 500 Style: italic"
    1005       RenderBlock {DIV} at (0,6178) size 769x18
     1005      RenderBlock {DIV} at (0,6189) size 769x18
    10061006        RenderText {#text} at (0,0) size 340x18
    10071007          text run at (0,0) width 340: "Font: Avenir-LightOblique Weight: 600 Style: italic"
    1008       RenderBlock {DIV} at (0,6196) size 769x18
     1008      RenderBlock {DIV} at (0,6207) size 769x18
    10091009        RenderText {#text} at (0,0) size 340x18
    10101010          text run at (0,0) width 340: "Font: Avenir-LightOblique Weight: 700 Style: italic"
    1011       RenderBlock {DIV} at (0,6214) size 769x18
     1011      RenderBlock {DIV} at (0,6225) size 769x18
    10121012        RenderText {#text} at (0,0) size 340x18
    10131013          text run at (0,0) width 340: "Font: Avenir-LightOblique Weight: 800 Style: italic"
    1014       RenderBlock {DIV} at (0,6232) size 769x18
     1014      RenderBlock {DIV} at (0,6243) size 769x18
    10151015        RenderText {#text} at (0,0) size 340x18
    10161016          text run at (0,0) width 340: "Font: Avenir-LightOblique Weight: 900 Style: italic"
    1017       RenderBlock {DIV} at (0,6250) size 769x18
     1017      RenderBlock {DIV} at (0,6261) size 769x18
    10181018        RenderText {#text} at (0,0) size 330x18
    10191019          text run at (0,0) width 330: "Font: Avenir-BookOblique Weight: 100 Style: italic"
    1020       RenderBlock {DIV} at (0,6268) size 769x18
     1020      RenderBlock {DIV} at (0,6279) size 769x18
    10211021        RenderText {#text} at (0,0) size 330x18
    10221022          text run at (0,0) width 330: "Font: Avenir-BookOblique Weight: 200 Style: italic"
    1023       RenderBlock {DIV} at (0,6286) size 769x18
     1023      RenderBlock {DIV} at (0,6297) size 769x18
    10241024        RenderText {#text} at (0,0) size 330x18
    10251025          text run at (0,0) width 330: "Font: Avenir-BookOblique Weight: 300 Style: italic"
    1026       RenderBlock {DIV} at (0,6304) size 769x18
     1026      RenderBlock {DIV} at (0,6315) size 769x18
    10271027        RenderText {#text} at (0,0) size 330x18
    10281028          text run at (0,0) width 330: "Font: Avenir-BookOblique Weight: 400 Style: italic"
    1029       RenderBlock {DIV} at (0,6322) size 769x18
     1029      RenderBlock {DIV} at (0,6333) size 769x18
    10301030        RenderText {#text} at (0,0) size 330x18
    10311031          text run at (0,0) width 330: "Font: Avenir-BookOblique Weight: 500 Style: italic"
    1032       RenderBlock {DIV} at (0,6340) size 769x18
     1032      RenderBlock {DIV} at (0,6351) size 769x18
    10331033        RenderText {#text} at (0,0) size 339x18
    10341034          text run at (0,0) width 339: "Font: Avenir-BookOblique Weight: 600 Style: italic"
    1035       RenderBlock {DIV} at (0,6358) size 769x18
     1035      RenderBlock {DIV} at (0,6369) size 769x18
    10361036        RenderText {#text} at (0,0) size 339x18
    10371037          text run at (0,0) width 339: "Font: Avenir-BookOblique Weight: 700 Style: italic"
    1038       RenderBlock {DIV} at (0,6376) size 769x18
     1038      RenderBlock {DIV} at (0,6387) size 769x18
    10391039        RenderText {#text} at (0,0) size 339x18
    10401040          text run at (0,0) width 339: "Font: Avenir-BookOblique Weight: 800 Style: italic"
    1041       RenderBlock {DIV} at (0,6394) size 769x18
     1041      RenderBlock {DIV} at (0,6405) size 769x18
    10421042        RenderText {#text} at (0,0) size 339x18
    10431043          text run at (0,0) width 339: "Font: Avenir-BookOblique Weight: 900 Style: italic"
    1044       RenderBlock {DIV} at (0,6412) size 769x18
     1044      RenderBlock {DIV} at (0,6423) size 769x18
    10451045        RenderText {#text} at (0,0) size 349x18
    10461046          text run at (0,0) width 349: "Font: Avenir-MediumOblique Weight: 100 Style: italic"
    1047       RenderBlock {DIV} at (0,6430) size 769x18
     1047      RenderBlock {DIV} at (0,6441) size 769x18
    10481048        RenderText {#text} at (0,0) size 349x18
    10491049          text run at (0,0) width 349: "Font: Avenir-MediumOblique Weight: 200 Style: italic"
    1050       RenderBlock {DIV} at (0,6448) size 769x18
     1050      RenderBlock {DIV} at (0,6459) size 769x18
    10511051        RenderText {#text} at (0,0) size 349x18
    10521052          text run at (0,0) width 349: "Font: Avenir-MediumOblique Weight: 300 Style: italic"
    1053       RenderBlock {DIV} at (0,6466) size 769x18
     1053      RenderBlock {DIV} at (0,6477) size 769x18
    10541054        RenderText {#text} at (0,0) size 349x18
    10551055          text run at (0,0) width 349: "Font: Avenir-MediumOblique Weight: 400 Style: italic"
    1056       RenderBlock {DIV} at (0,6484) size 769x18
     1056      RenderBlock {DIV} at (0,6495) size 769x18
    10571057        RenderText {#text} at (0,0) size 349x18
    10581058          text run at (0,0) width 349: "Font: Avenir-MediumOblique Weight: 500 Style: italic"
    1059       RenderBlock {DIV} at (0,6502) size 769x18
     1059      RenderBlock {DIV} at (0,6513) size 769x18
    10601060        RenderText {#text} at (0,0) size 359x18
    10611061          text run at (0,0) width 359: "Font: Avenir-MediumOblique Weight: 600 Style: italic"
    1062       RenderBlock {DIV} at (0,6520) size 769x18
     1062      RenderBlock {DIV} at (0,6531) size 769x18
    10631063        RenderText {#text} at (0,0) size 359x18
    10641064          text run at (0,0) width 359: "Font: Avenir-MediumOblique Weight: 700 Style: italic"
    1065       RenderBlock {DIV} at (0,6538) size 769x18
     1065      RenderBlock {DIV} at (0,6549) size 769x18
    10661066        RenderText {#text} at (0,0) size 359x18
    10671067          text run at (0,0) width 359: "Font: Avenir-MediumOblique Weight: 800 Style: italic"
    1068       RenderBlock {DIV} at (0,6556) size 769x18
     1068      RenderBlock {DIV} at (0,6567) size 769x18
    10691069        RenderText {#text} at (0,0) size 359x18
    10701070          text run at (0,0) width 359: "Font: Avenir-MediumOblique Weight: 900 Style: italic"
    1071       RenderBlock {DIV} at (0,6574) size 769x18
     1071      RenderBlock {DIV} at (0,6585) size 769x18
    10721072        RenderText {#text} at (0,0) size 333x18
    10731073          text run at (0,0) width 333: "Font: Avenir-BlackOblique Weight: 100 Style: italic"
    1074       RenderBlock {DIV} at (0,6592) size 769x18
     1074      RenderBlock {DIV} at (0,6603) size 769x18
    10751075        RenderText {#text} at (0,0) size 333x18
    10761076          text run at (0,0) width 333: "Font: Avenir-BlackOblique Weight: 200 Style: italic"
    1077       RenderBlock {DIV} at (0,6610) size 769x18
     1077      RenderBlock {DIV} at (0,6621) size 769x18
    10781078        RenderText {#text} at (0,0) size 333x18
    10791079          text run at (0,0) width 333: "Font: Avenir-BlackOblique Weight: 300 Style: italic"
    1080       RenderBlock {DIV} at (0,6628) size 769x18
     1080      RenderBlock {DIV} at (0,6639) size 769x18
    10811081        RenderText {#text} at (0,0) size 333x18
    10821082          text run at (0,0) width 333: "Font: Avenir-BlackOblique Weight: 400 Style: italic"
    1083       RenderBlock {DIV} at (0,6646) size 769x18
     1083      RenderBlock {DIV} at (0,6657) size 769x18
    10841084        RenderText {#text} at (0,0) size 333x18
    10851085          text run at (0,0) width 333: "Font: Avenir-BlackOblique Weight: 500 Style: italic"
    1086       RenderBlock {DIV} at (0,6664) size 769x18
     1086      RenderBlock {DIV} at (0,6675) size 769x18
    10871087        RenderText {#text} at (0,0) size 343x18
    10881088          text run at (0,0) width 343: "Font: Avenir-BlackOblique Weight: 600 Style: italic"
    1089       RenderBlock {DIV} at (0,6682) size 769x18
     1089      RenderBlock {DIV} at (0,6693) size 769x18
    10901090        RenderText {#text} at (0,0) size 343x18
    10911091          text run at (0,0) width 343: "Font: Avenir-BlackOblique Weight: 700 Style: italic"
    1092       RenderBlock {DIV} at (0,6700) size 769x18
     1092      RenderBlock {DIV} at (0,6711) size 769x18
    10931093        RenderText {#text} at (0,0) size 343x18
    10941094          text run at (0,0) width 343: "Font: Avenir-BlackOblique Weight: 800 Style: italic"
    1095       RenderBlock {DIV} at (0,6718) size 769x18
     1095      RenderBlock {DIV} at (0,6729) size 769x18
    10961096        RenderText {#text} at (0,0) size 343x18
    10971097          text run at (0,0) width 343: "Font: Avenir-BlackOblique Weight: 900 Style: italic"
  • trunk/LayoutTests/platform/mac/fast/text/font-weights-zh-expected.txt

    r187443 r213163  
    6868          text run at (0,0) width 267: "Font: Heiti SC Weight: 900 Style: normal"
    6969      RenderBlock {DIV} at (0,434) size 769x16
    70         RenderText {#text} at (0,0) size 153x16
    71           text run at (0,0) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}"
     70        RenderText {#text} at (0,0) size 144x16
     71          text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}"
    7272      RenderBlock {DIV} at (0,450) size 769x18
    7373        RenderText {#text} at (0,0) size 321x18
     
    122122          text run at (0,0) width 321: "Font: STHeitiSC-Light Weight: 900 Style: normal"
    123123      RenderBlock {DIV} at (0,740) size 769x16
    124         RenderText {#text} at (0,0) size 153x16
    125           text run at (0,0) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}"
     124        RenderText {#text} at (0,0) size 144x16
     125          text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}"
    126126      RenderBlock {DIV} at (0,756) size 769x18
    127127        RenderText {#text} at (0,0) size 341x18
  • trunk/Source/WebCore/ChangeLog

    r213161 r213163  
     12017-02-28  Myles C. Maxfield  <mmaxfield@apple.com>
     2
     3        [macOS] Migrate off of CTFontCreateForCSS
     4        https://bugs.webkit.org/show_bug.cgi?id=168678
     5
     6        Reviewed by David Hyatt.
     7
     8        This patch implements the Font Matching Algorithm detailed in
     9        https://drafts.csswg.org/css-fonts-4/#font-matching-algorithm
     10        Previously, this was implemented inside Core Text (via
     11        CTFontCreateForCSS()), but that implementation does not understand
     12        variation fonts. Therefore it should move to WebKit (along with
     13        the general fact that CSS algorithms should be implemented in a
     14        CSS engine, not the platform's text engine).
     15
     16        This implementation is not completely divorced from the platform,
     17        however - Core Text exposes font weights on a [-1, 1] range, but
     18        CSS operates on a [1, 999] range. In order to provide the mapping
     19        to CSS weights, Core Text infrastructure is necessary. Therefore,
     20        this new implementation of the matching algorithm is only used
     21        on certain operating systems.
     22
     23        The new implementation of the algorithm is not bug-compatible with
     24        the existing implementation; this patch does represent a behavior
     25        change. However, I have reviewed the differences manually and
     26        believe this algorithm to be a progression over the previous one
     27        (except for one case with Helvetica Neue - see
     28        LayoutTests/ChangeLog for more information about that).
     29
     30        This patch also represents a 27% performance progression on our
     31        standard page load test (just measuring the performance of the font
     32        matching algorithm, and nothing else). (Because font matching is
     33        only a small part of the entire test, the overall progression is
     34        much smaller.)
     35
     36        Tests: FontCacheTest.FontLookupFromFamilyName
     37               FontCacheTest.FontLookupFromPostScriptName
     38
     39        * platform/graphics/FontCache.h:
     40        (WebCore::FontCache::createFontPlatformDataForTesting): Allow for
     41        unit testing.
     42        * platform/graphics/cocoa/FontCacheCoreText.cpp:
     43        (WebCore::isSystemFont): Inlined.
     44        (WebCore::FontDatabase::singleton): Cache results of Core Text
     45        lookups.
     46        (WebCore::FontDatabase::Range::Range): Because of variation fonts,
     47        fonts' weights, widths, and slopes need to be represented as a range
     48        instead of an individual value.
     49        (WebCore::FontDatabase::Range::isValid):
     50        (WebCore::FontDatabase::Range::expand):
     51        (WebCore::FontDatabase::Range::includes):
     52        (WebCore::FontDatabase::InstalledFont::InstalledFont): Represents a
     53        Font Descriptor as well as some lookup information about it.
     54        (WebCore::FontDatabase::InstalledFontCollection::InstalledFontCollection):
     55        A collection of installed fonts.
     56        (WebCore::FontDatabase::InstalledFontCollection::insertInstalledFont):
     57        Cache minima and maxima.
     58        (WebCore::FontDatabase::InstalledFontCollection::isEmpty):
     59        (WebCore::FontDatabase::InstalledFontCollection::size):
     60        (WebCore::FontDatabase::lookupFamilyName): Get all the fonts in
     61        the family.
     62        (WebCore::FontDatabase::lookupPostScriptName): Get the font with
     63        the given PostScript name.
     64        (WebCore::FontDatabase::clear):
     65        (WebCore::FontDatabase::FontDatabase): Cache.
     66        (WebCore::iterateActiveFontsWithReturn): The Font Matching Algorithm
     67        works by starting with every font in the family, and the eliminating
     68        items from the set iteratively. Instead of actually removing items
     69        from a vector or linked list, we instead want to treat the collection
     70        as immutable and keep a parallel side-table of which items have been
     71        eliminated (in order to reduce copies and allocations). This makes
     72        sense because most families only have a handful of fonts in them.
     73        This function consults with the side-table to iterate only over the
     74        fonts which have not been eliminated.
     75        (WebCore::iterateActiveFonts): Ditto.
     76        (WebCore::findClosestStretch):
     77        (WebCore::filterStretch): Eliminate fonts based on their stretch
     78        value.
     79        (WebCore::findClosestStyle):
     80        (WebCore::filterStyle): Eliminate fonts based on their style value.
     81        (WebCore::findClosestWeight):
     82        (WebCore::filterWeight): Eliminate fonts based on their weight value.
     83        (WebCore::computeTargetWeight):
     84        (WebCore::findClosestFont): If we have a set of fonts in a family,
     85        select the font in the set which best matches the criteria.
     86        (WebCore::platformFontLookupWithFamily): While findClosestFont()
     87        function satisfies the spec's notion of the font matching algorithm,
     88        WebKit actually claims to be able to look up fonts by their PostScript
     89        name. Therefore, this function has a higher-level of logic to rectify
     90        the confusion that results when the PostScript name doesn't agree with
     91        the other CSS properties (like if you say "Helvetica-Bold" but also say
     92        font-weight: 100).
     93        * platform/spi/cocoa/CoreTextSPI.h: Add signature for system CSS
     94        font weight support.
     95
    1962017-02-24  Matt Rajca  <mrajca@apple.com>
    297
  • trunk/Source/WebCore/platform/graphics/FontCache.h

    r212513 r213163  
    3131
    3232#include "FontDescription.h"
     33#include "FontPlatformData.h"
    3334#include "Timer.h"
    3435#include <array>
     
    226227#endif
    227228
     229    std::unique_ptr<FontPlatformData> createFontPlatformDataForTesting(const FontDescription&, const AtomicString& family);
     230
    228231private:
    229232    FontCache();
     
    239242    FontPlatformData* getCustomFallbackFont(const UInt32, const FontDescription&);
    240243#endif
    241     std::unique_ptr<FontPlatformData> createFontPlatformData(const FontDescription&, const AtomicString& family, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings);
     244    WEBCORE_EXPORT std::unique_ptr<FontPlatformData> createFontPlatformData(const FontDescription&, const AtomicString& family, const FontFeatureSettings* fontFaceFeatures, const FontVariantSettings* fontFaceVariantSettings);
    242245   
    243246    static const AtomicString& alternateFamilyName(const AtomicString&);
     
    251254    friend class Font;
    252255};
     256
     257inline std::unique_ptr<FontPlatformData> FontCache::createFontPlatformDataForTesting(const FontDescription& fontDescription, const AtomicString& family)
     258{
     259    return createFontPlatformData(fontDescription, family, nullptr, nullptr);
     260}
    253261
    254262#if PLATFORM(COCOA)
     
    274282uint16_t toCoreTextFontWeight(FontWeight);
    275283bool isFontWeightBold(FontWeight);
    276 void platformInvalidateFontCache();
    277284SynthesisPair computeNecessarySynthesis(CTFontRef, const FontDescription&, bool isPlatformFont = false);
    278285RetainPtr<CTFontRef> platformFontWithFamilySpecialCase(const AtomicString& family, FontWeight, CTFontSymbolicTraits, float size);
  • trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp

    r212876 r213163  
    3535#include <wtf/MainThread.h>
    3636#include <wtf/NeverDestroyed.h>
     37
     38#define SHOULD_USE_CORE_TEXT_FONT_LOOKUP ((PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101200) || PLATFORM(IOS))
    3739
    3840namespace WebCore {
     
    693695}
    694696
    695 static void invalidateFontCache()
    696 {
    697     if (!isMainThread()) {
    698         callOnMainThread([] {
    699             invalidateFontCache();
    700         });
    701         return;
    702     }
    703 
    704     FontCache::singleton().invalidate();
    705 
    706     platformInvalidateFontCache();
    707 }
     697static void invalidateFontCache();
    708698
    709699static void fontCacheRegisteredFontsChangedNotificationCallback(CFNotificationCenterRef, void* observer, CFStringRef name, const void *, CFDictionaryRef)
     
    792782}
    793783
    794 static bool isSystemFont(const AtomicString& family)
    795 {
    796     return family.length() >= 1 && family[0] == '.';
    797 }
     784static inline bool isSystemFont(const AtomicString& family)
     785{
     786    // AtomicString's operator[] handles out-of-bounds by returning 0.
     787    return family[0] == '.';
     788}
     789
     790#if !SHOULD_USE_CORE_TEXT_FONT_LOOKUP
     791
     792constexpr float italicThreshold = 20;
     793constexpr float weightThreshold = 500;
     794
     795class FontDatabase {
     796public:
     797    static FontDatabase& singleton()
     798    {
     799        static NeverDestroyed<FontDatabase> database;
     800        return database;
     801    }
     802
     803    FontDatabase(const FontDatabase&) = delete;
     804    FontDatabase& operator=(const FontDatabase&) = delete;
     805
     806    // [Inclusive, Inclusive]
     807    struct Range {
     808        Range()
     809        {
     810            ASSERT(!isValid());
     811        }
     812
     813        Range(float minimum, float maximum)
     814            : minimum(minimum)
     815            , maximum(maximum)
     816        {
     817            ASSERT(isValid());
     818        }
     819
     820        bool isValid() const
     821        {
     822            return minimum <= maximum;
     823        }
     824
     825        void expand(const Range& other)
     826        {
     827            ASSERT(other.isValid());
     828            if (!isValid())
     829                *this = other;
     830            else {
     831                minimum = std::min(minimum, other.minimum);
     832                maximum = std::max(maximum, other.maximum);
     833            }
     834            ASSERT(isValid());
     835        }
     836
     837        bool includes(float target) const
     838        {
     839            return target >= minimum && target <= maximum;
     840        }
     841
     842        float minimum { 1 };
     843        float maximum { 0 };
     844    };
     845
     846    struct InstalledFont {
     847        InstalledFont() = default;
     848
     849        InstalledFont(CTFontDescriptorRef fontDescriptor)
     850            : fontDescriptor(fontDescriptor)
     851        {
     852            if (!fontDescriptor)
     853                return;
     854
     855            auto traits = adoptCF(static_cast<CFDictionaryRef>(CTFontDescriptorCopyAttribute(fontDescriptor, kCTFontTraitsAttribute)));
     856            float width = 0;
     857            float slant = 0;
     858            float weight = 0;
     859            if (traits) {
     860                auto widthNumber = static_cast<CFNumberRef>(CFDictionaryGetValue(traits.get(), kCTFontWidthTrait));
     861                if (widthNumber) {
     862                    // FIXME: Normalize this from Core Text's [-1, 1] range to CSS's [50%, 200%] range.
     863                    auto success = CFNumberGetValue(widthNumber, kCFNumberFloatType, &width);
     864                    ASSERT_UNUSED(success, success);
     865                }
     866
     867                auto symbolicTraitsNumber = static_cast<CFNumberRef>(CFDictionaryGetValue(traits.get(), kCTFontSymbolicTrait));
     868                if (symbolicTraitsNumber) {
     869                    int32_t symbolicTraits;
     870                    auto success = CFNumberGetValue(symbolicTraitsNumber, kCFNumberSInt32Type, &symbolicTraits);
     871                    ASSERT_UNUSED(success, success);
     872                    slant = symbolicTraits & kCTFontTraitItalic ? italicThreshold : 0;
     873                }
     874            }
     875
     876            auto weightNumber = adoptCF(static_cast<CFNumberRef>(CTFontDescriptorCopyAttribute(fontDescriptor, kCTFontCSSWeightAttribute)));
     877            if (weightNumber) {
     878                auto success = CFNumberGetValue(weightNumber.get(), kCFNumberFloatType, &weight);
     879                ASSERT_UNUSED(success, success);
     880            }
     881           
     882            stretch = Range(width, width);
     883            style = Range(slant, slant);
     884            this->weight = Range(weight, weight);
     885        }
     886
     887        RetainPtr<CTFontDescriptorRef> fontDescriptor;
     888        Range stretch;
     889        Range style;
     890        Range weight;
     891    };
     892
     893    struct InstalledFontFamily {
     894        InstalledFontFamily() = default;
     895
     896        explicit InstalledFontFamily(Vector<InstalledFont>&& installedFonts)
     897            : installedFonts(WTFMove(installedFonts))
     898        {
     899            for (auto& font : this->installedFonts)
     900                expand(font);
     901        }
     902
     903        void expand(const InstalledFont& installedFont)
     904        {
     905            stretchBounds.expand(installedFont.stretch);
     906            styleBounds.expand(installedFont.style);
     907            weightBounds.expand(installedFont.weight);
     908        }
     909
     910        bool isEmpty() const
     911        {
     912            return installedFonts.isEmpty();
     913        }
     914
     915        size_t size() const
     916        {
     917            return installedFonts.size();
     918        }
     919
     920        Vector<InstalledFont> installedFonts;
     921        Range stretchBounds;
     922        Range styleBounds;
     923        Range weightBounds;
     924    };
     925
     926    const InstalledFontFamily& lookUpFamilyName(const String& familyName)
     927    {
     928        auto folded = familyName.foldCase();
     929        return m_familyNameToFontDescriptors.ensure(folded, [&] {
     930            auto familyNameString = folded.createCFString();
     931            CFTypeRef keys[] = { kCTFontFamilyNameAttribute };
     932            CFTypeRef values[] = { familyNameString.get() };
     933            auto attributes = adoptCF(CFDictionaryCreate(kCFAllocatorDefault, keys, values, WTF_ARRAY_LENGTH(keys), &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
     934            auto fontDescriptorToMatch = adoptCF(CTFontDescriptorCreateWithAttributes(attributes.get()));
     935            if (auto matches = adoptCF(CTFontDescriptorCreateMatchingFontDescriptors(fontDescriptorToMatch.get(), nullptr))) {
     936                auto count = CFArrayGetCount(matches.get());
     937                Vector<InstalledFont> result;
     938                result.reserveInitialCapacity(count);
     939                for (CFIndex i = 0; i < count; ++i) {
     940                    InstalledFont installedFont(static_cast<CTFontDescriptorRef>(CFArrayGetValueAtIndex(matches.get(), i)));
     941                    result.uncheckedAppend(WTFMove(installedFont));
     942                }
     943                return InstalledFontFamily(WTFMove(result));
     944            }
     945            return InstalledFontFamily();
     946        }).iterator->value;
     947    }
     948
     949    const InstalledFont& lookupPostScriptName(const AtomicString& postScriptName)
     950    {
     951        auto folded = postScriptName.string().foldCase();
     952        return m_postScriptNameToFontDescriptors.ensure(folded, [&] {
     953            auto postScriptNameString = folded.createCFString();
     954            CFTypeRef keys[] = { kCTFontNameAttribute };
     955            CFTypeRef values[] = { postScriptNameString.get() };
     956            auto attributes = adoptCF(CFDictionaryCreate(kCFAllocatorDefault, keys, values, WTF_ARRAY_LENGTH(keys), &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
     957            auto fontDescriptorToMatch = adoptCF(CTFontDescriptorCreateWithAttributes(attributes.get()));
     958            auto match = adoptCF(static_cast<CTFontDescriptorRef>(CTFontDescriptorCreateMatchingFontDescriptor(fontDescriptorToMatch.get(), nullptr)));
     959            return InstalledFont(match.get());
     960        }).iterator->value;
     961    }
     962
     963    void clear()
     964    {
     965        m_familyNameToFontDescriptors.clear();
     966        m_postScriptNameToFontDescriptors.clear();
     967    }
     968
     969private:
     970    friend class NeverDestroyed<FontDatabase>;
     971
     972    FontDatabase() = default;
     973
     974    HashMap<String, InstalledFontFamily> m_familyNameToFontDescriptors;
     975    HashMap<String, InstalledFont> m_postScriptNameToFontDescriptors;
     976};
     977
     978template <typename T>
     979using IterateActiveFontsWithReturnCallback = std::function<std::optional<T>(const FontDatabase::InstalledFont&, size_t)>;
     980
     981template <typename T>
     982inline std::optional<T> iterateActiveFontsWithReturn(const FontDatabase::InstalledFontFamily& installedFonts, const Vector<bool>& filter, IterateActiveFontsWithReturnCallback<T> callback)
     983{
     984    ASSERT(installedFonts.size() == filter.size());
     985    for (size_t i = 0; i < installedFonts.size(); ++i) {
     986        if (!filter[i])
     987            continue;
     988        if (auto result = callback(installedFonts.installedFonts[i], i))
     989            return result;
     990    }
     991    return std::nullopt;
     992}
     993
     994template <typename T>
     995inline void iterateActiveFonts(const FontDatabase::InstalledFontFamily& installedFonts, const Vector<bool>& filter, T callback)
     996{
     997    iterateActiveFontsWithReturn<int>(installedFonts, filter, [&](const FontDatabase::InstalledFont& font, size_t i) -> std::optional<int> {
     998        callback(font, i);
     999        return std::nullopt;
     1000    });
     1001}
     1002
     1003static inline std::optional<float> findClosestStretch(float, const FontDatabase::InstalledFontFamily&, const Vector<bool>&)
     1004{
     1005    // FIXME: Implement this.
     1006    return 0;
     1007}
     1008
     1009static inline void filterStretch(float, const FontDatabase::InstalledFontFamily&, Vector<bool>&)
     1010{
     1011    // FIXME: Implement this.
     1012}
     1013
     1014static inline std::optional<float> findClosestStyle(float targetStyle, const FontDatabase::InstalledFontFamily& installedFonts, const Vector<bool>& filter)
     1015{
     1016    std::function<float(const FontDatabase::InstalledFont&)> computeScore;
     1017
     1018    if (targetStyle >= italicThreshold) {
     1019        float threshold = std::max(targetStyle, installedFonts.styleBounds.maximum);
     1020        computeScore = [&, threshold](const FontDatabase::InstalledFont& font) -> float {
     1021            ASSERT(font.style.isValid());
     1022            if (font.style.includes(targetStyle))
     1023                return 0;
     1024            ASSERT(font.style.minimum > targetStyle || font.style.maximum < targetStyle);
     1025            if (font.style.minimum > targetStyle)
     1026                return font.style.minimum - targetStyle;
     1027            ASSERT(targetStyle > font.style.maximum);
     1028            return threshold - font.style.maximum;
     1029        };
     1030    } else if (targetStyle >= 0) {
     1031        float threshold = std::max(targetStyle, installedFonts.styleBounds.maximum);
     1032        computeScore = [&, threshold](const FontDatabase::InstalledFont& font) -> float {
     1033            ASSERT(font.style.isValid());
     1034            if (font.style.includes(targetStyle))
     1035                return 0;
     1036            ASSERT(font.style.minimum > targetStyle || font.style.maximum < targetStyle);
     1037            if (font.style.maximum >= 0 && font.style.maximum < targetStyle)
     1038                return targetStyle - font.style.maximum;
     1039            if (font.style.minimum > targetStyle)
     1040                return font.style.minimum;
     1041            ASSERT(font.style.maximum < 0);
     1042            return threshold - font.style.maximum;
     1043        };
     1044    } else if (targetStyle > -italicThreshold) {
     1045        float threshold = std::min(targetStyle, installedFonts.styleBounds.minimum);
     1046        computeScore = [&, threshold](const FontDatabase::InstalledFont& font) -> float {
     1047            ASSERT(font.style.isValid());
     1048            if (font.style.includes(targetStyle))
     1049                return 0;
     1050            ASSERT(font.style.minimum > targetStyle || font.style.maximum < targetStyle);
     1051            if (font.style.minimum > targetStyle && font.style.minimum <= 0)
     1052                return font.style.minimum - targetStyle;
     1053            if (font.style.maximum < targetStyle)
     1054                return -font.style.maximum;
     1055            ASSERT(font.style.minimum > 0);
     1056            return font.style.minimum - threshold;
     1057        };
     1058    } else {
     1059        ASSERT(targetStyle <= -italicThreshold);
     1060        float threshold = std::min(targetStyle, installedFonts.styleBounds.minimum);
     1061        computeScore = [&, threshold](const FontDatabase::InstalledFont& font) -> float {
     1062            ASSERT(font.style.isValid());
     1063            if (font.style.includes(targetStyle))
     1064                return 0;
     1065            ASSERT(font.style.minimum > targetStyle || font.style.maximum < targetStyle);
     1066            if (font.style.maximum < targetStyle)
     1067                return targetStyle - font.style.maximum;
     1068            ASSERT(font.style.minimum > targetStyle);
     1069            return font.style.minimum - threshold;
     1070        };
     1071    }
     1072
     1073    size_t closestIndex = 0;
     1074    std::optional<float> minimumScore;
     1075    iterateActiveFonts(installedFonts, filter, [&](auto& installedFont, size_t i) {
     1076        auto score = computeScore(installedFont);
     1077        if (!minimumScore || score < minimumScore.value()) {
     1078            minimumScore = score;
     1079            closestIndex = i;
     1080        }
     1081    });
     1082
     1083    if (!minimumScore)
     1084        return { };
     1085    auto& winner = installedFonts.installedFonts[closestIndex];
     1086    if (winner.style.includes(targetStyle))
     1087        return targetStyle;
     1088    if (winner.style.minimum > targetStyle)
     1089        return winner.style.minimum;
     1090    ASSERT(winner.style.maximum < targetStyle);
     1091    return winner.style.maximum;
     1092}
     1093
     1094static inline void filterStyle(float target, const FontDatabase::InstalledFontFamily& installedFonts, Vector<bool>& filter)
     1095{
     1096    iterateActiveFonts(installedFonts, filter, [&](auto& installedFont, size_t i) {
     1097        if (!installedFont.style.includes(target))
     1098            filter[i] = false;
     1099    });
     1100}
     1101
     1102static inline std::optional<float> findClosestWeight(float targetWeight, const FontDatabase::InstalledFontFamily& installedFonts, const Vector<bool>& filter)
     1103{
     1104    {
     1105        IterateActiveFontsWithReturnCallback<float> searchFor400 = [&](const FontDatabase::InstalledFont& font, size_t) -> std::optional<float> {
     1106            if (font.weight.includes(400))
     1107                return 400;
     1108            return { };
     1109        };
     1110        IterateActiveFontsWithReturnCallback<float> searchFor500 = [&](const FontDatabase::InstalledFont& font, size_t) -> std::optional<float> {
     1111            if (font.weight.includes(500))
     1112                return 500;
     1113            return { };
     1114        };
     1115        if (targetWeight == 400) {
     1116            if (auto result = iterateActiveFontsWithReturn(installedFonts, filter, searchFor400))
     1117                return result.value();
     1118            if (auto result = iterateActiveFontsWithReturn(installedFonts, filter, searchFor500))
     1119                return result.value();
     1120        } else if (targetWeight == 500) {
     1121            if (auto result = iterateActiveFontsWithReturn(installedFonts, filter, searchFor500))
     1122                return result.value();
     1123            if (auto result = iterateActiveFontsWithReturn(installedFonts, filter, searchFor400))
     1124                return result.value();
     1125        }
     1126    }
     1127
     1128    std::function<float(const FontDatabase::InstalledFont&)> computeScore;
     1129    if (targetWeight <= weightThreshold) {
     1130        float threshold = std::min(targetWeight, installedFonts.weightBounds.minimum);
     1131        computeScore = [&, threshold](const FontDatabase::InstalledFont& font) -> float {
     1132            if (font.weight.includes(targetWeight))
     1133                return 0;
     1134            ASSERT(font.weight.minimum > targetWeight || font.weight.maximum < targetWeight);
     1135            if (font.weight.maximum < targetWeight)
     1136                return targetWeight - font.weight.maximum;
     1137            ASSERT(font.weight.minimum > targetWeight);
     1138            return font.weight.minimum - threshold;
     1139        };
     1140    } else {
     1141        ASSERT(targetWeight > weightThreshold);
     1142        float threshold = std::max(targetWeight, installedFonts.weightBounds.maximum);
     1143        computeScore = [&, threshold](const FontDatabase::InstalledFont& font) -> float {
     1144            if (font.weight.includes(targetWeight))
     1145                return 0;
     1146            ASSERT(font.weight.minimum > targetWeight || font.weight.maximum < targetWeight);
     1147            if (font.weight.minimum > targetWeight)
     1148                return font.weight.minimum - targetWeight;
     1149            ASSERT(font.weight.maximum < targetWeight);
     1150            return threshold - font.weight.maximum;
     1151        };
     1152    }
     1153
     1154    size_t closestIndex = 0;
     1155    std::optional<float> minimumScore;
     1156    iterateActiveFonts(installedFonts, filter, [&](auto& installedFont, size_t i) {
     1157        auto score = computeScore(installedFont);
     1158        if (!minimumScore || score < minimumScore.value()) {
     1159            minimumScore = score;
     1160            closestIndex = i;
     1161        }
     1162    });
     1163
     1164    if (!minimumScore)
     1165        return { };
     1166    auto& winner = installedFonts.installedFonts[closestIndex];
     1167    if (winner.weight.includes(targetWeight))
     1168        return targetWeight;
     1169    if (winner.weight.minimum > targetWeight)
     1170        return winner.weight.minimum;
     1171    ASSERT(winner.weight.maximum < targetWeight);
     1172    return winner.weight.maximum;
     1173}
     1174
     1175static inline void filterWeight(float target, const FontDatabase::InstalledFontFamily& installedFonts, Vector<bool>& filter)
     1176{
     1177    iterateActiveFonts(installedFonts, filter, [&](auto& installedFont, size_t i) {
     1178        if (!installedFont.weight.includes(target))
     1179            filter[i] = false;
     1180    });
     1181}
     1182
     1183static inline float computeTargetWeight(FontWeight weight)
     1184{
     1185    switch (weight) {
     1186    case FontWeight100:
     1187        return 100;
     1188    case FontWeight200:
     1189        return 200;
     1190    case FontWeight300:
     1191        return 300;
     1192    case FontWeight400:
     1193        return 400;
     1194    case FontWeight500:
     1195        return 500;
     1196    case FontWeight600:
     1197        return 600;
     1198    case FontWeight700:
     1199        return 700;
     1200    case FontWeight800:
     1201        return 800;
     1202    case FontWeight900:
     1203        return 900;
     1204    default:
     1205        ASSERT_NOT_REACHED();
     1206        return 400;
     1207    }
     1208}
     1209
     1210static const FontDatabase::InstalledFont* findClosestFont(const FontDatabase::InstalledFontFamily& familyFonts, CTFontSymbolicTraits requestedTraits, FontWeight weight)
     1211{
     1212    ASSERT(!familyFonts.isEmpty());
     1213
     1214    // Parallel to familyFonts.
     1215    Vector<bool> filter(familyFonts.size(), true);
     1216
     1217    float targetStretch = 0;
     1218    if (auto closestStretch = findClosestStretch(targetStretch, familyFonts, filter))
     1219        filterStretch(closestStretch.value(), familyFonts, filter);
     1220    else
     1221        return nullptr;
     1222
     1223    float targetStyle = requestedTraits & kCTFontTraitItalic ? italicThreshold : 0;
     1224    if (auto closestStyle = findClosestStyle(targetStyle, familyFonts, filter))
     1225        filterStyle(closestStyle.value(), familyFonts, filter);
     1226    else
     1227        return nullptr;
     1228
     1229    float targetWeight = computeTargetWeight(weight);
     1230    if (auto closestWeight = findClosestWeight(targetWeight, familyFonts, filter))
     1231        filterWeight(closestWeight.value(), familyFonts, filter);
     1232    else
     1233        return nullptr;
     1234
     1235    auto findFont = [&](const FontDatabase::InstalledFont& font, size_t) -> std::optional<std::reference_wrapper<const FontDatabase::InstalledFont>> {
     1236        return std::reference_wrapper<const FontDatabase::InstalledFont>(font);
     1237    };
     1238    if (const auto& result = iterateActiveFontsWithReturn<std::reference_wrapper<const FontDatabase::InstalledFont>>(familyFonts, filter, findFont))
     1239        return &result.value().get();
     1240    return nullptr;
     1241}
     1242
     1243#endif // !SHOULD_USE_CORE_TEXT_FONT_LOOKUP
    7981244
    7991245static RetainPtr<CTFontRef> platformFontLookupWithFamily(const AtomicString& family, CTFontSymbolicTraits requestedTraits, FontWeight weight, float size)
     
    8031249        return nullptr;
    8041250
     1251
     1252#if SHOULD_USE_CORE_TEXT_FONT_LOOKUP
    8051253    return adoptCF(CTFontCreateForCSS(family.string().createCFString().get(), toCoreTextFontWeight(weight), requestedTraits, size));
     1254#else
     1255    const auto& familyFonts = FontDatabase::singleton().lookUpFamilyName(family.string());
     1256    if (familyFonts.isEmpty()) {
     1257        const auto& postScriptFont = FontDatabase::singleton().lookupPostScriptName(family);
     1258        if (!postScriptFont.fontDescriptor)
     1259            return nullptr;
     1260        if (((requestedTraits & kCTFontTraitItalic) && postScriptFont.style.maximum < italicThreshold) || (weight >= FontWeight600 && postScriptFont.weight.maximum < 600)) {
     1261            auto postScriptFamilyName = adoptCF(static_cast<CFStringRef>(CTFontDescriptorCopyAttribute(postScriptFont.fontDescriptor.get(), kCTFontFamilyNameAttribute)));
     1262            if (!postScriptFamilyName)
     1263                return nullptr;
     1264            const auto& familyFonts = FontDatabase::singleton().lookUpFamilyName(String(postScriptFamilyName.get()));
     1265            if (familyFonts.isEmpty())
     1266                return nullptr;
     1267            if (const auto* installedFont = findClosestFont(familyFonts, requestedTraits, weight)) {
     1268                if (!installedFont->fontDescriptor)
     1269                    return nullptr;
     1270                return adoptCF(CTFontCreateWithFontDescriptor(installedFont->fontDescriptor.get(), size, nullptr));
     1271            }
     1272            return nullptr;
     1273        }
     1274        return adoptCF(CTFontCreateWithFontDescriptor(postScriptFont.fontDescriptor.get(), size, nullptr));
     1275    }
     1276
     1277    if (const auto* installedFont = findClosestFont(familyFonts, requestedTraits, weight))
     1278        return adoptCF(CTFontCreateWithFontDescriptor(installedFont->fontDescriptor.get(), size, nullptr));
     1279
     1280    return nullptr;
     1281#endif
     1282}
     1283
     1284static void invalidateFontCache()
     1285{
     1286    if (!isMainThread()) {
     1287        callOnMainThread([] {
     1288            invalidateFontCache();
     1289        });
     1290        return;
     1291    }
     1292
     1293#if !SHOULD_USE_CORE_TEXT_FONT_LOOKUP
     1294    FontDatabase::singleton().clear();
     1295#endif
     1296
     1297    FontCache::singleton().invalidate();
    8061298}
    8071299
  • trunk/Source/WebCore/platform/graphics/ios/FontCacheIOS.mm

    r212985 r213163  
    4040
    4141namespace WebCore {
    42 
    43 void platformInvalidateFontCache()
    44 {
    45 }
    4642
    4743bool requiresCustomFallbackFont(UChar32 character)
  • trunk/Source/WebCore/platform/graphics/mac/FontCacheMac.mm

    r212985 r213163  
    108108}
    109109
    110 void platformInvalidateFontCache()
    111 {
    112 }
    113 
    114110Ref<Font> FontCache::lastResortFallbackFont(const FontDescription& fontDescription)
    115111{
  • trunk/Source/WebCore/platform/spi/cocoa/CoreTextSPI.h

    r206466 r213163  
    8585CTFontDescriptorRef CTFontDescriptorCreateWithAttributesAndOptions(CFDictionaryRef attributes, CTFontDescriptorOptions);
    8686
     87extern const CFStringRef kCTFontCSSWeightAttribute;
    8788extern const CFStringRef kCTFontDescriptorTextStyleAttribute;
    8889extern const CFStringRef kCTFontUIFontDesignTrait;
  • trunk/Tools/ChangeLog

    r213162 r213163  
     12017-02-28  Myles C. Maxfield  <mmaxfield@apple.com>
     2
     3        [macOS] Migrate off of CTFontCreateForCSS
     4        https://bugs.webkit.org/show_bug.cgi?id=168678
     5
     6        Reviewed by David Hyatt.
     7
     8        Exhaustively test the font matching algorithm on Sierra.
     9
     10        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
     11        * TestWebKitAPI/Tests/WebCore/FontCache.cpp: Added.
     12        (TestWebKitAPI::FontCacheTest::SetUp):
     13        (TestWebKitAPI::createPlatformFont):
     14        (TestWebKitAPI::compareFonts):
     15        (TestWebKitAPI::TEST_F):
     16
    1172017-02-28  Basuke Suzuki  <Basuke.Suzuki@am.sony.com>
    218
  • trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj

    r213012 r213163  
    4848                1C2B81871C8925A000A5529F /* Ahem.ttf in Copy Resources */ = {isa = PBXBuildFile; fileRef = 1C2B81851C89252300A5529F /* Ahem.ttf */; };
    4949                1C9EB8411E380DA1005C6442 /* ComplexTextController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1C9EB8401E380DA1005C6442 /* ComplexTextController.cpp */; };
     50                1CAD1F861E5CE7DA00AF2C2C /* FontCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1CAD1F851E5CE7DA00AF2C2C /* FontCache.cpp */; };
    5051                1F83571B1D3FFB2300E3967B /* WKBackForwardList.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F83571A1D3FFB0E00E3967B /* WKBackForwardList.mm */; };
    5152                26DF5A6315A2A27E003689C2 /* CancelLoadFromResourceLoadDelegate.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 26DF5A6115A2A22B003689C2 /* CancelLoadFromResourceLoadDelegate.html */; };
     
    864865                1C2B81851C89252300A5529F /* Ahem.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Ahem.ttf; sourceTree = "<group>"; };
    865866                1C9EB8401E380DA1005C6442 /* ComplexTextController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ComplexTextController.cpp; sourceTree = "<group>"; };
     867                1CAD1F851E5CE7DA00AF2C2C /* FontCache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FontCache.cpp; sourceTree = "<group>"; };
    866868                1CB9BC371A67482300FE5678 /* WeakPtr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WeakPtr.cpp; sourceTree = "<group>"; };
    867869                1CF0D3781BBF2F3D00B4EF54 /* WKRetainPtr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKRetainPtr.cpp; sourceTree = "<group>"; };
     
    16861688                                9C64DC311D76198A004B598E /* YouTubePluginReplacement.cpp */,
    16871689                                1C9EB8401E380DA1005C6442 /* ComplexTextController.cpp */,
     1690                                1CAD1F851E5CE7DA00AF2C2C /* FontCache.cpp */,
    16881691                        );
    16891692                        path = WebCore;
     
    28442847                                51714EB81CF8CA17004723C4 /* WebProcessKillIDBCleanup.mm in Sources */,
    28452848                                536770341CC8022800D425B1 /* WebScriptObjectDescription.mm in Sources */,
     2849                                1CAD1F861E5CE7DA00AF2C2C /* FontCache.cpp in Sources */,
    28462850                                7CCE7ED41A411A7E00447C4C /* WebViewCanPasteURL.mm in Sources */,
    28472851                                CD78E11D1DB7EA660014A2DE /* FullscreenDelegate.mm in Sources */,
Note: See TracChangeset for help on using the changeset viewer.