mirror of
https://github.com/servo/servo.git
synced 2025-08-14 18:05:36 +01:00
style: Don't clamp font-size calc() factors too early.
These two bugs (bug 1572738 and bug 1572451) are stylo regressions. When font-family changes, we try to recompute the font-size with a length / percentage combinations in case the generic family changes, so the user preferences are kept. When calc() is involved, we clamp to non-negative too early, via NonNegativeLength::scale_by. I think we should generally dump this "try to track font-size across calc()" thingie, as as various comments note it is not quite perfect, and it's not clear how it should work in presence of min()/max(). This patch fixes the issue and simplifies code a bit, I may consider removing this altogether in a follow-up. Differential Revision: https://phabricator.services.mozilla.com/D41776
This commit is contained in:
parent
bff52ae4a1
commit
9404ac89b7
8 changed files with 149 additions and 169 deletions
|
@ -5,14 +5,13 @@
|
|||
//! Generic types for font stuff.
|
||||
|
||||
use crate::parser::{Parse, ParserContext};
|
||||
use app_units::Au;
|
||||
use byteorder::{BigEndian, ReadBytesExt};
|
||||
use cssparser::Parser;
|
||||
use num_traits::One;
|
||||
use std::fmt::{self, Write};
|
||||
use std::io::Cursor;
|
||||
use style_traits::{CssWriter, KeywordsCollectFn, ParseError};
|
||||
use style_traits::{SpecifiedValueInfo, StyleParseErrorKind, ToCss};
|
||||
use style_traits::{CssWriter, ParseError};
|
||||
use style_traits::{StyleParseErrorKind, ToCss};
|
||||
|
||||
/// https://drafts.csswg.org/css-fonts-4/#feature-tag-value
|
||||
#[derive(
|
||||
|
@ -172,104 +171,6 @@ impl Parse for FontTag {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(
|
||||
Animate,
|
||||
Clone,
|
||||
ComputeSquaredDistance,
|
||||
Copy,
|
||||
Debug,
|
||||
MallocSizeOf,
|
||||
PartialEq,
|
||||
ToAnimatedValue,
|
||||
ToAnimatedZero,
|
||||
ToCss,
|
||||
ToShmem,
|
||||
)]
|
||||
/// Additional information for keyword-derived font sizes.
|
||||
pub struct KeywordInfo<Length> {
|
||||
/// The keyword used
|
||||
pub kw: KeywordSize,
|
||||
/// A factor to be multiplied by the computed size of the keyword
|
||||
#[css(skip)]
|
||||
pub factor: f32,
|
||||
/// An additional Au offset to add to the kw*factor in the case of calcs
|
||||
#[css(skip)]
|
||||
pub offset: Length,
|
||||
}
|
||||
|
||||
impl<L> KeywordInfo<L>
|
||||
where
|
||||
Au: Into<L>,
|
||||
{
|
||||
/// KeywordInfo value for font-size: medium
|
||||
pub fn medium() -> Self {
|
||||
KeywordSize::Medium.into()
|
||||
}
|
||||
}
|
||||
|
||||
impl<L> From<KeywordSize> for KeywordInfo<L>
|
||||
where
|
||||
Au: Into<L>,
|
||||
{
|
||||
fn from(x: KeywordSize) -> Self {
|
||||
KeywordInfo {
|
||||
kw: x,
|
||||
factor: 1.,
|
||||
offset: Au(0).into(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<L> SpecifiedValueInfo for KeywordInfo<L> {
|
||||
fn collect_completion_keywords(f: KeywordsCollectFn) {
|
||||
<KeywordSize as SpecifiedValueInfo>::collect_completion_keywords(f);
|
||||
}
|
||||
}
|
||||
|
||||
/// CSS font keywords
|
||||
#[derive(
|
||||
Animate,
|
||||
Clone,
|
||||
ComputeSquaredDistance,
|
||||
Copy,
|
||||
Debug,
|
||||
MallocSizeOf,
|
||||
Parse,
|
||||
PartialEq,
|
||||
SpecifiedValueInfo,
|
||||
ToAnimatedValue,
|
||||
ToAnimatedZero,
|
||||
ToCss,
|
||||
ToShmem,
|
||||
)]
|
||||
#[allow(missing_docs)]
|
||||
pub enum KeywordSize {
|
||||
#[css(keyword = "xx-small")]
|
||||
XXSmall,
|
||||
XSmall,
|
||||
Small,
|
||||
Medium,
|
||||
Large,
|
||||
XLarge,
|
||||
#[css(keyword = "xx-large")]
|
||||
XXLarge,
|
||||
#[css(keyword = "xxx-large")]
|
||||
XXXLarge,
|
||||
}
|
||||
|
||||
impl KeywordSize {
|
||||
/// Convert to an HTML <font size> value
|
||||
#[inline]
|
||||
pub fn html_size(self) -> u8 {
|
||||
self as u8
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for KeywordSize {
|
||||
fn default() -> Self {
|
||||
KeywordSize::Medium
|
||||
}
|
||||
}
|
||||
|
||||
/// A generic value for the `font-style` property.
|
||||
///
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue