<!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>