Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

stylo: Make font base size computation threadsafe #16316

Merged
merged 3 commits into from Apr 9, 2017
Merged
Changes from 1 commit
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

Next

stylo: Bypass cache when fetching font size prefs from Stylo

  • Loading branch information
Manishearth committed Apr 9, 2017
commit 2ea8d61fbf0c2d9142a6db875e9eeb4343b0bab1
@@ -338,6 +338,7 @@ mod bindings {
"FontFamilyListRefCnt",
"FontFamilyName",
"FontFamilyType",
"FontSizePrefs",
"FragmentOrURL",
"FrameRequestCallback",
"GeckoParserExtraData",
@@ -623,6 +624,7 @@ mod bindings {
"ComputedTimingFunction_BeforeFlag",
"FontFamilyList",
"FontFamilyType",
"FontSizePrefs",
"Keyframe",
"ServoBundledURI",
"ServoElementSnapshot",
@@ -27,6 +27,7 @@ use gecko_bindings::structs::TraversalRootBehavior;
use gecko_bindings::structs::ComputedTimingFunction_BeforeFlag;
use gecko_bindings::structs::FontFamilyList;
use gecko_bindings::structs::FontFamilyType;
use gecko_bindings::structs::FontSizePrefs;
use gecko_bindings::structs::Keyframe;
use gecko_bindings::structs::ServoBundledURI;
use gecko_bindings::structs::ServoElementSnapshot;
@@ -1062,10 +1063,9 @@ extern "C" {
aSource: *const nsStyleFont);
}
extern "C" {
pub fn Gecko_nsStyleFont_GetBaseSize(font: *const nsStyleFont,
pres_context:
RawGeckoPresContextBorrowed)
-> nscoord;
pub fn Gecko_GetBaseSize(lang: *mut nsIAtom,
pres_context: RawGeckoPresContextBorrowed)
-> FontSizePrefs;
}
extern "C" {
pub fn Gecko_GetMediaFeatures() -> *const nsMediaFeature;
fn clone(&self) -> Self { *self }
}
#[repr(C)]
#[derive(Debug, Copy)]
pub struct FontSizePrefs {
pub mDefaultVariableSize: root::nscoord,
pub mDefaultFixedSize: root::nscoord,
pub mDefaultSerifSize: root::nscoord,
pub mDefaultSansSerifSize: root::nscoord,
pub mDefaultMonospaceSize: root::nscoord,
pub mDefaultCursiveSize: root::nscoord,
pub mDefaultFantasySize: root::nscoord,
}
#[test]
fn bindgen_test_layout_FontSizePrefs() {
assert_eq!(::std::mem::size_of::<FontSizePrefs>() , 28usize , concat !
( "Size of: " , stringify ! ( FontSizePrefs ) ));
assert_eq! (::std::mem::align_of::<FontSizePrefs>() , 4usize , concat
! ( "Alignment of " , stringify ! ( FontSizePrefs ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const FontSizePrefs ) ) .
mDefaultVariableSize as * const _ as usize } , 0usize ,
concat ! (
"Alignment of field: " , stringify ! ( FontSizePrefs ) ,
"::" , stringify ! ( mDefaultVariableSize ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const FontSizePrefs ) ) . mDefaultFixedSize
as * const _ as usize } , 4usize , concat ! (
"Alignment of field: " , stringify ! ( FontSizePrefs ) ,
"::" , stringify ! ( mDefaultFixedSize ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const FontSizePrefs ) ) . mDefaultSerifSize
as * const _ as usize } , 8usize , concat ! (
"Alignment of field: " , stringify ! ( FontSizePrefs ) ,
"::" , stringify ! ( mDefaultSerifSize ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const FontSizePrefs ) ) .
mDefaultSansSerifSize as * const _ as usize } , 12usize ,
concat ! (
"Alignment of field: " , stringify ! ( FontSizePrefs ) ,
"::" , stringify ! ( mDefaultSansSerifSize ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const FontSizePrefs ) ) .
mDefaultMonospaceSize as * const _ as usize } , 16usize ,
concat ! (
"Alignment of field: " , stringify ! ( FontSizePrefs ) ,
"::" , stringify ! ( mDefaultMonospaceSize ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const FontSizePrefs ) ) .
mDefaultCursiveSize as * const _ as usize } , 20usize ,
concat ! (
"Alignment of field: " , stringify ! ( FontSizePrefs ) ,
"::" , stringify ! ( mDefaultCursiveSize ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const FontSizePrefs ) ) .
mDefaultFantasySize as * const _ as usize } , 24usize ,
concat ! (
"Alignment of field: " , stringify ! ( FontSizePrefs ) ,
"::" , stringify ! ( mDefaultFantasySize ) ));
}
impl Clone for FontSizePrefs {
fn clone(&self) -> Self { *self }
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct nsROCSSPrimitiveValue([u8; 0]);
#[repr(C)]
fn clone(&self) -> Self { *self }
}
#[repr(C)]
#[derive(Debug, Copy)]
pub struct FontSizePrefs {
pub mDefaultVariableSize: root::nscoord,
pub mDefaultFixedSize: root::nscoord,
pub mDefaultSerifSize: root::nscoord,
pub mDefaultSansSerifSize: root::nscoord,
pub mDefaultMonospaceSize: root::nscoord,
pub mDefaultCursiveSize: root::nscoord,
pub mDefaultFantasySize: root::nscoord,
}
#[test]
fn bindgen_test_layout_FontSizePrefs() {
assert_eq!(::std::mem::size_of::<FontSizePrefs>() , 28usize , concat !
( "Size of: " , stringify ! ( FontSizePrefs ) ));
assert_eq! (::std::mem::align_of::<FontSizePrefs>() , 4usize , concat
! ( "Alignment of " , stringify ! ( FontSizePrefs ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const FontSizePrefs ) ) .
mDefaultVariableSize as * const _ as usize } , 0usize ,
concat ! (
"Alignment of field: " , stringify ! ( FontSizePrefs ) ,
"::" , stringify ! ( mDefaultVariableSize ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const FontSizePrefs ) ) . mDefaultFixedSize
as * const _ as usize } , 4usize , concat ! (
"Alignment of field: " , stringify ! ( FontSizePrefs ) ,
"::" , stringify ! ( mDefaultFixedSize ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const FontSizePrefs ) ) . mDefaultSerifSize
as * const _ as usize } , 8usize , concat ! (
"Alignment of field: " , stringify ! ( FontSizePrefs ) ,
"::" , stringify ! ( mDefaultSerifSize ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const FontSizePrefs ) ) .
mDefaultSansSerifSize as * const _ as usize } , 12usize ,
concat ! (
"Alignment of field: " , stringify ! ( FontSizePrefs ) ,
"::" , stringify ! ( mDefaultSansSerifSize ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const FontSizePrefs ) ) .
mDefaultMonospaceSize as * const _ as usize } , 16usize ,
concat ! (
"Alignment of field: " , stringify ! ( FontSizePrefs ) ,
"::" , stringify ! ( mDefaultMonospaceSize ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const FontSizePrefs ) ) .
mDefaultCursiveSize as * const _ as usize } , 20usize ,
concat ! (
"Alignment of field: " , stringify ! ( FontSizePrefs ) ,
"::" , stringify ! ( mDefaultCursiveSize ) ));
assert_eq! (unsafe {
& ( * ( 0 as * const FontSizePrefs ) ) .
mDefaultFantasySize as * const _ as usize } , 24usize ,
concat ! (
"Alignment of field: " , stringify ! ( FontSizePrefs ) ,
"::" , stringify ! ( mDefaultFantasySize ) ));
}
impl Clone for FontSizePrefs {
fn clone(&self) -> Self { *self }
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct nsROCSSPrimitiveValue([u8; 0]);
#[repr(C)]
@@ -536,7 +536,8 @@ ${helpers.single_keyword("font-variant-caps",
type ComputedValue = Au;
#[inline]
fn to_computed_value(&self, cx: &Context) -> computed_value::T {
use gecko_bindings::bindings::Gecko_nsStyleFont_GetBaseSize;
use gecko_bindings::bindings::Gecko_GetBaseSize;
use gecko_bindings::structs;
use values::specified::length::au_to_int_px;
// Data from nsRuleNode.cpp in Gecko
// Mapping from base size and HTML size to pixels
@@ -561,10 +562,18 @@ ${helpers.single_keyword("font-variant-caps",

// XXXManishearth handle quirks mode

let base_size = unsafe {
Gecko_nsStyleFont_GetBaseSize(cx.style().get_font().gecko(),
&*cx.device.pres_context)
let base_sizes = unsafe {
Gecko_GetBaseSize(cx.style().get_font().gecko().mLanguage.raw())
};
let base_size = match cx.style().get_font().gecko().mGenericID {
structs::kGenericFont_serif => base_sizes.mDefaultSerifSize,
structs::kGenericFont_sans_serif => base_sizes.mDefaultSansSerifSize,
structs::kGenericFont_monospace => base_sizes.mDefaultMonospaceSize,
structs::kGenericFont_cursive => base_sizes.mDefaultCursiveSize,
structs::kGenericFont_fantasy => base_sizes.mDefaultFantasySize,
x => unreachable!("Unknown generic ID {}", x),
};

let base_size_px = au_to_int_px(base_size as f32);
let html_size = *self as usize;
if base_size_px >= 9 && base_size_px <= 16 {
@@ -2109,6 +2109,7 @@ pub fn apply_declarations<'a, F, I>(device: &Device,
| LonghandId::TextOrientation
| LonghandId::AnimationName
| LonghandId::TransitionProperty
| LonghandId::XLang
% endif
);
if
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.