Changeset 194114 in webkit


Ignore:
Timestamp:
Dec 15, 2015 1:55:34 PM (8 years ago)
Author:
mmaxfield@apple.com
Message:

[Font Features] TrueType fonts trigger real features even when synthesis is applied
https://bugs.webkit.org/show_bug.cgi?id=152287

Reviewed by Darin Adler.

Source/WebCore:

When using a font feature that is synthesizable, and synthesis is triggered,
we should make sure to turn off the original font feature. Otherwise, the
feature will be applied twice on top of itself.

This worked for OpenType fonts, but not for TrueType fonts.

Tests: css3/font-variant-petite-caps-synthesis.html

css3/font-variant-small-caps-synthesis.html
css3/font-variant-petite-caps-synthesis-coverage.html
css3/font-variant-small-caps-synthesis-coverage.html

  • platform/graphics/cocoa/FontCocoa.mm:

(WebCore::defaultSelectorForTrueTypeFeature):
(WebCore::removedFeature):
(WebCore::createCTFontWithoutSynthesizableFeatures):

LayoutTests:

Adding tests.

  • css3/font-variant-petite-caps-synthesis-expected.html:
  • css3/font-variant-petite-caps-synthesis.html:
  • css3/font-variant-small-caps-synthesis-expected.html:
  • css3/font-variant-small-caps-synthesis.html:
  • css3/font-variant-petite-caps-synthesis-coverage-expected.html:
  • css3/font-variant-petite-caps-synthesis-coverage.html:
  • css3/font-variant-small-caps-synthesis-coverage-expected.html:
  • css3/font-variant-small-caps-synthesis-coverage.html:
