| <!DOCTYPE html> |
| <html lang="ja"> |
| <head> |
| <meta charset="UTF-8" /> |
| <title>Coordination of kern and palt features for CJK kerning</title> |
| <link rel="help" href="https://drafts.csswg.org/css-fonts/#font-kerning-prop" /> |
| <link rel="help" href="https://learn.microsoft.com/en-gb/typography/opentype/spec/features_ko#tag-kern" /> |
| <link rel="help" href="https://learn.microsoft.com/en-gb/typography/opentype/spec/features_pt#palt" /> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <style> |
| @font-face { |
| font-family: test; |
| src: url('resources/NotoSansJP-Regular.subset.otf') format('opentype'); |
| } |
| h1 { |
| font: bold 1.5em/1 sans-serif; |
| } |
| h2 { |
| font: 1em/1 sans-serif; |
| margin-bottom: .25em; |
| } |
| .test { |
| font-family: test, sans-serif; |
| font-size: 3em; |
| } |
| .latin { |
| background: yellow; |
| } |
| .cjk { |
| background: cyan; |
| } |
| .paltOFFkernON { |
| font-feature-settings: "palt" 0; |
| font-kerning: normal; |
| } |
| .kernOFF { |
| font-kerning: none; |
| } |
| .kernON { |
| font-kerning: normal; |
| } |
| .paltONkernON { |
| font-feature-settings: "palt" 1; |
| font-kerning: normal; |
| } |
| .paltONkernOFF { |
| font-feature-settings: "palt" 1; |
| font-kerning: none; |
| } |
| </style> |
| <body> |
| |
| <h1>Testing application of kerning to CJK text</h1> |
| <h2>default</h2> |
| <div class="test default"> |
| <span class=latin>YeYeYeYe</span><span class=cjk>ティティティティ</span> |
| </div> |
| <h2>font-kerning: none;</h2> |
| <div class="test kernOFF"> |
| <span class=latin>YeYeYeYe</span><span class=cjk>ティティティティ</span> |
| </div> |
| <h2>font-kerning: normal;</h2> |
| <div class="test kernON"> |
| <span class=latin>YeYeYeYe</span><span class=cjk>ティティティティ</span> |
| </div> |
| <h2>font-feature-settings:"palt" 0; font-kerning: normal;</h2> |
| <div class="test paltOFFkernON"> |
| <span class=latin>YeYeYeYe</span><span class=cjk>ティティティティ</span> |
| </div> |
| <h2>font-feature-settings:"palt" 1; font-kerning: normal;</h2> |
| <div class="test paltONkernON"> |
| <span class=latin>YeYeYeYe</span><span class=cjk>ティティティティ</span> |
| </div> |
| <h2>font-feature-settings:"palt" 1; font-kerning: none;</h2> |
| <div class="test paltONkernOFF"> |
| <span class=latin>YeYeYeYe</span><span class=cjk>ティティティティ</span> |
| </div> |
| |
| <script> |
| const expectMatch = [ |
| [ ".kernON .latin", ".paltOFFkernON .latin" ], |
| [ ".kernON .latin", ".paltONkernON .latin" ], |
| [ ".kernOFF .latin", ".paltONkernOFF .latin" ], |
| [ ".kernON .cjk", ".paltONkernON .cjk" ], |
| [ ".default .cjk", ".kernOFF .cjk" ], |
| ]; |
| const expectMismatch = [ |
| [ ".kernOFF .latin", ".kernON .latin" ], |
| [ ".kernOFF .cjk", ".kernON .cjk" ], |
| [ ".paltOFFkernON .cjk", ".paltONkernON .cjk" ], |
| ]; |
| const expectMatchOneOf = [ |
| [ ".default .latin", [".kernON .latin", ".kernOFF .latin"] ], |
| ]; |
| |
| expectMatch.forEach((t) => { |
| test(() => { |
| let w1 = document.querySelector(t[0]).offsetWidth; |
| let w2 = document.querySelector(t[1]).offsetWidth; |
| assert_equals(w1, w2); |
| }, "expected match: " + t[0] + " vs " + t[1]); |
| }); |
| |
| expectMismatch.forEach((t) => { |
| test(() => { |
| let w1 = document.querySelector(t[0]).offsetWidth; |
| let w2 = document.querySelector(t[1]).offsetWidth; |
| assert_not_equals(w1, w2); |
| }, "expected mismatch: " + t[0] + " vs " + t[1]); |
| }); |
| |
| expectMatchOneOf.forEach((t) => { |
| test(() => { |
| let w1 = document.querySelector(t[0]).offsetWidth; |
| let matched = false; |
| t[1].forEach((t2) => { |
| let w2 = document.querySelector(t2).offsetWidth; |
| if (w1 == w2) { |
| matched = true; |
| } |
| }); |
| assert_true(matched); |
| }, t[0] + " matches one of [" + t[1].join(", ") + "]"); |
| }); |
| </script> |
| |
| </body> |
| </head> |