Skip to main content

gpui/text_system/
raster.rs

1use crate::{GlyphRenderMode, RasterStyleRequest, Rgba8};
2use std::hash::{Hash, Hasher};
3
4/// Describes which foreground channels can change rasterized color artwork.
5#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
6pub enum ForegroundDependency {
7    /// The artwork or its fallback may use the complete foreground color.
8    Full,
9    /// Fixed RGB artwork uses only the foreground alpha.
10    AlphaOnly,
11}
12
13/// The cache-relevant raster settings chosen by a platform rasterizer.
14#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
15pub struct PreparedRasterStyle {
16    /// The normalized render mode.
17    pub mode: GlyphRenderMode,
18    /// Any normalized color effect baked into coverage or color pixels.
19    pub color_effect: RasterColorEffect,
20    /// Which foreground channels can alter this raster or its fallback.
21    pub foreground_dependency: ForegroundDependency,
22}
23
24impl PreparedRasterStyle {
25    /// Creates a color-independent raster style.
26    pub const fn independent(mode: GlyphRenderMode) -> Self {
27        Self {
28            mode,
29            color_effect: RasterColorEffect::Independent,
30            foreground_dependency: ForegroundDependency::Full,
31        }
32    }
33
34    /// Creates a native preblended style from the request's relevant color channels.
35    pub fn preblend(request: RasterStyleRequest) -> Self {
36        Self {
37            mode: request.requested_mode,
38            color_effect: RasterColorEffect::Preblend(request.normalized_color()),
39            foreground_dependency: request.foreground_dependency,
40        }
41    }
42}
43
44/// The part of the requested color, if any, which changes rasterized pixels.
45#[derive(Clone, Copy, Debug, Eq, PartialEq)]
46pub enum RasterColorEffect {
47    /// Coverage and color pixels do not depend on the scene color.
48    Independent,
49    /// CoreGraphics' five-level font-smoothing dilation.
50    Dilation(u8),
51    /// A quantized color consumed by a native preblending or `currentColor` path.
52    Preblend(Rgba8),
53}
54
55impl Hash for RasterColorEffect {
56    fn hash<H: Hasher>(&self, state: &mut H) {
57        core::mem::discriminant(self).hash(state);
58
59        match self {
60            Self::Independent => {}
61            Self::Dilation(dilation) => dilation.hash(state),
62            Self::Preblend(color) => <[u8; 4]>::from(*color).hash(state),
63        }
64    }
65}