diff --git a/crates/doc/src/style_libs.rs b/crates/doc/src/style_libs.rs index f64bdb430..97d46b7cd 100644 --- a/crates/doc/src/style_libs.rs +++ b/crates/doc/src/style_libs.rs @@ -155,6 +155,7 @@ pub const STYLE_LIBRARIES: &[BuiltinStyleLibrary] = &[ BuiltinStyleLibrary { id: "shadows-glows", name: "Shadows and Glows", make: shadows_glows }, BuiltinStyleLibrary { id: "outlines-rules", name: "Outlines and Rules", make: outlines_rules }, BuiltinStyleLibrary { id: "hand-drawn", name: "Hand-Drawn", make: hand_drawn }, + BuiltinStyleLibrary { id: "textures", name: "Textures", make: textures }, BuiltinStyleLibrary { id: "gradient-finishes", name: "Gradient Finishes", make: gradient_finishes }, BuiltinStyleLibrary { id: "shape-effects", name: "Shape Effects", make: shape_effects }, BuiltinStyleLibrary { id: "blends-transparency", name: "Blends and Transparency", make: blends_transparency }, @@ -322,6 +323,44 @@ fn hand_drawn() -> Vec { ] } +/// Textures: fills and strokes painted with the catalog's texture effects (grain, canvas and +/// burlap surfaces, craquelure, tiles, patchwork, stained glass and water paper). +fn textures() -> Vec { + let surface = |texture: &str, scaling: f64, relief: f64, light: &str| { + fx("texture.texturizer", json!({"texture": texture, "scaling": scaling, "relief": relief, "lightDirection": light, "invert": false})) + }; + vec![ + style( + "Fine Grain", + vec![F(fill("#c9ada7")), S(stroke("#4a4e69", 1.0))], + vec![fx("texture.grain", json!({"intensity": 35.0, "contrast": 55.0, "grainType": "regular"}))], + ), + style("Canvas Weave", vec![F(fill("#e9d8a6"))], vec![surface("canvas", 100.0, 6.0, "topLeft")]), + style("Burlap Sack", vec![F(fill("#bc8a5f")), S(stroke("#6f4518", 1.5))], vec![surface("burlap", 120.0, 8.0, "top")]), + style( + "Cracked Glaze", + vec![F(fill("#94d2bd")), S(stroke("#005f73", 1.0))], + vec![fx("texture.craquelure", json!({"crackSpacing": 12.0, "crackDepth": 5.0, "crackBrightness": 8.0}))], + ), + style( + "Mosaic Floor", + vec![F(fill("#0a9396"))], + vec![fx("texture.mosaicTiles", json!({"tileSize": 10.0, "groutWidth": 3.0, "lightenGrout": 8.0}))], + ), + style("Quilted Squares", vec![F(fill("#ee9b00"))], vec![fx("texture.patchwork", json!({"squareSize": 5.0, "relief": 10.0}))]), + style( + "Leaded Glass", + vec![F(FillLayer::new(linear(-45.0, &[(0.0, "#ae2012", 1.0), (0.5, "#ee9b00", 1.0), (1.0, "#005f73", 1.0)])))], + vec![fx("texture.stainedGlass", json!({"cellSize": 8.0, "borderThickness": 4.0, "lightIntensity": 3.0}))], + ), + style( + "Damp Paper", + vec![F(fill("#4895ef")), S(stroke("#3f37c9", 1.0))], + vec![fx("sketch.waterPaper", json!({"fiberLength": 12.0, "brightness": 55.0, "contrast": 60.0}))], + ), + ] +} + fn gradient_finishes() -> Vec { let rim = |h: &str| S(stroke(h, 1.0)); vec![ @@ -550,6 +589,18 @@ mod tests { assert_eq!(status.name, "Status Effects"); let status_names: Vec<&str> = status.styles.iter().map(|g| g.name.as_str()).collect(); assert_eq!(status_names, ["Poison Tint", "Freeze Edge", "Burn Aura", "Stun Pulse", "Stealth Fade", "Shield Buff"]); + let textures = builtin_style_library("textures").unwrap(); + assert_eq!(textures.name, "Textures"); + let texture_names: Vec<&str> = textures.styles.iter().map(|g| g.name.as_str()).collect(); + let expected = + ["Fine Grain", "Canvas Weave", "Burlap Sack", "Cracked Glaze", "Mosaic Floor", "Quilted Squares", "Leaded Glass", "Damp Paper"]; + assert_eq!(texture_names, expected); + for b in STYLE_LIBRARIES.iter().filter(|b| b.id != "textures") { + let lib = builtin_style_library(b.id).unwrap(); + assert!(lib.styles.iter().all(|g| !expected.contains(&g.name.as_str())), "{} shares a name with Textures", b.id); + } + let ids: Vec<&str> = STYLE_LIBRARIES.iter().map(|b| b.id).collect(); + assert_eq!(ids.iter().position(|&i| i == "textures"), ids.iter().position(|&i| i == "hand-drawn").map(|i| i + 1), "after Hand-Drawn"); } #[test] diff --git a/crates/engine/src/tests/stylelib.rs b/crates/engine/src/tests/stylelib.rs index 5124fb450..d1d415590 100644 --- a/crates/engine/src/tests/stylelib.rs +++ b/crates/engine/src/tests/stylelib.rs @@ -44,6 +44,7 @@ fn builtin_libraries_are_listed_with_original_styles_using_catalogued_effects() assert!(libs.len() >= 8 && libs.iter().all(|l| l["category"] == "builtIn"), "{libs:?}"); assert!(libs.iter().any(|l| l["id"] == "game-hud" && l["name"] == "Game HUD"), "{libs:?}"); assert!(libs.iter().any(|l| l["id"] == "status-effects" && l["name"] == "Status Effects"), "{libs:?}"); + assert!(libs.iter().any(|l| l["id"] == "textures" && l["name"] == "Textures" && l["count"] == 8), "{libs:?}"); for l in libs { let id = l["id"].as_str().unwrap(); let g = run(&mut s, "graphicStyle.library", json!({"library": id})); @@ -64,6 +65,10 @@ fn builtin_libraries_are_listed_with_original_styles_using_catalogued_effects() let status = run(&mut s, "graphicStyle.library", json!({"library": "status-effects"})); let status_names: Vec<&str> = status["styles"].as_array().unwrap().iter().map(|x| x["name"].as_str().unwrap()).collect(); assert_eq!(status_names, ["Poison Tint", "Freeze Edge", "Burn Aura", "Stun Pulse", "Stealth Fade", "Shield Buff"]); + let textures = run(&mut s, "graphicStyle.library", json!({"library": "textures"})); + let texture_names: Vec<&str> = textures["styles"].as_array().unwrap().iter().map(|x| x["name"].as_str().unwrap()).collect(); + let expected = ["Fine Grain", "Canvas Weave", "Burlap Sack", "Cracked Glaze", "Mosaic Floor", "Quilted Squares", "Leaded Glass", "Damp Paper"]; + assert_eq!(texture_names, expected); let id = rect(&mut s, 10.0, 20.0, 40.0, 30.0); let r = run(&mut s, "graphicStyle.addFromLibrary", json!({"library": "game-hud", "name": "Mana Glow", "apply": true, "ids": [id.0]})); assert_eq!((names(&r["added"]), r["applied"].as_str()), (vec!["Mana Glow"], Some("Mana Glow"))); @@ -167,6 +172,53 @@ fn add_with_null_ids_applies_to_selection() { assert_eq!(doc(&s).node(id).unwrap().extras().graphic_style, Some(style.id)); } +#[test] +fn textures_styles_apply_their_texture_effects_and_keep_their_params_through_save_and_open() { + let mut s = session(); + let (_, lib) = cmd::stylelib::library(&s, "textures").unwrap(); + let mut ids = vec![]; + for (i, g) in lib.styles.iter().enumerate() { + let id = rect(&mut s, (i % 4) as f64 * 50.0, (i / 4) as f64 * 50.0, 40.0, 40.0); + let before = undo_len(&s); + let r = run(&mut s, "graphicStyle.addFromLibrary", json!({"library": "textures", "name": g.name, "apply": true, "ids": [id.0]})); + assert_eq!((names(&r["added"]), r["applied"].as_str()), (vec![g.name.as_str()], Some(g.name.as_str()))); + assert_eq!(undo_len(&s), before + 1, "{}: added and applied as one step", g.name); + ids.push(id); + } + let effects = |s: &Session| -> Vec> { + ids.iter().map(|id| doc(s).node(*id).unwrap().appearance.effects.iter().map(|e| (e.id.clone(), e.params.clone())).collect()).collect() + }; + let applied = effects(&s); + let effect_ids: Vec> = applied.iter().map(|fx| fx.iter().map(|(id, _)| id.as_str()).collect()).collect(); + assert_eq!( + effect_ids, + [ + ["texture.grain"], + ["texture.texturizer"], + ["texture.texturizer"], + ["texture.craquelure"], + ["texture.mosaicTiles"], + ["texture.patchwork"], + ["texture.stainedGlass"], + ["sketch.waterPaper"], + ] + ); + assert_eq!(applied[1][0].1["texture"], "canvas"); + assert_eq!(applied[3][0].1["crackSpacing"], 12.0); + for (fx, g) in applied.iter().zip(&lib.styles) { + let want: Vec<(String, Value)> = g.appearance.effects.iter().map(|e| (e.id.clone(), e.params.clone())).collect(); + assert_eq!(fx, &want, "{} applies the library's params", g.name); + } + let b64 = run(&mut s, "document.serialize", json!({"format": "vectorcraft"}))["dataBase64"].as_str().unwrap().to_string(); + run(&mut s, "document.open", json!({"name": "textures.vectorcraft", "dataBase64": b64})); + assert_eq!(effects(&s), applied, "the params survive a save and open"); + for g in &lib.styles { + let saved = doc(&s).graphic_style(&g.name).unwrap(); + assert!(saved.same_look(g), "{} keeps its look", g.name); + assert!(ids.iter().any(|id| doc(&s).node(*id).unwrap().extras().graphic_style == Some(saved.id)), "{} stays linked", g.name); + } +} + /// A document with pattern `name` (a dot) and its swatch. fn add_pattern(s: &mut Session, name: &str, radius: f64) { s.edit("Pattern", |d, _| { diff --git a/crates/ui-egui/src/i18n/bg.tsv b/crates/ui-egui/src/i18n/bg.tsv index 47bdd1d31..1e98314c7 100644 --- a/crates/ui-egui/src/i18n/bg.tsv +++ b/crates/ui-egui/src/i18n/bg.tsv @@ -3091,6 +3091,15 @@ digits Malayalam Малаялам Stun Pulse Зашеметяване Stealth Fade Скритост Shield Buff Щит + Textures Текстури + Fine Grain Фино зърно + Canvas Weave Тъкано платно + Burlap Sack Зебло + Cracked Glaze Напукана глазура + Mosaic Floor Мозаечен под + Quilted Squares Капитонирани квадрати + Leaded Glass Оловно стъкло + Damp Paper Влажна хартия Shape Фигура Shape Builder Създател на фигури Shape Builder Regions Области на създателя на фигури diff --git a/crates/ui-egui/src/i18n/bs.tsv b/crates/ui-egui/src/i18n/bs.tsv index d4e3937e0..c86750c63 100644 --- a/crates/ui-egui/src/i18n/bs.tsv +++ b/crates/ui-egui/src/i18n/bs.tsv @@ -794,6 +794,15 @@ Stun Pulse Omamljenost Stealth Fade Nevidljivost Shield Buff Štit + Textures Teksture + Fine Grain Fino zrno + Canvas Weave Tkano platno + Burlap Sack Jutena vreća + Cracked Glaze Ispucala glazura + Mosaic Floor Mozaični pod + Quilted Squares Prošiveni kvadrati + Leaded Glass Olovno staklo + Damp Paper Vlažni papir Outlines and Rules Obrisi i linije Hand-Drawn Ručno crtano Gradient Finishes Gradijentne završnice diff --git a/crates/ui-egui/src/i18n/ca.tsv b/crates/ui-egui/src/i18n/ca.tsv index 888b9ae7a..4ead4cc95 100644 --- a/crates/ui-egui/src/i18n/ca.tsv +++ b/crates/ui-egui/src/i18n/ca.tsv @@ -4009,6 +4009,15 @@ digits Malayalam Malaiàlam Stun Pulse Atordiment Stealth Fade Sigil Shield Buff Escut + Textures Textures + Fine Grain Gra fi + Canvas Weave Teixit de llenç + Burlap Sack Sac de jute + Cracked Glaze Vidrat esquerdat + Mosaic Floor Terra de mosaic + Quilted Squares Quadrats encoixinats + Leaded Glass Vitrall emplomat + Damp Paper Paper humit Shape Forma Shape Builder Constructor de formes Shape Builder Delete Suprimeix del constructor de formes diff --git a/crates/ui-egui/src/i18n/cs.tsv b/crates/ui-egui/src/i18n/cs.tsv index 2d4a7eb3c..f9afe1477 100644 --- a/crates/ui-egui/src/i18n/cs.tsv +++ b/crates/ui-egui/src/i18n/cs.tsv @@ -802,6 +802,15 @@ Stun Pulse Omráčení Stealth Fade Plížení Shield Buff Štít + Textures Textury + Fine Grain Jemné zrno + Canvas Weave Tkané plátno + Burlap Sack Pytlovina + Cracked Glaze Popraskaná glazura + Mosaic Floor Mozaiková podlaha + Quilted Squares Prošívané čtverce + Leaded Glass Olovnaté sklo + Damp Paper Vlhký papír Outlines and Rules Obrysy a linky Hand-Drawn Ručně kreslené Gradient Finishes Přechodové povrchy diff --git a/crates/ui-egui/src/i18n/da.tsv b/crates/ui-egui/src/i18n/da.tsv index 7a6c2f0bd..8373e6be0 100644 --- a/crates/ui-egui/src/i18n/da.tsv +++ b/crates/ui-egui/src/i18n/da.tsv @@ -740,6 +740,15 @@ Stun Pulse Bedøvelse Stealth Fade Snige Shield Buff Skjold + Textures Teksturer + Fine Grain Fin kornethed + Canvas Weave Lærredsvævning + Burlap Sack Jutesæk + Cracked Glaze Krakeleret glasur + Mosaic Floor Mosaikgulv + Quilted Squares Quiltede firkanter + Leaded Glass Blyindfattet glas + Damp Paper Fugtigt papir Outlines and Rules Konturer og linjer Hand-Drawn Håndtegnet Gradient Finishes Gradientfinish diff --git a/crates/ui-egui/src/i18n/de.tsv b/crates/ui-egui/src/i18n/de.tsv index 355ab9876..908da6f63 100644 --- a/crates/ui-egui/src/i18n/de.tsv +++ b/crates/ui-egui/src/i18n/de.tsv @@ -3138,6 +3138,15 @@ digits Malayalam Malayalam Stun Pulse Betäubung Stealth Fade Schleichen Shield Buff Schild + Textures Texturen + Fine Grain Feine Körnung + Canvas Weave Leinwandgewebe + Burlap Sack Jutesack + Cracked Glaze Craquelé-Glasur + Mosaic Floor Mosaikboden + Quilted Squares Gesteppte Quadrate + Leaded Glass Bleiglas + Damp Paper Feuchtes Papier Shape Form Shape Builder Formerstellung Shape Builder Regions Formerstellungsbereiche diff --git a/crates/ui-egui/src/i18n/el.tsv b/crates/ui-egui/src/i18n/el.tsv index ee8efea3e..3a3fa05ef 100644 --- a/crates/ui-egui/src/i18n/el.tsv +++ b/crates/ui-egui/src/i18n/el.tsv @@ -3656,6 +3656,15 @@ digits Malayalam Μαλαγιάλαμ Stun Pulse Ζάλη Stealth Fade Αορασία Shield Buff Ασπίδα + Textures Υφές + Fine Grain Λεπτός κόκκος + Canvas Weave Ύφανση καμβά + Burlap Sack Λινάτσα + Cracked Glaze Ραγισμένο γλάσο + Mosaic Floor Ψηφιδωτό δάπεδο + Quilted Squares Καπιτονέ τετράγωνα + Leaded Glass Μολυβδόδετο γυαλί + Damp Paper Υγρό χαρτί Shape Builder Regions Περιοχές δημιουργίας σχημάτων Shape Effects Εφέ σχημάτων Shape Mode Λειτουργία σχήματος diff --git a/crates/ui-egui/src/i18n/es.tsv b/crates/ui-egui/src/i18n/es.tsv index 3b00ce20e..31c73d80d 100644 --- a/crates/ui-egui/src/i18n/es.tsv +++ b/crates/ui-egui/src/i18n/es.tsv @@ -3177,6 +3177,15 @@ digits Malayalam Malayálam Stun Pulse Aturdimiento Stealth Fade Sigilo Shield Buff Escudo + Textures Texturas + Fine Grain Grano fino + Canvas Weave Tejido de lienzo + Burlap Sack Saco de arpillera + Cracked Glaze Esmalte agrietado + Mosaic Floor Suelo de mosaico + Quilted Squares Cuadros acolchados + Leaded Glass Vidrio emplomado + Damp Paper Papel húmedo Shape Forma Shape Builder Generador de formas Shape Builder Regions Regiones del generador de formas diff --git a/crates/ui-egui/src/i18n/fi.tsv b/crates/ui-egui/src/i18n/fi.tsv index 20f63f21e..599eb354b 100644 --- a/crates/ui-egui/src/i18n/fi.tsv +++ b/crates/ui-egui/src/i18n/fi.tsv @@ -793,6 +793,15 @@ Stun Pulse Tainnutus Stealth Fade Hiipiminen Shield Buff Kilpi + Textures Tekstuurit + Fine Grain Hieno rae + Canvas Weave Kanvaskudos + Burlap Sack Juuttisäkki + Cracked Glaze Krakeloitu lasite + Mosaic Floor Mosaiikkilattia + Quilted Squares Tikatut ruudut + Leaded Glass Lyijylasi + Damp Paper Kostea paperi Outlines and Rules Ääriviivat ja viivat Hand-Drawn Käsin piirretyt Gradient Finishes Liukuväriviimeistelyt diff --git a/crates/ui-egui/src/i18n/fr.tsv b/crates/ui-egui/src/i18n/fr.tsv index 93cf8cb21..e45b31b2d 100644 --- a/crates/ui-egui/src/i18n/fr.tsv +++ b/crates/ui-egui/src/i18n/fr.tsv @@ -3169,6 +3169,15 @@ digits Malayalam Malayalam Stun Pulse Étourdissement Stealth Fade Furtivité Shield Buff Bouclier + Textures Textures + Fine Grain Grain fin + Canvas Weave Toile tissée + Burlap Sack Sac de jute + Cracked Glaze Glaçure craquelée + Mosaic Floor Sol en mosaïque + Quilted Squares Carrés matelassés + Leaded Glass Vitrail au plomb + Damp Paper Papier humide Shape Forme Shape Builder Concepteur de forme Shape Builder Regions Zones du Concepteur de forme diff --git a/crates/ui-egui/src/i18n/hi.tsv b/crates/ui-egui/src/i18n/hi.tsv index 089d2de72..240313890 100644 --- a/crates/ui-egui/src/i18n/hi.tsv +++ b/crates/ui-egui/src/i18n/hi.tsv @@ -4324,6 +4324,15 @@ antiAlias Sharp शार्प Stun Pulse स्तब्ध Stealth Fade छिपना Shield Buff ढाल + Textures बनावटें + Fine Grain महीन दाना + Canvas Weave कैनवास बुनावट + Burlap Sack टाट की बोरी + Cracked Glaze दरकी ग्लेज़ + Mosaic Floor मोज़ेक फ़र्श + Quilted Squares रज़ाईदार वर्ग + Leaded Glass सीसा जड़ा काँच + Damp Paper नम काग़ज़ Shaft: दस्ता: Shape शेप Shape Builder शेप बिल्डर diff --git a/crates/ui-egui/src/i18n/hu.tsv b/crates/ui-egui/src/i18n/hu.tsv index 5dfa1fa7d..2e3c479de 100644 --- a/crates/ui-egui/src/i18n/hu.tsv +++ b/crates/ui-egui/src/i18n/hu.tsv @@ -3799,6 +3799,15 @@ mark-style Japanese Japán Stun Pulse Kábítás Stealth Fade Lopakodás Shield Buff Pajzs + Textures Textúrák + Fine Grain Finom szemcse + Canvas Weave Vászonszövés + Burlap Sack Jutazsák + Cracked Glaze Repedezett máz + Mosaic Floor Mozaikpadló + Quilted Squares Steppelt négyzetek + Leaded Glass Ólomüveg + Damp Paper Nedves papír Shape Alakzat Shape Builder Alakzatépítő Shape Builder Regions Alakzatépítő területei diff --git a/crates/ui-egui/src/i18n/id.tsv b/crates/ui-egui/src/i18n/id.tsv index 24f1e2add..863cef09a 100644 --- a/crates/ui-egui/src/i18n/id.tsv +++ b/crates/ui-egui/src/i18n/id.tsv @@ -740,6 +740,15 @@ Stun Pulse Pingsan Stealth Fade Menghilang Shield Buff Perisai + Textures Tekstur + Fine Grain Butiran Halus + Canvas Weave Anyaman Kanvas + Burlap Sack Karung Goni + Cracked Glaze Glasir Retak + Mosaic Floor Lantai Mosaik + Quilted Squares Kotak Quilt + Leaded Glass Kaca Patri + Damp Paper Kertas Basah Outlines and Rules Garis luar dan garis Hand-Drawn Gambar tangan Gradient Finishes Finishing gradien diff --git a/crates/ui-egui/src/i18n/it.tsv b/crates/ui-egui/src/i18n/it.tsv index 7fdbd773c..44496d3c6 100644 --- a/crates/ui-egui/src/i18n/it.tsv +++ b/crates/ui-egui/src/i18n/it.tsv @@ -3214,6 +3214,15 @@ digits Malayalam Malayalam Stun Pulse Stordimento Stealth Fade Furtività Shield Buff Scudo + Textures Texture + Fine Grain Grana fine + Canvas Weave Trama di tela + Burlap Sack Sacco di iuta + Cracked Glaze Smalto craquelé + Mosaic Floor Pavimento a mosaico + Quilted Squares Quadrati trapuntati + Leaded Glass Vetro piombato + Damp Paper Carta umida Shape Forma Shape Builder Generatore forme Shape Builder Regions Aree del Generatore forme diff --git a/crates/ui-egui/src/i18n/ja.tsv b/crates/ui-egui/src/i18n/ja.tsv index 4f66a3280..5e22df25e 100644 --- a/crates/ui-egui/src/i18n/ja.tsv +++ b/crates/ui-egui/src/i18n/ja.tsv @@ -826,6 +826,15 @@ digits Malayalam マラヤーラム数字 Stun Pulse 気絶 Stealth Fade ステルス Shield Buff シールド + Textures テクスチャ集 + Fine Grain 細かい粒子 + Canvas Weave キャンバス織り + Burlap Sack 麻袋 + Cracked Glaze ひび割れ釉 + Mosaic Floor モザイクの床 + Quilted Squares キルトの四角 + Leaded Glass 鉛ガラス + Damp Paper 湿った紙 Outlines and Rules アウトラインと罫線 Hand-Drawn 手描き風 Gradient Finishes グラデーション仕上げ diff --git a/crates/ui-egui/src/i18n/ka.tsv b/crates/ui-egui/src/i18n/ka.tsv index b80b1a912..023613e06 100644 --- a/crates/ui-egui/src/i18n/ka.tsv +++ b/crates/ui-egui/src/i18n/ka.tsv @@ -699,6 +699,15 @@ Stun Pulse დაბნეულობა Stealth Fade შენიღბვა Shield Buff ფარი + Textures ტექსტურები + Fine Grain წვრილი მარცვალი + Canvas Weave ტილოს ქსოვილი + Burlap Sack ჯუთის ტომარა + Cracked Glaze დამსკდარი მინანქარი + Mosaic Floor მოზაიკის იატაკი + Quilted Squares ქვილთის კვადრატები + Leaded Glass ტყვიის მინა + Damp Paper ნესტიანი ქაღალდი Outlines and Rules კონტურები და ხაზები Hand-Drawn ხელით დახატული Gradient Finishes გრადიენტული ზედაპირები diff --git a/crates/ui-egui/src/i18n/ko.tsv b/crates/ui-egui/src/i18n/ko.tsv index b488b07a9..13040d80d 100644 --- a/crates/ui-egui/src/i18n/ko.tsv +++ b/crates/ui-egui/src/i18n/ko.tsv @@ -819,6 +819,15 @@ digits Malayalam 말라얄람어 Stun Pulse 기절 Stealth Fade 은신 Shield Buff 방패 + Textures 텍스처 + Fine Grain 고운 입자 + Canvas Weave 캔버스 직조 + Burlap Sack 마대 자루 + Cracked Glaze 갈라진 유약 + Mosaic Floor 모자이크 바닥 + Quilted Squares 퀼트 사각형 + Leaded Glass 납유리 + Damp Paper 젖은 종이 Outlines and Rules 윤곽선과 괘선 Hand-Drawn 손그림 Gradient Finishes 그레이디언트 마감 diff --git a/crates/ui-egui/src/i18n/nl.tsv b/crates/ui-egui/src/i18n/nl.tsv index 2557f5e19..f20c190bc 100644 --- a/crates/ui-egui/src/i18n/nl.tsv +++ b/crates/ui-egui/src/i18n/nl.tsv @@ -754,6 +754,15 @@ Stun Pulse Verdoving Stealth Fade Sluipen Shield Buff Schild + Textures Texturen + Fine Grain Fijne korrel + Canvas Weave Canvasweefsel + Burlap Sack Jutezak + Cracked Glaze Gecraqueleerd glazuur + Mosaic Floor Mozaïekvloer + Quilted Squares Gequilte vierkanten + Leaded Glass Glas-in-lood + Damp Paper Vochtig papier Outlines and Rules Omtrekken en lijnen Hand-Drawn Handgetekend Gradient Finishes Verloopafwerkingen diff --git a/crates/ui-egui/src/i18n/pl.tsv b/crates/ui-egui/src/i18n/pl.tsv index 2ad2c7096..a285a2496 100644 --- a/crates/ui-egui/src/i18n/pl.tsv +++ b/crates/ui-egui/src/i18n/pl.tsv @@ -749,6 +749,15 @@ Stun Pulse Ogłuszenie Stealth Fade Ukrycie Shield Buff Tarcza + Textures Tekstury + Fine Grain Drobne ziarno + Canvas Weave Splot płótna + Burlap Sack Worek jutowy + Cracked Glaze Spękana glazura + Mosaic Floor Mozaikowa posadzka + Quilted Squares Pikowane kwadraty + Leaded Glass Witraż ołowiany + Damp Paper Wilgotny papier Outlines and Rules Kontury i linie Hand-Drawn Rysowane odręcznie Gradient Finishes Wykończenia gradientowe diff --git a/crates/ui-egui/src/i18n/pt-br.tsv b/crates/ui-egui/src/i18n/pt-br.tsv index d8e08c3b7..679f620c4 100644 --- a/crates/ui-egui/src/i18n/pt-br.tsv +++ b/crates/ui-egui/src/i18n/pt-br.tsv @@ -2669,6 +2669,15 @@ digits Malayalam Malaiala Stun Pulse Atordoamento Stealth Fade Furtividade Shield Buff Escudo + Textures Texturas + Fine Grain Grão fino + Canvas Weave Trama de tela + Burlap Sack Saco de juta + Cracked Glaze Esmalte craquelado + Mosaic Floor Piso de mosaico + Quilted Squares Quadrados acolchoados + Leaded Glass Vitral de chumbo + Damp Paper Papel úmido Shape Forma Shape Builder Construtor de Formas Shape Builder Regions Regiões do Construtor de Formas diff --git a/crates/ui-egui/src/i18n/ru.tsv b/crates/ui-egui/src/i18n/ru.tsv index e3633377d..6947dd3f4 100644 --- a/crates/ui-egui/src/i18n/ru.tsv +++ b/crates/ui-egui/src/i18n/ru.tsv @@ -3209,6 +3209,15 @@ digits Malayalam Малаялам Stun Pulse Оглушение Stealth Fade Скрытность Shield Buff Щит + Textures Текстуры + Fine Grain Мелкое зерно + Canvas Weave Холстяное плетение + Burlap Sack Мешковина + Cracked Glaze Потрескавшаяся глазурь + Mosaic Floor Мозаичный пол + Quilted Squares Стёганые квадраты + Leaded Glass Витражное стекло + Damp Paper Влажная бумага Shape Фигура Shape Builder Создание фигур Shape Builder Regions Области создания фигур diff --git a/crates/ui-egui/src/i18n/sv.tsv b/crates/ui-egui/src/i18n/sv.tsv index ed9c849e3..af11c543a 100644 --- a/crates/ui-egui/src/i18n/sv.tsv +++ b/crates/ui-egui/src/i18n/sv.tsv @@ -3101,6 +3101,15 @@ digits Malayalam Malayalam Stun Pulse Bedövning Stealth Fade Smyga Shield Buff Sköld + Textures Texturer + Fine Grain Fin kornighet + Canvas Weave Kanvasväv + Burlap Sack Jutesäck + Cracked Glaze Krackelerad glasyr + Mosaic Floor Mosaikgolv + Quilted Squares Quiltade rutor + Leaded Glass Blyinfattat glas + Damp Paper Fuktigt papper Shape Form Shape Builder Formbyggare Shape Builder Regions Formbyggarområden diff --git a/crates/ui-egui/src/i18n/tr.tsv b/crates/ui-egui/src/i18n/tr.tsv index 8cac6c596..fe9e57e0b 100644 --- a/crates/ui-egui/src/i18n/tr.tsv +++ b/crates/ui-egui/src/i18n/tr.tsv @@ -3005,6 +3005,15 @@ digits Malayalam Malayalam Stun Pulse Sersemletme Stealth Fade Gizlilik Shield Buff Kalkan + Textures Dokular + Fine Grain İnce Gren + Canvas Weave Kanvas Dokuma + Burlap Sack Çuval Bezi + Cracked Glaze Çatlak Sır + Mosaic Floor Mozaik Zemin + Quilted Squares Kapitone Kareler + Leaded Glass Kurşunlu Cam + Damp Paper Nemli Kâğıt Shape Şekil Shape Builder Şekil Oluşturucu Shape Builder Regions Şekil Oluşturucu Bölgeleri diff --git a/crates/ui-egui/src/i18n/uk.tsv b/crates/ui-egui/src/i18n/uk.tsv index e4e9578b1..419c7bc71 100644 --- a/crates/ui-egui/src/i18n/uk.tsv +++ b/crates/ui-egui/src/i18n/uk.tsv @@ -3206,6 +3206,15 @@ digits Malayalam Малаялам Stun Pulse Оглушення Stealth Fade Невидимість Shield Buff Щит + Textures Текстури + Fine Grain Дрібне зерно + Canvas Weave Полотняне плетіння + Burlap Sack Мішковина + Cracked Glaze Потріскана глазур + Mosaic Floor Мозаїчна підлога + Quilted Squares Стьобані квадрати + Leaded Glass Вітражне скло + Damp Paper Вологий папір Shape Фігура Shape Builder Створення фігур Shape Builder Regions Області створення фігур diff --git a/crates/ui-egui/src/i18n/vi.tsv b/crates/ui-egui/src/i18n/vi.tsv index 616b186cc..85ebdd0b3 100644 --- a/crates/ui-egui/src/i18n/vi.tsv +++ b/crates/ui-egui/src/i18n/vi.tsv @@ -3545,6 +3545,15 @@ mark-style Japanese Kiểu Nhật Stun Pulse Choáng Stealth Fade Ẩn thân Shield Buff Khiên + Textures Kết cấu + Fine Grain Hạt mịn + Canvas Weave Vải canvas + Burlap Sack Bao bố + Cracked Glaze Men rạn + Mosaic Floor Sàn khảm + Quilted Squares Ô chần bông + Leaded Glass Kính chì + Damp Paper Giấy ẩm Shape Hình dạng Shape Builder Tạo hình dạng Shape Builder Regions Vùng Tạo hình dạng diff --git a/crates/ui-egui/src/i18n/zh-hans.tsv b/crates/ui-egui/src/i18n/zh-hans.tsv index e452dd085..f12d3d8e3 100644 --- a/crates/ui-egui/src/i18n/zh-hans.tsv +++ b/crates/ui-egui/src/i18n/zh-hans.tsv @@ -3044,6 +3044,15 @@ digits Malayalam 马拉雅拉姆数字 Stun Pulse 眩晕 Stealth Fade 隐身 Shield Buff 护盾 + Textures 纹理 + Fine Grain 细颗粒 + Canvas Weave 帆布纹 + Burlap Sack 麻布袋 + Cracked Glaze 裂纹釉 + Mosaic Floor 马赛克地面 + Quilted Squares 绗缝方格 + Leaded Glass 铅条玻璃 + Damp Paper 湿纸 Shape 形状 Shape Builder 形状生成器 Shape Builder Regions 形状生成器区域 diff --git a/crates/ui-egui/src/i18n/zh-hant.tsv b/crates/ui-egui/src/i18n/zh-hant.tsv index 6061e368c..825701584 100644 --- a/crates/ui-egui/src/i18n/zh-hant.tsv +++ b/crates/ui-egui/src/i18n/zh-hant.tsv @@ -4175,6 +4175,15 @@ digits Malayalam 馬來亞拉姆數字 Stun Pulse 暈眩 Stealth Fade 隱身 Shield Buff 護盾 + Textures 紋理 + Fine Grain 細顆粒 + Canvas Weave 帆布紋 + Burlap Sack 麻布袋 + Cracked Glaze 裂紋釉 + Mosaic Floor 馬賽克地面 + Quilted Squares 絎縫方格 + Leaded Glass 鉛條玻璃 + Damp Paper 濕紙 Shape 形狀 Shape Builder 形狀建立 Shape Builder Regions 形狀建立區域 diff --git a/docs/gaps.md b/docs/gaps.md index a228181ab..1ce258a11 100644 --- a/docs/gaps.md +++ b/docs/gaps.md @@ -646,11 +646,12 @@ macOS cursor delivery (#2292) is narrowed to a native host adapter using the exi Direct Selection of a path, compound path or type inside a dynamic instance also takes opacity and blend (`transparency.set`) and a gradient or pattern fill or stroke (`paint.setFill` / `paint.setStroke`, Eyedropper), for that instance only; - graphic style libraries (Window › Graphic Style Libraries; eight original libraries generated in code, including - Game HUD with Health Fill, Mana Glow, Damage Flash, Quest Outline, Coin Shine and Boss Alert, and Status Effects - with Poison Tint, Freeze Edge, Burn Aura, Stun Pulse, Stealth Fade and Shield Buff; User Defined; Other - Library…; `graphicStyle.libraries`, `graphicStyle.addFromLibrary`). -- **Missing:** more built-in brush libraries beyond the six shipped (and further graphic-style libraries beyond the eight shipped, and further symbol libraries beyond Basic + graphic style libraries (Window › Graphic Style Libraries; nine original libraries generated in code, including + Game HUD with Health Fill, Mana Glow, Damage Flash, Quest Outline, Coin Shine and Boss Alert, Status Effects + with Poison Tint, Freeze Edge, Burn Aura, Stun Pulse, Stealth Fade and Shield Buff, and Textures with Fine Grain, + Canvas Weave, Burlap Sack, Cracked Glaze, Mosaic Floor, Quilted Squares, Leaded Glass and Damp Paper, painted with + the texture effects; User Defined; Other Library…; `graphicStyle.libraries`, `graphicStyle.addFromLibrary`). +- **Missing:** more built-in brush libraries beyond the six shipped (and further graphic-style libraries beyond the nine shipped, and further symbol libraries beyond Basic Shapes, UI Frames, Map Markers, Inventory Icons and Skill Icons; original, generated in code, never Adobe's); dynamic symbols' `.ai` read and write; Global Edit of groups holding type or images, rotated copies as matches and highlighting matches before the start; 9-slice guides outside the symbol's art (a dragged guide stops at the art's edge). diff --git a/docs/mcp.md b/docs/mcp.md index 530de91b8..903982931 100644 --- a/docs/mcp.md +++ b/docs/mcp.md @@ -3353,7 +3353,10 @@ as a value left out. ## Graphic style libraries Graphic style libraries are read-only sets of graphic styles generated in code (Shadows and Glows, Outlines and -Rules, Hand-Drawn, Gradient Finishes, Shape Effects, Blends and Transparency, Game HUD, Status Effects). `graphicStyle.libraries` lists them +Rules, Hand-Drawn, Textures, Gradient Finishes, Shape Effects, Blends and Transparency, Game HUD, Status Effects). Textures +(`textures`) paints its fills and strokes with the texture effects: Fine Grain (`texture.grain`), Canvas Weave and Burlap +Sack (`texture.texturizer`), Cracked Glaze (`texture.craquelure`), Mosaic Floor (`texture.mosaicTiles`), Quilted Squares +(`texture.patchwork`), Leaded Glass (`texture.stainedGlass`) and Damp Paper (`sketch.waterPaper`). `graphicStyle.libraries` lists them (`id`, `name`, `category`: `builtIn`, `user` or `loaded`, `count`) and `graphicStyle.library {library}` returns one's styles in the `graphicStyle.list` shape (`library` is an id or a name). `graphicStyle.addFromLibrary {library, name? | names?}` copies styles into the document's Graphic Styles as one undo step (no names: the whole library); styles the diff --git a/docs/target-app-parity.md b/docs/target-app-parity.md index 25732becb..559ed0bd8 100644 --- a/docs/target-app-parity.md +++ b/docs/target-app-parity.md @@ -1358,7 +1358,8 @@ Moved from the ROADMAP's "Shipped so far" on 2026-10-10. Update it when a featur - **Transparency:** three-state Knockout Group (on, neutral, off), Opacity & Mask Define Knockout Shape, Page Isolated Blending and Page Knockout Group, on screen and in SVG/PDF. SVG export writes a knockout group of opaque art plainly, without masks, so shapes meeting edge to edge leave no seam; translucent, blended, masked or brushed art knocks out through masks. Blend modes match the standard formulas on screen, in SVG and in PDF, and non-isolated groups blend with the art below. Flatten Transparency with presets, a dialog and a Flattener Preview panel. Flattening for files without transparency (PDF/X-1a, PDF/X-3) in a CMYK document keeps the inks where it rasterizes, as under an image with see-through pixels: the images it makes hold ink amounts, not screen colours the file would separate again, so a C100 M6 Y41 K3 panel stays C100 M6 Y41 K3 there (#2160, `engine/src/cmd/fileio/tests_pdfx.rs`). On the canvas, the renderer no longer draws the picture of the art below back as an image each time it copies the backdrop of a non-isolated group that blends: it keeps that picture and draws the art that follows over it. At 2880 × 1800, 50 translucent groups with Multiply members take 65 ms a frame instead of 299 ms on 8 threads (`vectorcraft-cli bench`), and the frames have the same pixels. Type inside a group, layer, symbol instance, blend or repeat keeps its opacity, blend mode, opacity mask, Opacity & Mask Define Knockout Shape, own effects, perspective and visibility when the effects on the container outline it. Hidden type with a geometry effect of its own is left out of exports. - - **Graphic styles:** styles keep opacity and blend mode, capture groups and type, apply on top with Alt, and link to the objects using them; Redefine, Break Link, Graphic Style Options, Select All Unused, Sort by Name, and Select > Same Graphic Style / Appearance Attribute. The panel has list and thumbnail views with rendered previews, merge, reorder and drag and drop, plus a Control bar Style picker; eight generated style libraries (including Game HUD and Status Effects) save and load as `.vcstyles`. + - **Graphic styles:** styles keep opacity and blend mode, capture groups and type, apply on top with Alt, and link to the objects using them; Redefine, Break Link, Graphic Style Options, Select All Unused, Sort by Name, and Select > Same Graphic Style / Appearance Attribute. The panel has list and thumbnail views with rendered previews, merge, reorder and drag and drop, plus a Control bar Style picker; nine generated style libraries (including Game HUD, Status Effects and Textures) save and load as `.vcstyles`. + The built-in Textures graphic style library (`graphicStyle.addFromLibrary {library: "textures"}`) has eight styles that paint their fills and strokes with the texture effects: Fine Grain (Grain), Canvas Weave and Burlap Sack (Texturizer), Cracked Glaze (Craquelure), Mosaic Floor (Mosaic Tiles), Quilted Squares (Patchwork), Leaded Glass (Stained Glass) and Damp Paper (Water Paper). The help page names new graphic styles for textures ([What's new](https://helpx.adobe.com/illustrator/desktop/new-features/whats-new.html)) without naming them, so the styles, their names and their settings are VectorCraft's own (`tests::stylelib::textures_styles_apply_their_texture_effects_and_keep_their_params_through_save_and_open`). In the Graphic Styles panel, Shift-click selects a range of styles and Ctrl/Cmd-click adds or removes one. Applying a style to several objects, and Redefine Graphic Style, give the objects one shared copy of the style's appearance instead of a copy each; an object that is edited later gets its own copy, and an object whose placed gradients are fitted to its own bounds gets its own. The undo history's memory estimate counts a shared appearance once. Saved files are unchanged (`crates/engine/src/tests/styles.rs`). - **Several text styles at once:** in the Character Styles and Paragraph Styles panels, Shift-click highlights a range of styles and Ctrl/Cmd-click adds or removes one, without applying them; the panel menu's Select All Unused (`charStyle.unused`, `paraStyle.unused`) highlights the styles no type uses (in the layers, opacity masks, symbols, graph designs, pattern tiles and the art of brushes), never the Normal style; Delete, the button or the menu item, deletes every highlighted style but Normal in one undo step (`charStyle.delete {names}`, `paraStyle.delete {names}`). The menu's Duplicate copies every highlighted style in one undo step and highlights the copies. A highlighted row dragged onto Create New Style or Delete carries every highlighted style: dropped on Create New Style it copies them all and highlights the copies, and dropped on Delete it deletes them all but Normal and clears the highlight; a row from outside the highlight carries only its own style. Public reference: [Character and paragraph styles](https://web.archive.org/web/20261015081534/https://helpx.adobe.com/illustrator/using/character-paragraph-styles.html).