wpt / css / css-fonts / oblique-last-resort-weight-selection.html

Status: PASS | Duration: 7ms | Subtests: 1/1 | Open test on wpt.live | Open ref on wpt.live | wpt.fyi

/css/css-fonts/oblique-last-resort-weight-selection.html

<!DOCTYPE html>
<meta charset="utf-8">

<title>CSS Fonts: weight selection among last-resort oblique faces</title>

<link rel="help" href="https://drafts.csswg.org/css-fonts-4/#font-style-matching">
<link rel="help" href="https://drafts.csswg.org/css-fonts-4/#font-synthesis-style">
<meta name="assert" content="When italic is requested with font-synthesis-style:oblique-only and only oblique faces exist, the best weight match is selected among the penalized last-resort candidates">
<link rel="match" href="oblique-last-resort-weight-selection-ref.html">

<style>
/*
 * font-family 'test' has two oblique faces (both penalized as last resort when italic
 * is requested with font-synthesis-style:oblique-only).
 *
 * Face 1 (declared first): oblique 14deg–30deg, weight 400
 *   Good weight match for the request (w400). No size-adjust → full 50px glyphs.
 *
 * Face 2 (declared second): oblique 5deg–14deg, weight 700
 *   Poor weight match. size-adjust:50% → 25px glyphs if erroneously selected.
 *
 * WebKit builds the capabilities vector in reverse declaration order, so Face 2
 * is iterated first in FontSelectionAlgorithm. This makes the test deterministic:
 *
 *   With slope.minimum:
 *     Face 2 yields value=5 (its slope minimum). Face 1's range [14,30] does not
 *     contain 5, so Face 1 is eliminated. Only Face 2 (w700) survives; its 50%
 *     size-adjust produces 25px glyphs. ← INCORRECT
 *
 *   With clamp(requestSlope, slope.minimum, slope.maximum):
 *     Face 2 yields clamp(14,5,14)=14. Face 1 yields clamp(14,14,30)=14. Both
 *     ranges contain 14, so both survive the slope filter. Weight matching then
 *     selects Face 1 (w400 = requested weight) → full 50px glyphs. ← CORRECT
 */
@font-face {
  font-family: test;
  font-style: oblique 14deg 30deg;
  font-weight: 400;
  src: url("resources/markA.ttf");
}
@font-face {
  font-family: test;
  font-style: oblique 5deg 14deg;
  font-weight: 700;
  src: url("resources/markA.ttf");
  size-adjust: 50%;
}

div { font: 50px test; }
</style>

<!--
  Requesting italic + font-synthesis-style:oblique-only + font-weight:400.
  Both oblique faces are penalized (penalizeObliqueFontSelection=true).
  Among last-resort faces, CSS weight matching must select Face 1 (w400).
  Correct result: full-size (50px) 'A' glyph from markA.ttf with no size-adjust.
-->
<div style="font-style: italic; font-synthesis-style: oblique-only; font-weight: 400">A</div>

/css/css-fonts/oblique-last-resort-weight-selection-ref.html

<!DOCTYPE html>
<meta charset="utf-8">

<title>CSS Fonts reference: weight selection among last-resort oblique faces</title>

<style>
@font-face {
  font-family: ref;
  src: url("resources/markA.ttf");
}

div { font: 50px ref; }
</style>

<!-- Expected: full-size 50px 'A' from markA.ttf (Face 1, w400, no size-adjust selected) -->
<div>A</div>