Merge pull request #3035 from nrq6993-a11y/stream/vc-feat3-g2-artistic-underpainting

G2: Effect › Artistic › Underpainting raster filter
This commit is contained in:
BFlat
2026-10-22 00:38:11 +07:00
committed by GitHub
30 changed files with 258 additions and 7 deletions
+15
View File
@@ -420,6 +420,21 @@ pub fn effect_catalog() -> Vec<EffectInfo> {
"{brushSize: 0..10 (2; size of the sponge's pores), definition: 0..25 (12; how strongly lighter and darker blobs contrast), smoothness: 1..15 (5; softer blob edges)} paints the object as if dabbed with a sponge, in highly textured areas of contrasting colour. Coverage is kept. Original visual approximation; chosen VectorCraft defaults.",
json!({"brushSize": 2.0, "definition": 12.0, "smoothness": 5.0}),
),
r(
"artistic.underpainting",
"Underpainting…",
ARTISTIC,
"{brushSize: 0..40 (6; wider, softer strokes), textureCoverage: 0..40 (16; more of the relief texture on the strokes), texture: \"brick\"|\"burlap\"|\"canvas\"|\"sandstone\" (\"canvas\"; surfaces made in code), scaling: % 50..200 (100), relief: 0..50 (4), lightDirection: \"bottom\"|\"bottomLeft\"|\"left\"|\"topLeft\"|\"top\"|\"topRight\"|\"right\"|\"bottomRight\" (\"top\"), invert: bool (false; turns the surface's heights over)} paints the object with broad strokes over a textured ground, keeping its coverage. Slider ranges follow the documented controls; numeric defaults are chosen for VectorCraft and are not verified against proprietary defaults. Original visual approximation.",
json!({
"brushSize": 6.0,
"textureCoverage": 16.0,
"texture": "canvas",
"scaling": 100.0,
"relief": 4.0,
"lightDirection": "top",
"invert": false
}),
),
r(
"artistic.watercolor",
"Watercolor…",
+61 -2
View File
@@ -1,5 +1,5 @@
//! 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
//! Edges, Smudge Stick, Sponge, Underpainting and Watercolor). Original filters built from
//! public behaviour documentation:
//! <https://helpx.adobe.com/illustrator/using/summary-effects.html> and
//! <https://helpx.adobe.com/photoshop-elements/using/artistic-filters.html>.
@@ -10,7 +10,7 @@ use std::f64::consts::TAU;
use super::brushstrokes::{Smear, mix, stroke_reach, unit, unpremultiply};
use super::edges::sobel;
use super::pixelate::{Around, Place, Soft, cell, point_in, rand, value_noise};
use super::texture::{luma, premultiply, straight};
use super::texture::{self, Light, Texture, luma, premultiply, straight};
use super::{PixelSpace, blur_plane, pick};
use vectorcraft_geom::{Point, Vec2};
@@ -467,6 +467,65 @@ pub(super) fn glow_spread(size: f64) -> f64 {
0.25 * size.abs().min(24.0)
}
/// Underpainting: broad brush strokes (`brush_size`, 0..40) over a relief `texture` surface
/// (`scaling`, `relief`, `light`, `invert`, as Texturizer uses), blended in as strongly as
/// `texture_coverage` (0..40) says. Coverage is kept.
#[allow(clippy::too_many_arguments)]
pub(super) fn underpainting(
px: &mut [[u8; 4]],
w: usize,
h: usize,
space: &PixelSpace,
brush_size: f64,
texture_coverage: f64,
texture: &Texture,
scaling: f64,
relief: f64,
light: Light,
invert: bool,
) {
if !(brush_size.is_finite() && texture_coverage.is_finite() && space.px.is_finite() && space.px > 0.0) {
return;
}
let brush_size = brush_size.clamp(0.0, 40.0);
let coverage = (texture_coverage / 40.0).clamp(0.0, 1.0) as f32;
let (mut colour, alpha) = planes(px);
let sigma = (0.1 * brush_size.max(0.25)) / space.px;
if sigma > 0.0 {
soften(&mut colour, &alpha, w, h, sigma);
}
for (k, p) in px.iter_mut().enumerate() {
if p[3] == 0 {
continue;
}
let c = [colour[0][k], colour[1][k], colour[2][k]];
*p = premultiply(c, f32::from(p[3]) / 255.0);
}
if coverage <= 0.0 {
return;
}
let softened = px.to_vec();
texture::texturizer(px, w, h, space, texture, scaling, relief, light, invert);
if coverage >= 1.0 {
return;
}
let mix = 1.0 - coverage;
for (k, p) in px.iter_mut().enumerate() {
if p[3] == 0 {
continue;
}
let a = f32::from(p[3]) / 255.0;
let tex = straight(*p);
let soft = straight(softened[k]);
let c = [
(soft[0] * mix + tex[0] * coverage).clamp(0.0, 1.0),
(soft[1] * mix + tex[1] * coverage).clamp(0.0, 1.0),
(soft[2] * mix + tex[2] * coverage).clamp(0.0, 1.0),
];
*p = premultiply(c, a);
}
}
/// Neon Glow: the object in dimmed greys, lit by `colour` glowing from its light areas (`size`
/// above 0) or from its dark areas (below 0), spread as far as |`size`| (0..24) says and as
/// strong as `brightness` (0..50). Coverage is kept.
+20 -1
View File
@@ -44,7 +44,7 @@ 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; 50] = [
pub const PIXEL_EFFECTS: [&str; 51] = [
"artistic.cutout",
"artistic.dryBrush",
"artistic.filmGrain",
@@ -55,6 +55,7 @@ pub const PIXEL_EFFECTS: [&str; 50] = [
"artistic.posterEdges",
"artistic.smudgeStick",
"artistic.sponge",
"artistic.underpainting",
"artistic.watercolor",
"blur.radial",
"blur.smart",
@@ -138,6 +139,10 @@ pub enum PixelFx {
/// Artistic › Poster Edges: colours posterized to `posterization` + 2 levels (0..6) with black
/// lines on the edges, as thick as `thickness` (0..10) and as dark as `intensity` (0..10).
PosterEdges { thickness: f64, intensity: f64, posterization: f64 },
/// Artistic › Underpainting: colours softened as widely as `brush_size` (0..40), then a
/// `texture` surface (`scaling`, `relief`, `light`, `invert`) blended in as strongly as
/// `texture_coverage` (0..40) says.
Underpainting { brush_size: f64, texture_coverage: f64, texture: Texture, scaling: f64, relief: f64, light: Light, invert: bool },
/// Blur › Radial Blur around the object's centre: along arcs (spin, an arc of `amount`°) or
/// along rays (zoom, the content scaled by up to about ±`amount`/2 %), averaging 2^`passes` samples.
RadialBlur { amount: f64, zoom: bool, passes: u32 },
@@ -332,6 +337,15 @@ pub(crate) fn parse(id: &str, p: &Value) -> Option<PixelFx> {
highlight: num(p, "highlightArea", 0.0).clamp(0.0, 20.0),
intensity: num(p, "intensity", 10.0).clamp(0.0, 10.0),
},
"artistic.underpainting" => PixelFx::Underpainting {
brush_size: num(p, "brushSize", 6.0).clamp(0.0, 40.0),
texture_coverage: num(p, "textureCoverage", 16.0).clamp(0.0, 40.0),
texture: Texture::parse(text(p, "texture", "canvas")),
scaling: num(p, "scaling", 100.0).clamp(50.0, 200.0) / 100.0,
relief: num(p, "relief", 4.0).clamp(0.0, 50.0),
light: Light::parse(text(p, "lightDirection", "top")),
invert: flag(p, "invert", false),
},
"artistic.smudgeStick" => PixelFx::SmudgeStick {
stroke: num(p, "strokeLength", 2.0).clamp(0.0, 10.0),
highlight: num(p, "highlightArea", 12.0).clamp(0.0, 20.0),
@@ -576,6 +590,7 @@ impl PixelFx {
| PixelFx::NeonGlow { .. }
| PixelFx::PlasticWrap { .. }
| PixelFx::PosterEdges { .. }
| PixelFx::Underpainting { .. }
| PixelFx::ColorHalftone { .. }
| PixelFx::Mezzotint { .. }
| PixelFx::Craquelure { .. }
@@ -647,6 +662,7 @@ impl PixelFx {
PixelFx::PlasticWrap { smoothness, .. } => Some(artistic::plastic_reach(smoothness)),
// The edges' lines, spread round them.
PixelFx::PosterEdges { thickness, .. } => Some(3.0 * (0.3 + 0.25 * thickness) + 1.0),
PixelFx::Underpainting { brush_size, .. } => Some(3.0 * (0.1 * brush_size.max(0.25)) + 1.0),
// The dots' points, and the softened colour around them.
PixelFx::Pointillize { cell } => Some(2.5 * cell),
// The softened tones around the pixel.
@@ -682,6 +698,9 @@ impl PixelFx {
PixelFx::PosterEdges { thickness, intensity, posterization } => {
artistic::poster_edges(px, w, h, space, thickness, intensity, posterization)
}
PixelFx::Underpainting { brush_size, texture_coverage, ref texture, scaling, relief, light, invert } => {
artistic::underpainting(px, w, h, space, brush_size, texture_coverage, texture, scaling, relief, light, invert)
}
PixelFx::RadialBlur { amount, zoom, passes } => blur::radial(px, w, h, space, amount, zoom, passes),
PixelFx::SmartBlur { radius, threshold, samples, mode: SmartBlurMode::Normal } => {
blur::smart(px, w, h, to_px(radius), threshold, samples)
+86 -1
View File
@@ -2441,12 +2441,38 @@ fn artistic_params_take_defaults_and_stay_in_range() {
fx("artistic.neonGlow", json!({"glowSize": -1e308, "glowBrightness": 80, "color": "#ff0000"})),
PixelFx::NeonGlow { size: -24.0, brightness: 50.0, colour: [1.0, 0.0, 0.0] }
);
let under = PixelFx::Underpainting {
brush_size: 6.0,
texture_coverage: 16.0,
texture: Texture::Canvas,
scaling: 1.0,
relief: 4.0,
light: Light::Top,
invert: false,
};
assert_eq!(fx("artistic.underpainting", json!({})), under);
assert_eq!(
fx(
"artistic.underpainting",
json!({"brushSize": 99, "textureCoverage": -1, "texture": "brick", "scaling": 10, "relief": 60, "lightDirection": "bottomRight", "invert": true})
),
PixelFx::Underpainting {
brush_size: 40.0,
texture_coverage: 0.0,
texture: Texture::Brick,
scaling: 0.5,
relief: 50.0,
light: Light::BottomRight,
invert: true,
}
);
assert_eq!(fx("artistic.plasticWrap", json!({})), PixelFx::PlasticWrap { highlight: 20.0, detail: 12.0, smoothness: 15.0 });
assert_eq!(
fx("artistic.plasticWrap", json!({"highlightStrength": -1, "detail": 99, "smoothness": 0})),
PixelFx::PlasticWrap { highlight: 0.0, detail: 15.0, smoothness: 1.0 }
);
for id in ["artistic.cutout", "artistic.dryBrush", "artistic.neonGlow", "artistic.plasticWrap", "artistic.posterEdges"] {
for id in ["artistic.cutout", "artistic.dryBrush", "artistic.neonGlow", "artistic.plasticWrap", "artistic.posterEdges", "artistic.underpainting"]
{
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 });
@@ -2457,6 +2483,16 @@ fn artistic_params_take_defaults_and_stay_in_range() {
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);
for (id, key, table) in
[("artistic.underpainting", "texture", TEXTURES.as_slice()), ("artistic.underpainting", "lightDirection", LIGHT_DIRECTIONS.as_slice())]
{
let doc = crate::effect_info(id).unwrap().params;
let parsed: Vec<PixelFx> = table.iter().map(|(_, v)| fx(id, json!({ key: v }))).collect();
for (i, (_, v)) in table.iter().enumerate() {
assert!(doc.contains(&format!("\"{v}\"")), "{id} {v}");
assert!(parsed.iter().skip(i + 1).all(|p| *p != parsed[i]), "{id} {v}");
}
}
}
#[test]
@@ -2475,6 +2511,15 @@ fn artistic_filters_leave_invalid_coordinate_spaces_alone() {
PixelFx::NeonGlow { size: 5.0, brightness: 15.0, colour },
PixelFx::PlasticWrap { highlight: 20.0, detail: 12.0, smoothness: 15.0 },
PixelFx::PosterEdges { thickness: 2.0, intensity: 1.0, posterization: 2.0 },
PixelFx::Underpainting {
brush_size: 6.0,
texture_coverage: 16.0,
texture: Texture::Canvas,
scaling: 1.0,
relief: 4.0,
light: Light::Top,
invert: false,
},
];
for f in &filters {
assert_ne!(run(f, &space(w, h)), src, "{f:?} changes the art in a valid space");
@@ -2496,6 +2541,24 @@ fn artistic_filters_leave_invalid_coordinate_spaces_alone() {
PixelFx::PosterEdges { thickness: f64::NAN, intensity: 1.0, posterization: 2.0 },
PixelFx::PosterEdges { thickness: 2.0, intensity: f64::INFINITY, posterization: 2.0 },
PixelFx::PosterEdges { thickness: 2.0, intensity: 1.0, posterization: f64::NEG_INFINITY },
PixelFx::Underpainting {
brush_size: f64::NAN,
texture_coverage: 16.0,
texture: Texture::Canvas,
scaling: 1.0,
relief: 4.0,
light: Light::Top,
invert: false,
},
PixelFx::Underpainting {
brush_size: 6.0,
texture_coverage: f64::INFINITY,
texture: Texture::Canvas,
scaling: 1.0,
relief: 4.0,
light: Light::Top,
invert: false,
},
] {
if run(&f, &space(w, h)) != src {
changed.push(format!("{f:?}"));
@@ -2504,6 +2567,27 @@ fn artistic_filters_leave_invalid_coordinate_spaces_alone() {
assert!(changed.is_empty(), "directly constructed non-finite parameters and invalid spaces are harmless: {changed:?}");
}
#[test]
fn underpainting_softens_more_with_a_larger_brush_and_keeps_coverage() {
let (w, h) = (48, 32);
let src = ramp(w, h);
let diff = |brush: f64| {
let mut out = src.clone();
fx("artistic.underpainting", json!({"brushSize": brush, "textureCoverage": 0})).apply(&mut out, w, h, &space(w, h));
out.as_chunks::<4>()
.0
.iter()
.zip(src.as_chunks::<4>().0)
.filter(|(_, s)| s[3] == 255)
.map(|(o, s)| (0..3).map(|k| u32::from(o[k].abs_diff(s[k]))).sum::<u32>())
.sum::<u32>()
};
assert!(diff(40.0) > diff(2.0) * 2, "large brush {} vs small {}", diff(40.0), diff(2.0));
let mut out = src.clone();
fx("artistic.underpainting", json!({})).apply(&mut out, w, h, &space(w, h));
assert!(out.as_chunks::<4>().0.iter().zip(src.as_chunks::<4>().0).all(|(o, s)| o[3] == s[3]));
}
#[test]
fn plastic_wrap_adds_specular_highlights_and_keeps_coverage() {
let (w, h) = (48, 32);
@@ -2662,6 +2746,7 @@ fn artistic_filters_look_the_same_at_any_resolution() {
("artistic.cutout", json!({"edgeSimplicity": 6})),
("artistic.neonGlow", json!({"glowSize": 12, "glowBrightness": 30})),
("artistic.posterEdges", json!({"edgeThickness": 6, "edgeIntensity": 6})),
("artistic.underpainting", json!({"brushSize": 12, "textureCoverage": 20, "relief": 10})),
] {
let (mut a, mut b) = (coarse.clone(), fine.clone());
fx(id, p.clone()).apply(&mut a, w, h, &space(w, h));
+2 -1
View File
@@ -31,7 +31,7 @@ const BRUSH_STROKES: [(&str, &str); 8] = [
];
/// Effect › Artistic, at their defaults.
const ARTISTIC: [(&str, &str); 11] = [
const ARTISTIC: [(&str, &str); 12] = [
("artistic.cutout", "{}"),
("artistic.dryBrush", "{}"),
("artistic.filmGrain", "{}"),
@@ -41,6 +41,7 @@ const ARTISTIC: [(&str, &str); 11] = [
("artistic.paletteKnife", "{}"),
("artistic.plasticWrap", "{}"),
("artistic.posterEdges", "{}"),
("artistic.underpainting", "{}"),
("artistic.smudgeStick", "{}"),
("artistic.sponge", "{}"),
("artistic.watercolor", "{}"),
+4 -2
View File
@@ -301,8 +301,10 @@ fn choices(effect: &str, key: &str) -> Option<form::Choices> {
("sketch.halftonePattern", "patternType") => Some(&vectorcraft_effects::pixel::HALFTONE_TYPES),
("sketch.plaster", "lightDirection") => Some(&vectorcraft_effects::pixel::LIGHT_DIRECTIONS),
("texture.grain", "grainType") => Some(&vectorcraft_effects::pixel::GRAIN_TYPES),
("texture.texturizer", "texture") => Some(&vectorcraft_effects::pixel::TEXTURES),
("sketch.basRelief" | "texture.texturizer", "lightDirection") => Some(&vectorcraft_effects::pixel::LIGHT_DIRECTIONS),
("texture.texturizer" | "artistic.underpainting", "texture") => Some(&vectorcraft_effects::pixel::TEXTURES),
("sketch.basRelief" | "texture.texturizer" | "artistic.underpainting", "lightDirection") => {
Some(&vectorcraft_effects::pixel::LIGHT_DIRECTIONS)
}
("video.deinterlace", "eliminate") => Some(&[("Odd Fields", "odd"), ("Even Fields", "even")]),
("video.deinterlace", "create") => Some(&[("Duplication", "duplication"), ("Interpolation", "interpolation")]),
("stylize.innerGlow", "source") => Some(&[("Center", "center"), ("Edge", "edge")]),
+3
View File
@@ -4569,6 +4569,8 @@ lighting Light Светлина
Palette Knife Нож за палитра
Poster Edges… Плакатни ръбове…
Poster Edges Плакатни ръбове
Underpainting… Подбоя…
Underpainting Подбоя
Levels Нива
Edge Simplicity Простота на ръбовете
Edge Fidelity Точност на ръбовете
@@ -5252,6 +5254,7 @@ theme Appearance Външен вид
Watercolor… Акварел…
Watercolor Акварел
Brush Size Размер на четката
Texture Coverage Покритие на текстура
Definition Дефиниция
Brush Detail Детайл на четката
Shadow Intensity Интензивност на сенките
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -5068,6 +5068,8 @@ imageTrace Outline Obrys
Palette Knife Špachtle
Poster Edges… Plakátové okraje…
Poster Edges Plakátové okraje
Underpainting… Podmalba…
Underpainting Podmalba
Levels Úrovně
Edge Simplicity Jednoduchost okrajů
Edge Fidelity Věrnost okrajů
@@ -5283,6 +5285,7 @@ mark-style Japanese Japonské
Watercolor… Akvarel…
Watercolor Akvarel
Brush Size Velikost štětce
Texture Coverage Krytí textury
Definition Definice
Brush Detail Detail štětce
Shadow Intensity Intenzita stínů
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -5194,6 +5194,8 @@ swatch Bright Violet Kraftig violet
Paint Daubs Malerklatter
Palette Knife Paletkniv
Poster Edges Plakatkanter
Underpainting… Undermaling…
Underpainting Undermaling
Apply Data Set Anvend datasæt
Cancel Pattern Editing Annullér redigering af mønster
Copy Appearance Kopiér udseende
@@ -5297,6 +5299,7 @@ swatch Bright Violet Kraftig violet
Watercolor… Akvarel…
Watercolor Akvarel
Brush Size Penselstørrelse
Texture Coverage Teksturdækning
Definition Definition
Brush Detail Penseldetalje
Shadow Intensity Skyggeintensitet
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -4655,6 +4655,8 @@ lighting Light Licht
Palette Knife Palettenmesser
Poster Edges… Posterkanten…
Poster Edges Posterkanten
Underpainting… Untermalung…
Underpainting Untermalung
Levels Stufen
Edge Simplicity Kantenvereinfachung
Edge Fidelity Kantentreue
@@ -4862,6 +4864,7 @@ effect Soft Weich
Watercolor… Aquarell…
Watercolor Aquarell
Brush Size Pinselgröße
Texture Coverage Texturabdeckung
Definition Definition
Brush Detail Pinseldetail
Shadow Intensity Schattenintensität
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -2278,6 +2278,8 @@ lighting Light Φως
Palette Knife Μαχαίρι παλέτας
Poster Edges… Άκρες αφίσας…
Poster Edges Άκρες αφίσας
Underpainting… Υποζωγραφία…
Underpainting Υποζωγραφία
Levels Επίπεδα
Edge Simplicity Απλότητα άκρων
Edge Fidelity Πιστότητα άκρων
@@ -5235,6 +5237,7 @@ effect Points Σημεία
Watercolor… Υδατογραφία…
Watercolor Υδατογραφία
Brush Size Μέγεθος πινέλου
Texture Coverage Κάλυψη υφής
Definition Ευκρίνεια
Brush Detail Λεπτομέρεια πινέλου
Shadow Intensity Ένταση σκιών
Can't render this file because it contains an unexpected character in line 2038 and column 19.
+3
View File
@@ -4656,6 +4656,8 @@ lighting Light Luz
Palette Knife Espátula
Poster Edges… Bordes de póster…
Poster Edges Bordes de póster
Underpainting… Subpintura…
Underpainting Subpintura
Levels Niveles
Edge Simplicity Simplicidad de bordes
Edge Fidelity Fidelidad de bordes
@@ -5225,6 +5227,7 @@ mark-style Japanese Japonesas
Watercolor… Acuarela…
Watercolor Acuarela
Brush Size Tamaño del pincel
Texture Coverage Cobertura de textura
Definition Definición
Brush Detail Detalle del pincel
Shadow Intensity Intensidad de sombras
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -4963,6 +4963,8 @@ imageTrace Outline Ääriviiva
Palette Knife Palettiveitsi
Poster Edges… Julisteen reunat…
Poster Edges Julisteen reunat
Underpainting… Alapinta…
Underpainting Alapinta
Levels Tasot
Edge Simplicity Reunojen yksinkertaisuus
Edge Fidelity Reunojen tarkkuus
@@ -5247,6 +5249,7 @@ mark-style Japanese Japanilainen
Watercolor… Vesiväri…
Watercolor Vesiväri
Brush Size Siveltimen koko
Texture Coverage Tekstuurin peitto
Definition Terävyys
Brush Detail Siveltimen yksityiskohta
Shadow Intensity Varjojen voimakkuus
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -4666,6 +4666,8 @@ lighting Light Lumière
Palette Knife Couteau à palette
Poster Edges… Bords d’affiche…
Poster Edges Bords d’affiche
Underpainting… Sous-peinture…
Underpainting Sous-peinture
Levels Niveaux
Edge Simplicity Simplicité des contours
Edge Fidelity Fidélité des contours
@@ -5282,6 +5284,7 @@ theme Appearance Apparence
Watercolor… Aquarelle…
Watercolor Aquarelle
Brush Size Taille du pinceau
Texture Coverage Couverture de texture
Definition Définition
Brush Detail Détail du pinceau
Shadow Intensity Intensité des ombres
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -1599,6 +1599,8 @@ file-filter Templates Sablonok
Palette Knife Palettakés
Poster Edges… Poszterszélek…
Poster Edges Poszterszélek
Underpainting… Alapozás…
Underpainting Alapozás
Levels Szintek
Edge Simplicity Élek egyszerűsége
Edge Fidelity Élek hűsége
@@ -5269,6 +5271,7 @@ imageTrace Outline Körvonal
Watercolor… Akvarell…
Watercolor Akvarell
Brush Size Ecsetméret
Texture Coverage Textúra fedettség
Definition Kidolgozottság
Brush Detail Ecsetrészletesség
Shadow Intensity Árnyék intenzitása
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -5194,6 +5194,8 @@ swatch Bright Violet Violet cerah
Paint Daubs Coretan cat
Palette Knife Pisau palet
Poster Edges Tepi poster
Underpainting… Underpainting…
Underpainting Underpainting
Apply Data Set Terapkan set data
Cancel Pattern Editing Batalkan pengeditan pola
Copy Appearance Salin tampilan
@@ -5297,6 +5299,7 @@ swatch Bright Violet Violet cerah
Watercolor… Cat air…
Watercolor Cat air
Brush Size Ukuran kuas
Texture Coverage Cakupan tekstur
Definition Definisi
Brush Detail Detail kuas
Shadow Intensity Intensitas bayangan
Can't render this file because it contains an unexpected character in line 3808 and column 19.
+3
View File
@@ -4698,6 +4698,8 @@ lighting Light Luce
Palette Knife Spatola
Poster Edges… Bordi poster…
Poster Edges Bordi poster
Underpainting… Sottopittura…
Underpainting Sottopittura
Levels Livelli
Edge Simplicity Semplicità dei bordi
Edge Fidelity Fedeltà dei bordi
@@ -4897,6 +4899,7 @@ lighting Light Luce
Watercolor… Acquerello…
Watercolor Acquerello
Brush Size Dimensione pennello
Texture Coverage Copertura texture
Definition Definizione
Brush Detail Dettaglio pennello
Shadow Intensity Intensità ombre
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -4737,6 +4737,8 @@ lighting Light ライト
Palette Knife パレットナイフ
Poster Edges… ポスターエッジ…
Poster Edges ポスターエッジ
Underpainting… アンダーペインティング…
Underpainting アンダーペインティング
Levels レベル数
Edge Simplicity エッジの単純さ
Edge Fidelity エッジの正確さ
@@ -4937,6 +4939,7 @@ lighting Light ライト
Watercolor… 水彩…
Watercolor 水彩
Brush Size ブラシサイズ
Texture Coverage テクスチャのかかり具合
Definition 精細度
Brush Detail ブラシの細かさ
Shadow Intensity シャドウの強さ
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -5096,6 +5096,8 @@ imageTrace Outline კონტური
Persistent მუდმივი
Place from Library ბიბლიოთეკიდან განთავსება
Poster Edges პოსტერის კიდეები
Underpainting… ქვეფენის მხატვრობა…
Underpainting ქვეფენის მხატვრობა
Poster Edges… პოსტერის კიდეები…
Posterization პოსტერიზაცია
Previous Artboard წინა სამუშაო დაფა
@@ -5228,6 +5230,7 @@ imageTrace Outline კონტური
Watercolor… აკვარელი…
Watercolor აკვარელი
Brush Size ფუნჯის ზომა
Texture Coverage ტექსტურის დაფარვა
Definition განსაზღვრულობა
Brush Detail ფუნჯის დეტალი
Shadow Intensity ჩრდილის ინტენსივობა
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -4661,6 +4661,8 @@ lighting Light 광원
Palette Knife 팔레트 나이프
Poster Edges… 포스터 가장자리…
Poster Edges 포스터 가장자리
Underpainting… 언더페인팅…
Underpainting 언더페인팅
Levels 레벨 수
Edge Simplicity 가장자리 단순화
Edge Fidelity 가장자리 충실도
@@ -4860,6 +4862,7 @@ lighting Light 광원
Watercolor… 수채화…
Watercolor 수채화
Brush Size 브러시 크기
Texture Coverage 텍스처 적용 범위
Definition 선명도
Brush Detail 브러시 세부 묘사
Shadow Intensity 그림자 강도
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -5205,6 +5205,8 @@ swatch Bright Violet Felviolet
Paint Daubs Verfstipjes
Palette Knife Paletmes
Poster Edges Posterranden
Underpainting… Onderlaag…
Underpainting Onderlaag
Apply Data Set Gegevensset toepassen
Cancel Pattern Editing Patroon bewerken annuleren
Copy Appearance Uiterlijk kopiëren
@@ -5339,6 +5341,7 @@ swatch Bright Violet Felviolet
Watercolor… Aquarel…
Watercolor Aquarel
Brush Size Penseelgrootte
Texture Coverage Textuurdekking
Definition Definitie
Brush Detail Penseeldetail
Shadow Intensity Schaduwintensiteit
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -4901,6 +4901,8 @@ imageTrace Outline Kontur
Palette Knife Szpachel
Poster Edges… Krawędzie plakatu…
Poster Edges Krawędzie plakatu
Underpainting… Podmalówka…
Underpainting Podmalówka
Levels Poziomy
Edge Simplicity Prostota krawędzi
Edge Fidelity Wierność krawędzi
@@ -5135,6 +5137,7 @@ mark-style Japanese Japońskie
Watercolor… Akwarela…
Watercolor Akwarela
Brush Size Rozmiar pędzla
Texture Coverage Pokrycie teksturą
Definition Wyrazistość
Brush Detail Szczegółowość pędzla
Shadow Intensity Intensywność cieni
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -4051,6 +4051,8 @@ axis Both Ambos
Palette Knife Espátula
Poster Edges… Bordas de pôster…
Poster Edges Bordas de pôster
Underpainting… Subpintura…
Underpainting Subpintura
Levels Níveis
Edge Simplicity Simplicidade das bordas
Edge Fidelity Fidelidade das bordas
@@ -5200,6 +5202,7 @@ mark-style Japanese Japonesas
Watercolor… Aquarela…
Watercolor Aquarela
Brush Size Tamanho do pincel
Texture Coverage Cobertura da textura
Definition Definição
Brush Detail Detalhe do pincel
Shadow Intensity Intensidade da sombra
Can't render this file because it contains an unexpected character in line 6 and column 47.
+3
View File
@@ -4694,6 +4694,8 @@ lighting Light Свет
Palette Knife Нож для палитры
Poster Edges… Края плаката…
Poster Edges Края плаката
Underpainting… Подмалёвка…
Underpainting Подмалёвка
Levels Уровни
Edge Simplicity Простота краёв
Edge Fidelity Точность краёв
@@ -4893,6 +4895,7 @@ lighting Light Свет
Watercolor… Акварель…
Watercolor Акварель
Brush Size Размер кисти
Texture Coverage Покрытие текстурой
Definition Чёткость
Brush Detail Детализация кисти
Shadow Intensity Интенсивность теней
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -4575,6 +4575,8 @@ lighting Light Ljus
Palette Knife Palettkniv
Poster Edges… Affischkanter…
Poster Edges Affischkanter
Underpainting… Undermålning…
Underpainting Undermålning
Levels Nivåer
Edge Simplicity Kantförenkling
Edge Fidelity Kanttrohet
@@ -5239,6 +5241,7 @@ theme Appearance Utseende
Watercolor… Akvarell…
Watercolor Akvarell
Brush Size Penselstorlek
Texture Coverage Texturtäckning
Definition Skärpa
Brush Detail Penseldetalj
Shadow Intensity Skuggintensitet
Can't render this file because it contains an unexpected character in line 5 and column 25.
+3
View File
@@ -4678,6 +4678,8 @@ lighting Light Світло
Palette Knife Ніж палітри
Poster Edges… Плакатні краї…
Poster Edges Плакатні краї
Underpainting… Підмалювання…
Underpainting Підмалювання
Levels Рівні
Edge Simplicity Простота країв
Edge Fidelity Точність країв
@@ -4877,6 +4879,7 @@ lighting Light Світло
Watercolor… Акварель…
Watercolor Акварель
Brush Size Розмір пензля
Texture Coverage Покриття текстурою
Definition Чіткість
Brush Detail Деталізація пензля
Shadow Intensity Інтенсивність тіней
Can't render this file because it contains an unexpected character in line 733 and column 40.
+3
View File
@@ -1280,6 +1280,8 @@
Palette Knife Dao palette
Poster Edges… Viền áp phích…
Poster Edges Viền áp phích
Underpainting… Lớp sơn nền…
Underpainting Lớp sơn nền
Levels Số mức
Edge Simplicity Độ đơn giản của cạnh
Edge Fidelity Độ trung thực của cạnh
@@ -4877,6 +4879,7 @@ theme Appearance Giao diện
Watercolor… Màu nước…
Watercolor Màu nước
Brush Size Kích thước cọ
Texture Coverage Độ phủ kết cấu
Definition Độ nét
Brush Detail Chi tiết cọ
Shadow Intensity Cường độ bóng
Can't render this file because it contains an unexpected character in line 4016 and column 10.
+3
View File
@@ -4962,6 +4962,8 @@ lighting Light 光源
Palette Knife 调色刀
Poster Edges… 海报边缘…
Poster Edges 海报边缘
Underpainting… 底纹效果…
Underpainting 底纹效果
Levels 色阶数
Edge Simplicity 边缘简化度
Edge Fidelity 边缘逼真度
@@ -5118,6 +5120,7 @@ lighting Light 光源
Watercolor… 水彩…
Watercolor 水彩
Brush Size 画笔大小
Texture Coverage 纹理覆盖
Definition 清晰度
Brush Detail 画笔细节
Shadow Intensity 阴影强度
Can't render this file because it contains an unexpected character in line 2 and column 73.
+3
View File
@@ -4768,6 +4768,8 @@ lighting Light 光源
Palette Knife 調色刀
Poster Edges… 海報邊緣…
Poster Edges 海報邊緣
Underpainting… 底紋效果…
Underpainting 底紋效果
Levels 色階數
Edge Simplicity 邊緣簡化度
Edge Fidelity 邊緣逼真度
@@ -4928,6 +4930,7 @@ lighting Light 光源
Watercolor… 水彩…
Watercolor 水彩
Brush Size 筆刷大小
Texture Coverage 紋理覆蓋
Definition 清晰度
Brush Detail 筆刷細節
Shadow Intensity 陰影強度
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1
View File
@@ -99,6 +99,7 @@ fn effect_menu_lists_the_artistic_filters_before_blur() {
"Poster Edges…",
"Smudge Stick…",
"Sponge…",
"Underpainting…",
"Watercolor…"
]
);