зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1461589 - Add support for the CSS font-variant-emoji property to the style system. r=emilio
Differential Revision: https://phabricator.services.mozilla.com/D147494
This commit is contained in:
Родитель
784ccbccdb
Коммит
89c8d6a003
|
@ -69,6 +69,7 @@ exports.ANIMATION_TYPE_FOR_LONGHANDS = [
|
||||||
"font-variant-alternates",
|
"font-variant-alternates",
|
||||||
"font-variant-caps",
|
"font-variant-caps",
|
||||||
"font-variant-east-asian",
|
"font-variant-east-asian",
|
||||||
|
"font-variant-emoji",
|
||||||
"font-variant-ligatures",
|
"font-variant-ligatures",
|
||||||
"font-variant-numeric",
|
"font-variant-numeric",
|
||||||
"font-variant-position",
|
"font-variant-position",
|
||||||
|
|
|
@ -3030,6 +3030,7 @@ exports.CSS_PROPERTIES = {
|
||||||
"font-kerning",
|
"font-kerning",
|
||||||
"font-variant-alternates",
|
"font-variant-alternates",
|
||||||
"font-variant-east-asian",
|
"font-variant-east-asian",
|
||||||
|
"font-variant-emoji",
|
||||||
"font-variant-ligatures",
|
"font-variant-ligatures",
|
||||||
"font-variant-numeric",
|
"font-variant-numeric",
|
||||||
"font-variant-position",
|
"font-variant-position",
|
||||||
|
@ -6677,6 +6678,7 @@ exports.CSS_PROPERTIES = {
|
||||||
"font-optical-sizing",
|
"font-optical-sizing",
|
||||||
"font-variant-alternates",
|
"font-variant-alternates",
|
||||||
"font-variant-east-asian",
|
"font-variant-east-asian",
|
||||||
|
"font-variant-emoji",
|
||||||
"font-variant-ligatures",
|
"font-variant-ligatures",
|
||||||
"font-variant-numeric",
|
"font-variant-numeric",
|
||||||
"font-variant-position",
|
"font-variant-position",
|
||||||
|
@ -6938,6 +6940,7 @@ exports.CSS_PROPERTIES = {
|
||||||
"font-variant-caps",
|
"font-variant-caps",
|
||||||
"font-variant-alternates",
|
"font-variant-alternates",
|
||||||
"font-variant-east-asian",
|
"font-variant-east-asian",
|
||||||
|
"font-variant-emoji",
|
||||||
"font-variant-ligatures",
|
"font-variant-ligatures",
|
||||||
"font-variant-numeric",
|
"font-variant-numeric",
|
||||||
"font-variant-position"
|
"font-variant-position"
|
||||||
|
@ -6952,6 +6955,7 @@ exports.CSS_PROPERTIES = {
|
||||||
"contextual",
|
"contextual",
|
||||||
"diagonal-fractions",
|
"diagonal-fractions",
|
||||||
"discretionary-ligatures",
|
"discretionary-ligatures",
|
||||||
|
"emoji",
|
||||||
"full-width",
|
"full-width",
|
||||||
"historical-forms",
|
"historical-forms",
|
||||||
"historical-ligatures",
|
"historical-ligatures",
|
||||||
|
@ -6987,9 +6991,11 @@ exports.CSS_PROPERTIES = {
|
||||||
"super",
|
"super",
|
||||||
"swash",
|
"swash",
|
||||||
"tabular-nums",
|
"tabular-nums",
|
||||||
|
"text",
|
||||||
"titling-caps",
|
"titling-caps",
|
||||||
"traditional",
|
"traditional",
|
||||||
"unicase",
|
"unicase",
|
||||||
|
"unicode",
|
||||||
"unset"
|
"unset"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -7060,6 +7066,24 @@ exports.CSS_PROPERTIES = {
|
||||||
"unset"
|
"unset"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"font-variant-emoji": {
|
||||||
|
"isInherited": true,
|
||||||
|
"subproperties": [
|
||||||
|
"font-variant-emoji"
|
||||||
|
],
|
||||||
|
"supports": [],
|
||||||
|
"values": [
|
||||||
|
"emoji",
|
||||||
|
"inherit",
|
||||||
|
"initial",
|
||||||
|
"normal",
|
||||||
|
"revert",
|
||||||
|
"revert-layer",
|
||||||
|
"text",
|
||||||
|
"unicode",
|
||||||
|
"unset"
|
||||||
|
]
|
||||||
|
},
|
||||||
"font-variant-ligatures": {
|
"font-variant-ligatures": {
|
||||||
"isInherited": true,
|
"isInherited": true,
|
||||||
"subproperties": [
|
"subproperties": [
|
||||||
|
@ -11834,6 +11858,10 @@ exports.PREFERENCES = [
|
||||||
"font-optical-sizing",
|
"font-optical-sizing",
|
||||||
"layout.css.font-variations.enabled"
|
"layout.css.font-variations.enabled"
|
||||||
],
|
],
|
||||||
|
[
|
||||||
|
"font-variant-emoji",
|
||||||
|
"layout.css.font-variant-emoji.enabled"
|
||||||
|
],
|
||||||
[
|
[
|
||||||
"initial-letter",
|
"initial-letter",
|
||||||
"layout.css.initial-letter.enabled"
|
"layout.css.initial-letter.enabled"
|
||||||
|
|
|
@ -50,7 +50,8 @@ nsFont::MaxDifference nsFont::CalcDifference(const nsFont& aOther) const {
|
||||||
(variantLigatures != aOther.variantLigatures) ||
|
(variantLigatures != aOther.variantLigatures) ||
|
||||||
(variantNumeric != aOther.variantNumeric) ||
|
(variantNumeric != aOther.variantNumeric) ||
|
||||||
(variantPosition != aOther.variantPosition) ||
|
(variantPosition != aOther.variantPosition) ||
|
||||||
(variantWidth != aOther.variantWidth)) {
|
(variantWidth != aOther.variantWidth) ||
|
||||||
|
(variantEmoji != aOther.variantEmoji)) {
|
||||||
return MaxDifference::eLayoutAffecting;
|
return MaxDifference::eLayoutAffecting;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -70,6 +70,7 @@ struct nsFont final {
|
||||||
uint8_t variantNumeric = NS_FONT_VARIANT_NUMERIC_NORMAL;
|
uint8_t variantNumeric = NS_FONT_VARIANT_NUMERIC_NORMAL;
|
||||||
uint8_t variantPosition = NS_FONT_VARIANT_POSITION_NORMAL;
|
uint8_t variantPosition = NS_FONT_VARIANT_POSITION_NORMAL;
|
||||||
uint8_t variantWidth = NS_FONT_VARIANT_WIDTH_NORMAL;
|
uint8_t variantWidth = NS_FONT_VARIANT_WIDTH_NORMAL;
|
||||||
|
StyleFontVariantEmoji variantEmoji = StyleFontVariantEmoji::Normal;
|
||||||
|
|
||||||
// Smoothing - controls subpixel-antialiasing (currently OSX only)
|
// Smoothing - controls subpixel-antialiasing (currently OSX only)
|
||||||
uint8_t smoothing = NS_FONT_SMOOTHING_AUTO;
|
uint8_t smoothing = NS_FONT_SMOOTHING_AUTO;
|
||||||
|
|
|
@ -155,6 +155,8 @@
|
||||||
#define NS_FONT_VARIANT_WIDTH_THIRD 3
|
#define NS_FONT_VARIANT_WIDTH_THIRD 3
|
||||||
#define NS_FONT_VARIANT_WIDTH_QUARTER 4
|
#define NS_FONT_VARIANT_WIDTH_QUARTER 4
|
||||||
|
|
||||||
|
enum class StyleFontVariantEmoji : uint8_t { Normal, Text, Emoji, Unicode };
|
||||||
|
|
||||||
// based on fixed offset values used within WebKit
|
// based on fixed offset values used within WebKit
|
||||||
#define NS_FONT_SUBSCRIPT_OFFSET_RATIO (0.20)
|
#define NS_FONT_SUBSCRIPT_OFFSET_RATIO (0.20)
|
||||||
#define NS_FONT_SUPERSCRIPT_OFFSET_RATIO (0.34)
|
#define NS_FONT_SUPERSCRIPT_OFFSET_RATIO (0.34)
|
||||||
|
|
|
@ -167,6 +167,7 @@ rusty-enums = [
|
||||||
"mozilla::StyleBlend",
|
"mozilla::StyleBlend",
|
||||||
"mozilla::StyleMaskComposite",
|
"mozilla::StyleMaskComposite",
|
||||||
"mozilla::StyleWritingModeProperty",
|
"mozilla::StyleWritingModeProperty",
|
||||||
|
"StyleFontVariantEmoji",
|
||||||
]
|
]
|
||||||
allowlist-vars = [
|
allowlist-vars = [
|
||||||
"NS_ATTRVALUE_.*",
|
"NS_ATTRVALUE_.*",
|
||||||
|
|
|
@ -8058,6 +8058,13 @@
|
||||||
mirror: always
|
mirror: always
|
||||||
rust: true
|
rust: true
|
||||||
|
|
||||||
|
# Is support for font-variant-emoji enabled?
|
||||||
|
- name: layout.css.font-variant-emoji.enabled
|
||||||
|
type: RelaxedAtomicBool
|
||||||
|
value: @IS_NIGHTLY_BUILD@
|
||||||
|
mirror: always
|
||||||
|
rust: true
|
||||||
|
|
||||||
# Visibility level of font families available to CSS font-matching:
|
# Visibility level of font families available to CSS font-matching:
|
||||||
# 1 - only base system fonts
|
# 1 - only base system fonts
|
||||||
# 2 - also fonts from optional language packs
|
# 2 - also fonts from optional language packs
|
||||||
|
|
|
@ -130,6 +130,18 @@ ${helpers.predefined_type(
|
||||||
spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-east-asian",
|
spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-east-asian",
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
${helpers.single_keyword(
|
||||||
|
"font-variant-emoji",
|
||||||
|
"normal text emoji unicode",
|
||||||
|
engines="gecko",
|
||||||
|
gecko_pref="layout.css.font-variant-emoji.enabled",
|
||||||
|
has_effect_on_gecko_scrollbars=False,
|
||||||
|
gecko_enum_prefix="StyleFontVariantEmoji",
|
||||||
|
gecko_ffi_name="mFont.variantEmoji",
|
||||||
|
spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-emoji",
|
||||||
|
animation_value_type="discrete",
|
||||||
|
)}
|
||||||
|
|
||||||
${helpers.predefined_type(
|
${helpers.predefined_type(
|
||||||
"font-variant-ligatures",
|
"font-variant-ligatures",
|
||||||
"FontVariantLigatures",
|
"FontVariantLigatures",
|
||||||
|
|
|
@ -2604,7 +2604,7 @@ pub struct SourcePropertyDeclaration {
|
||||||
|
|
||||||
// This is huge, but we allocate it on the stack and then never move it,
|
// This is huge, but we allocate it on the stack and then never move it,
|
||||||
// we only pass `&mut SourcePropertyDeclaration` references around.
|
// we only pass `&mut SourcePropertyDeclaration` references around.
|
||||||
size_of_test!(SourcePropertyDeclaration, 632);
|
size_of_test!(SourcePropertyDeclaration, 664);
|
||||||
|
|
||||||
impl SourcePropertyDeclaration {
|
impl SourcePropertyDeclaration {
|
||||||
/// Create one. It’s big, try not to move it around.
|
/// Create one. It’s big, try not to move it around.
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
${'font-optical-sizing' if engine == 'gecko' else ''}
|
${'font-optical-sizing' if engine == 'gecko' else ''}
|
||||||
${'font-variant-alternates' if engine == 'gecko' else ''}
|
${'font-variant-alternates' if engine == 'gecko' else ''}
|
||||||
${'font-variant-east-asian' if engine == 'gecko' else ''}
|
${'font-variant-east-asian' if engine == 'gecko' else ''}
|
||||||
|
${'font-variant-emoji' if engine == 'gecko' else ''}
|
||||||
${'font-variant-ligatures' if engine == 'gecko' else ''}
|
${'font-variant-ligatures' if engine == 'gecko' else ''}
|
||||||
${'font-variant-numeric' if engine == 'gecko' else ''}
|
${'font-variant-numeric' if engine == 'gecko' else ''}
|
||||||
${'font-variant-position' if engine == 'gecko' else ''}
|
${'font-variant-position' if engine == 'gecko' else ''}
|
||||||
|
@ -45,10 +46,10 @@
|
||||||
<%
|
<%
|
||||||
gecko_sub_properties = "kerning language_override size_adjust \
|
gecko_sub_properties = "kerning language_override size_adjust \
|
||||||
variant_alternates variant_east_asian \
|
variant_alternates variant_east_asian \
|
||||||
variant_ligatures variant_numeric \
|
variant_emoji variant_ligatures \
|
||||||
variant_position feature_settings \
|
variant_numeric variant_position \
|
||||||
variation_settings optical_sizing \
|
feature_settings variation_settings \
|
||||||
palette".split()
|
optical_sizing palette".split()
|
||||||
%>
|
%>
|
||||||
% if engine == "gecko":
|
% if engine == "gecko":
|
||||||
% for prop in gecko_sub_properties:
|
% for prop in gecko_sub_properties:
|
||||||
|
@ -80,6 +81,7 @@
|
||||||
// line-height and palette are just reset to initial
|
// line-height and palette are just reset to initial
|
||||||
line_height: LineHeight::normal(),
|
line_height: LineHeight::normal(),
|
||||||
font_palette: FontPalette::normal(),
|
font_palette: FontPalette::normal(),
|
||||||
|
font_variant_emoji: font_variant_emoji::get_initial_specified_value(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
% endif
|
% endif
|
||||||
|
@ -194,9 +196,14 @@
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if let Some(v) = self.font_variant_emoji {
|
||||||
|
if v != &font_variant_emoji::get_initial_specified_value() {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
% for name in gecko_sub_properties:
|
% for name in gecko_sub_properties:
|
||||||
% if name != "optical_sizing" and name != "variation_settings" and name != "palette":
|
% if name != "optical_sizing" and name != "variation_settings" and name != "palette" and name != "variant_emoji":
|
||||||
if self.font_${name} != &font_${name}::get_initial_specified_value() {
|
if self.font_${name} != &font_${name}::get_initial_specified_value() {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
@ -320,11 +327,12 @@
|
||||||
sub_properties="font-variant-caps
|
sub_properties="font-variant-caps
|
||||||
${'font-variant-alternates' if engine == 'gecko' else ''}
|
${'font-variant-alternates' if engine == 'gecko' else ''}
|
||||||
${'font-variant-east-asian' if engine == 'gecko' else ''}
|
${'font-variant-east-asian' if engine == 'gecko' else ''}
|
||||||
|
${'font-variant-emoji' if engine == 'gecko' else ''}
|
||||||
${'font-variant-ligatures' if engine == 'gecko' else ''}
|
${'font-variant-ligatures' if engine == 'gecko' else ''}
|
||||||
${'font-variant-numeric' if engine == 'gecko' else ''}
|
${'font-variant-numeric' if engine == 'gecko' else ''}
|
||||||
${'font-variant-position' if engine == 'gecko' else ''}"
|
${'font-variant-position' if engine == 'gecko' else ''}"
|
||||||
spec="https://drafts.csswg.org/css-fonts-3/#propdef-font-variant">
|
spec="https://drafts.csswg.org/css-fonts-3/#propdef-font-variant">
|
||||||
<% gecko_sub_properties = "alternates east_asian ligatures numeric position".split() %>
|
<% gecko_sub_properties = "alternates east_asian emoji ligatures numeric position".split() %>
|
||||||
<%
|
<%
|
||||||
sub_properties = ["caps"]
|
sub_properties = ["caps"]
|
||||||
if engine == "gecko":
|
if engine == "gecko":
|
||||||
|
@ -399,8 +407,15 @@
|
||||||
const TOTAL_SUBPROPS: usize = ${len(sub_properties)};
|
const TOTAL_SUBPROPS: usize = ${len(sub_properties)};
|
||||||
let mut nb_normals = 0;
|
let mut nb_normals = 0;
|
||||||
% for prop in sub_properties:
|
% for prop in sub_properties:
|
||||||
if self.font_variant_${prop} == &font_variant_${prop}::get_initial_specified_value() {
|
% if prop == "emoji":
|
||||||
nb_normals += 1;
|
if let Some(value) = self.font_variant_${prop} {
|
||||||
|
% else:
|
||||||
|
{
|
||||||
|
let value = self.font_variant_${prop};
|
||||||
|
% endif
|
||||||
|
if value == &font_variant_${prop}::get_initial_specified_value() {
|
||||||
|
nb_normals += 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
% endfor
|
% endfor
|
||||||
|
|
||||||
|
@ -418,12 +433,19 @@
|
||||||
} else {
|
} else {
|
||||||
let mut has_any = false;
|
let mut has_any = false;
|
||||||
% for prop in sub_properties:
|
% for prop in sub_properties:
|
||||||
if self.font_variant_${prop} != &font_variant_${prop}::get_initial_specified_value() {
|
% if prop == "emoji":
|
||||||
if has_any {
|
if let Some(value) = self.font_variant_${prop} {
|
||||||
dest.write_str(" ")?;
|
% else:
|
||||||
|
{
|
||||||
|
let value = self.font_variant_${prop};
|
||||||
|
% endif
|
||||||
|
if value != &font_variant_${prop}::get_initial_specified_value() {
|
||||||
|
if has_any {
|
||||||
|
dest.write_str(" ")?;
|
||||||
|
}
|
||||||
|
has_any = true;
|
||||||
|
value.to_css(dest)?;
|
||||||
}
|
}
|
||||||
has_any = true;
|
|
||||||
self.font_variant_${prop}.to_css(dest)?;
|
|
||||||
}
|
}
|
||||||
% endfor
|
% endfor
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче