mirror of
https://github.com/storytold/vectorcraft.git
synced 2026-10-24 09:46:59 -06:00
Merge pull request #3894 from lehni/refactor/colour-key
Renderer: colour caches key colours with Color::key
This commit is contained in:
@@ -20,7 +20,6 @@ use vectorcraft_geom::{Affine, Rect};
|
|||||||
use vello_cpu::peniko::{Extend, ImageQuality, ImageSampler};
|
use vello_cpu::peniko::{Extend, ImageQuality, ImageSampler};
|
||||||
use vello_cpu::{Pixmap, RenderContext};
|
use vello_cpu::{Pixmap, RenderContext};
|
||||||
|
|
||||||
use crate::freeform::hash_color;
|
|
||||||
use crate::ink::Ink;
|
use crate::ink::Ink;
|
||||||
use crate::lru::{self, FrameCache};
|
use crate::lru::{self, FrameCache};
|
||||||
|
|
||||||
@@ -60,7 +59,7 @@ fn key(g: &GradientPaint, b: Rect, cols: u16, rows: u16, win: &[Range<u16>; 2],
|
|||||||
(gr.kind as u8, gr.dither, gr.method as u8).hash(&mut h);
|
(gr.kind as u8, gr.dither, gr.method as u8).hash(&mut h);
|
||||||
for s in &gr.stops {
|
for s in &gr.stops {
|
||||||
(s.offset.to_bits(), s.opacity.to_bits(), s.midpoint.to_bits()).hash(&mut h);
|
(s.offset.to_bits(), s.opacity.to_bits(), s.midpoint.to_bits()).hash(&mut h);
|
||||||
hash_color(&s.color, &mut h);
|
s.color.key().hash(&mut h);
|
||||||
}
|
}
|
||||||
let geom = g.resolve(b);
|
let geom = g.resolve(b);
|
||||||
(geom.start.x.to_bits(), geom.start.y.to_bits(), geom.end.x.to_bits(), geom.end.y.to_bits(), geom.aspect.to_bits()).hash(&mut h);
|
(geom.start.x.to_bits(), geom.start.y.to_bits(), geom.end.x.to_bits(), geom.end.y.to_bits(), geom.aspect.to_bits()).hash(&mut h);
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ use std::hash::{Hash, Hasher};
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use vectorcraft_color::freeform::{grid_size, painted_box, spread_scale};
|
use vectorcraft_color::freeform::{grid_size, painted_box, spread_scale};
|
||||||
use vectorcraft_color::{Color, Freeform, GradientPaint};
|
use vectorcraft_color::{Freeform, GradientPaint};
|
||||||
use vectorcraft_geom::{Affine, Rect};
|
use vectorcraft_geom::{Affine, Rect};
|
||||||
use vello_cpu::peniko::{Extend, ImageQuality, ImageSampler};
|
use vello_cpu::peniko::{Extend, ImageQuality, ImageSampler};
|
||||||
use vello_cpu::{Pixmap, RenderContext};
|
use vello_cpu::{Pixmap, RenderContext};
|
||||||
@@ -24,22 +24,13 @@ thread_local! {
|
|||||||
static GRIDS: RefCell<FrameCache<u64, Arc<Pixmap>>> = RefCell::new(FrameCache::new(lru::FREEFORM_BUDGET, usize::MAX));
|
static GRIDS: RefCell<FrameCache<u64, Arc<Pixmap>>> = RefCell::new(FrameCache::new(lru::FREEFORM_BUDGET, usize::MAX));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn hash_color(c: &Color, h: &mut impl Hasher) {
|
|
||||||
match *c {
|
|
||||||
Color::Rgb { r, g, b } => (0u8, r.to_bits(), g.to_bits(), b.to_bits()).hash(h),
|
|
||||||
Color::Cmyk { c, m, y, k } => (1u8, c.to_bits(), m.to_bits(), y.to_bits(), k.to_bits()).hash(h),
|
|
||||||
Color::Gray { k } => (2u8, k.to_bits()).hash(h),
|
|
||||||
Color::Lab { l, a, b } => (3u8, l.to_bits(), a.to_bits(), b.to_bits()).hash(h),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Cache key of the grid of `f` on box `b` at `cols` × `rows` painted with `ink` (and the active
|
/// Cache key of the grid of `f` on box `b` at `cols` × `rows` painted with `ink` (and the active
|
||||||
/// colour settings, which turn colours into display RGB or inks).
|
/// colour settings, which turn colours into display RGB or inks).
|
||||||
fn key(f: &Freeform, b: Rect, cols: u16, rows: u16, ink: Ink) -> u64 {
|
fn key(f: &Freeform, b: Rect, cols: u16, rows: u16, ink: Ink) -> u64 {
|
||||||
let mut h = std::collections::hash_map::DefaultHasher::new();
|
let mut h = std::collections::hash_map::DefaultHasher::new();
|
||||||
for p in &f.points {
|
for p in &f.points {
|
||||||
(p.at.x.to_bits(), p.at.y.to_bits(), p.opacity.to_bits(), p.spread.to_bits()).hash(&mut h);
|
(p.at.x.to_bits(), p.at.y.to_bits(), p.opacity.to_bits(), p.spread.to_bits()).hash(&mut h);
|
||||||
hash_color(&p.color, &mut h);
|
p.color.key().hash(&mut h);
|
||||||
}
|
}
|
||||||
f.lines.hash(&mut h);
|
f.lines.hash(&mut h);
|
||||||
(b.x0.to_bits(), b.y0.to_bits(), b.x1.to_bits(), b.y1.to_bits(), cols, rows).hash(&mut h);
|
(b.x0.to_bits(), b.y0.to_bits(), b.x1.to_bits(), b.y1.to_bits(), cols, rows).hash(&mut h);
|
||||||
|
|||||||
@@ -121,12 +121,12 @@ impl Renderer {
|
|||||||
/// The inks of `c` in the working CMYK space: CMYK as it is, grey as black ink, RGB and Lab
|
/// The inks of `c` in the working CMYK space: CMYK as it is, grey as black ink, RGB and Lab
|
||||||
/// separated with the colour settings' intent (cached: separating searches the profile).
|
/// separated with the colour settings' intent (cached: separating searches the profile).
|
||||||
fn inks(c: &Color) -> [f32; 4] {
|
fn inks(c: &Color) -> [f32; 4] {
|
||||||
let key = match *c {
|
match *c {
|
||||||
Color::Cmyk { c, m, y, k } => return [c, m, y, k],
|
Color::Cmyk { c, m, y, k } => return [c, m, y, k],
|
||||||
Color::Gray { k } => return [0.0, 0.0, 0.0, k],
|
Color::Gray { k } => return [0.0, 0.0, 0.0, k],
|
||||||
Color::Rgb { r, g, b } => [0, r.to_bits(), g.to_bits(), b.to_bits()],
|
Color::Rgb { .. } | Color::Lab { .. } => {}
|
||||||
Color::Lab { l, a, b } => [1, l.to_bits(), a.to_bits(), b.to_bits()],
|
}
|
||||||
};
|
let key = c.key();
|
||||||
let cms = cms::active();
|
let cms = cms::active();
|
||||||
SEPARATED.with(|s| {
|
SEPARATED.with(|s| {
|
||||||
let (owner, seen) = &mut *s.borrow_mut();
|
let (owner, seen) = &mut *s.borrow_mut();
|
||||||
@@ -141,7 +141,7 @@ fn inks(c: &Color) -> [f32; 4] {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Separated colours, for the colour settings they were separated with.
|
/// Separated colours, for the colour settings they were separated with.
|
||||||
type Separated = (Option<Arc<Cms>>, HashMap<[u32; 4], [f32; 4]>);
|
type Separated = (Option<Arc<Cms>>, HashMap<[u32; 5], [f32; 4]>);
|
||||||
|
|
||||||
thread_local! {
|
thread_local! {
|
||||||
static SEPARATED: RefCell<Separated> = RefCell::default();
|
static SEPARATED: RefCell<Separated> = RefCell::default();
|
||||||
|
|||||||
Reference in New Issue
Block a user