Introduce PhysicalGlyph for offsetting and scaling

This commit is contained in:
Héctor Ramón Jiménez 2023-06-20 06:07:24 +02:00
parent e8b10fd675
commit eb09cf0259
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
5 changed files with 79 additions and 38 deletions

View file

@ -14,19 +14,24 @@ pub struct LayoutGlyph {
pub start: usize,
/// End index of cluster in original line
pub end: usize,
/// Font size of the glyph
pub font_size: f32,
/// Font id of the glyph
pub font_id: fontdb::ID,
/// Font id of the glyph
pub glyph_id: u16,
/// X offset of hitbox
pub x: f32,
/// width of hitbox
/// Y offset of hitbox
pub y: f32,
/// Width of hitbox
pub w: f32,
/// Unicode BiDi embedding level, character is left-to-right if `level` is divisible by 2
pub level: unicode_bidi::Level,
/// Cache key, see [CacheKey]
pub cache_key: CacheKey,
/// X offset in line
///
/// If you are dealing with physical coordinates, you will want to use [`Self::x_int`]
/// together with [`CacheKey::x_bin`] instead. This will ensure the best alignment of the
/// rasterized glyphs with the pixel grid.
/// If you are dealing with physical coordinates, use [`Self::physical`] to obtain a
/// [`PhysicalGlyph`] for rendering.
///
/// This offset is useful when you are dealing with logical units and you do not care or
/// cannot guarantee pixel grid alignment. For instance, when you want to use the glyphs
@ -34,24 +39,47 @@ pub struct LayoutGlyph {
pub x_offset: f32,
/// Y offset in line
///
/// If you are dealing with physical coordinates, you will want to use [`Self::y_int`]
/// together with [`CacheKey::y_bin`] instead. This will ensure the best alignment of the
/// rasterized glyphs with the pixel grid.
/// If you are dealing with physical coordinates, use [`Self::physical`] to obtain a
/// [`PhysicalGlyph`] for rendering.
///
/// This offset is useful when you are dealing with logical units and you do not care or
/// cannot guarantee pixel grid alignment. For instance, when you want to use the glyphs
/// for vectorial text, apply linear transformations to the layout, etc.
pub y_offset: f32,
/// Integer component of X offset in line
pub x_int: i32,
/// Integer component of Y offset in line
pub y_int: i32,
/// Optional color override
pub color_opt: Option<Color>,
/// Metadata from `Attrs`
pub metadata: usize,
}
pub struct PhysicalGlyph {
/// Cache key, see [CacheKey]
pub cache_key: CacheKey,
/// Integer component of X offset in line
pub x: i32,
/// Integer component of Y offset in line
pub y: i32,
}
impl LayoutGlyph {
pub fn physical(&self, offset: (f32, f32), scale: f32) -> PhysicalGlyph {
let x_offset = self.font_size * self.x_offset;
let y_offset = self.font_size * self.y_offset;
let (cache_key, x, y) = CacheKey::new(
self.font_id,
self.glyph_id,
self.font_size * scale,
(
(self.x + x_offset) * scale + offset.0,
(self.y - y_offset) * scale + offset.1,
),
);
PhysicalGlyph { cache_key, x, y }
}
}
/// A line of laid out glyphs
pub struct LayoutLine {
/// Width of the line