Location:
trunk
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r194113 r194114  
     12015-12-15  Myles C. Maxfield  <mmaxfield@apple.com>
     2
     3        [Font Features] TrueType fonts trigger real features even when synthesis is applied
     4        https://bugs.webkit.org/show_bug.cgi?id=152287
     5
     6        Reviewed by Darin Adler.
     7
     8        Adding tests.
     9
     10        * css3/font-variant-petite-caps-synthesis-expected.html:
     11        * css3/font-variant-petite-caps-synthesis.html:
     12        * css3/font-variant-small-caps-synthesis-expected.html:
     13        * css3/font-variant-small-caps-synthesis.html:
     14        * css3/font-variant-petite-caps-synthesis-coverage-expected.html:
     15        * css3/font-variant-petite-caps-synthesis-coverage.html:
     16        * css3/font-variant-small-caps-synthesis-coverage-expected.html:
     17        * css3/font-variant-small-caps-synthesis-coverage.html:
     18
    1192015-12-15  Mark Lam  <mark.lam@apple.com>
    220
  • trunk/LayoutTests/css3/font-variant-petite-caps-synthesis-coverage-expected.html

    r193894 r194114  
    4242<div class="test">BA</div>
    4343</div>
     44<div style="font-family: testfont; border: solid black 1px; margin: 5px;">
     45<div class="test">AB</div>
     46<div class="test">B</div>
     47<div class="test">B</div>
     48<div class="test">B</div>
     49<div class="test"><span style="font-size: 14px;">A</span></div>
     50<div class="test">A</div>
     51<div class="test"><span style="font-size: 14px;">A</span>B</div>
     52<div class="test">B<span style="font-size: 14px;">A</span></div>
     53<div class="test">AA</div>
     54<div class="test">AA</div>
     55<div class="test">B</div>
     56<div class="test"><span style="font-size: 14px;">A</span>K</div>
     57<div class="test">K<span style="font-size: 14px;">A</span></div>
     58<div class="test">AB</div>
     59<div class="test">BA</div>
     60</div>
     61<div style="font-family: testfont; border: solid blue 1px; margin: 5px;">
     62<div class="test"><span style="font-size: 14px;">A</span></div>
     63<div class="test">A</div>
     64<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">B</span></div>
     65<div class="test"><span style="font-size: 14px;">B</span><span style="font-size: 14px;">A</span></div>
     66<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">B</span></div>
     67<div class="test"><span style="font-size: 14px;">B</span><span style="font-size: 14px;">A</span></div>
     68<div class="test">A</div>
     69<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">B</span></div>
     70<div class="test"><span style="font-size: 14px;">B</span><span style="font-size: 14px;">A</span></div>
     71<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">B</span></div>
     72<div class="test"><span style="font-size: 14px;">B</span><span style="font-size: 14px;">A</span></div>
     73</div>
    4474<div style="font-family: testfont; border: solid blue 1px; margin: 5px;">
    4575<div class="test"><span style="font-size: 14px;">A</span></div>
  • trunk/LayoutTests/css3/font-variant-petite-caps-synthesis-coverage.html

    r193894 r194114  
    77    font-family: "testfontotf";
    88    src: url("resources/FontWithFeatures.otf") format("opentype");
     9}
     10@font-face {
     11    /* Truetype. "S" responds to smcp; "V" responds to c2sc */
     12    /* Truetype. "T" responds to smcp; "W" responds to c2sc */
     13    font-family: "testfontttf";
     14    src: url("resources/FontWithFeatures.ttf") format("truetype");
    915}
    1016.test {
     
    4349<div class="test" style="font-variant-caps: petite-caps;">MA</div>
    4450</div>
     51<div style="font-family: testfontttf; border: solid black 1px; margin: 5px; font-feature-settings: 'ntrl';">
     52<div class="test">AB</div>
     53<div class="test">a</div>
     54<div class="test">T</div>
     55<div class="test">W</div>
     56<div class="test" style="font-variant-caps: petite-caps;">a</div>
     57<div class="test" style="font-variant-caps: petite-caps;">T</div>
     58<div class="test" style="font-variant-caps: petite-caps;">aT</div>
     59<div class="test" style="font-variant-caps: petite-caps;">Ta</div>
     60<div class="test" style="font-variant-caps: petite-caps;">AT</div>
     61<div class="test" style="font-variant-caps: petite-caps;">TA</div>
     62<div class="test" style="font-variant-caps: petite-caps;">W</div>
     63<div class="test" style="font-variant-caps: petite-caps;">aW</div>
     64<div class="test" style="font-variant-caps: petite-caps;">Wa</div>
     65<div class="test" style="font-variant-caps: petite-caps;">AW</div>
     66<div class="test" style="font-variant-caps: petite-caps;">WA</div>
     67</div>
    4568<div style="font-family: testfontotf; border: solid blue 1px; margin: 5px; font-feature-settings: 'ntrl';">
    4669<div class="test" style="font-variant-caps: all-petite-caps;">a</div>
     
    5679<div class="test" style="font-variant-caps: all-petite-caps;">MA</div>
    5780</div>
     81<div style="font-family: testfontttf; border: solid blue 1px; margin: 5px; font-feature-settings: 'ntrl';">
     82<div class="test" style="font-variant-caps: all-petite-caps;">a</div>
     83<div class="test" style="font-variant-caps: all-petite-caps;">T</div>
     84<div class="test" style="font-variant-caps: all-petite-caps;">aT</div>
     85<div class="test" style="font-variant-caps: all-petite-caps;">Ta</div>
     86<div class="test" style="font-variant-caps: all-petite-caps;">AT</div>
     87<div class="test" style="font-variant-caps: all-petite-caps;">TA</div>
     88<div class="test" style="font-variant-caps: all-petite-caps;">W</div>
     89<div class="test" style="font-variant-caps: all-petite-caps;">aW</div>
     90<div class="test" style="font-variant-caps: all-petite-caps;">Wa</div>
     91<div class="test" style="font-variant-caps: all-petite-caps;">AW</div>
     92<div class="test" style="font-variant-caps: all-petite-caps;">WA</div>
     93</div>
    5894</div>
    5995</body>
  • trunk/LayoutTests/css3/font-variant-petite-caps-synthesis-expected.html

    r193894 r194114  
    4242<div class="test">BA</div>
    4343</div>
     44<div style="font-family: testfont; border: solid black 1px; margin: 5px;">
     45<div class="test">AB</div>
     46<div class="test">B</div>
     47<div class="test">B</div>
     48<div class="test">B</div>
     49<div class="test"><span style="font-size: 14px;">A</span></div>
     50<div class="test">A</div>
     51<div class="test"><span style="font-size: 14px;">A</span>B</div>
     52<div class="test">B<span style="font-size: 14px;">A</span></div>
     53<div class="test">AA</div>
     54<div class="test">AA</div>
     55<div class="test">B</div>
     56<div class="test"><span style="font-size: 14px;">A</span>K</div>
     57<div class="test">K<span style="font-size: 14px;">A</span></div>
     58<div class="test">AB</div>
     59<div class="test">BA</div>
     60</div>
     61<div style="font-family: testfont; border: solid blue 1px; margin: 5px;">
     62<div class="test"><span style="font-size: 14px;">A</span></div>
     63<div class="test"><span style="font-size: 14px;">B</span></div>
     64<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">B</span></div>
     65<div class="test"><span style="font-size: 14px;">B</span><span style="font-size: 14px;">A</span></div>
     66<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">B</span></div>
     67<div class="test"><span style="font-size: 14px;">B</span><span style="font-size: 14px;">A</span></div>
     68<div class="test"><span style="font-size: 14px;">B</span></div>
     69<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">B</span></div>
     70<div class="test"><span style="font-size: 14px;">B</span><span style="font-size: 14px;">A</span></div>
     71<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">B</span></div>
     72<div class="test"><span style="font-size: 14px;">B</span><span style="font-size: 14px;">A</span></div>
     73</div>
    4474<div style="font-family: testfont; border: solid blue 1px; margin: 5px;">
    4575<div class="test"><span style="font-size: 14px;">A</span></div>
  • trunk/LayoutTests/css3/font-variant-petite-caps-synthesis.html

    r193894 r194114  
    77    font-family: "testfontotf";
    88    src: url("resources/FontWithFeatures.otf") format("opentype");
     9}
     10@font-face {
     11    /* Truetype. "S" responds to smcp; "V" responds to c2sc */
     12    /* Truetype. "T" responds to smcp; "W" responds to c2sc */
     13    font-family: "testfontttf";
     14    src: url("resources/FontWithFeatures.ttf") format("truetype");
    915}
    1016.test {
     
    4349<div class="test" style="font-variant-caps: petite-caps;">MA</div>
    4450</div>
     51<div style="font-family: testfontttf; border: solid black 1px; margin: 5px; font-feature-settings: 'ntrl';">
     52<div class="test">AB</div>
     53<div class="test">a</div>
     54<div class="test">T</div>
     55<div class="test">W</div>
     56<div class="test" style="font-variant-caps: petite-caps;">a</div>
     57<div class="test" style="font-variant-caps: petite-caps;">T</div>
     58<div class="test" style="font-variant-caps: petite-caps;">aT</div>
     59<div class="test" style="font-variant-caps: petite-caps;">Ta</div>
     60<div class="test" style="font-variant-caps: petite-caps;">AT</div>
     61<div class="test" style="font-variant-caps: petite-caps;">TA</div>
     62<div class="test" style="font-variant-caps: petite-caps;">W</div>
     63<div class="test" style="font-variant-caps: petite-caps;">aW</div>
     64<div class="test" style="font-variant-caps: petite-caps;">Wa</div>
     65<div class="test" style="font-variant-caps: petite-caps;">AW</div>
     66<div class="test" style="font-variant-caps: petite-caps;">WA</div>
     67</div>
    4568<div style="font-family: testfontotf; border: solid blue 1px; margin: 5px; font-feature-settings: 'ntrl';">
    4669<div class="test" style="font-variant-caps: all-petite-caps;">a</div>
     
    5679<div class="test" style="font-variant-caps: all-petite-caps;">MA</div>
    5780</div>
     81<div style="font-family: testfontttf; border: solid blue 1px; margin: 5px; font-feature-settings: 'ntrl';">
     82<div class="test" style="font-variant-caps: all-petite-caps;">a</div>
     83<div class="test" style="font-variant-caps: all-petite-caps;">T</div>
     84<div class="test" style="font-variant-caps: all-petite-caps;">aT</div>
     85<div class="test" style="font-variant-caps: all-petite-caps;">Ta</div>
     86<div class="test" style="font-variant-caps: all-petite-caps;">AT</div>
     87<div class="test" style="font-variant-caps: all-petite-caps;">TA</div>
     88<div class="test" style="font-variant-caps: all-petite-caps;">W</div>
     89<div class="test" style="font-variant-caps: all-petite-caps;">aW</div>
     90<div class="test" style="font-variant-caps: all-petite-caps;">Wa</div>
     91<div class="test" style="font-variant-caps: all-petite-caps;">AW</div>
     92<div class="test" style="font-variant-caps: all-petite-caps;">WA</div>
     93</div>
    5894</div>
    5995</body>
  • trunk/LayoutTests/css3/font-variant-small-caps-synthesis-coverage-expected.html

    r193894 r194114  
    4242<div class="test">BA</div>
    4343</div>
     44<div style="font-family: testfont; border: solid black 1px; margin: 5px;">
     45<div class="test">AB</div>
     46<div class="test">B</div>
     47<div class="test">B</div>
     48<div class="test">B</div>
     49<div class="test"><span style="font-size: 14px;">A</span></div>
     50<div class="test">A</div>
     51<div class="test"><span style="font-size: 14px;">A</span>B</div>
     52<div class="test">B<span style="font-size: 14px;">A</span></div>
     53<div class="test">AA</div>
     54<div class="test">AA</div>
     55<div class="test">B</div>
     56<div class="test"><span style="font-size: 14px;">A</span>K</div>
     57<div class="test">K<span style="font-size: 14px;">A</span></div>
     58<div class="test">AB</div>
     59<div class="test">BA</div>
     60</div>
    4461<div style="font-family: testfont; border: solid red 1px; margin: 5px;">
    4562<div class="test"style="">AB</div>
     
    6077<div class="test">A<span style="font-size: 14px;">A</span></div>
    6178<div class="test"><span style="font-size: 14px;">A</span>A</div>
     79</div>
     80<div style="font-family: testfont; border: solid red 1px; margin: 5px;">
     81<div class="test"style="">AB</div>
     82<div class="test">B</div>
     83<div class="test">B</div>
     84<div class="test">B</div>
     85<div class="test">A</div>
     86<div class="test">B</div>
     87<div class="test"><span style="font-size: 14px;">A</span></div>
     88<div class="test">A</div>
     89<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">A</span></div>
     90<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">A</span></div>
     91<div class="test">AA</div>
     92<div class="test">AA</div>
     93<div class="test"><span style="font-size: 14px;">B</span></div>
     94<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">B</span></div>
     95<div class="test"><span style="font-size: 14px;">B</span><span style="font-size: 14px;">A</span></div>
     96<div class="test">A<span style="font-size: 14px;">B</span></div>
     97<div class="test"><span style="font-size: 14px;">B</span>A</div>
     98</div>
     99<div style="font-family: testfont; border: solid blue 1px; margin: 5px;">
     100<div class="test"><span style="font-size: 14px;">A</span></div>
     101<div class="test">A</div>
     102<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">B</span></div>
     103<div class="test"><span style="font-size: 14px;">B</span><span style="font-size: 14px;">A</span></div>
     104<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">B</span></div>
     105<div class="test"><span style="font-size: 14px;">B</span><span style="font-size: 14px;">A</span></div>
     106<div class="test">A</div>
     107<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">B</span></div>
     108<div class="test"><span style="font-size: 14px;">B</span><span style="font-size: 14px;">A</span></div>
     109<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">B</span></div>
     110<div class="test"><span style="font-size: 14px;">B</span><span style="font-size: 14px;">A</span></div>
    62111</div>
    63112<div style="font-family: testfont; border: solid blue 1px; margin: 5px;">
     
    87136<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">A</span></div>
    88137</div>
     138<div style="font-family: testfont; border: solid green 1px; margin: 5px;">
     139<div class="test"><span style="font-size: 14px;">A</span></div>
     140<div class="test">A</div>
     141<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">A</span></div>
     142<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">A</span></div>
     143<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">A</span></div>
     144<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">A</span></div>
     145<div class="test">A</div>
     146<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">B</span></div>
     147<div class="test"><span style="font-size: 14px;">B</span><span style="font-size: 14px;">A</span></div>
     148<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">B</span></div>
     149<div class="test"><span style="font-size: 14px;">B</span><span style="font-size: 14px;">A</span></div>
     150</div>
    89151</div>
    90152</body>
  • trunk/LayoutTests/css3/font-variant-small-caps-synthesis-coverage.html

    r193894 r194114  
    1010}
    1111@font-face {
     12    /* Truetype. "S" responds to smcp; "V" responds to c2sc */
     13    font-family: "testfontttf";
     14    src: url("resources/FontWithFeatures.ttf") format("truetype");
     15}
     16@font-face {
    1217    /* Opentype. "f" responds to smcp; "g" responds to c2sc */
    1318    font-family: "testfontlowercasesmallcapsotf";
    1419    src: url("resources/FontWithFeaturesLowercaseSmallCaps.otf") format("opentype");
     20}
     21@font-face {
     22    /* Truetype. "r" responds to smcp; "u" responds to c2sc */
     23    font-family: "testfontlowercasesmallcapsttf";
     24    src: url("resources/FontWithFeaturesLowercaseSmallCaps.ttf") format("truetype");
    1525}
    1626.test {
     
    4959<div class="test" style="font-variant-caps: small-caps;">KA</div>
    5060</div>
     61<div style="font-family: testfontttf; border: solid black 1px; margin: 5px; font-feature-settings: 'ntrl';">
     62<div class="test">AB</div>
     63<div class="test">a</div>
     64<div class="test">S</div>
     65<div class="test">V</div>
     66<div class="test" style="font-variant-caps: small-caps;">a</div>
     67<div class="test" style="font-variant-caps: small-caps;">S</div>
     68<div class="test" style="font-variant-caps: small-caps;">aS</div>
     69<div class="test" style="font-variant-caps: small-caps;">Sa</div>
     70<div class="test" style="font-variant-caps: small-caps;">AS</div>
     71<div class="test" style="font-variant-caps: small-caps;">SA</div>
     72<div class="test" style="font-variant-caps: small-caps;">V</div>
     73<div class="test" style="font-variant-caps: small-caps;">aV</div>
     74<div class="test" style="font-variant-caps: small-caps;">Va</div>
     75<div class="test" style="font-variant-caps: small-caps;">AV</div>
     76<div class="test" style="font-variant-caps: small-caps;">VA</div>
     77</div>
    5178<div style="font-family: testfontlowercasesmallcapsotf; border: solid red 1px; margin: 5px; font-feature-settings: 'ntrl';">
    5279<div class="test">AB</div>
     
    6895<div class="test" style="font-variant-caps: small-caps;">gA</div>
    6996</div>
     97<div style="font-family: testfontlowercasesmallcapsttf; border: solid red 1px; margin: 5px; font-feature-settings: 'ntrl';">
     98<div class="test">AB</div>
     99<div class="test">a</div>
     100<div class="test">r</div>
     101<div class="test">u</div>
     102<div class="test">R</div>
     103<div class="test">U</div>
     104<div class="test" style="font-variant-caps: small-caps;">a</div>
     105<div class="test" style="font-variant-caps: small-caps;">r</div>
     106<div class="test" style="font-variant-caps: small-caps;">ar</div>
     107<div class="test" style="font-variant-caps: small-caps;">ra</div>
     108<div class="test" style="font-variant-caps: small-caps;">Ar</div>
     109<div class="test" style="font-variant-caps: small-caps;">rA</div>
     110<div class="test" style="font-variant-caps: small-caps;">u</div>
     111<div class="test" style="font-variant-caps: small-caps;">au</div>
     112<div class="test" style="font-variant-caps: small-caps;">ua</div>
     113<div class="test" style="font-variant-caps: small-caps;">Au</div>
     114<div class="test" style="font-variant-caps: small-caps;">uA</div>
     115</div>
    70116<div style="font-family: testfontotf; border: solid blue 1px; margin: 5px; font-feature-settings: 'ntrl';">
    71117<div class="test" style="font-variant-caps: all-small-caps;">a</div>
     
    81127<div class="test" style="font-variant-caps: all-small-caps;">KA</div>
    82128</div>
     129<div style="font-family: testfontttf; border: solid blue 1px; margin: 5px; font-feature-settings: 'ntrl';">
     130<div class="test" style="font-variant-caps: all-small-caps;">a</div>
     131<div class="test" style="font-variant-caps: all-small-caps;">S</div>
     132<div class="test" style="font-variant-caps: all-small-caps;">aS</div>
     133<div class="test" style="font-variant-caps: all-small-caps;">Sa</div>
     134<div class="test" style="font-variant-caps: all-small-caps;">AS</div>
     135<div class="test" style="font-variant-caps: all-small-caps;">SA</div>
     136<div class="test" style="font-variant-caps: all-small-caps;">V</div>
     137<div class="test" style="font-variant-caps: all-small-caps;">aV</div>
     138<div class="test" style="font-variant-caps: all-small-caps;">Va</div>
     139<div class="test" style="font-variant-caps: all-small-caps;">AV</div>
     140<div class="test" style="font-variant-caps: all-small-caps;">VA</div>
     141</div>
    83142<div style="font-family: testfontlowercasesmallcapsotf; border: solid green 1px; margin: 5px; font-feature-settings: 'ntrl';">
    84143<div class="test" style="font-variant-caps: all-small-caps;">a</div>
     
    92151<div class="test" style="font-variant-caps: all-small-caps;">ga</div>
    93152<div class="test" style="font-variant-caps: all-small-caps;">Ag</div>
    94 <div class="test" style="font-variant-caps: all-small-caps;">gA</div
     153<div class="test" style="font-variant-caps: all-small-caps;">gA</div>
     154</div>
     155<div style="font-family: testfontlowercasesmallcapsttf; border: solid green 1px; margin: 5px; font-feature-settings: 'ntrl';">
     156<div class="test" style="font-variant-caps: all-small-caps;">a</div>
     157<div class="test" style="font-variant-caps: all-small-caps;">r</div>
     158<div class="test" style="font-variant-caps: all-small-caps;">ar</div>
     159<div class="test" style="font-variant-caps: all-small-caps;">ra</div>
     160<div class="test" style="font-variant-caps: all-small-caps;">Ar</div>
     161<div class="test" style="font-variant-caps: all-small-caps;">rA</div>
     162<div class="test" style="font-variant-caps: all-small-caps;">u</div>
     163<div class="test" style="font-variant-caps: all-small-caps;">au</div>
     164<div class="test" style="font-variant-caps: all-small-caps;">ua</div>
     165<div class="test" style="font-variant-caps: all-small-caps;">Au</div>
     166<div class="test" style="font-variant-caps: all-small-caps;">uA</div>
    95167</div>
    96168</div>
  • trunk/LayoutTests/css3/font-variant-small-caps-synthesis-expected.html

    r193894 r194114  
    4242<div class="test">BA</div>
    4343</div>
     44<div style="font-family: testfont; border: solid black 1px; margin: 5px;">
     45<div class="test">AB</div>
     46<div class="test">B</div>
     47<div class="test">B</div>
     48<div class="test">B</div>
     49<div class="test"><span style="font-size: 14px;">A</span></div>
     50<div class="test">A</div>
     51<div class="test"><span style="font-size: 14px;">A</span>B</div>
     52<div class="test">B<span style="font-size: 14px;">A</span></div>
     53<div class="test">AA</div>
     54<div class="test">AA</div>
     55<div class="test">B</div>
     56<div class="test"><span style="font-size: 14px;">A</span>K</div>
     57<div class="test">K<span style="font-size: 14px;">A</span></div>
     58<div class="test">AB</div>
     59<div class="test">BA</div>
     60</div>
    4461<div style="font-family: testfont; border: solid red 1px; margin: 5px;">
    4562<div class="test"style="">AB</div>
     
    6077<div class="test">A<span style="font-size: 14px;">A</span></div>
    6178<div class="test"><span style="font-size: 14px;">A</span>A</div>
     79</div>
     80<div style="font-family: testfont; border: solid red 1px; margin: 5px;">
     81<div class="test"style="">AB</div>
     82<div class="test">B</div>
     83<div class="test">B</div>
     84<div class="test">B</div>
     85<div class="test">A</div>
     86<div class="test">B</div>
     87<div class="test"><span style="font-size: 14px;">A</span></div>
     88<div class="test"><span style="font-size: 14px;">A</span></div>
     89<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">A</span></div>
     90<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">A</span></div>
     91<div class="test">A<span style="font-size: 14px;">A</span></div>
     92<div class="test"><span style="font-size: 14px;">A</span>A</div>
     93<div class="test"><span style="font-size: 14px;">B</span></div>
     94<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">B</span></div>
     95<div class="test"><span style="font-size: 14px;">B</span><span style="font-size: 14px;">A</span></div>
     96<div class="test">A<span style="font-size: 14px;">B</span></div>
     97<div class="test"><span style="font-size: 14px;">B</span>A</div>
     98</div>
     99<div style="font-family: testfont; border: solid blue 1px; margin: 5px;">
     100<div class="test"><span style="font-size: 14px;">A</span></div>
     101<div class="test"><span style="font-size: 14px;">B</span></div>
     102<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">B</span></div>
     103<div class="test"><span style="font-size: 14px;">B</span><span style="font-size: 14px;">A</span></div>
     104<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">B</span></div>
     105<div class="test"><span style="font-size: 14px;">B</span><span style="font-size: 14px;">A</span></div>
     106<div class="test"><span style="font-size: 14px;">B</span></div>
     107<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">B</span></div>
     108<div class="test"><span style="font-size: 14px;">B</span><span style="font-size: 14px;">A</span></div>
     109<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">B</span></div>
     110<div class="test"><span style="font-size: 14px;">B</span><span style="font-size: 14px;">A</span></div>
    62111</div>
    63112<div style="font-family: testfont; border: solid blue 1px; margin: 5px;">
     
    87136<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">A</span></div>
    88137</div>
     138<div style="font-family: testfont; border: solid green 1px; margin: 5px;">
     139<div class="test"><span style="font-size: 14px;">A</span></div>
     140<div class="test"><span style="font-size: 14px;">A</span></div>
     141<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">A</span></div>
     142<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">A</span></div>
     143<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">A</span></div>
     144<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">A</span></div>
     145<div class="test"><span style="font-size: 14px;">B</span></div>
     146<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">B</span></div>
     147<div class="test"><span style="font-size: 14px;">B</span><span style="font-size: 14px;">A</span></div>
     148<div class="test"><span style="font-size: 14px;">A</span><span style="font-size: 14px;">B</span></div>
     149<div class="test"><span style="font-size: 14px;">B</span><span style="font-size: 14px;">A</span></div>
     150</div>
    89151</div>
    90152</body>
  • trunk/LayoutTests/css3/font-variant-small-caps-synthesis.html

    r193894 r194114  
    1010}
    1111@font-face {
     12    /* Truetype. "S" responds to smcp; "V" responds to c2sc */
     13    font-family: "testfontttf";
     14    src: url("resources/FontWithFeatures.ttf") format("truetype");
     15}
     16@font-face {
    1217    /* Opentype. "f" responds to smcp; "g" responds to c2sc */
    1318    font-family: "testfontlowercasesmallcapsotf";
    1419    src: url("resources/FontWithFeaturesLowercaseSmallCaps.otf") format("opentype");
     20}
     21@font-face {
     22    /* Truetype. "r" responds to smcp; "u" responds to c2sc */
     23    font-family: "testfontlowercasesmallcapsttf";
     24    src: url("resources/FontWithFeaturesLowercaseSmallCaps.ttf") format("truetype");
    1525}
    1626.test {
     
    4959<div class="test" style="font-variant-caps: small-caps;">KA</div>
    5060</div>
     61<div style="font-family: testfontttf; border: solid black 1px; margin: 5px; font-feature-settings: 'ntrl';">
     62<div class="test">AB</div>
     63<div class="test">a</div>
     64<div class="test">S</div>
     65<div class="test">V</div>
     66<div class="test" style="font-variant-caps: small-caps;">a</div>
     67<div class="test" style="font-variant-caps: small-caps;">S</div>
     68<div class="test" style="font-variant-caps: small-caps;">aS</div>
     69<div class="test" style="font-variant-caps: small-caps;">Sa</div>
     70<div class="test" style="font-variant-caps: small-caps;">AS</div>
     71<div class="test" style="font-variant-caps: small-caps;">SA</div>
     72<div class="test" style="font-variant-caps: small-caps;">V</div>
     73<div class="test" style="font-variant-caps: small-caps;">aV</div>
     74<div class="test" style="font-variant-caps: small-caps;">Va</div>
     75<div class="test" style="font-variant-caps: small-caps;">AV</div>
     76<div class="test" style="font-variant-caps: small-caps;">VA</div>
     77</div>
    5178<div style="font-family: testfontlowercasesmallcapsotf; border: solid red 1px; margin: 5px; font-feature-settings: 'ntrl';">
    5279<div class="test">AB</div>
     
    6895<div class="test" style="font-variant-caps: small-caps;">gA</div>
    6996</div>
     97<div style="font-family: testfontlowercasesmallcapsttf; border: solid red 1px; margin: 5px; font-feature-settings: 'ntrl';">
     98<div class="test">AB</div>
     99<div class="test">a</div>
     100<div class="test">r</div>
     101<div class="test">u</div>
     102<div class="test">R</div>
     103<div class="test">U</div>
     104<div class="test" style="font-variant-caps: small-caps;">a</div>
     105<div class="test" style="font-variant-caps: small-caps;">r</div>
     106<div class="test" style="font-variant-caps: small-caps;">ar</div>
     107<div class="test" style="font-variant-caps: small-caps;">ra</div>
     108<div class="test" style="font-variant-caps: small-caps;">Ar</div>
     109<div class="test" style="font-variant-caps: small-caps;">rA</div>
     110<div class="test" style="font-variant-caps: small-caps;">u</div>
     111<div class="test" style="font-variant-caps: small-caps;">au</div>
     112<div class="test" style="font-variant-caps: small-caps;">ua</div>
     113<div class="test" style="font-variant-caps: small-caps;">Au</div>
     114<div class="test" style="font-variant-caps: small-caps;">uA</div>
     115</div>
    70116<div style="font-family: testfontotf; border: solid blue 1px; margin: 5px; font-feature-settings: 'ntrl';">
    71117<div class="test" style="font-variant-caps: all-small-caps;">a</div>
     
    81127<div class="test" style="font-variant-caps: all-small-caps;">KA</div>
    82128</div>
     129<div style="font-family: testfontttf; border: solid blue 1px; margin: 5px; font-feature-settings: 'ntrl';">
     130<div class="test" style="font-variant-caps: all-small-caps;">a</div>
     131<div class="test" style="font-variant-caps: all-small-caps;">S</div>
     132<div class="test" style="font-variant-caps: all-small-caps;">aS</div>
     133<div class="test" style="font-variant-caps: all-small-caps;">Sa</div>
     134<div class="test" style="font-variant-caps: all-small-caps;">AS</div>
     135<div class="test" style="font-variant-caps: all-small-caps;">SA</div>
     136<div class="test" style="font-variant-caps: all-small-caps;">V</div>
     137<div class="test" style="font-variant-caps: all-small-caps;">aV</div>
     138<div class="test" style="font-variant-caps: all-small-caps;">Va</div>
     139<div class="test" style="font-variant-caps: all-small-caps;">AV</div>
     140<div class="test" style="font-variant-caps: all-small-caps;">VA</div>
     141</div>
    83142<div style="font-family: testfontlowercasesmallcapsotf; border: solid green 1px; margin: 5px; font-feature-settings: 'ntrl';">
    84143<div class="test" style="font-variant-caps: all-small-caps;">a</div>
     
    92151<div class="test" style="font-variant-caps: all-small-caps;">ga</div>
    93152<div class="test" style="font-variant-caps: all-small-caps;">Ag</div>
    94 <div class="test" style="font-variant-caps: all-small-caps;">gA</div
     153<div class="test" style="font-variant-caps: all-small-caps;">gA</div>
     154</div>
     155<div style="font-family: testfontlowercasesmallcapsttf; border: solid green 1px; margin: 5px; font-feature-settings: 'ntrl';">
     156<div class="test" style="font-variant-caps: all-small-caps;">a</div>
     157<div class="test" style="font-variant-caps: all-small-caps;">r</div>
     158<div class="test" style="font-variant-caps: all-small-caps;">ar</div>
     159<div class="test" style="font-variant-caps: all-small-caps;">ra</div>
     160<div class="test" style="font-variant-caps: all-small-caps;">Ar</div>
     161<div class="test" style="font-variant-caps: all-small-caps;">rA</div>
     162<div class="test" style="font-variant-caps: all-small-caps;">u</div>
     163<div class="test" style="font-variant-caps: all-small-caps;">au</div>
     164<div class="test" style="font-variant-caps: all-small-caps;">ua</div>
     165<div class="test" style="font-variant-caps: all-small-caps;">Au</div>
     166<div class="test" style="font-variant-caps: all-small-caps;">uA</div>
    95167</div>
    96168</div>
  • trunk/Source/WebCore/ChangeLog

    r194111 r194114  
     12015-12-15  Myles C. Maxfield  <mmaxfield@apple.com>
     2
     3        [Font Features] TrueType fonts trigger real features even when synthesis is applied
     4        https://bugs.webkit.org/show_bug.cgi?id=152287
     5
     6        Reviewed by Darin Adler.
     7
     8        When using a font feature that is synthesizable, and synthesis is triggered,
     9        we should make sure to turn off the original font feature. Otherwise, the
     10        feature will be applied twice on top of itself.
     11
     12        This worked for OpenType fonts, but not for TrueType fonts.
     13
     14        Tests: css3/font-variant-petite-caps-synthesis.html
     15               css3/font-variant-small-caps-synthesis.html
     16               css3/font-variant-petite-caps-synthesis-coverage.html
     17               css3/font-variant-small-caps-synthesis-coverage.html
     18
     19        * platform/graphics/cocoa/FontCocoa.mm:
     20        (WebCore::defaultSelectorForTrueTypeFeature):
     21        (WebCore::removedFeature):
     22        (WebCore::createCTFontWithoutSynthesizableFeatures):
     23
    1242015-12-15  Per Arne Vollan  <peavo@outlook.com>
    225
  • trunk/Source/WebCore/platform/graphics/cocoa/FontCocoa.mm

    r193942 r194114  
    470470}
    471471
    472 static inline RetainPtr<CFDictionaryRef> removedFeature(CFDictionaryRef feature)
     472static inline CFNumberRef defaultSelectorForTrueTypeFeature(int key, CTFontRef font)
     473{
     474    RetainPtr<CFArrayRef> features = adoptCF(CTFontCopyFeatures(font));
     475    CFIndex featureCount = CFArrayGetCount(features.get());
     476    for (CFIndex i = 0; i < featureCount; ++i) {
     477        CFDictionaryRef featureType = static_cast<CFDictionaryRef>(CFArrayGetValueAtIndex(features.get(), i));
     478        CFNumberRef featureKey = static_cast<CFNumberRef>(CFDictionaryGetValue(featureType, kCTFontFeatureTypeIdentifierKey));
     479        if (!featureKey)
     480            continue;
     481        int rawFeatureKey;
     482        CFNumberGetValue(featureKey, kCFNumberIntType, &rawFeatureKey);
     483        if (rawFeatureKey != key)
     484            continue;
     485
     486        CFArrayRef featureSelectors = static_cast<CFArrayRef>(CFDictionaryGetValue(featureType, kCTFontFeatureTypeSelectorsKey));
     487        if (!featureSelectors)
     488            continue;
     489        CFIndex selectorsCount = CFArrayGetCount(featureSelectors);
     490        for (CFIndex j = 0; j < selectorsCount; ++j) {
     491            CFDictionaryRef featureSelector = static_cast<CFDictionaryRef>(CFArrayGetValueAtIndex(featureSelectors, j));
     492            CFNumberRef isDefault = static_cast<CFNumberRef>(CFDictionaryGetValue(featureSelector, kCTFontFeatureSelectorDefaultKey));
     493            if (!isDefault)
     494                continue;
     495            int rawIsDefault;
     496            CFNumberGetValue(isDefault, kCFNumberIntType, &rawIsDefault);
     497            if (!rawIsDefault)
     498                continue;
     499            return static_cast<CFNumberRef>(CFDictionaryGetValue(featureSelector, kCTFontFeatureSelectorIdentifierKey));
     500        }
     501    }
     502    return nullptr;
     503}
     504
     505static inline RetainPtr<CFDictionaryRef> removedFeature(CFDictionaryRef feature, CTFontRef font)
    473506{
    474507    bool isOpenType = isOpenTypeFeature(feature);
     
    495528        auto trueTypeFeaturePair = trueTypeFeature(feature);
    496529        if (trueTypeFeaturePair.first == kLowerCaseType && (trueTypeFeaturePair.second == kLowerCaseSmallCapsSelector || trueTypeFeaturePair.second == kLowerCasePetiteCapsSelector)) {
    497             int rawSelector = kDefaultLowerCaseSelector;
    498             RetainPtr<CFNumberRef> selector = adoptCF(CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &rawSelector));
    499530            CFDictionaryAddValue(result.get(), kCTFontFeatureTypeIdentifierKey, CFDictionaryGetValue(feature, kCTFontFeatureTypeIdentifierKey));
    500             CFDictionaryAddValue(result.get(), kCTFontFeatureSelectorIdentifierKey, selector.get());
     531            if (CFNumberRef defaultSelector = defaultSelectorForTrueTypeFeature(kLowerCaseType, font))
     532                CFDictionaryAddValue(result.get(), kCTFontFeatureSelectorIdentifierKey, defaultSelector);
     533            else
     534                CFDictionaryAddValue(result.get(), kCTFontFeatureSelectorIdentifierKey, CFDictionaryGetValue(feature, kCTFontFeatureSelectorIdentifierKey));
    501535        } else if (trueTypeFeaturePair.first == kUpperCaseType && (trueTypeFeaturePair.second == kUpperCaseSmallCapsSelector || trueTypeFeaturePair.second == kUpperCasePetiteCapsSelector)) {
    502             int rawSelector = kDefaultUpperCaseSelector;
    503             RetainPtr<CFNumberRef> selector = adoptCF(CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &rawSelector));
    504536            CFDictionaryAddValue(result.get(), kCTFontFeatureTypeIdentifierKey, CFDictionaryGetValue(feature, kCTFontFeatureTypeIdentifierKey));
    505             CFDictionaryAddValue(result.get(), kCTFontFeatureSelectorIdentifierKey, selector.get());
     537            if (CFNumberRef defaultSelector = defaultSelectorForTrueTypeFeature(kUpperCaseType, font))
     538                CFDictionaryAddValue(result.get(), kCTFontFeatureSelectorIdentifierKey, defaultSelector);
     539            else
     540                CFDictionaryAddValue(result.get(), kCTFontFeatureSelectorIdentifierKey, CFDictionaryGetValue(feature, kCTFontFeatureSelectorIdentifierKey));
    506541        } else {
    507542            CFDictionaryAddValue(result.get(), kCTFontFeatureTypeIdentifierKey, CFDictionaryGetValue(feature, kCTFontFeatureTypeIdentifierKey));
     
    521556    for (CFIndex i = 0; i < featureCount; ++i) {
    522557        CFDictionaryRef feature = static_cast<CFDictionaryRef>(CFArrayGetValueAtIndex(features.get(), i));
    523         CFArrayAppendValue(newFeatures.get(), removedFeature(feature).get());
     558        CFArrayAppendValue(newFeatures.get(), removedFeature(feature, font).get());
    524559    }
    525560    CFTypeRef keys[] = { kCTFontFeatureSettingsAttribute };
Note: See TracChangeset for help on using the changeset viewer.