From 03bd5e5a53f06c8e5408092ebcd4b5386c248e28 Mon Sep 17 00:00:00 2001 From: bflatastic Date: Thu, 22 Oct 2026 00:17:05 +0700 Subject: [PATCH] =?UTF-8?q?G2:=20Effect=20=E2=80=BA=20Artistic=20=E2=80=BA?= =?UTF-8?q?=20Paint=20Daubs=20raster=20filter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Squashed from #3032 onto main. --- crates/effects/src/lib.rs | 7 ++ crates/effects/src/pixel/artistic.rs | 135 ++++++++++++++++++++++- crates/effects/src/pixel/mod.rs | 17 ++- crates/effects/src/pixel/tests.rs | 30 +++++ crates/engine/src/tests_rasterfilters.rs | 4 +- crates/ui-egui/src/dialogs/effect.rs | 6 + crates/ui-egui/src/dialogs/mod.rs | 2 +- crates/ui-egui/src/i18n/bg.tsv | 9 ++ crates/ui-egui/src/i18n/cs.tsv | 9 ++ crates/ui-egui/src/i18n/da.tsv | 9 ++ crates/ui-egui/src/i18n/de.tsv | 8 ++ crates/ui-egui/src/i18n/el.tsv | 9 ++ crates/ui-egui/src/i18n/es.tsv | 9 ++ crates/ui-egui/src/i18n/fi.tsv | 9 ++ crates/ui-egui/src/i18n/fr.tsv | 9 ++ crates/ui-egui/src/i18n/hu.tsv | 9 ++ crates/ui-egui/src/i18n/id.tsv | 9 ++ crates/ui-egui/src/i18n/it.tsv | 9 ++ crates/ui-egui/src/i18n/ja.tsv | 9 ++ crates/ui-egui/src/i18n/ka.tsv | 9 ++ crates/ui-egui/src/i18n/ko.tsv | 9 ++ crates/ui-egui/src/i18n/nl.tsv | 9 ++ crates/ui-egui/src/i18n/pl.tsv | 9 ++ crates/ui-egui/src/i18n/pt-br.tsv | 9 ++ crates/ui-egui/src/i18n/ru.tsv | 9 ++ crates/ui-egui/src/i18n/sv.tsv | 9 ++ crates/ui-egui/src/i18n/uk.tsv | 9 ++ crates/ui-egui/src/i18n/vi.tsv | 9 ++ crates/ui-egui/src/i18n/zh-hans.tsv | 9 ++ crates/ui-egui/src/i18n/zh-hant.tsv | 9 ++ crates/ui-egui/src/menus.rs | 1 + crates/ui-egui/src/tests_labels.rs | 17 +++ docs/effects-parity.md | 4 +- 33 files changed, 419 insertions(+), 10 deletions(-) diff --git a/crates/effects/src/lib.rs b/crates/effects/src/lib.rs index a2b0f2a02..4cb7ac55f 100644 --- a/crates/effects/src/lib.rs +++ b/crates/effects/src/lib.rs @@ -378,6 +378,13 @@ pub fn effect_catalog() -> Vec { "{glowSize: -24..24 (5; above 0 the light areas glow, below 0 the dark ones; farther from 0 spreads the glow wider), glowBrightness: 0..50 (15; a stronger glow over dimmer greys), color: \"#rrggbb\" (\"#4da6ff\"; the glow's colour)} redraws the object in greys lit by a coloured glow, keeping its coverage. Original visual approximation; chosen VectorCraft defaults.", json!({"glowSize": 5.0, "glowBrightness": 15.0, "color": "#4da6ff"}), ), + r( + "artistic.paintDaubs", + "Paint Daubs…", + ARTISTIC, + "{brushSize: 1..50 (10; dab centres farther apart), sharpness: 0..40 (25; harder dab edges), brushType: \"simple\"|\"lightRough\"|\"darkRough\"|\"wideSharp\"|\"wideBlurry\"|\"sparkle\" (\"simple\")} repaints the object with thick round brush dabs in the local colours, keeping its coverage. Original visual approximation; chosen VectorCraft defaults.", + json!({"brushSize": 10.0, "sharpness": 25.0, "brushType": "simple"}), + ), r( "artistic.paletteKnife", "Palette Knife…", diff --git a/crates/effects/src/pixel/artistic.rs b/crates/effects/src/pixel/artistic.rs index 33eb43f5f..71381472f 100644 --- a/crates/effects/src/pixel/artistic.rs +++ b/crates/effects/src/pixel/artistic.rs @@ -1,5 +1,5 @@ -//! Effect › Artistic (Cutout, Dry Brush, Film Grain, Neon Glow, Palette Knife, Plastic Wrap, Poster Edges, Smudge Stick, Sponge and -//! Watercolor). Original filters built from +//! Effect › Artistic (Cutout, Dry Brush, Film Grain, Neon Glow, Paint Daubs, Palette Knife, Plastic Wrap, Poster +//! Edges, Smudge Stick, Sponge and Watercolor). Original filters built from //! public behaviour documentation: //! and //! . @@ -9,9 +9,9 @@ use std::f64::consts::TAU; use super::brushstrokes::{Smear, mix, stroke_reach, unit, unpremultiply}; use super::edges::sobel; -use super::pixelate::{Place, cell, rand, value_noise}; +use super::pixelate::{Around, Place, Soft, cell, point_in, rand, value_noise}; use super::texture::{luma, premultiply, straight}; -use super::{PixelSpace, blur_plane}; +use super::{PixelSpace, blur_plane, pick}; use vectorcraft_geom::{Point, Vec2}; const SALT_DRY: u64 = 264; @@ -19,6 +19,56 @@ const MARGIN: f64 = 1.0; const SALT_PLASTIC: u64 = 512; const SALT_FILM: u64 = 256; +const SALT_DAUB: u64 = 272; + +/// Paint Daubs' brush types, in the Brush Type menu's order: (label, parameter value). +/// Illustrator's list: . +pub const PAINT_DAUB_BRUSH_TYPES: [(&str, &str); 6] = [ + ("Simple", "simple"), + ("Light Rough", "lightRough"), + ("Dark Rough", "darkRough"), + ("Wide Sharp", "wideSharp"), + ("Wide Blurry", "wideBlurry"), + ("Sparkle", "sparkle"), +]; + +/// A Paint Daubs brush ([`PAINT_DAUB_BRUSH_TYPES`]). +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum PaintDaubBrush { + Simple, + LightRough, + DarkRough, + WideSharp, + WideBlurry, + Sparkle, +} + +impl PaintDaubBrush { + const ALL: [PaintDaubBrush; 6] = [ + PaintDaubBrush::Simple, + PaintDaubBrush::LightRough, + PaintDaubBrush::DarkRough, + PaintDaubBrush::WideSharp, + PaintDaubBrush::WideBlurry, + PaintDaubBrush::Sparkle, + ]; + + /// The brush of Brush Type `value` (a [`PAINT_DAUB_BRUSH_TYPES`] value, any case); Simple otherwise. + pub fn parse(value: &str) -> Self { + if value.eq_ignore_ascii_case("wideRough") { + return PaintDaubBrush::WideSharp; + } + if value.eq_ignore_ascii_case("hue") { + return PaintDaubBrush::WideBlurry; + } + pick(&PAINT_DAUB_BRUSH_TYPES, &Self::ALL, value, PaintDaubBrush::Simple) + } +} + +/// How far (document units) a dab reaches past its centre at `size` (1..50). +pub(super) fn paint_daub_radius(size: f64) -> f64 { + size.clamp(1.0, 50.0) * 0.48 +} /// Keep the last cell's four corner values: magnified adjacent pixels often share a cell. /// The cache changes only cost, never the field, and needs constant storage per raster. @@ -247,6 +297,83 @@ pub(super) fn poster_edges(px: &mut [[u8; 4]], w: usize, h: usize, space: &Pixel } } +/// Paint Daubs: thick round dabs on a grid `size` (1..50) points apart, each dab painted in the +/// local colour around its centre, with edges as sharp as `sharpness` (0..40) and a profile from +/// `kind`. Coverage is kept. +pub(super) fn paint_daubs(px: &mut [[u8; 4]], w: usize, h: usize, space: &PixelSpace, size: f64, sharpness: f64, kind: PaintDaubBrush) { + if !([size, sharpness].iter().all(|v| v.is_finite()) && size > 0.0) { + return; + } + let Some(place) = Place::new(space, w, h) else { return }; + let spacing = size.clamp(1.0, 50.0); + let brush_r = paint_daub_radius(size); + let edge = 1.0 + 2.5 * (sharpness.clamp(0.0, 40.0) / 40.0); + let soft = Soft::new(px, w, (spacing * 0.15) / place.px); + let dab = |i: i64, j: i64| { + let at = point_in(SALT_DAUB, i, j); + let center = Point::new(at.x * spacing, at.y * spacing); + (center, soft.at(place.index(center))) + }; + let cover = |q: Point, center: Point, colour: [f32; 4]| -> f32 { + if colour[3] <= 0.0 { + return 0.0; + } + let (dx, dy) = (q.x - center.x, q.y - center.y); + let (dx, dy) = match kind { + PaintDaubBrush::WideSharp | PaintDaubBrush::WideBlurry => (dx * 0.65, dy * 1.35), + _ => (dx, dy), + }; + let t = (dx.hypot(dy) / brush_r).clamp(0.0, 1.0); + let edge_k = match kind { + PaintDaubBrush::WideSharp => edge * 1.35, + PaintDaubBrush::WideBlurry => edge * 0.55, + _ => edge, + }; + let mut c = (1.0 - t).powf(edge_k) as f32; + let tone = luma(unpremultiply(colour).0); + match kind { + PaintDaubBrush::LightRough => c *= 0.7 + 0.35 * rough_bristle(q, 0), + PaintDaubBrush::DarkRough => c *= 0.55 + 0.45 * (1.0 - rough_bristle(q, 1)), + PaintDaubBrush::Sparkle if rough_bristle(center, 2) > 0.92 && tone > 0.55 => c = c.max(0.85), + PaintDaubBrush::Simple | PaintDaubBrush::WideSharp | PaintDaubBrush::WideBlurry | PaintDaubBrush::Sparkle => {} + } + c + }; + let mut around = Around::new(); + place.each(px, |x, y, out| { + if out[3] == 0 { + return; + } + let q = place.at(x, y); + let (u, v) = (q.x / spacing, q.y / spacing); + let (Some(i), Some(j)) = (cell(u), cell(v)) else { return }; + let mut sum = [0.0f32; 3]; + let mut weight = 0.0f32; + for k in 0..9 { + let Some((center, colour)) = around.get((i, j), k, dab) else { continue }; + let w = cover(q, center, colour); + if w <= 0.0 { + continue; + } + let c = unpremultiply(colour).0; + for (s, v) in sum.iter_mut().zip(c) { + *s += v * w; + } + weight += w; + } + if weight <= 1e-6 { + return; + } + let c = sum.map(|v| (v / weight).clamp(0.0, 1.0)); + *out = premultiply(c, f32::from(out[3]) / 255.0); + }); +} + +fn rough_bristle(p: Point, k: u64) -> f32 { + let (Some(i), Some(j)) = (cell(p.x * 3.7), cell(p.y * 3.7)) else { return 0.5 }; + rand(SALT_DAUB + 3, i, j, k) as f32 +} + /// How far (document units) Plastic Wrap's softened relief is sampled at `smoothness` (1..15). pub(super) fn plastic_reach(smoothness: f64) -> f64 { 3.0 * (0.15 + 0.35 * smoothness.clamp(1.0, 15.0)) diff --git a/crates/effects/src/pixel/mod.rs b/crates/effects/src/pixel/mod.rs index 253abf45b..669f9f405 100644 --- a/crates/effects/src/pixel/mod.rs +++ b/crates/effects/src/pixel/mod.rs @@ -1,4 +1,4 @@ -//! Photoshop-style raster effects (Effect › Artistic › Cutout, Dry Brush, Film Grain, Neon Glow, Plastic Wrap and +//! Photoshop-style raster effects (Effect › Artistic › Cutout, Dry Brush, Film Grain, Neon Glow, Paint Daubs, Plastic Wrap and //! Poster Edges, Smudge Stick, Sponge and Watercolor, Blur › Radial Blur and Smart Blur, Brush Strokes › Accented Edges, Angled Strokes, //! Crosshatch, Dark Strokes, Ink Outlines, Spatter, Sprayed Strokes and Sumi-e, Distort › Diffuse //! Glow, Glass and Ocean Ripple, Pixelate › Color Halftone, Crystallize, Mezzotint and Pointillize, @@ -34,6 +34,7 @@ use vectorcraft_geom::{Affine, Point, Rect}; use crate::util::{flag, num, text}; +pub use artistic::{PAINT_DAUB_BRUSH_TYPES, PaintDaubBrush}; pub use blur::{SMART_BLUR_MODES, SmartBlurMode}; pub use brushstrokes::{STROKE_DIRECTIONS, StrokeDirection}; pub use distort::{GLASS_TEXTURES, GLASS_TEXTURES_LOADED, GlassTexture}; @@ -43,11 +44,12 @@ pub use sketch::{HALFTONE_TYPES, HalftonePattern}; pub use texture::{GRAIN_TYPES, Grain, LIGHT_DIRECTIONS, Light, TEXTURES, TEXTURES_LOADED, Texture}; /// The Photoshop-style effect ids (all raster effects, see [`crate::is_raster`]). -pub const PIXEL_EFFECTS: [&str; 49] = [ +pub const PIXEL_EFFECTS: [&str; 50] = [ "artistic.cutout", "artistic.dryBrush", "artistic.filmGrain", "artistic.neonGlow", + "artistic.paintDaubs", "artistic.paletteKnife", "artistic.plasticWrap", "artistic.posterEdges", @@ -123,6 +125,9 @@ pub enum PixelFx { /// light areas (`size` above 0) or the dark ones (below 0), spread by |`size`| (-24..24), as /// strong as `brightness` (0..50). NeonGlow { size: f64, brightness: f64, colour: [f32; 3] }, + /// Artistic › Paint Daubs: dabs `size` (1..50) points apart, as sharp as `sharpness` (0..40), + /// with brush `kind`. + PaintDaubs { size: f64, sharpness: f64, kind: PaintDaubBrush }, /// Artistic › Palette Knife: knife strokes `stroke_size` (1..50) long smear the colours; /// `stroke_detail` (1..3) keeps more original detail when higher; `softness` (0..10) softens /// the strokes. @@ -342,6 +347,11 @@ pub(crate) fn parse(id: &str, p: &Value) -> Option { shadow: num(p, "shadowIntensity", 1.0).clamp(0.0, 10.0), texture: num(p, "texture", 1.0).clamp(1.0, 3.0).round() as u32, }, + "artistic.paintDaubs" => PixelFx::PaintDaubs { + size: num(p, "brushSize", 10.0).clamp(1.0, 50.0), + sharpness: num(p, "sharpness", 25.0).clamp(0.0, 40.0), + kind: PaintDaubBrush::parse(text(p, "brushType", "simple")), + }, "artistic.plasticWrap" => PixelFx::PlasticWrap { highlight: num(p, "highlightStrength", 20.0).clamp(0.0, 20.0), detail: num(p, "detail", 12.0).clamp(0.0, 15.0), @@ -557,6 +567,7 @@ impl PixelFx { PixelFx::BasRelief { .. } | PixelFx::Charcoal { .. } | PixelFx::Photocopy { .. } | PixelFx::Stamp { .. } => 0.0, PixelFx::WaterPaper { fiber_length, .. } => sketch::water_paper_shift(fiber_length), PixelFx::GlowingEdges { width, smoothness, .. } => width.max(smoothness * 3.0), + PixelFx::PaintDaubs { size, .. } => artistic::paint_daub_radius(size), // These three keep the object's coverage. PixelFx::SmudgeStick { .. } | PixelFx::Sponge { .. } | PixelFx::Watercolor { .. } => 0.0, PixelFx::FilmGrain { .. } @@ -625,6 +636,7 @@ impl PixelFx { | PixelFx::Reticulation { .. } => Some(0.0), PixelFx::DryBrush { size, detail, .. } => Some(artistic::dry_brush_reach(size, detail)), PixelFx::Plaster { smoothness, .. } => Some(sketch::plaster_reach(smoothness)), + PixelFx::PaintDaubs { size, .. } => Some(artistic::paint_daub_radius(size) + size * 0.15), PixelFx::WaterPaper { fiber_length, .. } => { Some(sketch::water_paper_shift(fiber_length) + 3.0 * (0.06 * fiber_length.clamp(3.0, 50.0)).max(0.35)) } @@ -661,6 +673,7 @@ impl PixelFx { PixelFx::SmudgeStick { stroke, highlight, intensity } => paint::smudge_stick(px, w, h, space, stroke, highlight, intensity), PixelFx::Sponge { brush, definition, smoothness } => paint::sponge(px, w, h, space, brush, definition, smoothness), PixelFx::Watercolor { detail, shadow, texture } => paint::watercolor(px, w, h, space, detail, shadow, texture), + PixelFx::PaintDaubs { size, sharpness, kind } => artistic::paint_daubs(px, w, h, space, size, sharpness, kind), PixelFx::PlasticWrap { highlight, detail, smoothness } => artistic::plastic_wrap(px, w, h, space, highlight, detail, smoothness), PixelFx::NeonGlow { size, brightness, colour } => artistic::neon_glow(px, w, h, space, size, brightness, colour), PixelFx::PaletteKnife { stroke_size, stroke_detail, softness } => { diff --git a/crates/effects/src/pixel/tests.rs b/crates/effects/src/pixel/tests.rs index 09a8d811c..62f151ada 100644 --- a/crates/effects/src/pixel/tests.rs +++ b/crates/effects/src/pixel/tests.rs @@ -2449,6 +2449,14 @@ fn artistic_params_take_defaults_and_stay_in_range() { for id in ["artistic.cutout", "artistic.dryBrush", "artistic.neonGlow", "artistic.plasticWrap", "artistic.posterEdges"] { assert_eq!(fx(id, json!({})).outset(Rect::new(0.0, 0.0, 40.0, 30.0)), 0.0, "{id} keeps the object's shape"); } + assert_eq!(fx("artistic.paintDaubs", json!({})), PixelFx::PaintDaubs { size: 10.0, sharpness: 25.0, kind: PaintDaubBrush::Simple }); + assert_eq!( + fx("artistic.paintDaubs", json!({"brushSize": 0, "sharpness": 99, "brushType": "wideBlurry"})), + PixelFx::PaintDaubs { size: 1.0, sharpness: 40.0, kind: PaintDaubBrush::WideBlurry } + ); + let doc = crate::effect_info("artistic.paintDaubs").unwrap().params; + assert!(PAINT_DAUB_BRUSH_TYPES.iter().all(|(_, v)| doc.contains(&format!("\"{v}\""))), "{doc}"); + assert!(fx("artistic.paintDaubs", json!({})).outset(Rect::new(0.0, 0.0, 40.0, 30.0)) > 0.0); } #[test] @@ -2543,6 +2551,28 @@ fn cutout_simplicity_smooths_the_pieces_edges() { assert!(changes(10.0) * 4 < changes(0.0), "{} vs {}", changes(10.0), changes(0.0)); } +#[test] +fn paint_daubs_coarsens_a_ramp_and_keeps_coverage() { + let (w, h) = (64, 32); + let src = ramp(w, h); + let mut out = src.clone(); + fx("artistic.paintDaubs", json!({"brushSize": 28, "sharpness": 35})).apply(&mut out, w, h, &space(w, h)); + assert_ne!(out, src, "dabbed art differs from the ramp"); + assert!(out.as_chunks::<4>().0.iter().zip(src.as_chunks::<4>().0).all(|(o, s)| o[3] == s[3])); +} + +#[test] +fn paint_daubs_larger_brushes_flatten_more() { + let (w, h) = (80, 40); + let src = ramp(w, h); + let dab_colours = |size: f64| { + let mut out = src.clone(); + fx("artistic.paintDaubs", json!({"brushSize": size, "sharpness": 20})).apply(&mut out, w, h, &space(w, h)); + colours(&out).len() + }; + assert!(dab_colours(35.0) < dab_colours(8.0), "{} vs {}", dab_colours(35.0), dab_colours(8.0)); +} + #[test] fn poster_edges_draw_black_lines_on_edges_and_posterize_the_rest() { let (w, h) = (40, 20); diff --git a/crates/engine/src/tests_rasterfilters.rs b/crates/engine/src/tests_rasterfilters.rs index e5b17f02a..52c4ab80c 100644 --- a/crates/engine/src/tests_rasterfilters.rs +++ b/crates/engine/src/tests_rasterfilters.rs @@ -31,11 +31,13 @@ const BRUSH_STROKES: [(&str, &str); 8] = [ ]; /// Effect › Artistic, at their defaults. -const ARTISTIC: [(&str, &str); 10] = [ +const ARTISTIC: [(&str, &str); 11] = [ ("artistic.cutout", "{}"), ("artistic.dryBrush", "{}"), ("artistic.filmGrain", "{}"), ("artistic.neonGlow", "{}"), + // Wide Blurry softens dabs; Simple leaves uniform fills unchanged on the striped art. + ("artistic.paintDaubs", r#"{"brushType": "wideBlurry"}"#), ("artistic.paletteKnife", "{}"), ("artistic.plasticWrap", "{}"), ("artistic.posterEdges", "{}"), diff --git a/crates/ui-egui/src/dialogs/effect.rs b/crates/ui-egui/src/dialogs/effect.rs index e535e4c1f..94551f924 100644 --- a/crates/ui-egui/src/dialogs/effect.rs +++ b/crates/ui-egui/src/dialogs/effect.rs @@ -201,6 +201,10 @@ fn body(app: &mut VectorcraftApp, ui: &mut egui::Ui, d: &mut Dialog) -> bool { pub(crate) const FILM_GRAIN_FIELDS: [(&str, &str, f64); 3] = [("grain", "Grain", 20.0), ("highlightArea", "Highlight Area", 20.0), ("intensity", "Intensity", 10.0)]; +/// Paint Daubs › Brush Type labels ([`vectorcraft_effects::pixel::PAINT_DAUB_BRUSH_TYPES`]); extend +/// [`crate::menus::menu_strings`] with these like [`FILM_GRAIN_FIELDS`]. +pub(crate) const PAINT_DAUB_BRUSH_TYPE_LABELS: [&str; 6] = ["Simple", "Light Rough", "Dark Rough", "Wide Sharp", "Wide Blurry", "Sparkle"]; + fn film_grain_fields(ui: &mut egui::Ui, d: &mut Dialog) -> bool { let before = d.fields.clone(); // Use one column wide enough for this language's longest label, keeping every rail aligned. @@ -292,6 +296,7 @@ fn choices(effect: &str, key: &str) -> Option { ("brushStrokes.sprayedStrokes", "strokeDirection") => Some(&vectorcraft_effects::pixel::STROKE_DIRECTIONS), ("distort.glass", "texture") => Some(&vectorcraft_effects::pixel::GLASS_TEXTURES), ("pixelate.mezzotint", "type") => Some(&vectorcraft_effects::pixel::MEZZOTINT_TYPES), + ("artistic.paintDaubs", "brushType") => Some(&vectorcraft_effects::pixel::PAINT_DAUB_BRUSH_TYPES), ("sketch.graphicPen", "strokeDirection") => Some(&vectorcraft_effects::pixel::STROKE_DIRECTIONS), ("sketch.halftonePattern", "patternType") => Some(&vectorcraft_effects::pixel::HALFTONE_TYPES), ("sketch.plaster", "lightDirection") => Some(&vectorcraft_effects::pixel::LIGHT_DIRECTIONS), @@ -714,6 +719,7 @@ mod tests { ("distort.roughen", "points"), ("stylize.innerGlow", "source"), (DROP_SHADOW, "shade"), + ("artistic.paintDaubs", "brushType"), ] { let doc = vectorcraft_effects::effect_info(effect).unwrap().params; let listed = doc.split(&format!("{key}: ")).nth(1).unwrap().split([',', '}', ' ']).next().unwrap().to_string(); diff --git a/crates/ui-egui/src/dialogs/mod.rs b/crates/ui-egui/src/dialogs/mod.rs index db49229fc..8082977cb 100644 --- a/crates/ui-egui/src/dialogs/mod.rs +++ b/crates/ui-egui/src/dialogs/mod.rs @@ -115,7 +115,7 @@ use serde_json::{Value, json}; pub use color_picker::open as open_color_picker; pub use document_setup::open as open_document_setup; pub use effect::open as open_effect_dialog; -pub(crate) use effect::{FILM_GRAIN_FIELDS, SHADES, shown_choices}; +pub(crate) use effect::{FILM_GRAIN_FIELDS, PAINT_DAUB_BRUSH_TYPE_LABELS, SHADES, shown_choices}; pub use export_as::open as open_export_as; pub use export_for_screens::open as open_export_for_screens; pub(crate) use export_for_screens::{ diff --git a/crates/ui-egui/src/i18n/bg.tsv b/crates/ui-egui/src/i18n/bg.tsv index b59d8399f..e76dbfd59 100644 --- a/crates/ui-egui/src/i18n/bg.tsv +++ b/crates/ui-egui/src/i18n/bg.tsv @@ -32,6 +32,13 @@ Channel 4 Канал 4 Cell Size Размер на клетката Fine Dots Финни точки + + Simple Прост + Light Rough Светъл груб + Dark Rough Тъмен груб + Wide Sharp Широк остър + Wide Blurry Широк размазан + Sparkle Блясък Medium Dots Средни точки Grainy Dots Зърнести точки Coarse Dots Едри точки @@ -4557,6 +4564,8 @@ lighting Light Светлина Neon Glow… Неоново сияние… Palette Knife… Нож за палитра… Neon Glow Неоново сияние + Paint Daubs… Мазки с боя… + Paint Daubs Мазки с боя Palette Knife Нож за палитра Poster Edges… Плакатни ръбове… Poster Edges Плакатни ръбове diff --git a/crates/ui-egui/src/i18n/cs.tsv b/crates/ui-egui/src/i18n/cs.tsv index 4d425327f..d0657788e 100644 --- a/crates/ui-egui/src/i18n/cs.tsv +++ b/crates/ui-egui/src/i18n/cs.tsv @@ -2915,6 +2915,13 @@ lighting Light Světlo Soft Light Měkké světlo Crosshatch Křížové šrafování Fine Dots Jemné tečky + + Simple Jednoduchý + Light Rough Světle hrubý + Dark Rough Tmavě hrubý + Wide Sharp Široce ostrý + Wide Blurry Široce rozmazaný + Sparkle Jiskra Medium Dots Střední tečky Grainy Dots Zrnité tečky Coarse Dots Hrubé tečky @@ -5056,6 +5063,8 @@ imageTrace Outline Obrys Neon Glow… Neonová záře… Palette Knife… Špachtle… Neon Glow Neonová záře + Paint Daubs… Malířské tahy… + Paint Daubs Malířské tahy Palette Knife Špachtle Poster Edges… Plakátové okraje… Poster Edges Plakátové okraje diff --git a/crates/ui-egui/src/i18n/da.tsv b/crates/ui-egui/src/i18n/da.tsv index a2a9517ed..6dddf1ab9 100644 --- a/crates/ui-egui/src/i18n/da.tsv +++ b/crates/ui-egui/src/i18n/da.tsv @@ -2688,6 +2688,13 @@ lighting Light Lys Soft Light Blødt lys Crosshatch Krydsskravering Fine Dots Fine prikker + + Simple Enkel + Light Rough Lys ru + Dark Rough Mørk ru + Wide Sharp Bred skarp + Wide Blurry Bred sløret + Sparkle Glimt Medium Dots Mellemstore prikker Grainy Dots Kornede prikker Coarse Dots Grove prikker @@ -5183,6 +5190,8 @@ swatch Bright Violet Kraftig violet Cutout Udklip Dry Brush Tør pensel Neon Glow Neonglød + Paint Daubs… Malerklatter… + Paint Daubs Malerklatter Palette Knife Paletkniv Poster Edges Plakatkanter Apply Data Set Anvend datasæt diff --git a/crates/ui-egui/src/i18n/de.tsv b/crates/ui-egui/src/i18n/de.tsv index e174368fd..0fc849939 100644 --- a/crates/ui-egui/src/i18n/de.tsv +++ b/crates/ui-egui/src/i18n/de.tsv @@ -4637,6 +4637,12 @@ lighting Light Licht Reset Ruler Origin Linealursprung zurücksetzen Artistic Kunstfilter Film Grain… Filmkörnung… + Simple Einfach + Light Rough Leicht rau + Dark Rough Dunkel rau + Wide Sharp Breit scharf + Wide Blurry Breit unscharf + Sparkle Funkeln Cutout… Ausschnitt… Cutout Ausschnitt Dry Brush… Trockenpinsel… @@ -4644,6 +4650,8 @@ lighting Light Licht Neon Glow… Neonglühen… Palette Knife… Palettenmesser… Neon Glow Neonglühen + Paint Daubs… Tupfer… + Paint Daubs Tupfer Palette Knife Palettenmesser Poster Edges… Posterkanten… Poster Edges Posterkanten diff --git a/crates/ui-egui/src/i18n/el.tsv b/crates/ui-egui/src/i18n/el.tsv index 8d844f800..f7138c421 100644 --- a/crates/ui-egui/src/i18n/el.tsv +++ b/crates/ui-egui/src/i18n/el.tsv @@ -29,6 +29,13 @@ Channel 4 Κανάλι 4 Cell Size Μέγεθος κελιού Fine Dots Λεπτές κουκκίδες + + Simple Απλό + Light Rough Ελαφρύ τραχύ + Dark Rough Σκούρο τραχύ + Wide Sharp Ευρύ οξύ + Wide Blurry Ευρύ θολό + Sparkle Λάμψη Medium Dots Μεσαίες κουκκίδες Grainy Dots Κοκκώδεις κουκκίδες Coarse Dots Χοντρές κουκκίδες @@ -2266,6 +2273,8 @@ lighting Light Φως Neon Glow… Λάμψη νέον… Palette Knife… Μαχαίρι παλέτας… Neon Glow Λάμψη νέον + Paint Daubs… Πινελιές βαφής… + Paint Daubs Πινελιές βαφής Palette Knife Μαχαίρι παλέτας Poster Edges… Άκρες αφίσας… Poster Edges Άκρες αφίσας diff --git a/crates/ui-egui/src/i18n/es.tsv b/crates/ui-egui/src/i18n/es.tsv index f98165673..72e6b9e5c 100644 --- a/crates/ui-egui/src/i18n/es.tsv +++ b/crates/ui-egui/src/i18n/es.tsv @@ -37,6 +37,13 @@ Channel 4 Canal 4 Cell Size Tamaño de celda Fine Dots Puntos finos + + Simple Simple + Light Rough Rugoso claro + Dark Rough Rugoso oscuro + Wide Sharp Ancho nítido + Wide Blurry Ancho borroso + Sparkle Destello Medium Dots Puntos medios Grainy Dots Puntos granulados Coarse Dots Puntos gruesos @@ -4644,6 +4651,8 @@ lighting Light Luz Neon Glow… Resplandor de neón… Palette Knife… Espátula… Neon Glow Resplandor de neón + Paint Daubs… Pinceladas… + Paint Daubs Pinceladas Palette Knife Espátula Poster Edges… Bordes de póster… Poster Edges Bordes de póster diff --git a/crates/ui-egui/src/i18n/fi.tsv b/crates/ui-egui/src/i18n/fi.tsv index 8e5e631bd..9f652f8d6 100644 --- a/crates/ui-egui/src/i18n/fi.tsv +++ b/crates/ui-egui/src/i18n/fi.tsv @@ -2861,6 +2861,13 @@ lighting Light Valo Soft Light Pehmeä valo Crosshatch Ristiviivoitus Fine Dots Hienot pisteet + + Simple Yksinkertainen + Light Rough Vaalea karkea + Dark Rough Tumma karkea + Wide Sharp Leveä terävä + Wide Blurry Leveä sumea + Sparkle Kimallus Medium Dots Keskikokoiset pisteet Grainy Dots Rakeiset pisteet Coarse Dots Karkeat pisteet @@ -4951,6 +4958,8 @@ imageTrace Outline Ääriviiva Neon Glow… Neonhehku… Palette Knife… Palettiveitsi… Neon Glow Neonhehku + Paint Daubs… Maalitahrat… + Paint Daubs Maalitahrat Palette Knife Palettiveitsi Poster Edges… Julisteen reunat… Poster Edges Julisteen reunat diff --git a/crates/ui-egui/src/i18n/fr.tsv b/crates/ui-egui/src/i18n/fr.tsv index 80a96e071..59edc85f5 100644 --- a/crates/ui-egui/src/i18n/fr.tsv +++ b/crates/ui-egui/src/i18n/fr.tsv @@ -38,6 +38,13 @@ Channel 4 Couche 4 Cell Size Taille de cellule Fine Dots Points fins + + Simple Simple + Light Rough Rugueux clair + Dark Rough Rugueux foncé + Wide Sharp Large net + Wide Blurry Large flou + Sparkle Scintillement Medium Dots Points moyens Grainy Dots Points granuleux Coarse Dots Gros points @@ -4654,6 +4661,8 @@ lighting Light Lumière Neon Glow… Néon… Palette Knife… Couteau à palette… Neon Glow Néon + Paint Daubs… Empâtements… + Paint Daubs Empâtements Palette Knife Couteau à palette Poster Edges… Bords d’affiche… Poster Edges Bords d’affiche diff --git a/crates/ui-egui/src/i18n/hu.tsv b/crates/ui-egui/src/i18n/hu.tsv index 9f101d129..af87b9c08 100644 --- a/crates/ui-egui/src/i18n/hu.tsv +++ b/crates/ui-egui/src/i18n/hu.tsv @@ -1401,6 +1401,13 @@ Find Next Következő keresése Find Objects Objektumok keresése Fine Dots Finom pontok + + Simple Egyszerű + Light Rough Világos durva + Dark Rough Sötét durva + Wide Sharp Széles éles + Wide Blurry Széles elmosott + Sparkle Csillogás First Első First Baseline Első alapvonal First commit Első commit @@ -1587,6 +1594,8 @@ file-filter Templates Sablonok Neon Glow… Neonfény… Palette Knife… Palettakés… Neon Glow Neonfény + Paint Daubs… Festékpaca… + Paint Daubs Festékpaca Palette Knife Palettakés Poster Edges… Poszterszélek… Poster Edges Poszterszélek diff --git a/crates/ui-egui/src/i18n/id.tsv b/crates/ui-egui/src/i18n/id.tsv index 769a989a6..fc71552c3 100644 --- a/crates/ui-egui/src/i18n/id.tsv +++ b/crates/ui-egui/src/i18n/id.tsv @@ -2688,6 +2688,13 @@ lighting Light Cahaya Soft Light Cahaya lembut Crosshatch Arsir silang Fine Dots Titik halus + + Simple Sederhana + Light Rough Kasar terang + Dark Rough Kasar gelap + Wide Sharp Lebar tajam + Wide Blurry Lebar buram + Sparkle Kilau Medium Dots Titik sedang Grainy Dots Titik berbutir Coarse Dots Titik kasar @@ -5183,6 +5190,8 @@ swatch Bright Violet Violet cerah Cutout Potongan Dry Brush Kuas kering Neon Glow Pendar neon + Paint Daubs… Coretan cat… + Paint Daubs Coretan cat Palette Knife Pisau palet Poster Edges Tepi poster Apply Data Set Terapkan set data diff --git a/crates/ui-egui/src/i18n/it.tsv b/crates/ui-egui/src/i18n/it.tsv index 223e9ebf1..c6ef8c1d4 100644 --- a/crates/ui-egui/src/i18n/it.tsv +++ b/crates/ui-egui/src/i18n/it.tsv @@ -37,6 +37,13 @@ Channel 4 Canale 4 Cell Size Dimensione cella Fine Dots Punti fini + + Simple Semplice + Light Rough Ruvido chiaro + Dark Rough Ruvido scuro + Wide Sharp Ampio nitido + Wide Blurry Ampio sfocato + Sparkle Scintillio Medium Dots Punti medi Grainy Dots Punti granulosi Coarse Dots Punti grossi @@ -4686,6 +4693,8 @@ lighting Light Luce Neon Glow… Bagliore neon… Palette Knife… Spatola… Neon Glow Bagliore neon + Paint Daubs… Pennellate… + Paint Daubs Pennellate Palette Knife Spatola Poster Edges… Bordi poster… Poster Edges Bordi poster diff --git a/crates/ui-egui/src/i18n/ja.tsv b/crates/ui-egui/src/i18n/ja.tsv index 27418db9e..41d816197 100644 --- a/crates/ui-egui/src/i18n/ja.tsv +++ b/crates/ui-egui/src/i18n/ja.tsv @@ -3760,6 +3760,13 @@ theme Appearance 外観 Channel 4 チャンネル 4 Cell Size セルの大きさ Fine Dots 細かい点 + + Simple シンプル + Light Rough ライトラフ + Dark Rough ダークラフ + Wide Sharp ワイドシャープ + Wide Blurry ワイドブラー + Sparkle スパークル Medium Dots 中程度の点 Grainy Dots 粒状の点 Coarse Dots 粗い点 @@ -4725,6 +4732,8 @@ lighting Light ライト Neon Glow… ネオングロー… Palette Knife… パレットナイフ… Neon Glow ネオングロー + Paint Daubs… ペイントダブ… + Paint Daubs ペイントダブ Palette Knife パレットナイフ Poster Edges… ポスターエッジ… Poster Edges ポスターエッジ diff --git a/crates/ui-egui/src/i18n/ka.tsv b/crates/ui-egui/src/i18n/ka.tsv index b1ad1d76c..aa907e018 100644 --- a/crates/ui-egui/src/i18n/ka.tsv +++ b/crates/ui-egui/src/i18n/ka.tsv @@ -2500,6 +2500,13 @@ lighting Light სინათლე Soft Light რბილი სინათლე Crosshatch ჯვარედინი დაშტრიხვა Fine Dots წვრილი წერტილები + + Simple მარტივი + Light Rough ღია ხასიათიანი + Dark Rough მუქი ხასიათიანი + Wide Sharp ფართო მკვეთრი + Wide Blurry ფართო ბუნდოვანი + Sparkle ციმციმი Medium Dots საშუალო წერტილები Grainy Dots მარცვლოვანი წერტილები Coarse Dots მსხვილი წერტილები @@ -5077,6 +5084,8 @@ imageTrace Outline კონტური Move Slice ნაჭრის გადაადგილება Move Type on a Path ტრაექტორიაზე ტექსტის გადაადგილება Neon Glow ნეონის ნათება + Paint Daubs… საღებავის კვეთები… + Paint Daubs საღებავის კვეთები Palette Knife პალეტის დანა Neon Glow… ნეონის ნათება… Palette Knife… პალეტის დანა… diff --git a/crates/ui-egui/src/i18n/ko.tsv b/crates/ui-egui/src/i18n/ko.tsv index 51cde1959..e4d7f8caa 100644 --- a/crates/ui-egui/src/i18n/ko.tsv +++ b/crates/ui-egui/src/i18n/ko.tsv @@ -3745,6 +3745,13 @@ theme Appearance 외관 Channel 4 채널 4 Cell Size 셀 크기 Fine Dots 고운 점 + + Simple 단순 + Light Rough 밝은 거칠기 + Dark Rough 어두운 거칠기 + Wide Sharp 넓고 선명 + Wide Blurry 넓고 흐림 + Sparkle 반짝임 Medium Dots 중간 점 Grainy Dots 거친 입자 점 Coarse Dots 굵은 점 @@ -4649,6 +4656,8 @@ lighting Light 광원 Neon Glow… 네온 글로… Palette Knife… 팔레트 나이프… Neon Glow 네온 글로 + Paint Daubs… 페인트 다브… + Paint Daubs 페인트 다브 Palette Knife 팔레트 나이프 Poster Edges… 포스터 가장자리… Poster Edges 포스터 가장자리 diff --git a/crates/ui-egui/src/i18n/nl.tsv b/crates/ui-egui/src/i18n/nl.tsv index 8c334db44..b76776350 100644 --- a/crates/ui-egui/src/i18n/nl.tsv +++ b/crates/ui-egui/src/i18n/nl.tsv @@ -2702,6 +2702,13 @@ lighting Light Licht Soft Light Zacht licht Crosshatch Kruisarcering Fine Dots Fijne stippen + + Simple Eenvoudig + Light Rough Licht ruw + Dark Rough Donker ruw + Wide Sharp Breed scherp + Wide Blurry Breed wazig + Sparkle Fonkel Medium Dots Middelgrote stippen Grainy Dots Korrelige stippen Coarse Dots Grove stippen @@ -5194,6 +5201,8 @@ swatch Bright Violet Felviolet Cutout Knipsel Dry Brush Droog penseel Neon Glow Neongloed + Paint Daubs… Verfstipjes… + Paint Daubs Verfstipjes Palette Knife Paletmes Poster Edges Posterranden Apply Data Set Gegevensset toepassen diff --git a/crates/ui-egui/src/i18n/pl.tsv b/crates/ui-egui/src/i18n/pl.tsv index 3706f95d0..eb272cfa4 100644 --- a/crates/ui-egui/src/i18n/pl.tsv +++ b/crates/ui-egui/src/i18n/pl.tsv @@ -2793,6 +2793,13 @@ lighting Light Światło Soft Light Łagodne światło Crosshatch Kreskowanie krzyżowe Fine Dots Drobne kropki + + Simple Prosty + Light Rough Jasny szorstki + Dark Rough Ciemny szorstki + Wide Sharp Szeroki ostry + Wide Blurry Szeroki rozmyty + Sparkle Iskra Medium Dots Średnie kropki Grainy Dots Ziarniste kropki Coarse Dots Grube kropki @@ -4889,6 +4896,8 @@ imageTrace Outline Kontur Neon Glow… Neonowa poświata… Palette Knife… Szpachel… Neon Glow Neonowa poświata + Paint Daubs… Plamy farby… + Paint Daubs Plamy farby Palette Knife Szpachel Poster Edges… Krawędzie plakatu… Poster Edges Krawędzie plakatu diff --git a/crates/ui-egui/src/i18n/pt-br.tsv b/crates/ui-egui/src/i18n/pt-br.tsv index 442547160..f63074fc0 100644 --- a/crates/ui-egui/src/i18n/pt-br.tsv +++ b/crates/ui-egui/src/i18n/pt-br.tsv @@ -4046,6 +4046,8 @@ axis Both Ambos Neon Glow… Brilho neon… Palette Knife… Espátula… Neon Glow Brilho neon + Paint Daubs… Manchas de tinta… + Paint Daubs Manchas de tinta Palette Knife Espátula Poster Edges… Bordas de pôster… Poster Edges Bordas de pôster @@ -4111,6 +4113,13 @@ axis Both Ambos Channel 4 Canal 4 Cell Size Tamanho da Célula Fine Dots Pontos Finos + + Simple Simples + Light Rough Áspero claro + Dark Rough Áspero escuro + Wide Sharp Largo nítido + Wide Blurry Largo borrado + Sparkle Brilho Medium Dots Pontos Médios Grainy Dots Pontos Granulados Coarse Dots Pontos Grossos diff --git a/crates/ui-egui/src/i18n/ru.tsv b/crates/ui-egui/src/i18n/ru.tsv index 34b8835b2..6a6bb6e9a 100644 --- a/crates/ui-egui/src/i18n/ru.tsv +++ b/crates/ui-egui/src/i18n/ru.tsv @@ -35,6 +35,13 @@ Channel 4 Канал 4 Cell Size Размер ячейки Fine Dots Мелкие точки + + Simple Простой + Light Rough Светлая грубость + Dark Rough Тёмная грубость + Wide Sharp Широкий резкий + Wide Blurry Широкий размытый + Sparkle Блеск Medium Dots Средние точки Grainy Dots Зернистые точки Coarse Dots Крупные точки @@ -4682,6 +4689,8 @@ lighting Light Свет Neon Glow… Неоновое свечение… Palette Knife… Нож для палитры… Neon Glow Неоновое свечение + Paint Daubs… Мазки кисти… + Paint Daubs Мазки кисти Palette Knife Нож для палитры Poster Edges… Края плаката… Poster Edges Края плаката diff --git a/crates/ui-egui/src/i18n/sv.tsv b/crates/ui-egui/src/i18n/sv.tsv index eb1f68f4b..82017cccf 100644 --- a/crates/ui-egui/src/i18n/sv.tsv +++ b/crates/ui-egui/src/i18n/sv.tsv @@ -34,6 +34,13 @@ Channel 4 Kanal 4 Cell Size Cellstorlek Fine Dots Fina punkter + + Simple Enkel + Light Rough Lätt grov + Dark Rough Mörk grov + Wide Sharp Bred skarp + Wide Blurry Bred suddig + Sparkle Glittra Medium Dots Medelstora punkter Grainy Dots Korniga punkter Coarse Dots Grova punkter @@ -4563,6 +4570,8 @@ lighting Light Ljus Neon Glow… Neonsken… Palette Knife… Palettkniv… Neon Glow Neonsken + Paint Daubs… Färgklickar… + Paint Daubs Färgklickar Palette Knife Palettkniv Poster Edges… Affischkanter… Poster Edges Affischkanter diff --git a/crates/ui-egui/src/i18n/uk.tsv b/crates/ui-egui/src/i18n/uk.tsv index 114a75ad8..599eb3d5f 100644 --- a/crates/ui-egui/src/i18n/uk.tsv +++ b/crates/ui-egui/src/i18n/uk.tsv @@ -36,6 +36,13 @@ Channel 4 Канал 4 Cell Size Розмір комірки Fine Dots Дрібні точки + + Simple Простий + Light Rough Світла грубість + Dark Rough Темна грубість + Wide Sharp Широкий різкий + Wide Blurry Широкий розмитий + Sparkle Іскра Medium Dots Середні точки Grainy Dots Зернисті точки Coarse Dots Великі точки @@ -4666,6 +4673,8 @@ lighting Light Світло Neon Glow… Неонове сяйво… Palette Knife… Ніж палітри… Neon Glow Неонове сяйво + Paint Daubs… Мазки фарби… + Paint Daubs Мазки фарби Palette Knife Ніж палітри Poster Edges… Плакатні краї… Poster Edges Плакатні краї diff --git a/crates/ui-egui/src/i18n/vi.tsv b/crates/ui-egui/src/i18n/vi.tsv index 8407ddc08..89beb2e17 100644 --- a/crates/ui-egui/src/i18n/vi.tsv +++ b/crates/ui-egui/src/i18n/vi.tsv @@ -1275,6 +1275,8 @@ Neon Glow… Ánh neon… Palette Knife… Dao palette… Neon Glow Ánh neon + Paint Daubs… Vệt sơn… + Paint Daubs Vệt sơn Palette Knife Dao palette Poster Edges… Viền áp phích… Poster Edges Viền áp phích @@ -1299,6 +1301,13 @@ Find Next Tìm tiếp Find Objects Tìm đối tượng Fine Dots Chấm mịn + + Simple Đơn giản + Light Rough Thô sáng + Dark Rough Thô tối + Wide Sharp Rộng sắc + Wide Blurry Rộng mờ + Sparkle Lấp lánh First Đầu tiên First commit Commit đầu tiên First Page Trang đầu diff --git a/crates/ui-egui/src/i18n/zh-hans.tsv b/crates/ui-egui/src/i18n/zh-hans.tsv index d5e999fd8..1470c85f2 100644 --- a/crates/ui-egui/src/i18n/zh-hans.tsv +++ b/crates/ui-egui/src/i18n/zh-hans.tsv @@ -4761,6 +4761,13 @@ axis Both 两者 Channel 4 色版 4 Cell Size 单元格大小 Fine Dots 细点 + + Simple 简单 + Light Rough 浅色粗糙 + Dark Rough 深色粗糙 + Wide Sharp 宽锐 + Wide Blurry 宽模糊 + Sparkle 闪光 Medium Dots 中等点 Grainy Dots 颗粒点 Coarse Dots 粗点 @@ -4950,6 +4957,8 @@ lighting Light 光源 Neon Glow… 霓虹灯光… Palette Knife… 调色刀… Neon Glow 霓虹灯光 + Paint Daubs… 绘画涂抹… + Paint Daubs 绘画涂抹 Palette Knife 调色刀 Poster Edges… 海报边缘… Poster Edges 海报边缘 diff --git a/crates/ui-egui/src/i18n/zh-hant.tsv b/crates/ui-egui/src/i18n/zh-hant.tsv index 2eeeb9017..c6acb7995 100644 --- a/crates/ui-egui/src/i18n/zh-hant.tsv +++ b/crates/ui-egui/src/i18n/zh-hant.tsv @@ -4567,6 +4567,13 @@ axis Both 兩者 Channel 4 色版 4 Cell Size 單元大小 Fine Dots 細點 + + Simple 簡單 + Light Rough 淺色粗糙 + Dark Rough 深色粗糙 + Wide Sharp 寬銳 + Wide Blurry 寬模糊 + Sparkle 閃光 Medium Dots 中等點 Grainy Dots 顆粒點 Coarse Dots 粗點 @@ -4756,6 +4763,8 @@ lighting Light 光源 Neon Glow… 霓虹光… Palette Knife… 調色刀… Neon Glow 霓虹光 + Paint Daubs… 繪畫塗抹… + Paint Daubs 繪畫塗抹 Palette Knife 調色刀 Poster Edges… 海報邊緣… Poster Edges 海報邊緣 diff --git a/crates/ui-egui/src/menus.rs b/crates/ui-egui/src/menus.rs index 9b2586a9f..54264de12 100644 --- a/crates/ui-egui/src/menus.rs +++ b/crates/ui-egui/src/menus.rs @@ -4189,6 +4189,7 @@ pub fn menu_strings() -> std::collections::BTreeSet { out.extend(crate::prefs_dialog::UI_FIELDS.iter().map(|f| f.2.to_string())); out.extend(crate::dialogs::button_labels().into_iter().map(str::to_string)); out.extend(crate::dialogs::FILM_GRAIN_FIELDS.iter().map(|(_, label, _)| label.to_string())); + out.extend(crate::dialogs::PAINT_DAUB_BRUSH_TYPE_LABELS.iter().map(|label| label.to_string())); out.extend(crate::chrome::hint_strings().into_iter().map(str::to_string)); out.remove(""); out diff --git a/crates/ui-egui/src/tests_labels.rs b/crates/ui-egui/src/tests_labels.rs index e264be563..02828e49b 100644 --- a/crates/ui-egui/src/tests_labels.rs +++ b/crates/ui-egui/src/tests_labels.rs @@ -93,6 +93,7 @@ fn effect_menu_lists_the_artistic_filters_before_blur() { "Dry Brush…", "Film Grain…", "Neon Glow…", + "Paint Daubs…", "Palette Knife…", "Plastic Wrap…", "Poster Edges…", @@ -108,6 +109,22 @@ fn effect_menu_lists_the_artistic_filters_before_blur() { assert!(at("Artistic") < at("Blur")); } +/// Paint Daubs' Brush Type menu matches Illustrator's list and uses the effect choice labels. +#[test] +fn paint_daubs_brush_type_menu_matches_illustrator() { + use crate::dialogs::PAINT_DAUB_BRUSH_TYPE_LABELS; + use serde_json::Map; + use vectorcraft_effects::pixel::PAINT_DAUB_BRUSH_TYPES; + let catalog: Vec<&str> = PAINT_DAUB_BRUSH_TYPES.iter().map(|(label, _)| *label).collect(); + assert_eq!(PAINT_DAUB_BRUSH_TYPE_LABELS.as_slice(), catalog.as_slice()); + let params = Map::new(); + let shown = crate::dialogs::shown_choices("artistic.paintDaubs", "brushType", ¶ms, false).unwrap(); + assert_eq!(shown.len(), PAINT_DAUB_BRUSH_TYPES.len()); + for ((label, value), (english, id)) in shown.iter().zip(PAINT_DAUB_BRUSH_TYPES.iter()) { + assert_eq!((label.as_str(), value.as_str()), (*english, *id)); + } +} + #[test] fn effect_menu_lists_the_pixelate_filters_between_blur_and_sharpen() { let app = app(); diff --git a/docs/effects-parity.md b/docs/effects-parity.md index 287916397..06cbf2acd 100644 --- a/docs/effects-parity.md +++ b/docs/effects-parity.md @@ -12,7 +12,7 @@ Part of [target-app-parity.md](target-app-parity.md); open work is in [gaps.md]( | Group | Illustrator | VectorCraft | % | Remaining (h) | |---|---:|---:|---:|---:| | Illustrator effects (vector and stylize) | 50 | 46 | 92% | 6–10 | -| Photoshop effects (raster, Effect Gallery) | 57 | 47 | 82% | 8–14 | +| Photoshop effects (raster, Effect Gallery) | 57 | 48 | 84% | 8–14 | | 3D and Materials | 4 (+3 Classic) | 4 (initial: Extrude & Bevel, Revolve, Inflate, Rotate) | ~25% | 25–45 | | Beyond Illustrator: Effect › Color Adjustments (6), effect plug-ins (WebAssembly) | — | 6 + plug-ins | — | — | @@ -38,7 +38,7 @@ its resolution, PDF export warns once per object with the requested and the lowe | Submenu | Items | Ours | Missing | |---|---|---:|---| -| Artistic | Colored Pencil, Cutout, Dry Brush, Film Grain, Fresco, Neon Glow, Paint Daubs, Palette Knife, Plastic Wrap, Poster Edges, Rough Pastels, Smudge Stick, Sponge, Underpainting, Watercolor | 8/15 (approximate Cutout, Film Grain, Neon Glow, Plastic Wrap, Poster Edges, Smudge Stick, Sponge, Watercolor) | Colored Pencil, Dry Brush, Fresco, Paint Daubs, Palette Knife, Rough Pastels, Underpainting | +| Artistic | Colored Pencil, Cutout, Dry Brush, Film Grain, Fresco, Neon Glow, Paint Daubs, Palette Knife, Plastic Wrap, Poster Edges, Rough Pastels, Smudge Stick, Sponge, Underpainting, Watercolor | 9/15 (approximate Cutout, Film Grain, Neon Glow, Paint Daubs, Plastic Wrap, Poster Edges, Smudge Stick, Sponge, Watercolor) | Colored Pencil, Dry Brush, Fresco, Palette Knife, Rough Pastels, Underpainting | | Blur | Gaussian Blur, Radial Blur, Smart Blur | 3/3 | — | | Brush Strokes | Accented Edges, Angled Strokes, Crosshatch, Dark Strokes, Ink Outlines, Spatter, Sprayed Strokes, Sumi-e | 8/8 | — | | Distort | Diffuse Glow, Glass, Ocean Ripple | 3/3 | — |