Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 15 additions & 21 deletions webrender/src/platform/macos/font.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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<GlyphDimensions> {
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<GlyphDimensions> {
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 {
Expand Down Expand Up @@ -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<GlyphOptions>)
-> Option<RasterizedGlyph> {
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())
}
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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,
Expand Down
25 changes: 8 additions & 17 deletions webrender/src/platform/unix/font.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand Down Expand Up @@ -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<GlyphDimensions> {
self.load_glyph(font_key, size, character).and_then(|slot| {
pub fn get_glyph_dimensions(&mut self,
key: &GlyphKey) -> Option<GlyphDimensions> {
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
Expand All @@ -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<GlyphOptions>)
-> Option<RasterizedGlyph> {
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,
Expand Down
50 changes: 17 additions & 33 deletions webrender/src/platform/windows/font.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<GlyphOptions>) ->
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,
Expand All @@ -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::<f64>::into(x_suboffset) as f32;
let y_offset: f32 = Into::<f64>::into(y_suboffset) as f32;
let x_offset: f32 = Into::<f64>::into(key.x_suboffset) as f32;
let y_offset: f32 = Into::<f64>::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 }
Expand All @@ -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<GlyphDimensions> {
// 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))
Expand Down Expand Up @@ -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<GlyphOptions>)
-> Option<RasterizedGlyph> {
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);

Expand All @@ -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);

Expand Down
13 changes: 2 additions & 11 deletions webrender/src/resource_cache.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -708,13 +704,8 @@ fn spawn_glyph_cache_thread() -> (Sender<GlyphCacheMsg>, Receiver<GlyphCacheResu
thread_pool.execute(move || {
FONT_CONTEXT.with(move |font_context| {
let mut font_context = font_context.borrow_mut();
let result = font_context.rasterize_glyph(glyph_key.key.font_key,
glyph_key.key.size,
glyph_key.key.color,
glyph_key.key.index,
let result = font_context.rasterize_glyph(&glyph_key.key,
render_mode,
glyph_key.key.x_suboffset,
glyph_key.key.y_suboffset,
glyph_options);
glyph_tx.send((glyph_key, result)).unwrap();
});
Expand Down