Commit d8ab76e9 authored by Xiaocheng Hu's avatar Xiaocheng Hu Committed by Commit Bot

Introduce line-gap-override descriptor of @font-face


Bug: 1098355
Change-Id: I30914ddd88b884a6b0241c1184904a67fa7370fd
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2364001Reviewed-by: default avatarKoji Ishii <kojii@chromium.org>
Commit-Queue: Xiaocheng Hu <xiaochengh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#799698}
parent b960daf4
...@@ -718,6 +718,7 @@ enum CSSSampleId { ...@@ -718,6 +718,7 @@ enum CSSSampleId {
kAscentOverride = 672, kAscentOverride = 672,
kDescentOverride = 673, kDescentOverride = 673,
kLetterSpacingOverride = 674, kLetterSpacingOverride = 674,
kLineGapOverride = 675,
// 1. Add new features above this line (don't change the assigned numbers of // 1. Add new features above this line (don't change the assigned numbers of
// the existing items). // the existing items).
// 2. Run the src/tools/metrics/histograms/update_use_counter_css.py script // 2. Run the src/tools/metrics/histograms/update_use_counter_css.py script
......
...@@ -5139,6 +5139,12 @@ ...@@ -5139,6 +5139,12 @@
is_property: false, is_property: false,
runtime_flag: "CSSFontMetricsOverride", runtime_flag: "CSSFontMetricsOverride",
}, },
{
name: "line-gap-override",
is_descriptor: true,
is_property: false,
runtime_flag: "CSSFontMetricsOverride",
},
// Shorthands // Shorthands
{ {
......
...@@ -195,6 +195,8 @@ FontFace* FontFace::Create(Document* document, ...@@ -195,6 +195,8 @@ FontFace* FontFace::Create(Document* document,
AtRuleDescriptorID::AscentOverride) && AtRuleDescriptorID::AscentOverride) &&
font_face->SetPropertyFromStyle(properties, font_face->SetPropertyFromStyle(properties,
AtRuleDescriptorID::DescentOverride) && AtRuleDescriptorID::DescentOverride) &&
font_face->SetPropertyFromStyle(properties,
AtRuleDescriptorID::LineGapOverride) &&
font_face->SetPropertyFromStyle( font_face->SetPropertyFromStyle(
properties, AtRuleDescriptorID::LetterSpacingOverride) && properties, AtRuleDescriptorID::LetterSpacingOverride) &&
font_face->GetFontSelectionCapabilities().IsValid() && font_face->GetFontSelectionCapabilities().IsValid() &&
...@@ -365,6 +367,9 @@ bool FontFace::SetPropertyValue(const CSSValue* value, ...@@ -365,6 +367,9 @@ bool FontFace::SetPropertyValue(const CSSValue* value,
case AtRuleDescriptorID::DescentOverride: case AtRuleDescriptorID::DescentOverride:
descent_override_ = value; descent_override_ = value;
break; break;
case AtRuleDescriptorID::LineGapOverride:
line_gap_override_ = value;
break;
case AtRuleDescriptorID::LetterSpacingOverride: case AtRuleDescriptorID::LetterSpacingOverride:
letter_spacing_override_ = value; letter_spacing_override_ = value;
break; break;
...@@ -811,6 +816,7 @@ void FontFace::Trace(Visitor* visitor) const { ...@@ -811,6 +816,7 @@ void FontFace::Trace(Visitor* visitor) const {
visitor->Trace(display_); visitor->Trace(display_);
visitor->Trace(ascent_override_); visitor->Trace(ascent_override_);
visitor->Trace(descent_override_); visitor->Trace(descent_override_);
visitor->Trace(line_gap_override_);
visitor->Trace(letter_spacing_override_); visitor->Trace(letter_spacing_override_);
visitor->Trace(error_); visitor->Trace(error_);
visitor->Trace(loaded_property_); visitor->Trace(loaded_property_);
...@@ -849,6 +855,10 @@ FontMetricsOverride FontFace::GetFontMetricsOverride() const { ...@@ -849,6 +855,10 @@ FontMetricsOverride FontFace::GetFontMetricsOverride() const {
result.descent_override = result.descent_override =
To<CSSPrimitiveValue>(*descent_override_).GetFloatValue() / 100; To<CSSPrimitiveValue>(*descent_override_).GetFloatValue() / 100;
} }
if (line_gap_override_) {
result.line_gap_override =
To<CSSPrimitiveValue>(*line_gap_override_).GetFloatValue() / 100;
}
if (letter_spacing_override_) { if (letter_spacing_override_) {
result.letter_spacing_override = result.letter_spacing_override =
To<CSSPrimitiveValue>(*letter_spacing_override_).GetFloatValue(); To<CSSPrimitiveValue>(*letter_spacing_override_).GetFloatValue();
......
...@@ -135,7 +135,8 @@ class CORE_EXPORT FontFace : public ScriptWrappable, ...@@ -135,7 +135,8 @@ class CORE_EXPORT FontFace : public ScriptWrappable,
bool HasPendingActivity() const final; bool HasPendingActivity() const final;
bool HasFontMetricsOverride() const { bool HasFontMetricsOverride() const {
return ascent_override_ || descent_override_ || letter_spacing_override_; return ascent_override_ || descent_override_ || line_gap_override_ ||
letter_spacing_override_;
} }
FontMetricsOverride GetFontMetricsOverride() const; FontMetricsOverride GetFontMetricsOverride() const;
...@@ -179,6 +180,7 @@ class CORE_EXPORT FontFace : public ScriptWrappable, ...@@ -179,6 +180,7 @@ class CORE_EXPORT FontFace : public ScriptWrappable,
Member<const CSSValue> display_; Member<const CSSValue> display_;
Member<const CSSValue> ascent_override_; Member<const CSSValue> ascent_override_;
Member<const CSSValue> descent_override_; Member<const CSSValue> descent_override_;
Member<const CSSValue> line_gap_override_;
Member<const CSSValue> letter_spacing_override_; Member<const CSSValue> letter_spacing_override_;
LoadStatusType status_; LoadStatusType status_;
Member<DOMException> error_; Member<DOMException> error_;
......
...@@ -266,6 +266,7 @@ CSSValue* AtRuleDescriptorParser::ParseFontFaceDescriptor( ...@@ -266,6 +266,7 @@ CSSValue* AtRuleDescriptorParser::ParseFontFaceDescriptor(
break; break;
case AtRuleDescriptorID::AscentOverride: case AtRuleDescriptorID::AscentOverride:
case AtRuleDescriptorID::DescentOverride: case AtRuleDescriptorID::DescentOverride:
case AtRuleDescriptorID::LineGapOverride:
parsed_value = ConsumeFontMetricOverride(range, context); parsed_value = ConsumeFontMetricOverride(range, context);
break; break;
case AtRuleDescriptorID::LetterSpacingOverride: case AtRuleDescriptorID::LetterSpacingOverride:
......
...@@ -57,6 +57,9 @@ ...@@ -57,6 +57,9 @@
{ {
name: "letter-spacing-override" name: "letter-spacing-override"
}, },
{
name: "line-gap-override",
},
{ {
name: "max-height", name: "max-height",
}, },
......
...@@ -12,6 +12,7 @@ namespace blink { ...@@ -12,6 +12,7 @@ namespace blink {
struct FontMetricsOverride { struct FontMetricsOverride {
base::Optional<float> ascent_override; base::Optional<float> ascent_override;
base::Optional<float> descent_override; base::Optional<float> descent_override;
base::Optional<float> line_gap_override;
base::Optional<float> letter_spacing_override; base::Optional<float> letter_spacing_override;
}; };
......
...@@ -126,7 +126,12 @@ void SimpleFontData::PlatformInit(bool subpixel_ascent_descent, ...@@ -126,7 +126,12 @@ void SimpleFontData::PlatformInit(bool subpixel_ascent_descent,
font_metrics_.SetHasXHeight(false); font_metrics_.SetHasXHeight(false);
} }
float line_gap = SkScalarToFloat(metrics.fLeading); float line_gap;
if (metrics_override.line_gap_override) {
line_gap = *metrics_override.line_gap_override * platform_data_.size();
} else {
line_gap = SkScalarToFloat(metrics.fLeading);
}
font_metrics_.SetLineGap(line_gap); font_metrics_.SetLineGap(line_gap);
font_metrics_.SetLineSpacing(lroundf(ascent) + lroundf(descent) + font_metrics_.SetLineSpacing(lroundf(ascent) + lroundf(descent) +
lroundf(line_gap)); lroundf(line_gap));
......
...@@ -216,6 +216,7 @@ letterSpacing ...@@ -216,6 +216,7 @@ letterSpacing
letterSpacingOverride letterSpacingOverride
lightingColor lightingColor
lineBreak lineBreak
lineGapOverride
lineHeight lineHeight
lineHeightStep lineHeightStep
listStyle listStyle
......
<!DOCTYPE html>
<meta charset="utf-8">
<title>Tests the ascent-override and descent-override descriptors of @font-face</title>
<style>
.target {
position: absolute;
font-size: 20px;
top: 10px;
left: 10px;
width: 60px;
height: 30px;
}
.character {
display: inline-block;
background-color: green;
width: 1em; /* Same as an 'X' in Ahem */
height: 1em; /* Same as an 'X' in Ahem */
position: absolute;
}
</style>
<div class="target">
<span class="character" style="top: 0.5em; left: 0"></span>
<span class="character" style="top: 2.5em; left: 0"></span>
</div>
<!DOCTYPE html>
<meta charset="utf-8">
<link rel="author" href="mailto:xiaochengh@chromium.org">
<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/4792">
<link rel="match" href="line-gap-override-ref.html">
<title>Tests the line-gap-override descriptor of @font-face</title>
<style>
@font-face {
font-family: custom-font;
src: local(Ahem), url(/fonts/Ahem.ttf);
line-gap-override: 100%;
}
.target {
font: 20px custom-font;
color: green;
position: absolute;
top: 10px;
left: 10px;
}
</style>
<div class="target">
X<br>
X
</div>
...@@ -45562,6 +45562,7 @@ Called by update_use_counter_css.py.--> ...@@ -45562,6 +45562,7 @@ Called by update_use_counter_css.py.-->
<int value="672" label="ascent-override"/> <int value="672" label="ascent-override"/>
<int value="673" label="descent-override"/> <int value="673" label="descent-override"/>
<int value="674" label="letter-spacing-override"/> <int value="674" label="letter-spacing-override"/>
<int value="675" label="line-gap-override"/>
</enum> </enum>
<enum name="MappedEditingCommands"> <enum name="MappedEditingCommands">
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment