From 552a849744056a5b504ce2efefa04c4bf020b2eb Mon Sep 17 00:00:00 2001 From: Mason Chang Date: Thu, 2 Feb 2017 12:07:40 -0800 Subject: [PATCH] Pass GlyphKey to get glyph dimensions and rasterize glyphs --- webrender/src/platform/macos/font.rs | 36 ++++++++----------- webrender/src/platform/unix/font.rs | 25 +++++-------- webrender/src/platform/windows/font.rs | 50 +++++++++----------------- webrender/src/resource_cache.rs | 13 ++----- 4 files changed, 42 insertions(+), 82 deletions(-) diff --git a/webrender/src/platform/macos/font.rs b/webrender/src/platform/macos/font.rs index 957e44aa96..a7cbaa8c0d 100644 --- a/webrender/src/platform/macos/font.rs +++ b/webrender/src/platform/macos/font.rs @@ -16,7 +16,7 @@ use core_text; use std::collections::HashMap; use std::collections::hash_map::Entry; use webrender_traits::{ColorU, FontKey, FontRenderMode, GlyphDimensions}; -use webrender_traits::{GlyphOptions, SubpixelOffset}; +use webrender_traits::{GlyphKey, GlyphOptions, SubpixelOffset}; use gamma_lut::{GammaLut, Color as ColorLut}; pub struct FontContext { @@ -169,14 +169,12 @@ impl FontContext { } pub fn get_glyph_dimensions(&mut self, - font_key: FontKey, - size: Au, - character: u32, - x_subpixel: SubpixelOffset, - y_subpixel: SubpixelOffset) -> Option { - self.get_ct_font(font_key, size).and_then(|ref ct_font| { - let glyph = character as CGGlyph; - let metrics = get_glyph_metrics(ct_font, glyph, x_subpixel, y_subpixel); + key: &GlyphKey) -> Option { + self.get_ct_font(key.font_key, key.size).and_then(|ref ct_font| { + let glyph = key.index as CGGlyph; + let metrics = get_glyph_metrics(ct_font, glyph, + key.x_suboffset, + key.y_suboffset); if metrics.rasterized_width == 0 || metrics.rasterized_height == 0 { None } else { @@ -230,19 +228,15 @@ impl FontContext { } pub fn rasterize_glyph(&mut self, - font_key: FontKey, - size: Au, - color: ColorU, - character: u32, + key: &GlyphKey, render_mode: FontRenderMode, - x_suboffset: SubpixelOffset, - y_suboffset: SubpixelOffset, _glyph_options: Option) -> Option { - match self.get_ct_font(font_key, size) { + match self.get_ct_font(key.font_key, key.size) { Some(ref ct_font) => { - let glyph = character as CGGlyph; - let metrics = get_glyph_metrics(ct_font, glyph, x_suboffset, y_suboffset); + let glyph = key.index as CGGlyph; + let metrics = get_glyph_metrics(ct_font, glyph, + key.x_suboffset, key.y_suboffset); if metrics.rasterized_width == 0 || metrics.rasterized_height == 0 { return Some(RasterizedGlyph::blank()) } @@ -300,8 +294,8 @@ impl FontContext { cg_context.set_allows_antialiasing(antialias); cg_context.set_should_antialias(antialias); - let y_offset :f64 = y_suboffset.into(); - let x_offset :f64 = y_suboffset.into(); + let y_offset :f64 = key.y_suboffset.into(); + let x_offset :f64 = key.y_suboffset.into(); // CG Origin is bottom left, WR is top left. Need -y offset let rasterization_origin = CGPoint { @@ -365,7 +359,7 @@ impl FontContext { metrics.rasterized_width as usize, metrics.rasterized_height as usize, render_mode, - color); + key.color); Some(RasterizedGlyph { width: metrics.rasterized_width, diff --git a/webrender/src/platform/unix/font.rs b/webrender/src/platform/unix/font.rs index 9584962ee4..2d2d713ad2 100644 --- a/webrender/src/platform/unix/font.rs +++ b/webrender/src/platform/unix/font.rs @@ -5,6 +5,7 @@ use app_units::Au; use webrender_traits::{FontKey, ColorU, FontRenderMode, GlyphDimensions}; use webrender_traits::{NativeFontHandle, GlyphOptions, SubpixelOffset}; +use webrender_traits::{GlyphKey}; use freetype::freetype::{FT_Render_Mode, FT_Pixel_Mode}; use freetype::freetype::{FT_Done_FreeType, FT_Library_SetLcdFilter}; @@ -112,14 +113,9 @@ impl FontContext { None } - pub fn get_glyph_dimensions(&self, - font_key: FontKey, - size: Au, - character: u32, - _x_subpixel: SubpixelOffset, - _y_subpixel: SubpixelOffset) - -> Option { - self.load_glyph(font_key, size, character).and_then(|slot| { + pub fn get_glyph_dimensions(&mut self, + key: &GlyphKey) -> Option { + self.load_glyph(key.font_key, key.size, key.index).and_then(|slot| { let metrics = unsafe { &(*slot).metrics }; if metrics.width == 0 || metrics.height == 0 { None @@ -135,20 +131,15 @@ impl FontContext { } pub fn rasterize_glyph(&mut self, - font_key: FontKey, - size: Au, - _color: ColorU, - character: u32, + key: &GlyphKey, render_mode: FontRenderMode, - _x_suboffset: SubpixelOffset, - _y_suboffset: SubpixelOffset, _glyph_options: Option) -> Option { let mut glyph = None; - if let Some(slot) = self.load_glyph(font_key, - size, - character) { + if let Some(slot) = self.load_glyph(key.font_key, + key.size, + key.index) { let render_mode = match render_mode { FontRenderMode::Mono => FT_Render_Mode::FT_RENDER_MODE_MONO, FontRenderMode::Alpha => FT_Render_Mode::FT_RENDER_MODE_NORMAL, diff --git a/webrender/src/platform/windows/font.rs b/webrender/src/platform/windows/font.rs index 76515a5df2..99e64c302b 100644 --- a/webrender/src/platform/windows/font.rs +++ b/webrender/src/platform/windows/font.rs @@ -4,8 +4,8 @@ use app_units::Au; use std::collections::HashMap; -use webrender_traits::{FontKey, ColorU, FontRenderMode, GlyphDimensions}; -use webrender_traits::{GlyphOptions, SubpixelOffset}; +use webrender_traits::{FontKey, FontRenderMode, GlyphDimensions}; +use webrender_traits::{GlyphKey, GlyphOptions, SubpixelOffset}; use gamma_lut::{GammaLut, Color as ColorLut}; use dwrote; @@ -156,23 +156,18 @@ impl FontContext { } } - fn create_glyph_analysis(&self, font_key: FontKey, - size: Au, glyph: u32, + fn create_glyph_analysis(&self, key: &GlyphKey, render_mode: FontRenderMode, - x_suboffset: SubpixelOffset, - y_suboffset: SubpixelOffset, options: Option) -> dwrote::GlyphRunAnalysis { - let face = self.fonts.get(&font_key).unwrap(); - let glyph = glyph as u16; - - let glyph = glyph as u16; + let face = self.fonts.get(&key.font_key).unwrap(); + let glyph = key.index as u16; let advance = 0.0f32; let offset = dwrote::GlyphOffset { advanceOffset: 0.0, ascenderOffset: 0.0 }; let glyph_run = dwrote::DWRITE_GLYPH_RUN { fontFace: unsafe { face.as_ptr() }, - fontEmSize: size.to_f32_px(), // size in DIPs (1/96", same as CSS pixels) + fontEmSize: key.size.to_f32_px(), // size in DIPs (1/96", same as CSS pixels) glyphCount: 1, glyphIndices: &glyph, glyphAdvances: &advance, @@ -184,12 +179,12 @@ impl FontContext { let dwrite_measure_mode = dwrite_measure_mode(render_mode, options); let dwrite_render_mode = dwrite_render_mode(face, render_mode, - size.to_f32_px(), + key.size.to_f32_px(), dwrite_measure_mode, options); - let x_offset: f32 = Into::::into(x_suboffset) as f32; - let y_offset: f32 = Into::::into(y_suboffset) as f32; + let x_offset: f32 = Into::::into(key.x_suboffset) as f32; + let y_offset: f32 = Into::::into(key.y_suboffset) as f32; let transform = Some( dwrote::DWRITE_MATRIX { m11: 1.0, m12: 0.0, m21: 0.0, m22: 1.0, dx: x_offset, dy: y_offset } @@ -203,18 +198,11 @@ impl FontContext { // TODO: Pipe GlyphOptions into glyph_dimensions too pub fn get_glyph_dimensions(&self, - font_key: FontKey, - size: Au, - glyph: u32, - x_suboffset: SubpixelOffset, - y_suboffset: SubpixelOffset) + key: &GlyphKey) -> Option { // Probably have to default to something else here. let render_mode = FontRenderMode::Subpixel; - let analysis = self.create_glyph_analysis(font_key, size, - glyph, render_mode, - x_suboffset, y_suboffset, - None); + let analysis = self.create_glyph_analysis(key, render_mode, None); let texture_type = dwrite_texture_type(render_mode); Some(get_glyph_dimensions_with_analysis(analysis, texture_type)) @@ -267,19 +255,12 @@ impl FontContext { } pub fn rasterize_glyph(&mut self, - font_key: FontKey, - size: Au, - color: ColorU, - glyph: u32, + key: &GlyphKey, render_mode: FontRenderMode, - x_suboffset: SubpixelOffset, - y_suboffset: SubpixelOffset, glyph_options: Option) -> Option { - let analysis = self.create_glyph_analysis(font_key, size, glyph, + let analysis = self.create_glyph_analysis(key, render_mode, - x_suboffset, - y_suboffset, glyph_options); let texture_type = dwrite_texture_type(render_mode); @@ -301,7 +282,10 @@ impl FontContext { }; lut_correction.preblend_rgb(&mut pixels, width, height, - ColorLut::new(color.r, color.g, color.b, color.a)); + ColorLut::new(key.color.r, + key.color.g, + key.color.b, + key.color.a)); let rgba_pixels = self.convert_to_rgba(&mut pixels, render_mode); diff --git a/webrender/src/resource_cache.rs b/webrender/src/resource_cache.rs index e7bbf3401d..7341ae5175 100644 --- a/webrender/src/resource_cache.rs +++ b/webrender/src/resource_cache.rs @@ -417,11 +417,7 @@ impl ResourceCache { } } - dimensions = font_context.get_glyph_dimensions(glyph_key.font_key, - glyph_key.size, - glyph_key.index, - glyph_key.x_suboffset, - glyph_key.y_suboffset); + dimensions = font_context.get_glyph_dimensions(glyph_key); }); *entry.insert(dimensions) @@ -708,13 +704,8 @@ fn spawn_glyph_cache_thread() -> (Sender, Receiver