From 8a4343e816c2a936994991bd8edb8639de66f199 Mon Sep 17 00:00:00 2001 From: khuntvidisha13 Date: Tue, 3 Mar 2026 13:39:16 +0530 Subject: [PATCH 1/5] Add visual tests for primitive shapes (rect, ellipse, triangle, arc, line, point) --- .../__screenshots__/shapes/arc-win32.png | Bin 0 -> 536 bytes .../__screenshots__/shapes/ellipse-win32.png | Bin 0 -> 717 bytes .../__screenshots__/shapes/line-win32.png | Bin 0 -> 255 bytes .../__screenshots__/shapes/point-win32.png | Bin 0 -> 182 bytes .../__screenshots__/shapes/rect-win32.png | Bin 0 -> 160 bytes .../__screenshots__/shapes/triangle-win32.png | Bin 0 -> 375 bytes .../src/test/shapes/PrimitiveShapeTest.java | 89 ++++++++++++++++++ .../processing/mode/java/ParserTests.java | 12 +++ java/test/resources/interface_test.expected | 33 +++++++ java/test/resources/interface_test.pde | 13 +++ 10 files changed, 147 insertions(+) create mode 100644 core/test/processing/visual/__screenshots__/shapes/arc-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/ellipse-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/line-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/point-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/rect-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/triangle-win32.png create mode 100644 core/test/processing/visual/src/test/shapes/PrimitiveShapeTest.java create mode 100644 java/test/resources/interface_test.expected create mode 100644 java/test/resources/interface_test.pde diff --git a/core/test/processing/visual/__screenshots__/shapes/arc-win32.png b/core/test/processing/visual/__screenshots__/shapes/arc-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..3b1e137e5a2c8a6964f9424da9a6ca169455ad94 GIT binary patch literal 536 zcmV+z0_XjSP)4&9klzdxWx@mlMM_<6k*~9NXmdaKql@$iPSl7$7K6B z*8Xg#ocf-@PAmI;pO&>g+TtV8=)z|pS{y`+gJ^LOEe@i^L9{rC76;MdAX*$mi-Tx! z_@7$AVDNIee7&2~>E!eIXqgU$mdE4S@Aov-G~4ag;c(D09SW^zG`d_aX{u?a(*Pr_;1dheE4dF6Z-knrfPCHd`nZXqgU$)_6R|A$aepKOT=( zs};$#Oou`X#A302zfZGG&}cNm;V`YaMXl9rHUojc`Fy7FFL5{=yk2j;UZ*v;sI@>U zm8w>&wBaR+#bP3npapjr(i#i~PN#D=o6!;`qtVE2wvTHv`FywA!E(J`PbQOg zyNx++u~_gOG^>r*3^Lo7ogF&fON+c4r=zBb#Xf&Emr>oT}UC9q- zTitFql}b4r4wK0gkH>Sl-0SP>cs!m?r;Eh`E&3S2IG$pT-EKcWKW{dhG|)d`um!Qp z%S(+$b9#CTa|?c8Cg!Wv>SQwc{QOLV{sq3aTCJANW{X53qtS>e^8l;D;jr0k=J{KB z*+ML>R$D9+i0oCmp~l+&|0lVWqyUj7EYYo?S6Q8 zpy36O&1SJ5dc7VMTYP z-@l2yb$53sXm8!$-#eX78dVtc`5aqT&`CsgIXF02Z{EU9Z?#$l1WjJ&+AEMG2{ zQTzza@=I`w;Vvr_3RHxJ&(F`RtE;W8t@YfAOK@AGcnSuCU#lQ+^bQXXjYi`-D~Khi zmJ*2sUiakW1bwRfC$PKg^*Tx#g+hU~>#w(df;#i;>O-El$$|XI)x^;00000NkvXXu0mjf#>Z6Y literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shapes/line-win32.png b/core/test/processing/visual/__screenshots__/shapes/line-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..0e8129c0ac7c8232a1dd8d23452230b62825e69f GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~A$2?seLn`9lp4%wMtjNQ9F}qRi ziji(^8x#UDy#F5ixku0abMY^2oi)cCN7kT7_Oa#k` znuvbCM}i=0sBDn^T7(b50sXyx627wn(SH zRmnSbqt5BHjcU6OJW@B_{PACDyXo2pucJX=XW8{kY_Q7P#i|SR5re0zpUXO@geCw- Cm1}_j literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shapes/point-win32.png b/core/test/processing/visual/__screenshots__/shapes/point-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..d7439edeb981a6fcb8fa6c37a8fb8782d8a18823 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~AwVp1HAr*0NFKy&Kpuof677Fi*Ar*0N&u!#nP~c&`_{M%_ zv}S}S*V73Lj_x(m{O9^R=*eOEGfEK17a6G8uUod?Y;zUwW)7UN%AAeAZBxV& b!O)O_f%9d%_`!}ypp^`su6{1-oD!Ml$0OI}2hUi` zV%D;lwJc`;AZy#U{779`)^QxeFzoxDUq}nfT9#!T$9bOf3u!S~iE5gr^E{)#VzLs| zx~}(qrx&8t0rO^kr@}(Oyjd9)<_B|S{iMSDV6LoRsW2y) zp7j?M<^|mxWKNV&NGi8NPVMefeRumOx z1gmESQehUbN>(ftW&x{Yg;QZwuu@j~p}z0C*DQUx09ML+<60K8mc^`PF>6`OJ^@wV V3Nfe{fMoyx002ovPDHLkV1g78n{WUC literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/src/test/shapes/PrimitiveShapeTest.java b/core/test/processing/visual/src/test/shapes/PrimitiveShapeTest.java new file mode 100644 index 000000000..84e903978 --- /dev/null +++ b/core/test/processing/visual/src/test/shapes/PrimitiveShapeTest.java @@ -0,0 +1,89 @@ +package processing.visual.src.test.shapes; + +import org.junit.jupiter.api.*; +import processing.core.*; +import processing.visual.src.test.base.VisualTest; +import processing.visual.src.core.ProcessingSketch; +import processing.visual.src.core.TestConfig; + +@Tag("shapes") +@Tag("primitives") +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class PrimitiveShapeTest extends VisualTest { + + private ProcessingSketch createTest(ShapeCallback callback) { + return new ProcessingSketch() { + @Override + public void setup(PApplet p) { + p.background(200); + p.fill(255); + p.stroke(0); + } + + @Override + public void draw(PApplet p) { + callback.draw(p); + } + }; + } + + @FunctionalInterface + interface ShapeCallback { + void draw(PApplet p); + } + + @Test + @Order(1) + @DisplayName("Drawing a rectangle") + public void testRect() { + assertVisualMatch("shapes/rect", createTest(p -> { + p.rect(10, 10, 30, 30); + }), new TestConfig(50, 50)); + } + + @Test + @Order(2) + @DisplayName("Drawing an ellipse") + public void testEllipse() { + assertVisualMatch("shapes/ellipse", createTest(p -> { + p.ellipse(25, 25, 30, 20); + }), new TestConfig(50, 50)); + } + + @Test + @Order(3) + @DisplayName("Drawing a triangle") + public void testTriangle() { + assertVisualMatch("shapes/triangle", createTest(p -> { + p.triangle(25, 10, 10, 40, 40, 40); + }), new TestConfig(50, 50)); + } + + @Test + @Order(4) + @DisplayName("Drawing an arc") + public void testArc() { + assertVisualMatch("shapes/arc", createTest(p -> { + p.arc(25, 25, 30, 30, 0, PApplet.PI); + }), new TestConfig(50, 50)); + } + + @Test + @Order(5) + @DisplayName("Drawing a line") + public void testLine() { + assertVisualMatch("shapes/line", createTest(p -> { + p.line(10, 10, 40, 40); + }), new TestConfig(50, 50)); + } + + @Test + @Order(6) + @DisplayName("Drawing a point") + public void testPoint() { + assertVisualMatch("shapes/point", createTest(p -> { + p.strokeWeight(5); + p.point(25, 25); + }), new TestConfig(50, 50)); + } +} \ No newline at end of file diff --git a/java/test/processing/mode/java/ParserTests.java b/java/test/processing/mode/java/ParserTests.java index 9d589caaf..ccbf7b716 100644 --- a/java/test/processing/mode/java/ParserTests.java +++ b/java/test/processing/mode/java/ParserTests.java @@ -495,4 +495,16 @@ public void testWhitespace() { expectGood("whitespace", false); } + + + @Test + public void testWhitespaceTest() { + expectGood("whitespace_test", false); + + +} + @Test + public void testInterface() { + expectGood("interface_test", true); + } } diff --git a/java/test/resources/interface_test.expected b/java/test/resources/interface_test.expected new file mode 100644 index 000000000..e7b6d26e0 --- /dev/null +++ b/java/test/resources/interface_test.expected @@ -0,0 +1,33 @@ +import processing.core.*; +import processing.data.*; +import processing.event.*; +import processing.opengl.*; +import java.util.HashMap; +import java.util.ArrayList; +import java.io.File; +import java.io.BufferedReader; +import java.io.PrintWriter; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.IOException; +public class interface_test extends PApplet { +enum Direction { + NORTH, SOUTH, EAST, WEST +} + public void setup() { + size(100, 100); + Direction d = Direction.NORTH; + println(d); + } + public void draw() { + background(255); + } + static public void main(String[] passedArgs) { + String[] appletArgs = new String[] { "interface_test" }; + if (passedArgs != null) { + PApplet.main(concat(appletArgs, passedArgs)); + } else { + PApplet.main(appletArgs); + } + } +} \ No newline at end of file diff --git a/java/test/resources/interface_test.pde b/java/test/resources/interface_test.pde new file mode 100644 index 000000000..fe87ece6a --- /dev/null +++ b/java/test/resources/interface_test.pde @@ -0,0 +1,13 @@ +enum Direction { + NORTH, SOUTH, EAST, WEST +} + +void setup() { + size(100, 100); + Direction d = Direction.NORTH; + println(d); +} + +void draw() { + background(255); +} \ No newline at end of file From 8229d0478e8110bf3418223fe13dc5a42e8a2c95 Mon Sep 17 00:00:00 2001 From: khuntvidisha13 Date: Tue, 3 Mar 2026 18:53:32 +0530 Subject: [PATCH 2/5] Add OVERLAY, HARD_LIGHT, SOFT_LIGHT blend modes and BlendModesSuite, TypographySuite --- .../blend-modes/hard-light-win32.png | Bin 0 -> 268 bytes .../blend-modes/overlay-win32.png | Bin 0 -> 269 bytes .../blend-modes/soft-light-win32.png | Bin 0 -> 263 bytes .../shape-modes/arc-center-win32.png | Bin 0 -> 639 bytes .../shape-modes/arc-corner-win32.png | Bin 0 -> 639 bytes .../shape-modes/arc-corners-win32.png | Bin 0 -> 639 bytes .../arc-negative-dimensions-win32.png | Bin 0 -> 446 bytes .../shape-modes/arc-radius-win32.png | Bin 0 -> 639 bytes .../shape-modes/ellipse-center-win32.png | Bin 0 -> 958 bytes .../shape-modes/ellipse-corner-win32.png | Bin 0 -> 958 bytes .../shape-modes/ellipse-corners-win32.png | Bin 0 -> 958 bytes .../ellipse-negative-dimensions-win32.png | Bin 0 -> 1010 bytes .../shape-modes/ellipse-radius-win32.png | Bin 0 -> 958 bytes .../shape-modes/rect-center-win32.png | Bin 0 -> 704 bytes .../shape-modes/rect-corner-win32.png | Bin 0 -> 704 bytes .../shape-modes/rect-corners-win32.png | Bin 0 -> 704 bytes .../rect-negative-dimensions-win32.png | Bin 0 -> 177 bytes .../shape-modes/rect-radius-win32.png | Bin 0 -> 704 bytes .../shapes-3d/per-vertex-fills-win32.png | Bin 0 -> 660 bytes .../shapes-3d/per-vertex-strokes-win32.png | Bin 0 -> 696 bytes .../shapes-3d/vertex-coordinates-win32.png | Bin 0 -> 134 bytes .../shapes/bezier-curves-win32.png | Bin 0 -> 722 bytes .../shapes/closed-curves-win32.png | Bin 0 -> 723 bytes .../shapes/closed-polylines-win32.png | Bin 0 -> 602 bytes .../__screenshots__/shapes/contours-win32.png | Bin 0 -> 985 bytes .../shapes/curves-tightness-win32.png | Bin 0 -> 761 bytes .../__screenshots__/shapes/curves-win32.png | Bin 0 -> 702 bytes .../__screenshots__/shapes/lines-win32.png | Bin 0 -> 387 bytes .../__screenshots__/shapes/points-win32.png | Bin 0 -> 254 bytes .../shapes/polylines-win32.png | Bin 0 -> 583 bytes .../shapes/quad-strips-win32.png | Bin 0 -> 405 bytes .../shapes/quadratic-beziers-win32.png | Bin 0 -> 579 bytes .../__screenshots__/shapes/quads-win32.png | Bin 0 -> 188 bytes .../shapes/single-closed-contour-win32.png | Bin 0 -> 222 bytes .../shapes/single-unclosed-contour-win32.png | Bin 0 -> 222 bytes .../shapes/triangle-fans-win32.png | Bin 0 -> 968 bytes .../shapes/triangle-strips-win32.png | Bin 0 -> 692 bytes .../shapes/triangles-win32.png | Bin 0 -> 686 bytes .../align/multi-line-center-bottom-win32.png | Bin 0 -> 1239 bytes .../align/multi-line-center-center-win32.png | Bin 0 -> 1240 bytes .../align/multi-line-center-top-win32.png | Bin 0 -> 1281 bytes .../align/multi-line-left-bottom-win32.png | Bin 0 -> 1198 bytes .../align/multi-line-left-center-win32.png | Bin 0 -> 1200 bytes .../align/multi-line-left-top-win32.png | Bin 0 -> 1240 bytes .../align/multi-line-right-bottom-win32.png | Bin 0 -> 1201 bytes .../align/multi-line-right-center-win32.png | Bin 0 -> 1203 bytes .../align/multi-line-right-top-win32.png | Bin 0 -> 1245 bytes .../align/single-word-center-bottom-win32.png | Bin 0 -> 5834 bytes .../align/single-word-center-center-win32.png | Bin 0 -> 5887 bytes .../align/single-word-center-top-win32.png | Bin 0 -> 5834 bytes .../align/single-word-left-bottom-win32.png | Bin 0 -> 5641 bytes .../align/single-word-left-center-win32.png | Bin 0 -> 5693 bytes .../align/single-word-left-top-win32.png | Bin 0 -> 5641 bytes .../align/single-word-right-bottom-win32.png | Bin 0 -> 5692 bytes .../align/single-word-right-center-win32.png | Bin 0 -> 5747 bytes .../align/single-word-right-top-win32.png | Bin 0 -> 5692 bytes .../typography/complex/colored-text-win32.png | Bin 0 -> 3866 bytes .../typography/complex/rotated-text-win32.png | Bin 0 -> 4263 bytes .../complex/transparent-text-win32.png | Bin 0 -> 7043 bytes .../typography/font/default-font-win32.png | Bin 0 -> 789 bytes .../typography/font/monospace-font-win32.png | Bin 0 -> 707 bytes .../typography/font/system-font-win32.png | Bin 0 -> 1211 bytes .../leading/different-values-win32.png | Bin 0 -> 5859 bytes .../typography/pfont/ascent-descent-win32.png | Bin 0 -> 350 bytes .../pfont/char-availability-win32.png | Bin 0 -> 3687 bytes .../size/sizes-comparison-win32.png | Bin 0 -> 8956 bytes .../textmode/mode-switching-win32.png | Bin 0 -> 1614 bytes .../typography/textmode/model-mode-win32.png | Bin 0 -> 1774 bytes .../typography/textmode/shape-mode-win32.png | Bin 0 -> 1768 bytes .../typography/width/string-width-win32.png | Bin 0 -> 1664 bytes .../src/test/blendmodes/BlendModeTest.java | 26 ++++++ .../src/test/suites/BlendModesSuite.java | 12 +++ .../src/test/suites/TypographySuite.java | 12 +++ .../src/test/typography/TextModeTest.java | 80 ++++++++++++++++++ 74 files changed, 130 insertions(+) create mode 100644 core/test/processing/visual/__screenshots__/blend-modes/hard-light-win32.png create mode 100644 core/test/processing/visual/__screenshots__/blend-modes/overlay-win32.png create mode 100644 core/test/processing/visual/__screenshots__/blend-modes/soft-light-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shape-modes/arc-center-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shape-modes/arc-corner-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shape-modes/arc-corners-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shape-modes/arc-negative-dimensions-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shape-modes/arc-radius-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shape-modes/ellipse-center-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shape-modes/ellipse-corner-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shape-modes/ellipse-corners-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shape-modes/ellipse-negative-dimensions-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shape-modes/ellipse-radius-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shape-modes/rect-center-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shape-modes/rect-corner-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shape-modes/rect-corners-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shape-modes/rect-negative-dimensions-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shape-modes/rect-radius-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes-3d/per-vertex-fills-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes-3d/per-vertex-strokes-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes-3d/vertex-coordinates-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/bezier-curves-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/closed-curves-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/closed-polylines-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/contours-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/curves-tightness-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/curves-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/lines-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/points-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/polylines-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/quad-strips-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/quadratic-beziers-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/quads-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/single-closed-contour-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/single-unclosed-contour-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/triangle-fans-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/triangle-strips-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/triangles-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/align/multi-line-center-bottom-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/align/multi-line-center-center-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/align/multi-line-center-top-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/align/multi-line-left-bottom-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/align/multi-line-left-center-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/align/multi-line-left-top-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/align/multi-line-right-bottom-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/align/multi-line-right-center-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/align/multi-line-right-top-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/align/single-word-center-bottom-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/align/single-word-center-center-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/align/single-word-center-top-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/align/single-word-left-bottom-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/align/single-word-left-center-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/align/single-word-left-top-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/align/single-word-right-bottom-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/align/single-word-right-center-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/align/single-word-right-top-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/complex/colored-text-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/complex/rotated-text-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/complex/transparent-text-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/font/default-font-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/font/monospace-font-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/font/system-font-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/leading/different-values-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/pfont/ascent-descent-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/pfont/char-availability-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/size/sizes-comparison-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/textmode/mode-switching-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/textmode/model-mode-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/textmode/shape-mode-win32.png create mode 100644 core/test/processing/visual/__screenshots__/typography/width/string-width-win32.png create mode 100644 core/test/processing/visual/src/test/suites/BlendModesSuite.java create mode 100644 core/test/processing/visual/src/test/suites/TypographySuite.java create mode 100644 core/test/processing/visual/src/test/typography/TextModeTest.java diff --git a/core/test/processing/visual/__screenshots__/blend-modes/hard-light-win32.png b/core/test/processing/visual/__screenshots__/blend-modes/hard-light-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..884cef9324d30258906f4d1c6c29139e054343ca GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~Ampxq^Ln`9lPT$CT*nx+6XYce6 zQuoyLZ2Z1`h{&5Ptl-kg!@^LmWE77V z$1c)vKk+eUy2dHNBAe@~T}3T2=Sx9SkFRaikIg&(HuMXVVs%*C1Y2$A6F=9a+V84) zZ)xa!V&2op`L82IZC5W!5B;*HYhLKZ&01AqNB7TQ{h;4*eg8EuZ+;r%oh%Vor*oap zcezZQQ2c18UZBd8ITh=?MK~?h=e-tkb&_lPVZaP`Ta3zV#x*-lHZKHvkHOQ`&t;uc GLK6V^N^eI1 literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/blend-modes/overlay-win32.png b/core/test/processing/visual/__screenshots__/blend-modes/overlay-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..e97036a342edc9fc5fe75b1b7cc3332ea9395fe8 GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~AS3F%DLn`9lPT$CT*nx+6XYce6 zLVA1r*}PuM+Jr^@X5k22#Nc$`u<0MCl;2f7E;Tb6e;6=-Ok{g>n5U&?-Rpjrz`hBO zcj^UBQGQaf&RgUuhvmH2Lavrheb0A+qzYf(n5Osrd7bE9hZFOrDyE!2B~WCSeX~#R zy{&p0$IZ<)uWM~rFG>&nvZiZZ=*7)iRbj5@SN#y*%zopr0N*8Ywg3PC literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/blend-modes/soft-light-win32.png b/core/test/processing/visual/__screenshots__/blend-modes/soft-light-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..feaf2d7455530a1d43afbdf1f86d9820dd35ce4d GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~A=R92;Ln`9lPCv-YEMv--aa{@%T7y-UrF#vdD)KPIw2I?UJd$L73zr&9lf*E=-> zp9mJ&nyYr%IIVlW%w?kciLZC2Xnf+3+%9+A@abEws>TV%rxl-^DdM@z`*3@>Eakt5%+eMVV;(uL`yN7 z1rw{P`vbizbDF#hxLo>O_M3FP>ulocoW!Q$;#zl<%Zu%|YE-|Qz}fK1xAzzO?|%JN ztS&olg87>Y)~-vNZ|0at@v=3?t#42E6`pG-!W!6?Y#%s(&cu1=pC5j>;r83UrwKr6xi%-wh2egFOV zW5v#xOMmL+mz0$p3lMRUw0ZR3+4Gz?^Xsow+i%O-b-2YOxkleoeZExlyE3<`OP#-JSG&{}1^$}3aSNCC>J1bSKcX*vWxwckMLm5< zr29X)MAgM69}85$b{d8?%;>qqd8+ZD&Xgy6OfJ03_?DkBea`e{clvdvq)buUSIJ-q zbYZrPg4*Je!@pE0|<$pq=(K>4nUDCo�CA5l`pim-17hMGGM}D@O1TaS?83{ F1OTblC^P^7 literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shape-modes/arc-corner-win32.png b/core/test/processing/visual/__screenshots__/shape-modes/arc-corner-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..124d3c8db9c9e481eb21efa1e6106111f1c3e811 GIT binary patch literal 639 zcmeAS@N?(olHy`uVBq!ia0vp^Hb7j@z`*3@>Eakt5%+eMVV;(uL`yN7 z1rw{P`vbizbDF#hxLo>O_M3FP>ulocoW!Q$;#zl<%Zu%|YE-|Qz}fK1xAzzO?|%JN ztS&olg87>Y)~-vNZ|0at@v=3?t#42E6`pG-!W!6?Y#%s(&cu1=pC5j>;r83UrwKr6xi%-wh2egFOV zW5v#xOMmL+mz0$p3lMRUw0ZR3+4Gz?^Xsow+i%O-b-2YOxkleoeZExlyE3<`OP#-JSG&{}1^$}3aSNCC>J1bSKcX*vWxwckMLm5< zr29X)MAgM69}85$b{d8?%;>qqd8+ZD&Xgy6OfJ03_?DkBea`e{clvdvq)buUSIJ-q zbYZrPg4*Je!@pE0|<$pq=(K>4nUDCo�CA5l`pim-17hMGGM}D@O1TaS?83{ F1OTblC^P^7 literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shape-modes/arc-corners-win32.png b/core/test/processing/visual/__screenshots__/shape-modes/arc-corners-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..124d3c8db9c9e481eb21efa1e6106111f1c3e811 GIT binary patch literal 639 zcmeAS@N?(olHy`uVBq!ia0vp^Hb7j@z`*3@>Eakt5%+eMVV;(uL`yN7 z1rw{P`vbizbDF#hxLo>O_M3FP>ulocoW!Q$;#zl<%Zu%|YE-|Qz}fK1xAzzO?|%JN ztS&olg87>Y)~-vNZ|0at@v=3?t#42E6`pG-!W!6?Y#%s(&cu1=pC5j>;r83UrwKr6xi%-wh2egFOV zW5v#xOMmL+mz0$p3lMRUw0ZR3+4Gz?^Xsow+i%O-b-2YOxkleoeZExlyE3<`OP#-JSG&{}1^$}3aSNCC>J1bSKcX*vWxwckMLm5< zr29X)MAgM69}85$b{d8?%;>qqd8+ZD&Xgy6OfJ03_?DkBea`e{clvdvq)buUSIJ-q zbYZrPg4*Je!@pE0|<$pq=(K>4nUDCo�CA5l`pim-17hMGGM}D@O1TaS?83{ F1OTblC^P^7 literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shape-modes/arc-negative-dimensions-win32.png b/core/test/processing/visual/__screenshots__/shape-modes/arc-negative-dimensions-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..a97455efbf08757a16dddd60b6797557ed8af7f1 GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0FXZU~KhtaSW-5dwWH9^`Qij10Pi* zCH&eQ*_GDlolMB&2%CLSUqRvzlUn3#ol`o8H)PD?FpHlQb9<6&L2Y33$0`Sw_sV_M zJNgZFJQsJ7JI_~tY}tpYo=nvfc&D^FMoM5OKAzuHwtMdT-+SZMU(C3YWf~~5`l^=o z7rFmy-j>~dTPEt7xi#wX$BL~{M+LOlKQ!>1^nU)0mq4+! z%`;c63KTJPEPqp?H7{~m=DFv^X3rbv`W-d)p0woi&oj^d9C})G(d2EV==n8Od*>Bx z4`Oj#@cP$hpyJ6Vm&EApuikbqa{cuW(<i6L53WAxNHm}(A{TQnB`5KX&rTF!3jS9i2fkvzMLvFZE;$Mqr& Rzku<=;OXk;vd$@?2>>=U&#?di literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shape-modes/arc-radius-win32.png b/core/test/processing/visual/__screenshots__/shape-modes/arc-radius-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..124d3c8db9c9e481eb21efa1e6106111f1c3e811 GIT binary patch literal 639 zcmeAS@N?(olHy`uVBq!ia0vp^Hb7j@z`*3@>Eakt5%+eMVV;(uL`yN7 z1rw{P`vbizbDF#hxLo>O_M3FP>ulocoW!Q$;#zl<%Zu%|YE-|Qz}fK1xAzzO?|%JN ztS&olg87>Y)~-vNZ|0at@v=3?t#42E6`pG-!W!6?Y#%s(&cu1=pC5j>;r83UrwKr6xi%-wh2egFOV zW5v#xOMmL+mz0$p3lMRUw0ZR3+4Gz?^Xsow+i%O-b-2YOxkleoeZExlyE3<`OP#-JSG&{}1^$}3aSNCC>J1bSKcX*vWxwckMLm5< zr29X)MAgM69}85$b{d8?%;>qqd8+ZD&Xgy6OfJ03_?DkBea`e{clvdvq)buUSIJ-q zbYZrPg4*Je!@pE0|<$pq=(K>4nUDCo�CA5l`pim-17hMGGM}D@O1TaS?83{ F1OTblC^P^7 literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shape-modes/ellipse-center-win32.png b/core/test/processing/visual/__screenshots__/shape-modes/ellipse-center-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..e0fd115f3795309df11b9ce8e8425de9226e967f GIT binary patch literal 958 zcmeAS@N?(olHy`uVBq!ia0vp^Hb7j@z`)$<>Eakt5%+fb#w;U85x2KZ z0v;}xT<#wTQ{+#WY~;#ODY$xzlY_v<&zx(VUri{JI%w`OUu}Zg(#RWXHO2pbbAR8k z=JY(Lri+IYZ_KnVyTp0vqPZWV{;$7(|Ni{>^W(>l&z_}O$jqBNx72Fxqf!G2AGOK9 zfB$~8|7iM`Y-@5-VU%veO`SS<+uJdQoHlIFy`e)6$MLeh0T%3LO z*{@$!`|qzloVxvXY;5e>>)9LsvYKRnsj#W5th~5h?qJz&*%|16iHQ^&UF2TwQ?MB%q7CEdJ)?9qB)s5k-6mOgYm{Y~EAae0Rb$_7H z+#R;_oM-mFV41s2t>b2&9_Kk-pc&okbaP8WP4ujG#L6_KSxZ^Y@DbQ7=-b;M1N72^ z4WdA&G+&ouG|4upXcPf)UMn`F^|H;k0Sc8o`c}c0YPLwYWY#Q&H0xa|7TbYl=`jaoAD&U$nlJui78W&22lIqFtF>gSwK!@4FYl2wKL2zm8$s!66(DD z*mBCv4!;YTSxqzEzL@mjP7%kfy)SNEatn6_`W)y~pxF;y*`H5yzL4XtY|aAqfB8nR zYuAQ@jQh7w0OZd7Prz0TrvP}osQLC$#f)u>CpMpCF_gY|h2zA+Gg7>K(ctJ=D+uzo kxCe+sOiDWK>Gq#VFVdQ&MBb@0L}5ld;kCd literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shape-modes/ellipse-corner-win32.png b/core/test/processing/visual/__screenshots__/shape-modes/ellipse-corner-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..e0fd115f3795309df11b9ce8e8425de9226e967f GIT binary patch literal 958 zcmeAS@N?(olHy`uVBq!ia0vp^Hb7j@z`)$<>Eakt5%+fb#w;U85x2KZ z0v;}xT<#wTQ{+#WY~;#ODY$xzlY_v<&zx(VUri{JI%w`OUu}Zg(#RWXHO2pbbAR8k z=JY(Lri+IYZ_KnVyTp0vqPZWV{;$7(|Ni{>^W(>l&z_}O$jqBNx72Fxqf!G2AGOK9 zfB$~8|7iM`Y-@5-VU%veO`SS<+uJdQoHlIFy`e)6$MLeh0T%3LO z*{@$!`|qzloVxvXY;5e>>)9LsvYKRnsj#W5th~5h?qJz&*%|16iHQ^&UF2TwQ?MB%q7CEdJ)?9qB)s5k-6mOgYm{Y~EAae0Rb$_7H z+#R;_oM-mFV41s2t>b2&9_Kk-pc&okbaP8WP4ujG#L6_KSxZ^Y@DbQ7=-b;M1N72^ z4WdA&G+&ouG|4upXcPf)UMn`F^|H;k0Sc8o`c}c0YPLwYWY#Q&H0xa|7TbYl=`jaoAD&U$nlJui78W&22lIqFtF>gSwK!@4FYl2wKL2zm8$s!66(DD z*mBCv4!;YTSxqzEzL@mjP7%kfy)SNEatn6_`W)y~pxF;y*`H5yzL4XtY|aAqfB8nR zYuAQ@jQh7w0OZd7Prz0TrvP}osQLC$#f)u>CpMpCF_gY|h2zA+Gg7>K(ctJ=D+uzo kxCe+sOiDWK>Gq#VFVdQ&MBb@0L}5ld;kCd literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shape-modes/ellipse-corners-win32.png b/core/test/processing/visual/__screenshots__/shape-modes/ellipse-corners-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..e0fd115f3795309df11b9ce8e8425de9226e967f GIT binary patch literal 958 zcmeAS@N?(olHy`uVBq!ia0vp^Hb7j@z`)$<>Eakt5%+fb#w;U85x2KZ z0v;}xT<#wTQ{+#WY~;#ODY$xzlY_v<&zx(VUri{JI%w`OUu}Zg(#RWXHO2pbbAR8k z=JY(Lri+IYZ_KnVyTp0vqPZWV{;$7(|Ni{>^W(>l&z_}O$jqBNx72Fxqf!G2AGOK9 zfB$~8|7iM`Y-@5-VU%veO`SS<+uJdQoHlIFy`e)6$MLeh0T%3LO z*{@$!`|qzloVxvXY;5e>>)9LsvYKRnsj#W5th~5h?qJz&*%|16iHQ^&UF2TwQ?MB%q7CEdJ)?9qB)s5k-6mOgYm{Y~EAae0Rb$_7H z+#R;_oM-mFV41s2t>b2&9_Kk-pc&okbaP8WP4ujG#L6_KSxZ^Y@DbQ7=-b;M1N72^ z4WdA&G+&ouG|4upXcPf)UMn`F^|H;k0Sc8o`c}c0YPLwYWY#Q&H0xa|7TbYl=`jaoAD&U$nlJui78W&22lIqFtF>gSwK!@4FYl2wKL2zm8$s!66(DD z*mBCv4!;YTSxqzEzL@mjP7%kfy)SNEatn6_`W)y~pxF;y*`H5yzL4XtY|aAqfB8nR zYuAQ@jQh7w0OZd7Prz0TrvP}osQLC$#f)u>CpMpCF_gY|h2zA+Gg7>K(ctJ=D+uzo kxCe+sOiDWK>Gq#VFVdQ&MBb@0L}5ld;kCd literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shape-modes/ellipse-negative-dimensions-win32.png b/core/test/processing/visual/__screenshots__/shape-modes/ellipse-negative-dimensions-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..fe97057fab6ee863c6eec5ab79ce47310063beac GIT binary patch literal 1010 zcmV9ZC?gC@10&uyD|!xQcKT=~xg7;u4fD1?eq!4nmjP z1WUn9>m<54xd^%!Czp=iQ+w7+wK2KjdXO)V5PrUI^6~L|-xuh9NP)KSF=SyGk%eVM z7M2lNSVm-F8Igr$ME@by-CgJ8C{k^;G~0^uNRf(=E{ar*f3=5m|2yA4ZK+bo*_U;&ZBY7~mOT zwz!TL6MEQ*o= z?%!DThsRSRXu^~gJT=eJ(a}1F7KKp$-%FldEDD}lW_y@gdQ7Ts>d^SNENlPHc9 zCA+t`hg~mTcGpFUCZlztIK5DZ0$UT^x#mqw$ZwJp?aHqXz`amV1rpr}_jzGoOl6vcEpz0KR* zhSgTp49o5i)PP7b75O8n+wFEHGj}JG$#S`j`Nre%^Yim;Hp5qZk1M#2e?o@RQ&bMQ?32lRXEXEJFjsKMuQU0q!r z931rfeeL_-6`t?&`E+)oOi`wy2WlPF^X68oswi%^+uUkZt5u!V`c^Lc9S)e(^F)JRUEVN;orz!{IWwaOVvMgL=JQC={a64JX7(o3WO{ z-`dyL*Jo#E;c$3=f8TDmd_y7O^ literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shape-modes/ellipse-radius-win32.png b/core/test/processing/visual/__screenshots__/shape-modes/ellipse-radius-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..e0fd115f3795309df11b9ce8e8425de9226e967f GIT binary patch literal 958 zcmeAS@N?(olHy`uVBq!ia0vp^Hb7j@z`)$<>Eakt5%+fb#w;U85x2KZ z0v;}xT<#wTQ{+#WY~;#ODY$xzlY_v<&zx(VUri{JI%w`OUu}Zg(#RWXHO2pbbAR8k z=JY(Lri+IYZ_KnVyTp0vqPZWV{;$7(|Ni{>^W(>l&z_}O$jqBNx72Fxqf!G2AGOK9 zfB$~8|7iM`Y-@5-VU%veO`SS<+uJdQoHlIFy`e)6$MLeh0T%3LO z*{@$!`|qzloVxvXY;5e>>)9LsvYKRnsj#W5th~5h?qJz&*%|16iHQ^&UF2TwQ?MB%q7CEdJ)?9qB)s5k-6mOgYm{Y~EAae0Rb$_7H z+#R;_oM-mFV41s2t>b2&9_Kk-pc&okbaP8WP4ujG#L6_KSxZ^Y@DbQ7=-b;M1N72^ z4WdA&G+&ouG|4upXcPf)UMn`F^|H;k0Sc8o`c}c0YPLwYWY#Q&H0xa|7TbYl=`jaoAD&U$nlJui78W&22lIqFtF>gSwK!@4FYl2wKL2zm8$s!66(DD z*mBCv4!;YTSxqzEzL@mjP7%kfy)SNEatn6_`W)y~pxF;y*`H5yzL4XtY|aAqfB8nR zYuAQ@jQh7w0OZd7Prz0TrvP}osQLC$#f)u>CpMpCF_gY|h2zA+Gg7>K(ctJ=D+uzo kxCe+sOiDWK>Gq#VFVdQ&MBb@0L}5ld;kCd literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shape-modes/rect-center-win32.png b/core/test/processing/visual/__screenshots__/shape-modes/rect-center-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..f8b37838e356be6fa94d44fdf11672668d0d15cb GIT binary patch literal 704 zcmeAS@N?(olHy`uVBq!ia0vp^Hb7j@z`)e*>Eakt5%>0*r-!rHl_QU2Guz{wsC4x8Lg}Zk<`(o_ob6=J~t! z&f#QI^_Sq<{<>A~FZw@S{MWez$)EKcBB#!^n6z#(R`gx?#>XRA!&>+fcA+)Z3(xMU zy5V;AaP%*^zajP?Gxq;Kd?78)HfQm(hgRkGKG?NkF?^7lRP}W6f5zwf$MYA|a3um$ OCWEJ|pUXO@geCyJRZl4Z literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shape-modes/rect-corner-win32.png b/core/test/processing/visual/__screenshots__/shape-modes/rect-corner-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..f8b37838e356be6fa94d44fdf11672668d0d15cb GIT binary patch literal 704 zcmeAS@N?(olHy`uVBq!ia0vp^Hb7j@z`)e*>Eakt5%>0*r-!rHl_QU2Guz{wsC4x8Lg}Zk<`(o_ob6=J~t! z&f#QI^_Sq<{<>A~FZw@S{MWez$)EKcBB#!^n6z#(R`gx?#>XRA!&>+fcA+)Z3(xMU zy5V;AaP%*^zajP?Gxq;Kd?78)HfQm(hgRkGKG?NkF?^7lRP}W6f5zwf$MYA|a3um$ OCWEJ|pUXO@geCyJRZl4Z literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shape-modes/rect-corners-win32.png b/core/test/processing/visual/__screenshots__/shape-modes/rect-corners-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..f8b37838e356be6fa94d44fdf11672668d0d15cb GIT binary patch literal 704 zcmeAS@N?(olHy`uVBq!ia0vp^Hb7j@z`)e*>Eakt5%>0*r-!rHl_QU2Guz{wsC4x8Lg}Zk<`(o_ob6=J~t! z&f#QI^_Sq<{<>A~FZw@S{MWez$)EKcBB#!^n6z#(R`gx?#>XRA!&>+fcA+)Z3(xMU zy5V;AaP%*^zajP?Gxq;Kd?78)HfQm(hgRkGKG?NkF?^7lRP}W6f5zwf$MYA|a3um$ OCWEJ|pUXO@geCyJRZl4Z literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shape-modes/rect-negative-dimensions-win32.png b/core/test/processing/visual/__screenshots__/shape-modes/rect-negative-dimensions-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..18a0a4a4676a10219588a419f764bbafddc926ab GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~A6`n4RAr*0N&pUE881S%Oy!Sul zp4Umet=!gkRSxmgPj31k6Mp*G?}hH0JP^=6v3Hl6o86-G_wsk4bU z%vV@hzEFSv#{ECOnMA69;gbBYP@rh-Bv%B?I#tC`^pv4R@t{cw&@z`)e*>Eakt5%>0*r-!rHl_QU2Guz{wsC4x8Lg}Zk<`(o_ob6=J~t! z&f#QI^_Sq<{<>A~FZw@S{MWez$)EKcBB#!^n6z#(R`gx?#>XRA!&>+fcA+)Z3(xMU zy5V;AaP%*^zajP?Gxq;Kd?78)HfQm(hgRkGKG?NkF?^7lRP}W6f5zwf$MYA|a3um$ OCWEJ|pUXO@geCyJRZl4Z literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shapes-3d/per-vertex-fills-win32.png b/core/test/processing/visual/__screenshots__/shapes-3d/per-vertex-fills-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..f8e58c38c52ca06239e259c69540432c13538b8f GIT binary patch literal 660 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0FXZV2bv1aSW-5dppI@TiH>f?fIdj z$_GV?mWx09(jl?uRC3^s-S!F-LyF9ro9{!C$}aKOW~y;BDVN z_uTx`r~f{F9M8^vIy!pu>ecTL^RPAlFy9hk)D)w4d{yYSy=VFOZ~nA=U2@~>+37_) z&-}kAIZg54VdmL0a3|H9J%$oI7{UZSlni;jcFwTC@H;Gb z%s+bc{M)kG_h&bimVCMW{b=}|a~UD0o`2r6WkOeJY3ZxVN6vZA|Ls%q;9eQ=w{Cw# zjk#23zU7=HKxx)r*VLD?3hTVWLj`P$)6$hly0{fL)wt$sQ076I?iDE1qOV#YK?udo zvNqh4J1pW{^!iC+Yc|Z;9;d1sk!YE}*DGqnA+Bh9^YB}DV|VTTJ>ky8#E?r(qG2=g zwo9`(F8#DM>TgNWrVl?f@-|6L-ICBPy8LR^)vT>SD`)(ykjhjv4x3Wgw|t`5u_IlR z9|8pqiiU}-ew?|4b$dji4@jb8!=e}cK-y#DBM%TA$FAK~u;=H`eyz-hrW+r*9M=}% t(#lL!iU_RQJMV|+^v=YWpMg}kD3e-C%q^3U1D#hK;bFaP>wl*f8n z=u1`pufN|ue!P-UFn>jAT6#L;tq3DVYia5G7Zt)-neyI=R0r^`R%A+JYp#CQ$udoj z(R%rE|1-O7u6_F^p4!yza@l2l$Fn={+uM!V6xzO;Mub%A986y%y2#!|{ENN(9s7It z>oXZD)@blCMyI4nwFL(?^J`}sezUq5T_ zPF>2%$nEnw{O{J%%`e_DqarzhC9G#66=<9N~(JKf`h{d(r)W#XBc1Y4usN z;Oje|*#GXQ}zXJ>zV`t)wb zUh_{Mg)TWo>P+@a->Q+>3sR63VHVmyeS%n4(#$FL_pHAsYv`IZrB1HhvygLXYuZMi zQ!?+foH8AmPpf^dSh!_DSL!4yIc41*hSP1fa@x8*LZ^>dgJ`+a$7I&u&;PxD$GNqM cCx5cLD(_}{_NsjYFhw$Wy85}Sb4q9e0K@4({r~^~ literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shapes-3d/vertex-coordinates-win32.png b/core/test/processing/visual/__screenshots__/shapes-3d/vertex-coordinates-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..e07fe529c8ee84295a8d219564ef7954d4f5ca85 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~AzMd|QAr*0N&n;wRFyLv}@UQ;n zxmoMGS1Sk|-7`6@UHX<#Zs#_a=ta60r)79=QN_=-JNe?t>YUel7l8&dc)I$ztaD0e F0suSKG4B8X literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shapes/bezier-curves-win32.png b/core/test/processing/visual/__screenshots__/shapes/bezier-curves-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..e628f405416f0c1608764e2352c817234fcbda87 GIT binary patch literal 722 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0FXZV4CUa;uum9_ja1CM^T`}@!Kvg zAC*NG^3QQmWD>o2^q{7JifdGei%67|NDRx-g^I<21qFIXjyeiVj4CO(P^R7~;J876 zM`+fn?+eA_*7aZAdHgXq-*@xQIluq^e^4<0cg|O{NxFZIrzvDygd>LwmtKFBmzSUa z`q|&Vwe|J#(+d?cI*&fuzTJGzsWUZp;+-x#dYB!(7Y3Y3GX{!${=7Lv>u9PBN0ha- z_2P>h%Z-dBcub^t^&UH1Fq(b#`}gk_Q)h;)PBoD#lw@zZcJX51+OWeb&&0&XTg&jp z9BW)qT2@w8TG|>s(^GA7qXPrTy4bilwr0mUr+RL`^;>=!WZmkZl@dH`b561GIL-A7 z*P9M9D{TAi(3K&RPqL&NfB5l3WBO@DNswknz3H!?J!4BZ4$u&p99wC{@i)~`C*f4 zMP}&g(5+Et{}sygANN`+bgAH=(4H*~moHy-QEIH#;A}rE*U#==&mO<__U-5&J2utG z&p!L?+c&c(4_>@~u=?unD%C_DzvaO(Cz>A?aGd5)d2m5~!3CxVVsFZRzkaQ~?(fv) z%a#w&)t^M=db^m>P3kwTN%b&GtlwWMAicg#9;j;Sbwb!L< zHgM>?`B@{kOk~dTqE~Ade4U=OamV)U?BZPamp)DX|MV#<-wdB+ckjmjXq10;uq(=8 z`Q^r~$I~_+4CA}b2$i*)F$H}hIMP!eeK`9dw0-Emfyi9QoY9? v?~GY@G2?;rlr@g8>*1*anXzGER6WDBfW`0DPwz1Vrd0+{S3j3^P63h|C@6}TK(rHWEFz*12o?#c>{YDv2N>~EDHgWgNRU8C2zCasP!KId5HAM| z7|4$h3qc{;iRa^pviVk%o!RA(VxMw%=G}+!o!#-|&#&YJU-%t}S|o^CB#2rhh*~6w zS|o^CBnYY1?RN1cS_IST^?C}0A{Yz`A}5$uI-PdA-9DesWHMDM6?~fzVYEi0k;P(x zb=qt;rBX?w(L6jn;6Wq^qg5`KL2I*PFc@gH+Ds;c$8km&Esw{O&*%4Az{kf2m}RqB zJd_&(Xl=_ro6VS7!2A0B^7i(oR;wQ$AMu=@;H$+f`$5|6 zHkgs_O}<*F><4*zdNLRctyT+9J`P_kcG(XSkH^o?&tZq+`A6WTb*$`c*6X#) zIN}Jrw7w}jo9T3_)9LQ-?{Uf@=(T<_>_Imcsz#Hf+(E6gIJ4a z**E{3j7DQ562Z|7$h3Ht{qyrPnM^8`%2+IhqrXC?MP2sEWRgmyPESuSE-qeQUvVxA zGA+`w&*$^!=jZF|Yq?ww-yHZ;gcFZIrlr^G;pDVfEb#Lgz)7LeXoSOIyWK98N^Le< zB9Z8HIymcF$h4}}>eba1Y$Aul0f(pXj@#Q?uh;8zI#nu_L?VG78ny+jE2+&MGOaCe zKDoQQgRK-~5RFC)g+i@X!=tI7(fSXFS|o^CB#2rh`~|oT5b>9jcJu%M002ovPDHLk FV1g-oRkr{D literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shapes/closed-polylines-win32.png b/core/test/processing/visual/__screenshots__/shapes/closed-polylines-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..43a6cc68baa5e64606ed03d8209ccc9f56f8e57e GIT binary patch literal 602 zcmV-g0;T?ZS_o!>9QvcD1wAAAQ!OM=moV6-F{EeV8HqtRHcR`}F^2(3gS(d+f_ zss9jK#bPm^&*M}7A+(y!W-u81{2mFd!C+un7ITlw*KJt`-#aU7>!ub0bZ{DvG_ z3&xa6rN8#*b^@-~D_o<~>EQQ-&|0vXR;v{bhoAR|oD_${K|f@)7L>7CtriLew8xiD ziqUAK88TW6%9zXLhQpzIk8hk5njxdLpp2nV=yWR$XHrX#%{NJKA++Cd?$sskg>E>8DYlpc*J8VyoHRVrOJp0 zvhffymX<2x?RLWh*+@gi(z5Sm#M2~*LdMlnWyGT-h(gBIQf0)Wgz!Vg)q0ds6K2S` zTAF2a!wDHzOTUZ{I3eR|+1h2iTrTVNy5H~DYPDD_20#3Z#RAW`BhZqT(d_|Ofgtm+>Dx5CSbIV=9&M$pazKf~o#_AOu>#Znwin o{vgx(7)DEi(UM@aBz&pX4@Y3iAecJL&;S4c07*qoM6N<$g28DYmjD0& literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shapes/contours-win32.png b/core/test/processing/visual/__screenshots__/shapes/contours-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..c7460ad10f7b8085033c130566999fb1902c1401 GIT binary patch literal 985 zcmV;~119{5P)!cN-U6tyRh)Nk&h(BMo}dBN|K$}u%|41 zl%?MHms8W}xpU8*xik08TlcrP&7FDXoL_U!JkK+6*T0fDdE$2v({jWAsdaI2v9Yl+ zK0e;o)>d3x93LNFSXkK9)HE_Ovbws;Re6I?n6#KUEiJ92q@=sMdv0#-_V)Ju{heQq zIa5?rl$x5lwY4R0^MjCDIAvvJot~cl3C+sNN={A=G4f{5*lRg)Qgn25G&D5G`#oc$ z<=hFrzP<_y3Z|x}dTG+6kbSI9Jlau2#_^Sup-`}UFrym_1iJ`n8wH6i@Dl02> zr_9XE#l=NEhQFNT(#OY#3Ttm~A08goV>}|YdV70EM@KC!9*l5OaFQo9KR>U+&d<-; z`!dJ_Qmd@2?D+WD(qhR(fJJq6bxKN#6`7lxyR@_az3oIxEFzXsd|G{dePd%|)?^O1 zJh0`XxVNUKryCm^t;rlFh_kb^?Cfkk#v@W|b8|B? z16o>I1_uYlP+pK)^eXfP)L?zq&(F{G_4WGtdM+{j%gc*?_2lG)!Vujo5A-T*6lyT_ zPM_WuoY-Wx`_BtDTGv07k-mT$OudsL8o^GNmzQg6Ydq14ii*Ugcc87hjSAbijw7w9dTng0HML;1G|9}yPb19E|!KLota|42(Tv}Q;&d=JYZ zg7860wEqTF%fG+BFNX-i2QBfjWWf0ck`G#BEbyQm{tkak@qF)6LCIPfrh@A+4>g2L}f- z)QHbo3M6Qw$!Gk!6;eb+%R4bGH^j8u5Yuu)Ov?>1EjRoHw#j0441u}r00000NkvXX Hu0mjfqg>uC literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shapes/curves-tightness-win32.png b/core/test/processing/visual/__screenshots__/shapes/curves-tightness-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..aecfee50eac36f1b58ad3c38476e9db5d17ffb4c GIT binary patch literal 761 zcmVsCmYl~g(zLZCDB106h#EVABzwKiqzCngMpym*~vj@iBbenQjwss zDFRUu!^VmxrSFI2;{2T6*XN!aFsZ>OiH+uPfAyPZ-_9IeO4$H`>! z{lmw{$K~ZE$VDQN`}=!5bT!1$>UO&`r(Z^+Q6Lb|YPI=%9*h*eYA`9VKL}f?xdcDof z&1SQSLm7l?k(M2?ySsaJb%jG21ZoK=I|5G0a5#)}83bwxD?6J^CgXHEaV~=pEt<0b zlFep$E?`2mXv+S}$;nAD7{t*GLbNE$K4X7>ANC>~%|NV0Uv}W-(^-&d(U<-G{oQCZrcx;!Jr9`{W!b;JzHBxd+(YAB z4rE&JL36nrUTrntK@EhgR%@%(!nqvCw2H+d++ITZa5%)v@&YRG%ncLU?KTcw1eq29 zXEi+0E0xN0I{o_kir41=b&SX33WehA>OOQ5b`#tpJr4 r8@LYrVW9k9*?ufv)TB3KD}PwXf*I`Lio{|&1SpZ?)`(u$48}7 zSt^zAAQJe|TCdj!rvsD8+3613xKMDStgUgLob5|Eigb%2bRkv zm}RqBJmCU((1NmKqa*YAT%k~u%Vj+0C%9@c%YKr6zYk`lYm=)MD*H()m5NrY?e%(i z@_D#wvCDpvcsy>gSYUIN}VPw7w}j8yKuosS1SxPB{g= z){kXp1NDa&K)2h)SuE(aE-5>kP$=Z_cyJaAdaVn~j@WLu8jYq{EaJGYP-nxh%-ENX!2G{9LV8Z*Om~=dG zo+3xW;jq{1bvPVyxm+X?nM@|X-w*pZsm&*3S_j~K^6>BgODV`87K`Qc`BtliM^izg k^$!rVND#D05VT163!sr))f)NWK>z>%07*qoM6N<$f@;K21ONa4 literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shapes/lines-win32.png b/core/test/processing/visual/__screenshots__/shapes/lines-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..f2e42539e6ec1a9a671ec70073a841319caa55ff GIT binary patch literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0FXZVD$2IaSW-5dpm6-XN!Y?tG@A8 z7Qvh&Urz0?;?Z@@aW=TQDbFBcT4VCR`Gx$=wGU_5O#6Qzyh=sCwt~&Kdts)biEi7n zqX`+jhYRK{-*@f!wOiYK<6kFdoc+9K-D)8J!mpSY*|j{nm0FbswQKtqsve$H`SLaY zvdmlGW8-5bq9!F?FHPt@IG&Kr2Et}jXCAmtp)3CXp=W5rH2&O)st6aw-ntFh|<1-xH+On2f zC!IO5=gIN-cy5lh6+IR$*K`e=1ft51b~t3*l~~NVP*u_{@b!GK_b+Ubm?d^tJY;_S V@wSBadBDJB@O1TaS?83{1OQeUr{Dkp literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shapes/points-win32.png b/core/test/processing/visual/__screenshots__/shapes/points-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..d0aecf8d308801172759a216d5c9a5373da55412 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~AM?GB}Ln`9lPBr8^s=(tM`Oxmp z?Bp*IXFvUKVA-S^Z1aRyG;7H#)6z?yB7&Yt%PkRe&N5sgb~q@z=VJBxt;bBy75_Bw zUb{il{*lde{>@ji*8bfJVHv%hmbp#i$@>KtC)F4BPOGsqiCT8o=3jff}k2tuN|JJ}OAcZW4I z_w3my&R5R4$$T=uUm@gtBq2Qb46K#}t0lo|Nw8WH2(4r?x!rE@)I5Y%DwUc{CU|Nd zLaS6N_4|E1H4mZHYPFipCZ3vy&>9Q|<#HKMe_^#+;ZaZst@(VO&*$;<6^q3p7K=@% zQ~VGJLJMjbiA47MJ%0EJIK|^}xOh69-fTAbSq`BE78tDVnhG=J%& z7!HS;A)~dRjD!632plq&mMSBxDHe--Cq=N3v9wef@j@QKLdMckWyA~F1PB>R%PS*Z$VM76 zmX`A8smRCj{_#xwJ>6FnAGh|#X%`*Dogp8}DUq%m3$hcaL zb{Q|1%X+=;^?LPsJ&{O6qtWGZiFZ5@Xi3ZH_kf=i4u`YZY_(c#x7(x9=>4B{ffiXt z9S?*+>$!}7=z$PuK^Zfdj3Ez%Knu2-^FRo+fZc9~M`n;|{To(Gg4L2>wIqC~))x|j V=vi=ANS6Qr002ovPDHLkV1fs&1S0?d literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shapes/quad-strips-win32.png b/core/test/processing/visual/__screenshots__/shapes/quad-strips-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..10ace87067d2d804de39b0f9bbaa4f8805b6ad87 GIT binary patch literal 405 zcmV;G0c!q&4g4&>0f#w$6U_Cg3LEz|{tiz%IAKeK|HKJ$5JV`R$kD@~6 zK|jfZKlly2mISXQ!D~tIS`x0brfG_z=y8`cP0a*86yr+E@Or(PrunyoXnj7PvMhNH7{f5+dCn)EBhYHww(B~+5W{@Lx~}=ea|BvNQ7p^C z7h*i0&%W>Z#B)%sZQJ5FK8}Mg1laf8+(g!OyV+M8e@Pp87PO&ld~^@v;jXS)EQtDwWP=Gd%bS)9F+w6t-F|yzBx;7Dy(O9*+ml ze$@GVb~qf-XcVvci92gB7$_8qUayBYJfvE!%H{HYzmM1a#GM67rIJ>w-S78!3DI`D zg}JbllS{^)_csuDdqp-n{#3&i9=uN|~k% zl8TrUY95u5RXR;f>dMswr{$jE&75=9VtLg{W|f%ExR7}Xhv2Sxc9)%kt2cMROeXot_v8w%{@Myh7VkmbX{603FQW>FVdQ&MBb@0K0oz0RR91 literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shapes/single-unclosed-contour-win32.png b/core/test/processing/visual/__screenshots__/shapes/single-unclosed-contour-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..401b9974d104fb6c160742813712fd19b64d37b2 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~AOFdm2Ln`9lp4-UFY{=sr_}2br z?o@`ADq?0G{EFcprkZGMo)@mgdrxt*%*>}JbllS{^)_csuDdqp-n{#3&i9=uN|~k% zl8TrUY95u5RXR;f>dMswr{$jE&75=9VtLg{W|f%ExR7}Xhv2Sxc9)%kt2cMROeXot_v8w%{@Myh7VkmbX{603FQW>FVdQ&MBb@0K0oz0RR91 literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shapes/triangle-fans-win32.png b/core/test/processing/visual/__screenshots__/shapes/triangle-fans-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..c7c2b87e6474ded14d75d91e6e02c3c0fbaed4e9 GIT binary patch literal 968 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 UYk7IszyJUM07*qoM6N<$g7s=T0RR91 literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/typography/align/multi-line-center-bottom-win32.png b/core/test/processing/visual/__screenshots__/typography/align/multi-line-center-bottom-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..8fb9873b4380dccece3765aea590b247a112219a GIT binary patch literal 1239 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 A?EnA( literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/typography/align/multi-line-left-bottom-win32.png b/core/test/processing/visual/__screenshots__/typography/align/multi-line-left-bottom-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..e08a0792eb97cbac36d6b0215010cc83102edde7 GIT binary patch literal 1198 zcmeAS@N?(olHy`uVBq!ia0vp^(||aIg9%8!wv1cOz`#=K>Eakt5%+fPdF`A;iR0?r zsVCV|)3OA#tz9>6-kqv!ee=Yzl*EHhof9HAJmjCis@lq9+Ueu9bLj-5>rN+UbVg)I zwX%J;D=o76zPEVh=f|~k(`)RzFTbulZ#nm8oz?L@&m()DnoDXwC{{0+U>k5k zP9ue1WD`5rP3G1&jZWWi3$M}kSsE06fM?1KiABN@;U3q&2+vTQ=+U8Q)fn5lF+zvY zt~sb^y_4tksp%ePxwt|VOtm#a8n3Kb5WpI=xyebCnu0l+ckbMI^WsHCZLR4weSQ7* zwzeM8&2Qek$;rv-2tBtW{NbxttByZDnPPP8*U_U#4;*ONn8fudJSIkltMv%yIfLLI zA3hY6l(^iE&?&2~-o0m!PrX#Rg^f*2boA+8m1=5gf9mRkgM~$&^?l~z=i}4T*3OjX zV0rcW_3qufy}iBF)z!D&Ja_KgvuDrt?c29%)vBpeMISdF`Sz{MYAzpJbHEI1AyF|g zu}iTYQwuC&!o%I0Jye{S-_}3Bc~f#_ZFRM=+-k#=AU0`kMHH$ ztoK&8T!Gq}f6`gz9a>xNtXvR1Vcv?*pFclhi3akot+cST{P?rx^5x4;b4_DJ|NZX! za@o(-L~3btac1Vph%?N0)?HZX=V~-lM^p3Wty`DQFY_-v{+6rv#>L)>f?vvqVK!Ib?-x6S2Cta>3VQz-Tv+ShBR$ z;<)5@tuwo}YzMkW)kQ&oqt)qQ!3;6Q?(XhKayg01E)*?)^y9~l?c2kp&!0K7W&8I3 zw&x|%xZaj)y;yw7E+ueI0(W@pH7n7Q>z5t^L-)&=efCmc*Xe50+vGzp00i_>zopr0O0jB`v3p{ literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/typography/align/multi-line-left-center-win32.png b/core/test/processing/visual/__screenshots__/typography/align/multi-line-left-center-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..2dfc4168fe378db6a4bd5e1bcb862496833db113 GIT binary patch literal 1200 zcmeAS@N?(olHy`uVBq!ia0vp^(||aIg9%8!wv1cOz`#=O>Eakt5%+fPdF`A;iR0?r zsVCV|)3OA#tz9>6-kqv!ee=Yzl*EHhof9HAJmjCis@lq9+Ueu9bLoVlb*+;Og*RR> z;o^N)`zpoi``+T2pC8xGO|P-?|M8;&a}TU@^1b}% zfw6|_cdaQU(Uomi)+`8M4cgq~BSIzrFw2!HtM)vDuW!)HYreZCh$SkKthi1*1<>M;f-`~G|>(;+UAO8Hw*%QXj<@>PV(DLQWzgT}c z_@nXA-@ku1ZQ3+@wzSmyckh1H*lBF(XXfg4S$vUSL?}2o`03N9y}iA0>%Z4`+iRG# z>b73Xd;RpO>O_wVfpbp8>!eTRj$iOWS_wy3M{~*Mo5jY*_xJXG{qp6^xpU7hhlhRF zI-X=QJ(@3*0KwNv)lWs@fh&p&T&YpZ)D@^I+G z{kQMTH=DiaqK54(Z*T8oNpcU$TK!CC3w649dY-&?E$rD7F64rc zk^o1G)4~D^pY91qkGewr5?okQbLaN$)&1#dX}50Q{y#6B$GG*Iwdj|ymol3)Ada8Q zRh9L!X#Mr-swyp?k09^N<(j*5r{$&@=GGQ5qW^Zg|0-Pm=+B>;{Ct0Tdpo;J+V}6? zO-+k@4D?f}R)*rk@4vsUecRgF`s&rIGa}`8)?MhB>&I$nVd3$$t&Q#11JQlQHyzu{ zwf63{<8!&9dM~VrNbP&NrsyHJNS*VNG}czF3A02+Rykya1*~9N8R@u?3x{B8_`+qG z;SY>s{$?90l*cSLnCWw@Q8MQH>C6MFcr!7!EdP(;>oM*hyJwqR1C~S#p00i_>zopr E0G13q0ssI2 literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/typography/align/multi-line-left-top-win32.png b/core/test/processing/visual/__screenshots__/typography/align/multi-line-left-top-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..33624d9ff01e40bc52633681d84a080d506210a1 GIT binary patch literal 1240 zcmeAS@N?(olHy`uVBq!ia0vp^(||aIg9%8!wv1cOz`!!!)5S5QBJS;6e~prOiR0?r zsY`PL(w4Dp+!QQgy?gtV6m{-RGfy6BTI6yDfKY=eo(<`liw8n}cHYf(f<(C**Jn_ZPN)toUQ@!S3ZFpQL86Zo)fF2_7?3)3@*5 z{S%3Zjm^!^7uSAiWNd6~X}NO!Cv~abSI%cxmWixev*t$5w(jok6$kF!n|J%In0DsF z&p$tX{`~vbuP?%LINJ|T3;XfskIuFC@89$D^S_+>?)S52X_=Xw_qy0+WMtN?UAy;p z<*{SO=J=(@#?HO|`s(?@woQ+g6x7%6-?C*&T&!MrX=!PCdU|5w!yi9(nBBg1Ei69% z{@uH=VPV_$?9rL$k&~OND#Y1;oVj(Sa$sU!o}O)M$j9G*LqkJNI9QlWDr#$ð{- zb7gIHweb0?4TrW&STSMVp_HYYHceu4c6L@(Rki;&Ve(|*PM0IarV9*oRkYTuSm6=2 z<>QMN8O6n)^&6KjSN|BptKrklqfr9{|CnnH>lRF?TO%ea8XF&fxuUxI_QL{)g_TAN z0#rn}Y8OnHF=K{?p5D5(Yq#EhD=jVkKh}?d>++!~PRZN9e)=TTee^}B{lvWz=d?uk zIXpCX$qEZt!L%~caUs`|G}czF3A3hZwjNB_uyt$b?Oe~I%1TQE1BI}l=dWI6rKB8r zTXz23xwOmgWnXL6lxNo0)!n;&TRSZ1$-8%bVN!<=AAbG%H7_r(tgP%W#x6cQ7t-pdawEu zxQ$!etVP}3-D6{8Z&g%P?OM9@>Hp6?iOVk3EN`;Yl64mQDxC9h)rE-VP4l9x?&fWu zKWEO1Wj_vuF5KwXdhE^}naDGbP0l+XkKdEZCo literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/typography/align/multi-line-right-bottom-win32.png b/core/test/processing/visual/__screenshots__/typography/align/multi-line-right-bottom-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..49c26f06facf998e0cc2a7fc81dbecc98ec0da37 GIT binary patch literal 1201 zcmeAS@N?(olHy`uVBq!ia0vp^(||aIg9%8!wv1cOz`#=B>Eakt5%+fPdF?&XGRM`q zQ%|y`rez6eTf1)DygOAnTH14_j!uMzpb@v(AI41!mS{MiZSwKjx%7`#vF;Uv`!hYf zE^9nFe&_tlFIO+mkSm`z^Zd@wJHP*p@;NSfe#!OK>1RGh7A$Qnh?yzvAmyPUry{~H z)Wyzuw7KPxqti!)g%uM5Y;X%d=bU`Xz9%>K%Ff(WkRj;eN|R z4;8+;CLPgyr)Bc5?b%jqtC%p-iU_f>vH9}-dwoq!gn52m-mzoH)>!Y{w0-;by?f`T zm9@5XWthAw+IjEZJtH%BH@7v`mX3cg)IK z+vgV_wg2Id9~H&L#;Y4=&Xin#{r0tMZ7pplW_@_^V#T&?)8uOH;){!mg2rBqDXYn^s+?=O>*md-RZGz<(5{(L;&%gZZiB*J%8KoN#qL2$;pLB4T2eoVQ-HZbHDsuNm^CRx2xNYL-ks_TR{3o(~qDaem38?f?y!>6>>sIknb09iPm#>*ovE z(#p!2K%2GR2wTk#nKOTWwavVrKYyBR2I{$?{^y_hC3$txhXph8&Tidm`d1ZX!;6;I zSs^Myon2jBbLY-oAD&#=+QK#Wf|uRou7?jF_Jl9KKfPw%gbS84LjLq80OizBiLNGp ztrvR??d;xt|NSy!A~=DpasR#IvZt%o)K5Qa8XXiQcrGcXl$K5fxoeYJiOot2TU%Kf znJcebTU+0~%L@zlSaD*O!GBNIlMCN3>;eTz;`|FYmo&YL+I8n`S$s^)28b8aCv%;> zbV(?5&%S-nih+*&-E#lGTbBLG9lLf}Sy)_n{rq`))zi(JjqQL2Uf|?5UAdsS<@)QT z=a+7Yi;P^ketkOJXIx1oB~!jdM@7Bpoo;u06VUkQH-O$SaXSCXboJ^Q;Y%}LivQ?b z^e^A=!TjJ7V9rdDdE#{O?{kv?6+-zKBiH|9+x?VrZ^fP1-N2%V!PC{xWt~$(69D>& BBBcNT literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/typography/align/multi-line-right-center-win32.png b/core/test/processing/visual/__screenshots__/typography/align/multi-line-right-center-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..9e93f280bb244d269caa7b9dc02634c9faa3022f GIT binary patch literal 1203 zcmeAS@N?(olHy`uVBq!ia0vp^(||aIg9%8!wv1cOz`#=F>Eakt5%+fPe($Pmnd3_p zGuA9^3fZt|*|r4>wr%6qy?9GVP=%M*lqE3aNr3lX#)|<0j*em$BAx;ziZ8^U@3eP-Fzc7{UP+@8wL#D#QiU|QW z9vX5gBK$&K?3_oNTOK(&eZ(z1N8Lwl@_q-s2^)PnTMtw^Rr%I8#dI8hJX46!Y{w0-;by?f`T zm9@5XWthAw+IjEZJtH%BH@7v`mX3c?yf>g)IK z+viulw!WaIX3x%@Gp`;vbEfC|>)h;YXD8rZMH*QR{op9ssUEifab^GNxc@yVv*s^8HIj38kY|XyDzFRn2 zowi)~Z>_Jdule@*^W|S7c!g#iwo{zj8gJd(+q-4Pj2SCduKfAfTvb(dW5k)NHEf(` zfkrG`_%Pdj{qp6@ckkNuZ_|fgzp`w@np>V-;Ea!pyI1F&-($wf&(FVl)v9;z-ev6F zzyJNmiU}X$-PE@T@wMj)2^AL?U%h&D?b@|@+oR+E)UtDS&;9=WyNi#lJFE2N@w4~(A zw{M$vIXSsrYw2tE4OzE&bMX4)jS-QNl6ODt1PlMQnKX(EX#r*mH#=D)IT5Auzk1zgjk;Bz~xFl=c+O;otgREaD zES7a+iie7pmR4C=*}i$bK-X)PIB5gTZ)^T>ws8!-ZHPI5qhhM8+7Hh5z4-0$s z`ZXwEoYc2WI=`ezLRNO^-)Ymtsva*rzY%Es1WEQ}aDUHx3vIVCg! E0Mb<-YXATM literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/typography/align/multi-line-right-top-win32.png b/core/test/processing/visual/__screenshots__/typography/align/multi-line-right-top-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..e75985de724062ac4a7b5ab5dca091f16238b7e1 GIT binary patch literal 1245 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 EA0Y5!a{vGU literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/typography/align/single-word-center-center-win32.png b/core/test/processing/visual/__screenshots__/typography/align/single-word-center-center-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..4ce4544ba26ed88e786d4f3a6bb14b52bc6b2801 GIT binary patch literal 5887 zcmeHLc{J4f|DH-2Dn?nd4`nHY#Mot-knEwcUcylJ{UU^reHU47D#DDBu|S`)_ z5Xk9=5XdP(=xOjxyoK>+2!xTSuA=zB$9!di%7LD|-?D*RRi<*waZ{mJOi+%6mjz`8 z_oOP*BnUt+MeLrT)9r$tIeiuht^9s>R)p>hlpB8TLb!^qjuQhkQm0Gr-v03@@hHE0 z*=Z*<>**x!eso#)PK_fvdo8~|E6elU8OR?mH3GoPHK9t7pvM$kkUQeRFvuS)icpA7 z44eY;{x0k^pia*YfRuZ}TZR)*cB1m|vr#5+-}iWv(V!$P}M5vOS> zuuMWwrG+=F&nSZjqZlb(|Ll#aKch%Oo(HE7mWg8ME{s`?S6lLR9AVoSXHJ-&nduCq zyvTCfb-HP;J&jY&_qLFbX6&io7SJRvE4t9G1rx;4?o8ZO)mV(_$5H{l<|wAM{`~F= z$FYNZO<%u$Z5UY@|ESN1Oqgkji(1?1Rya;Z(mDL-c|A=!-e0S;(RIl^j$g-;VS6C1 z_5#*8cA3Ef{e07pZmmu2tzzA>c>8`{sVqwGwMmA?x?f8ID0*bT-W=1$;nC6lS}A|< z#VaCr{0{>U$!UVrT3ei#q{=xmgW(?XxCu$`)$!o7=Of8qgePje>wL+DnM1t4j0nrn z1~%j|*Y|Sr6dY9G_f?|n4Dm$@zli73*H+h*=pzGRnP3ss-as`UCppRUia-20s$EA) zZLFBvk`d06d77_im~UCncce!#3K`>VJNw>gpgS|ft(qc+haYO^$HlNBwA9t7{`p_k}JYv+A-dPd*)P zkCl#c|0B*~@{|gQ^COA)IfODw{JqmeHIuM;*`Ut`sAietm|;h}utjYWpLUyG)Hl3_ zmR2f*ZYX>Unap`<)tFXG1ty(?WyM+4-PEEKFvQrEcHZJeS2}+SINDplCS7R^yO`u@ zOcz>G$-x#0>SlsC`N1m21aBK-6NHQ9RLE8c3?RuiM>5p-?G$75U%*2N$Rra5fd}t(ECGy89i;CJVomh( z?q4^lz+`SH{JuFWN}5{i&le-L#Bn+wE^p4Y<2BQ`rr@7^Hm2X}zKLWKz8Pkcj?352 z*Rnhm*m??WP?Nvbr(Al~0ZSRq4bAEvjL}HD$#5v^v;JFqPzls_KumF<#@m_HLU@nD z&pX#0@-C2RN8vy6zRl-IE4LMIH_t3)`;ZuFUSBi`D!PK}UoXC&eyjFv?1#q#h5mb+tsCZ= zIr4IBiZ2rr`|xOO(IzHsg~Kh*zyq%Q^TyXGEg#ap&{>6=kUqZ#9N<0_lO^Mw`gGZ? znMedsAHX4uHqGjb%uP)*$ybY`+f8$PmkK~sM#ZL5+S#(x_;f&0b6+K1A)LKrK3TUW z&M*A@MZ)c@j8&rWwjbRW7|+_a;*Z33;hzABXb2OoEr|^j8juEzEZC*o-by`L>vsubdx2Fi8h1$yi_S&2J_I@sKKHbt4Z4!LLD&YVVe*Vd0vG1km zqs{qFfk-?BXDAq3#^(8Cf<;}xwhZ|iAKxqdFlcv_FaCB^8yx8X3tNjwFO;7#zGtcFcL5>W z*n7=;d+FP<+i0y>_XftYNpVj`NP@q%h)umwjT>Eiuu3fr&GB26dV;F;-}73V6pC`_ zU{(iIiaFCsRh$OjF$$%$1n=H*S%!9FDbXh{e}ZrtDQ#ZiO!y=crBUOx(m^!`#AwbV z`z(Gb9j}L4h&|Mro@eqxCBFuB9K3be86_OE-nC-yA);uPYOE{aIC>j3`z&3D;%BCm zyS45g+_F&R0JTsXRUbz=Nhp|NDbF`3J7O%mNtvDQ6Tbb1gSPP+?=_3SLxZj#S^#`U z2YXLVgNJYy!o+HV-Q+>V(Rw4TN&DScw(C){MFvHwo*02DcywG`<=_L%!`_vsHaTW# zkN2LtN!s$)1x_=xDqh(Hv~gdCJAW`lAE+_V&5SwQjp=3~lZq{m-YmYnqZq{GmyNY| zr*OVP#%1wHj)Sd!ZL4KKK{mR?q7vlDhes{e31|SPgex2_u)MsyNHMClwMDy~mCA3% z;jEj~M|Y5Ju&{%8=uqrmiux1J3J9ze@Gf98`R(CHxs?P!AVeUsv!;yTRn7!*s^I1n zU^pwxSP_M442uo6zz~~(S#J|`8T?)h4_>c-b|#mI$^Whd34q(MaX2Z|65jH$U}1KO|u(OvL$gqiE)DW zv=L~+U2~KhJdYzM2|Ly970WLG|}Pj{jDiuYGC~J%LBZfmbjg9F178< zxEsTQ8k27a94SC)4fPoqt9@D{xLMy~pe;+4@$x0VfLkBI&zp4N6s2Vxhn$M$dIrMz zCI^p50$V7T!nKC-t4b5TK01KV&YK{LO)9$r+*6gFQ}gifwD!Rbb>= zHsHVq{IB^^iO+@=ib?cO>P2?uBBN9^W5X^mTV(;Y*zz!Bk1jMQid3bFE`(ngiiM&{ z-vjmj` zL0!PplZTow_PxW3Up}zNm-hJa+ev(&i6x9>P7}uTvUmP`VlX`V#FL_`H@+lX9Srl{ zbLXjMGOPCZ(6zXo@_Pb)X`n#A#kl{CDlIA@i7(ry;ZNMSOx=0%EZy*bKcp>1VA{4{ zxbC17vtx05bcl7YCiEK3Vtl8Ml7PO)Gnl92bjAy0r{I~l?Gwx47PbD_=KgNS1=I~L zE6`w(6W5$ZVC}4SUfBbro8i$RU+;`HsjTQ4!Jx!Ybm~Qur8eytao&NOrd9AL+5OFS zVQizBBE|RZl`&*Yy6IP0{(t6Wvql8d9F@JZQxU18rv8#*WLnw z2>5L)D=Un+ty|q{hMe=HEXk$OUxo3kiUBMy++GzH+I!-pO%Rb$%`w0qtc;eo-y#~x zcrC*|>lEm{^V?Z%t%jPAJCvjDx#tQ3BCqWEL-CAg4}&SpX}Cl&IbBQ(HTxNeOOu&) zr@iL;>3b%yFdNljPIcH1lO4`o3{vid;9Z@g0MBn>Zbpj)Cdqa zlev!~y`Y$9zA88|2KwfcDh*Y@k^p3ohH%1^HKv*ww_W|DUvgL$Wdo~7wNWc|*VJ?z zfZy7lSkpOBY-U1_rs9RhXugtoanFb-bMakXUR&SsOU}Hi>2E2n6G{2u&>%S|Fe1P6 zK)0Rw`e;s6^Ka{rQMKt2kW>IjNX~DYO(Ea_7%YXo*(53V`TH+LEWsiKmaCE+O2lZ&IhIe?FRzGvIHSG-r;Da}7=-r@vYxZC5v;GQeMbMkxHd@6nf znljBcac~7_lSPrC5NgFu$h4}*nE9F?>|ATDF!y>qbmO1y0hlY`muxOm76L%2#&Ix! zJ>^-Ed3E^n?i!#9k#QK~@_St*^oc2cxy3+Er>5ucDY0zS%98d36Kvm~H+_0SFocpe zHR+rx8W!fG>SHG-Ndq)AyGB$<$PxI6?RNMfU}iknXOmgZ=tJhV$3@uC)MUBqb%ysc@)l z7N#x!=zWvKs|lKC@a|p;HKU+i01YyV5m3M?sL1x}#47_Y@{)lC2Tuw7es|TyNwCpc z5PUsFO@Yg{wX&K9(4XCf>2icFa*fc{mUD1(f;t6wJpxV<@I3JTVs5ivCJBBm&CTVY zvS9TFANE_;U!s}CDx4;k_KO5_<66Z&&}ZmBM$uE-j=s}Ki{+53Ho}>MK5D6{iF~&{ zvJW_xbe#^x+#RNY^;tyiHG;n)RrOrCWde*;g07gMq=6hZ%1F)p!tUs$l zdxO2!=4||nzb*qLP(!t80!B9_B({N-Eo~5URkz&VUitfojn||59d*ZzsULV4g`_{v zwT;qvFInSUYs@$#9Qu@LQ7x;E18wF+;`W+tMl3v<8t{2cH&jVNqJpv%XqPHX`Wxcg z!C0h2>dKUcaE$jy%otO*oVWA1q@T@Ts;q5CWD6(L8wvS+3?VT_Xv~%cMxzSjrk<#B zeFOC5_*lgv%((n9AT`13*VXBBz*L3M%JYNO`Mt0~;a70|fD{e-p$y}eb{wzjUFr1b zpak}8u*!92cz77tpcFxro}o3r&L2T!gKbFe6~&16<$xN%RJKR_R0MuZUGWZWFs#>M zsMt)ZwmmUEKHlYf!&xc1pdUyWcN>`gVsk<@V1vnS8jWQBUa(g;hSRohKyuj?p+d!G zHMUwXba(b)m(1D)c4?3Lpi|&yPOu9CrJ&)E{n0Mt0ExKw@4eu^H=zHYE8&%6Nbs4A V)nND(xZ;LD)R9^$#Y(>g{|7KFU2OmW literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/typography/align/single-word-center-top-win32.png b/core/test/processing/visual/__screenshots__/typography/align/single-word-center-top-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..7bc60b3c31babb165d229f4b8032b6140f7e1290 GIT binary patch literal 5834 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 literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/typography/align/single-word-left-center-win32.png b/core/test/processing/visual/__screenshots__/typography/align/single-word-left-center-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..327bae858a0c0af34b2789d7ae2573ced8fdb82c GIT binary patch literal 5693 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 literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/typography/align/single-word-left-top-win32.png b/core/test/processing/visual/__screenshots__/typography/align/single-word-left-top-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..ff4d242f02b48ce838f7ada6ed06a73765fa6d76 GIT binary patch literal 5641 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 D6ddW0 literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/typography/align/single-word-right-bottom-win32.png b/core/test/processing/visual/__screenshots__/typography/align/single-word-right-bottom-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..cf73e7bded17a704105419a7b62795697e9addb7 GIT binary patch literal 5692 zcmeHL^;?r|-=Bgy3kDbn2n+>8sgVvCu^~tZNH+pfN{qqi)aeKj6(t0Q$fIlM7gv9D9~;0aCjW8AFmqDR_<^3;v~<05fDX;hC_ zB)2<5HnUomxv?ix$E@i_+I3~Djbd_TB^4o%xVlMR2!u+2?T472BS0WMP&h#=u*zejOAm7ILL`)nYmxNGzP5RHYc!ER z)YJO0kcnMMly|;a!S>G~zY*oC#^E%XE1nTf(?*Nsk)54k7Oj2h8?%KY&WO;hA`cVh zhC}Fr{9?J0_eBQh;lti&sHWL2Y#=isKR^GKUP{2d8*iibojG#`*KF@STraG!JzH2h zNo{VEYTg!V8X1k;vtw&5JM9p5J#05}XC;O2NJ1Q$u$+JB1@;8&otVk%m}eI*UwbYm zhJ9vQK5GSgw?F@l-sOxC$dQCnSc!GDt~e$*?zGfMjo0Ak9PRFOMW2nIw3(S14-b!{ zr^K)7=;-L{``3qg_7s=}1k~X7?!=jO-+`UF+G_WX@r}hOl@Ald7^=h3KE=A^q3<18 zp6cG)T5Lu+kI2Z#7@L?Bn&u1D$lFKm;E`V0PCb=^gagLDDN9N#kP|W=VGnuab&E8v zr7NH!cN^T^)<*7bdZx4G|j`#^-3UfIpKfV5nwS2TQCEX%J=%W&%{jV^v-mW*Z!Z|%iT7CF7t!6 zhHUwoP~X#V)|Z{CgmYRC$|SKXbA4-`u)JcMTI)cUhP~Y_+*M(83>gZCd9A|vl>GDX z(S>&88n?UZE;nyl2D<1!m(yVzPTGs+SWSG;*4|#;6{JR3p=M)b-MaWxg0N^bIxH+~ zuD3WTDJfS!t-^1rOF57cGZr<}6dpQQeb>0k_#6L}TAJDFS-Si1*@{juffUDvz%vcI4gdWkclSj_!}2 z9O`hbO3M`4?x2yCjj1ff+r5-c`)t?F=gaiYqvKh@r4G%ztAjokh33~7Op;S;TpE7q zTfRx~vPrH%b<^5=b~Q>Z*;a$Nw7s#+C8D2aS^lzr=u?<#W5`O}bTj%i8tS|uImXr( zEl5zW`c9OVkhqr7ouifT(~}FHT@)f>in)KRylI$t|2XgN=3FVRxvOc5q3m}}e9bA> zwhmWlQ5v8vLjbs8S6Pbcr|LWwx}x=vFL-6vtS$u`!-Q%50=G~6@9k9Es^P%V@bQ}@ z<-iiR%B#?j9#FIAYoi|P=GC{%A`6_0KnpcvIdP#`bV?dmEX>u-jh#pCs^@s3C@E+> zQEm4T`KXmRQTks>k0pFnH)D{@{-N%9AHgihO)& zs+1MxM*$xIrc5P#+{sHKBk8$@S*o}`dj+2nPjc`p-Di}wDO!pHzk;VF2q*58#KnV@ zCvH2<*~F!;OyzFXt)kTKuX)#VPTL1LZm%=x1&!K?{52_JzP`RA&B&wIK|Hv?*d+mI zsR_F}-0#>}x7wcgE-N+1yx1Ca*#RIC+ic~_IaDA@8mMyXCJom5)J8a^rKKG`Em>sW zSdSO)202J5CwGxhTR-ly$6cey)ca0oF>@b*0ZNtgFlLUoww7s6!!r=h_qi2P=HC<9 z*CJk%08af*+T>^*NBAVWBF?-_J?=OOX6!28KcQro`_CBrvK@8lNM0DKtF+8_QbuKt1ARwi{+>uk<*<9gTwj&3uFkKj<&7)y#PDxEGK@_I_&EG%e|e%Ez8uq?g_eLra4y0nwo5cVZedX8%MGck-K4w4yOiW z`Y;mKRjGhidW&tqs7kI*BpR7F8o$yF-`iQk$*C>NlFw9nyGSlhQc*;9Ef`^O{;ZOJnYX(nHk_bhgy4TyHYz;C zp#)>g<&Q#}s6!JZY-;*<&plyx^_}T0POp2>5X5{rlv!zHj`B0RI5i)nmh@&L+K!FJ zqZ;-GPnqmo&gE$OZm&h;L|1-`E4Qk2ZHFInB??jEPf0w%w8SxC_je>Y@>#~hX7^p- zJ3ypnlBxP6l{!$4UfJ&gbZt5ubDvK+K%ep1fLdtZ{zQ1k_Ku=wzhF&uIJIHJV`q13 zvG!qtfSNrU^7gm9$9NkHcli9*+(i6qFd;ROri`1ER77v5K+BlW9H!$z9IZESVcBd%%tj7Dq~K>JiTr*jD$_7WGuCdV|zR8-~{a6?vB%kqFkpBwe$0y%nP3YU@h4W2q$B>!F;f?YYKvdu0ll! z=As4}mUXySu};JF_+rtz;#)lh$Q^Q$GQms=Fc2GZX(XVVgu=BgC|ET1rtR)*b;RB= zEw=8dC%(YE!H%I3T+@YUp7BJU&Yrpqs4hU@d|)h;KjwxZ3Nprd3tDWDsZ{Oxy<&3m zCiAF5Az&{h6c#aU<}>jj0oT@&z^nLI4LNWz8RK0Wgs#q~r*pjkZ&5$k&&Wt}j;ZT8%U0#6@gfig2q~rBMLP9!{C5m$!Kl1uCz!lq0{wk>T z8dN||zU?+M+~)M(-QK{x6l6Jgtc(GlhOzNoHlh$p!nan(b67?HuOyZrVvU%qP*iWJ z!{W}QxXY)f?G(z>9C%Sk&7~BHNb^PjazrJLri(Cnkzyax{<{SI)weAWT=gFkc;o*L zE_=-pKi+Nk?(An4jx-bYs68QG^u+Y%oM#u!IQ8BF(wnrU6ovGa*m21MkvT1UfCm*) zg=g0wQfCU3POQxKaDjdnpt)OEILg86S$r7x5bW%?{Kn8Vz`&s++!^?}-dN!q)6{I- zg=BLS6UPPgCyDC-N2viQ8Q?RYv(hPjOt_w|F6Td2jo|@YZpsjVKFX@)B}>@!`gQHC zPb6;CKy3{S41hXHbi@<_wEe!a@uFFQrQ7QRO;=Z@KfnK-V`@f*=hLjl6s@Y=e z>Q73}1p$m9Byw^-UaG0gn{fnA0Jefl)^*BB#M<%-O3gJp z0n9~lv%j2u_=*|wgkIsu_e!_cj;_u$S#35X*B;wExPo4R*}k6Bo|wv9*j$-2D>P4t zkDu!= ACv`|nEn16)PxPI~-l>cvSyar|GS8+#;+0~WGyOWjHJqD^goQO6xo{upg z$TPrb_LkS<=QcMC9YuV`HF8T}X!rBy&s(}tx>!Pb=Ud}X+bAkhY$lD2Oz%<8*0KDq zU*+NK!MT=kt$RmKg7jv-QzAk4Pdnz>kykU711D`C6o=3;@j8Cl;>3njsqElox)TP_ z9kBH|+_DxK0DQELl-5ep^N#0OnywA>9A5B`hua<_3N$#Rj%3s)i5fPAtQ5F8kK%B+ zWJ$Y=_WOot+nN%H>e(}fYCBcjt2@@ER#sN1(A5*^lZS-~bmDz&{$Nf0t_-9}*Y}yx z=H~w2t;b!k96)pD{|TEtn@Laii8E0&{4Mz8u!b0dFHlwa+r4tPd-c8Nan;_#1FJad zS?5BM@AkScvmU8sZ2ZNic}GOs&%vt%bjhjz+*24&R>Wq0sz0si3w2?zmNt!|r;G73 z7e9p$C4D7A?*u{(GcNmzv5q(x6b%at;RG8DP>_2R1VO~YpieP)wx>|ho%$l*B=_~} z*AYuChk(R9SMVB0ML0iK^kIa{r{w})uX<|S(q`oWuu2vbGR`6R1%}8*kC*Qw(+d^m zUIYc7^#Q&snap;cprxxD#~nc1wfhMA_?LYBhJts0S@!iDE!+Ujy2djNFQYjEKlXU7 zJf?-Lxz0}L0|NaBd7t_wc-a-W+esb1q5`u*e$}x4`bhXe3smj!UtRaOZC8G#mc*_$`y*=2*^K}kMmi#p@vJJS53Cb3ein8|lCWNKP;F)LSEz?l6LjKx|A2cl{z?hO3HcmV}Sys zNI4`A5@UbD>fhr9w?RIdrV#kAHVS3?XNS~j32V8C?R8)u&I=3UXTH3$sr3d9j29L1 zYpBkz)_Zt%&%tVYE0q-cifU`zk&TrmU(?e|2Y%{D%iYj5Mke6M@teD)8yger%n2M1 z2iKQq=;SvR*x?oetZ8Ai*@0lRoOs{@B$prNMWEV;gltB$94Y~e-00XLX2viu#YtRI zhyMIankrxHDYP)u*9Qq#Wne}4jr$uz1CjfJu(SIrTe}^SXVhePa+5q;Os12DtM9yMLjNk7rLvZ_7ql47tN1Y;IRnVdYy;Dlz+0O)1b(B| z(CeLwfreMShu&PFxf-ZLuH&S@C#*b8=srjR2O1J}ivWYX;DNJ3^0fXv`nMAQ{WCGJ a$Femp#4ld}3kF|>Av#wKG)vGo?)(q$Hu+Kj literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/typography/align/single-word-right-center-win32.png b/core/test/processing/visual/__screenshots__/typography/align/single-word-right-center-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..fd9b7c69e08b966d49663b81dc33f5481e05c207 GIT binary patch literal 5747 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 literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/typography/complex/rotated-text-win32.png b/core/test/processing/visual/__screenshots__/typography/complex/rotated-text-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..b90e1aaca7157dabc6fca561eaca85fb95d30d5c GIT binary patch literal 4263 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 literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/typography/complex/transparent-text-win32.png b/core/test/processing/visual/__screenshots__/typography/complex/transparent-text-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..a9118ac7c6cd2186d0b29ec1a959e57262eff819 GIT binary patch literal 7043 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 literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/typography/leading/different-values-win32.png b/core/test/processing/visual/__screenshots__/typography/leading/different-values-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..ae57773e1cd60907443158904b9a86982d765930 GIT binary patch literal 5859 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 literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/typography/pfont/ascent-descent-win32.png b/core/test/processing/visual/__screenshots__/typography/pfont/ascent-descent-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..85dab54b370603c1bd2d11293a609713ad6d0938 GIT binary patch literal 350 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 literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/typography/size/sizes-comparison-win32.png b/core/test/processing/visual/__screenshots__/typography/size/sizes-comparison-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..0d28198cf63b6d2abd3a51da6b548c2fe2449be3 GIT binary patch literal 8956 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 E7meQ*?*IS* literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/typography/textmode/mode-switching-win32.png b/core/test/processing/visual/__screenshots__/typography/textmode/mode-switching-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..9f57131efad07f2e2952864d2fc74f3a9d25c054 GIT binary patch literal 1614 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 BV)+07 literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/typography/textmode/shape-mode-win32.png b/core/test/processing/visual/__screenshots__/typography/textmode/shape-mode-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..80dc55a4e406b155f98116f2ac98c555102dda00 GIT binary patch literal 1768 zcmaJ?Yd8}O8=k{fs|b-pHJ?Kvxu!nkxXC-Q?Ty78bBsC6aUnA;<w2!|ey-=a?-Y!UmBb;XLjV9k0%?t~ z6V_Z|TsSBy%;yF5R{#J|H421}bIMke&=JxT2KIjslLE?sj5XY`>0OdTyg*UBhm<%|&j z4RscN+u%<<}RVOek@N`IaNcYSt!EE|LZK=ur5-J$FK0!ITGg3})t+skBlHgXr36(~Rp<9C z^qfmmWMF8hpd6i-sSJn3?d>*2EpIGO+9FZ`>HF9u2rI_o-YA8l5Dk7FGIiN%xCCCU zl$Mr;n_5K2qZ-1vtu-~evYkD}PnzO+NE@48;%q0d;?6#GcX!vb6fTenooP10Sjbgm zOPrm}Kkw6!NaOo^*r!^LJUYqhntP>*J> zZ(L5G{UqCc>UmgO_-tqN*O|&N^46;NbW>FK#ju&8^0wH`(Ctc4`0Z-v+A^QM%%`sP zg)p-5i8~X@tVI2w351o^^ME(k-_>|u=ZzZ(WM*2)52w>Jz6-}_8qON+2cfo>#;dk} zEPwsbc;8^V79RI=-IA2RGrGB=&?|O8(hw+~G@9M-^33lIf4s`cmS&t|HS{rX^l?vj zH-o`QKV@=!unspkr(FV%gTQVPX~t2!A=-i(@&R3K^=6%T&@wk;r=qB_#)&Lw~ukv`g;<1>4!lbfxCX zLp@}B+sD;L4Bjpbm;6^X7#ipFR`_{-uM1OfvsJG~+3qI30&d&>11)<;w%gAyZ`2A# z7Ad0O2h`_!;DXc6-5Egd0NWzNt0dql#mB%CuZgqQURe99IRmHS-qJbL@=|>@^ z81DAsZhoRD*1M1HA(dsLR)uWv>65h89io|Nh!(9|yNRj8&#FWn3b8>g%3=QEgiPgv zPFxTn5C|+MepY`wd({bm!{L^$!D)ro2W6vV{mS@yb%lx8fM7>FfZL1bjmc)&#Hh1H z{!q@5Vp_y*3Updv`!63EWK&#-#D?SaAC$9^bN$(P^MLR?sw;1-(w>#HRCN9Ko0EaQ z4&X-ev+z8qC%cEr5Z;(X{ z`0Z@)i(j&awXzW67*B@7>D4%*K9yRQheLF9>hoq=V#hGv-rf&%>mJWf8A&!`?2>01 zBPfa3Yj{c}r}50yd5Cc&v!NlM`)Q+-4i4kbs;UTe@1+rmSDAPLv9u5YAvtt*Bpirn zn+R2d?YB#J4SbClQj-?Bi|N2;>rer{r_=+f1o|!ITTX^R7+S9Iv4@CRtc literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/typography/width/string-width-win32.png b/core/test/processing/visual/__screenshots__/typography/width/string-width-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..d44f86015f7b0b5384708e8b07c99a66062c9d4f GIT binary patch literal 1664 zcmdT_|2Go~6i1RKwZt}r!Ygcx7^Ga4ov56bIs5QR8>`^1r8JVeHdit)6>{z8B0;5EtJi7hkaSbBjG zmdRy1KkN+hH4OxcoGdtjwlsDb2gc3gWJcYH2Do#`nCMeBxUBs03byyXuU+_h9Pgt2 zN>v55U{-ec^LNGj3oDX0(>NX@8kUxkys6!?S*TkB(}Lw`{D2uPF(a(`fv5IfwhOsLV?HC|WAA&ErNbm?0tykLB&@qFdnWY6wL%BGh5Yw4uL#YMEg zf2EvG*Zi4fVr*)P5dV3y>D}`3qKeICJ14#kf>sVTr4L64id>RC)dZ_wKUH@3_Ev%+ z5M$%Xl#a2nvbW094pw@D^~s3rR+;Q{XOXeFd3BHo1OjpU3!M{_irH+ss;FqYIP)3? zi$=dFb~``Dr{c+Ea-H^c&(ILxxwMo_#wrAnGLkMrXREWbWQ&Ezv+#(BcU)xN)BUaB zUF@5Z7>+n~@?~wU6E&8IO;1lBb)qdz9j-e5TflSO*2cFPnYZ$7@kAnVK$3X-{?yde zqUsHeLJ5167OW$mWtzE-@ly`Ex$VbGrBZKvz%C(yX>o{&rEE)k%;J*CzKVWvEErCN zAut#Wl}fF`@_o^0BlgJ1DN^non}oz+shNevn)30wK5b|k77NPiR7-nPO`uF1Q{+QK z3=9mC8cEM@P)y+`rG~=L&`|r6QpS7ujve8nt=H9ZIA;AVxjc1qyL+0GwKb`;$kp^f z+?kk|8%P{e4*UEZ*Td#4~37kIj(K;GS*q->_w)Hq-^ zZZkC^>GWHB9#ARx2-4@7AtVy{#Vu9=vsI}@piroKeSQ6JJvyK$`I8EC;jd7IbYUU& z=+Uk#df=E9Mz$3m2UPaUWEMnWv2a<<0=%%Yv?sH?yu9Ar#Ka)p2@lK~SY2J6^xzjX9RpF; zzPl$}?{ToV-#qK>H8)S*%uKSbs;`H*4nLxWcz37x`!niW%jh2XtZBb6h{*9LJuBdg zx%~RBjt)jnPV@Q$9@=o?UpXochoe-6_j%vEqM6gTJHSXQp6*;h4pZ)p+v-YN;xQn} z)_S7EPvb9Q%7j7#Qx0Vtjs$|?<`yQ8i!)ynu@$6|lBTBgvuA~`>%z?rrXJz!IZ?Oi z=2mdQ9HdrweYtX2dJz#S5D0{?mJ!04p~kC6sMLoHhybbwe;!eYPPYliTJ{bM!cc=)DmB-;b>>V*8xO`yf`(K-1xHR-^7%&OmCv&>8wAiT5{1f*d*ET`y}$bW z%%H6wzbOQ?1kz5nTWxQau`H0qaye#!5yHGHm&+rb8jBpEs%LB~mz;?H$bwQZCR@A- zuI*!&`bV{H|AWqZ?zF`Zuhrwx$eM8}z0lfHg8FbG1@ULFH2j_XD<5-jL44b9!*7$n zBwtm&eMGzO@BTfS)j)0s4SG=Ly|B&12W3g9f;hZ0EkKlc~C|^U>Adxuh)R??77mLM4qkA13fQ8CY8EZs$KxEe*GoU@*Sv(+@ zf1K*uSA@C5hppZ~PSgYv2;V-uuJU1-k8H^8y?gIaI+Ij$+{(kng)%>eT1Z-6h?WPo ztJeiIG|Xb!6B^1uqviOx%YOPM7Dn4ZC$d^}0z?D?VXnHZ;hYM@Z0G*{FlB<_zRG}g z_w-nS&S@_B2 Date: Tue, 3 Mar 2026 19:12:34 +0530 Subject: [PATCH 3/5] Add 3D shape tests (box, sphere, transform) and 2D transform tests (translate, rotate, scale, pushpop) --- .../__screenshots__/shapes-3d/box-win32.png | Bin 0 -> 134 bytes .../shapes-3d/sphere-win32.png | Bin 0 -> 134 bytes .../shapes-3d/transform-win32.png | Bin 0 -> 134 bytes .../shapes/transform-pushpop-win32.png | Bin 0 -> 665 bytes .../shapes/transform-rotate-win32.png | Bin 0 -> 666 bytes .../shapes/transform-scale-win32.png | Bin 0 -> 200 bytes .../shapes/transform-translate-win32.png | Bin 0 -> 160 bytes .../visual/src/test/shapes/Shape3DTest.java | 33 ++++++ .../visual/src/test/shapes/TransformTest.java | 95 ++++++++++++++++++ 9 files changed, 128 insertions(+) create mode 100644 core/test/processing/visual/__screenshots__/shapes-3d/box-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes-3d/sphere-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes-3d/transform-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/transform-pushpop-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/transform-rotate-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/transform-scale-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/transform-translate-win32.png create mode 100644 core/test/processing/visual/src/test/shapes/TransformTest.java diff --git a/core/test/processing/visual/__screenshots__/shapes-3d/box-win32.png b/core/test/processing/visual/__screenshots__/shapes-3d/box-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..e07fe529c8ee84295a8d219564ef7954d4f5ca85 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~AzMd|QAr*0N&n;wRFyLv}@UQ;n zxmoMGS1Sk|-7`6@UHX<#Zs#_a=ta60r)79=QN_=-JNe?t>YUel7l8&dc)I$ztaD0e F0suSKG4B8X literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shapes-3d/sphere-win32.png b/core/test/processing/visual/__screenshots__/shapes-3d/sphere-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..e07fe529c8ee84295a8d219564ef7954d4f5ca85 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~AzMd|QAr*0N&n;wRFyLv}@UQ;n zxmoMGS1Sk|-7`6@UHX<#Zs#_a=ta60r)79=QN_=-JNe?t>YUel7l8&dc)I$ztaD0e F0suSKG4B8X literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shapes-3d/transform-win32.png b/core/test/processing/visual/__screenshots__/shapes-3d/transform-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..e07fe529c8ee84295a8d219564ef7954d4f5ca85 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~AzMd|QAr*0N&n;wRFyLv}@UQ;n zxmoMGS1Sk|-7`6@UHX<#Zs#_a=ta60r)79=QN_=-JNe?t>YUel7l8&dc)I$ztaD0e F0suSKG4B8X literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shapes/transform-pushpop-win32.png b/core/test/processing/visual/__screenshots__/shapes/transform-pushpop-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..5d24f94bfcf992aa16ea4110413a93f3d59b0894 GIT binary patch literal 665 zcmV;K0%rY*P)4}?_sXRfArb{~39Uk@(5Qt(Xe0z%jJ@~u;1@LHaQGS@Ba_L*X0xeOs(e0=i&+9|RVo$u`snf919~bH3Wvi1iK9Wj z&y5zur`PKl<6~sE+rjn$kI`zi=;M5!8?8_%WHy^0#D{>M7KFc^g0k~F?#GI={1Yy8rJ z7naZG!^^wfZt?tgfOUmUWHcJ#@mS)#TD4lu>2xZU%5u4k75?B9-|M#1LZP5mtL=9C zcs#}~7f$h|)9K-GNUvoVyq&@tzy}X!pU>x8uh&@W5+5uWDg=0h;CdR&ZOvxWdV)^Xq_mPO7P32)oR=AHg$;)&VcE3in|_pk=6-#jpTAU z{0v5;QHXD~THziSUaIwR{G$&90ubMPK7X(&yjtr-uh*N+X810RpV9g&oE8b3773gd z37i%Q@2f=wuBY*+?FZqsNZ_fGj~)e6f%0i{9`Vxh$DnmP{^7rvHF79*^lwsu^Ro+ij1> zV_6oxLn$*XnEZZ!rBd*YG#Ye|A33lLns}?#Di8>?S}nTMWA9kdU{vV0sYPFiz>zz)gbiZ%CVH5ImJ>nwT;R z;foE93>+Lprf*_8EQBwEIA(F!{*xIoF-;c27ie6XaDjr%l!@uHkZs$zoEHiOQzmAF zg)GZ5Xkw;V%;=9>%pl8bE=wktC6mjN=|fq+0TSXBgD&Cx5C8xG07*qoM6N<$f^(`q AdH?_b literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shapes/transform-scale-win32.png b/core/test/processing/visual/__screenshots__/shapes/transform-scale-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..7469724b5805b61b5bc45b0c2e6d8accb8371108 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~A{hlt4Ar*0NZy545DDb!?zS}>= zlh0XLX75z1#cKbegxbFMs%**6yR~e}uXf7`OBK8eCx>Rox)pt|dwSIO+E3%&5U-cv zaW-jB=UmT7`)2-n&L;QlwG+QeMRIKtNzptJ1k&O-tx1O!Ccu(1GqPK(pjqO1^0eL4 hC)(ZHp5}m%=i^WI&MuX{-UW0TgQu&X%Q~loCIGraOLPDL literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shapes/transform-translate-win32.png b/core/test/processing/visual/__screenshots__/shapes/transform-translate-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..56141c7ebc340ccd7d57dcdd782956f0caa2a870 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~A>7Fi*Ar*0N&lz$tDDtpgyz@Wh zUe?wrBBvx$be~P-tWmo)SxNq0f>wN@3v!K%1`MWLW7U;!d&OgUQ=gp e)NKHUFJ?U!eE#kGnn^$_89ZJ6T-G@yGywpJDLNPc literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/src/test/shapes/Shape3DTest.java b/core/test/processing/visual/src/test/shapes/Shape3DTest.java index 7006cf329..cf9374f23 100644 --- a/core/test/processing/visual/src/test/shapes/Shape3DTest.java +++ b/core/test/processing/visual/src/test/shapes/Shape3DTest.java @@ -81,4 +81,37 @@ public void testPerVertexStrokes() { p.endShape(); }), new TestConfig(50, 50)); } + @Test + @Order(4) + @DisplayName("Drawing a box") + public void testBox() { + assertVisualMatch("shapes-3d/box", create3DTest(p -> { + p.translate(25, 25, 0); + p.rotateX(0.5f); + p.rotateY(0.5f); + p.box(20); + }), new TestConfig(50, 50)); + } + + @Test + @Order(5) + @DisplayName("Drawing a sphere") + public void testSphere() { + assertVisualMatch("shapes-3d/sphere", create3DTest(p -> { + p.translate(25, 25, 0); + p.sphere(15); + }), new TestConfig(50, 50)); + } + + @Test + @Order(6) + @DisplayName("3D rotation and translation") + public void test3DTransform() { + assertVisualMatch("shapes-3d/transform", create3DTest(p -> { + p.translate(25, 25, 0); + p.rotateX(PApplet.PI / 4); + p.rotateY(PApplet.PI / 4); + p.box(15, 10, 20); + }), new TestConfig(50, 50)); + } } \ No newline at end of file diff --git a/core/test/processing/visual/src/test/shapes/TransformTest.java b/core/test/processing/visual/src/test/shapes/TransformTest.java new file mode 100644 index 000000000..bf0cada27 --- /dev/null +++ b/core/test/processing/visual/src/test/shapes/TransformTest.java @@ -0,0 +1,95 @@ +package processing.visual.src.test.shapes; + +import org.junit.jupiter.api.*; +import processing.core.*; +import processing.visual.src.test.base.VisualTest; +import processing.visual.src.core.ProcessingSketch; +import processing.visual.src.core.TestConfig; + +@Tag("shapes") +@Tag("transforms") +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class TransformTest extends VisualTest { + + @Test + @Order(1) + @DisplayName("Translate") + public void testTranslate() { + assertVisualMatch("shapes/transform-translate", new ProcessingSketch() { + @Override + public void setup(PApplet p) { + p.background(200); + p.fill(255); + p.stroke(0); + } + @Override + public void draw(PApplet p) { + p.translate(20, 20); + p.rect(0, 0, 20, 20); + } + }, new TestConfig(50, 50)); + } + + @Test + @Order(2) + @DisplayName("Rotate") + public void testRotate() { + assertVisualMatch("shapes/transform-rotate", new ProcessingSketch() { + @Override + public void setup(PApplet p) { + p.background(200); + p.fill(255); + p.stroke(0); + } + @Override + public void draw(PApplet p) { + p.translate(25, 25); + p.rotate(PApplet.PI / 4); + p.rect(-10, -10, 20, 20); + } + }, new TestConfig(50, 50)); + } + + @Test + @Order(3) + @DisplayName("Scale") + public void testScale() { + assertVisualMatch("shapes/transform-scale", new ProcessingSketch() { + @Override + public void setup(PApplet p) { + p.background(200); + p.fill(255); + p.stroke(0); + } + @Override + public void draw(PApplet p) { + p.scale(1.5f); + p.rect(5, 5, 20, 20); + } + }, new TestConfig(50, 50)); + } + + @Test + @Order(4) + @DisplayName("Push and Pop Matrix") + public void testPushPopMatrix() { + assertVisualMatch("shapes/transform-pushpop", new ProcessingSketch() { + @Override + public void setup(PApplet p) { + p.background(200); + p.fill(255); + p.stroke(0); + } + @Override + public void draw(PApplet p) { + p.pushMatrix(); + p.translate(10, 10); + p.rotate(PApplet.PI / 6); + p.rect(0, 0, 15, 15); + p.popMatrix(); + p.fill(255, 0, 0); + p.rect(25, 25, 15, 15); + } + }, new TestConfig(50, 50)); + } +} \ No newline at end of file From b52e16789d015e6333fdb3c0b16397fc48d59558 Mon Sep 17 00:00:00 2001 From: khuntvidisha13 Date: Tue, 3 Mar 2026 19:27:27 +0530 Subject: [PATCH 4/5] Add stroke tests (weight, cap, join) and blend mode tests (background blend, mode reset) --- .../blend-modes/background-blend-win32.png | Bin 0 -> 358 bytes .../blend-modes/mode-reset-win32.png | Bin 0 -> 227 bytes .../shapes/stroke-cap-round-win32.png | Bin 0 -> 243 bytes .../shapes/stroke-cap-square-win32.png | Bin 0 -> 177 bytes .../shapes/stroke-join-bevel-win32.png | Bin 0 -> 238 bytes .../shapes/stroke-join-miter-win32.png | Bin 0 -> 221 bytes .../shapes/stroke-join-round-win32.png | Bin 0 -> 246 bytes .../shapes/stroke-weight-win32.png | Bin 0 -> 316 bytes .../src/test/blendmodes/BlendModeTest.java | 62 +++++++++ .../visual/src/test/shapes/StrokeTest.java | 129 ++++++++++++++++++ 10 files changed, 191 insertions(+) create mode 100644 core/test/processing/visual/__screenshots__/blend-modes/background-blend-win32.png create mode 100644 core/test/processing/visual/__screenshots__/blend-modes/mode-reset-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/stroke-cap-round-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/stroke-cap-square-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/stroke-join-bevel-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/stroke-join-miter-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/stroke-join-round-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/stroke-weight-win32.png create mode 100644 core/test/processing/visual/src/test/shapes/StrokeTest.java diff --git a/core/test/processing/visual/__screenshots__/blend-modes/background-blend-win32.png b/core/test/processing/visual/__screenshots__/blend-modes/background-blend-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..6808395030aa5d3d8e2d5a4cb1436543d0050188 GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0FXZVAS<=aSW-5dwWySpNWy7?cw%_ zg06GLUFT-Mo3jXrJ}3HXtaIC(wVn>jCy3<^ql)|q)$*ib@BXV?F+h>G%xC1UUgy3r4@o~ zS6;IyZe_cwHdXAY*;2lvdaZIl?RIv&VX!|Y{iv_tSc=+>;7i79ET1)95lVI~@@3k1 zw4(AtQfYKE0+8l zrRJDg<|b~ld|7bk>5Ait^P4;VGP<3)H{q_Jb@Dd#9N(LBCJK1#Y&;@_m00uts$`=vnubXVCJ2jvH1A?lOG3^@R*!lctrKRD8 zyi*aJZf>p?>Ly$9wnHoj-b{VQKpfpsN`?UHx3vIVCg!00UoW A<^TWy literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shapes/stroke-cap-round-win32.png b/core/test/processing/visual/__screenshots__/shapes/stroke-cap-round-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..1d5bc814c3e1c70878e3a1ddbe9162becb3df9cb GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~AyF6VSLn`9lPTR=KtSG>;vdv0% z;zgbiC*vhQQe^JNKj8iF-rHJH=uJUW^A-)yx(4PsE=qycspeyzuai?RoAX oD<_CGZ4p?~s-Vk~skn#n?vujY#m!;7KwmI;y85}Sb4q9e0Og-wp#T5? literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shapes/stroke-cap-square-win32.png b/core/test/processing/visual/__screenshots__/shapes/stroke-cap-square-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..8d9d122515cf8c33d04bfd1c9ad51df831610b88 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~A6`n4RAr*0NuQ_rZP~c&3tiSii zr~X=%N!%%=AZ}}S$4$#86v?kV!=G-@4S_$>!`6PiwRo!;zx1Azum4l~J7%==o;h_! z>5S5}O~1-IZKr*^77pV5oB1?x@{Fl7U1zxJq*mTgNfShd{M!P71OOpS5;7LiHFx4^an91tzb??LlA0OSGd9C!> zjrCj2;%by%PoBRiYi;h_pi{Hf+|`u?_R^R$>_wX3g+oormp*N>9;)4y$qhNelF{r5}E*Ton@;4 literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shapes/stroke-join-round-win32.png b/core/test/processing/visual/__screenshots__/shapes/stroke-join-round-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..18cad53943ed0c8be5c497e809a836da4667938d GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~Adp%toLn`9l&e+I%*no%SYKDIA zG_Tj0D(wazTsaIX)D#arT5q!8ab!Vq-)hyv_AeSY8EI%YZ!+3*+Uoh6z4E3rZvLrL z;n@7<%$(woq<<@P&TQKLaTZffmwb(I+D+SPcSf_L{QDMex)!B>|7iJ)x8{)-AD&M* zbBd`aGP1!?o7*5QmGRgbodYwbvPx{;#E={&hA!!oYWjEeI_0@nOOh{_>@WR#hwYzu hYHC0jTWV?r)9JH|>=;{D1_M39;OXk;vd$@?2>?m1WFi0n literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shapes/stroke-weight-win32.png b/core/test/processing/visual/__screenshots__/shapes/stroke-weight-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..0ac975d791f30010cf4b13e0a1b38d788a010ee8 GIT binary patch literal 316 zcmV-C0mJ@@P)VU425ADMuDYR<|;ZE20E5N3_?rGJ!F(z+_{P0N&ZVf@~4obxhZS(1CD}aDOi?* zWl6KTu4_EP++T)fkrXUT!Lk%AO9ksZ&v6_-9$_w~CrQDY=UHEK6~pu-`G?iwDOi?* zWvO88`|fxWF+E8#3s2j&)t5=dFg?jKYnmqgVfA3pEYj5y8QtEZDp-~Z*0ybqdkfQ( zB(sKL&}XB1Fcd6E^(Rirn!PNByHt`Jm3y^r&b=iuo$ Date: Tue, 3 Mar 2026 19:32:59 +0530 Subject: [PATCH 5/5] Add ColorTest and ImageTest visual tests for color modes and PImage operations --- .../shapes/color-background-win32.png | Bin 0 -> 187 bytes .../shapes/color-fill-alpha-win32.png | Bin 0 -> 212 bytes .../shapes/color-fill-rgb-win32.png | Bin 0 -> 433 bytes .../shapes/color-hsb-win32.png | Bin 0 -> 182 bytes .../shapes/color-stroke-win32.png | Bin 0 -> 227 bytes .../shapes/image-draw-win32.png | Bin 0 -> 230 bytes .../shapes/image-resize-win32.png | Bin 0 -> 288 bytes .../shapes/image-tint-win32.png | Bin 0 -> 148 bytes .../visual/src/test/shapes/ColorTest.java | 120 ++++++++++++++++++ .../visual/src/test/shapes/ImageTest.java | 85 +++++++++++++ 10 files changed, 205 insertions(+) create mode 100644 core/test/processing/visual/__screenshots__/shapes/color-background-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/color-fill-alpha-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/color-fill-rgb-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/color-hsb-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/color-stroke-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/image-draw-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/image-resize-win32.png create mode 100644 core/test/processing/visual/__screenshots__/shapes/image-tint-win32.png create mode 100644 core/test/processing/visual/src/test/shapes/ColorTest.java create mode 100644 core/test/processing/visual/src/test/shapes/ImageTest.java diff --git a/core/test/processing/visual/__screenshots__/shapes/color-background-win32.png b/core/test/processing/visual/__screenshots__/shapes/color-background-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..cbfe0ec4432cd1b482670804d0905e802c244490 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~AO`a}}Ar*0N`!@16I0zh;m^O1p z=h_9nPncpGD^%RqUAl3*ZVvaRk5P=9)n=F;T*H~>TXAAnoOEnwr0p)D%~d6;X zoq2U}>Wr(4wGCIhhbM*guRF3v4!43&=hv(^$Zm=hJ~J!fT8r!Eya|5w29u;Xm4U8d N@O1TaS?83{1OWd*OQQe) literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shapes/color-fill-alpha-win32.png b/core/test/processing/visual/__screenshots__/shapes/color-fill-alpha-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..fdc34eaf912a3948dc9dd8bb367a18798b2bf093 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~AvproLLn`9lo-^b+U?6h%LjC7& z&)#OGa4ZStGMZ)+hjX&wm z6z$?#a)Qg1H7KQZ5tHU7r@%&$$c5x8vurLsmh#r;+PSzRuRWD-u5j!CI+MZE)z4*} HQ$iB}#)M08 literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shapes/color-fill-rgb-win32.png b/core/test/processing/visual/__screenshots__/shapes/color-fill-rgb-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..fefc4c7e20339fee5ac5de542627a4171c657198 GIT binary patch literal 433 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0FXZV65I<*!18&i%k{8ld2gJ3u zytrWgr9nR=ME-Z4se}Q>lz(UvdeGA!Z7CLqF)jIS4aB3AB@dh*Fc5s zzjS0bttdIM=#pZ$SG$fD4$krakv|VvCPU3g@h#JM%_!Q#uz)FMn-0e(d?HF$K_pkRsS(Ys(-DDV^pG0 z(pt%1M$ttZHf<3In=aS%BC?f-ng zU&V>mj}o}KLzxd1&(pTt-)?;)nzwp&V!r8{wQS$7S>9*e5pleTQSaKun1=3B9q|WA zvZtvf)bQy4#_dwy!VcfdLRi|i_v(i2QhK$oSvM^fj`r|a<_B~*gQu&X%Q~loCIBFp BT(tlI literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/__screenshots__/shapes/image-resize-win32.png b/core/test/processing/visual/__screenshots__/shapes/image-resize-win32.png new file mode 100644 index 0000000000000000000000000000000000000000..0c9e4dd55b09eef3d08a36ba66317b689700fad8 GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1SBWM%0B~A&pllnLn`9lp4-UD94K()g7&qe zyR@zAh5x$P9oF^QVzA(K@#)<)cOK7MGx_)AHLw5v;!JyCoMGTR-?3Tp7mw7L3+WdU z+U%OyjK4^l%vgAS!9ku{Hr_#_?kp<2^|fcqx8ppUx|}y%E3My``-(rZb&XS);_3;ZC$v&TH*rNCRg83o cGSOwY3j}}7-aMcG2hbV@Pgg&ebxsLQ08V)}nE(I) literal 0 HcmV?d00001 diff --git a/core/test/processing/visual/src/test/shapes/ColorTest.java b/core/test/processing/visual/src/test/shapes/ColorTest.java new file mode 100644 index 000000000..f83b567b8 --- /dev/null +++ b/core/test/processing/visual/src/test/shapes/ColorTest.java @@ -0,0 +1,120 @@ +package processing.visual.src.test.shapes; + +import org.junit.jupiter.api.*; +import processing.core.*; +import processing.visual.src.test.base.VisualTest; +import processing.visual.src.core.ProcessingSketch; +import processing.visual.src.core.TestConfig; + +@Tag("shapes") +@Tag("color") +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class ColorTest extends VisualTest { + + @Test + @Order(1) + @DisplayName("Fill with RGB color") + public void testFillRGB() { + assertVisualMatch("shapes/color-fill-rgb", new ProcessingSketch() { + @Override + public void setup(PApplet p) { + p.background(255); + p.noStroke(); + } + @Override + public void draw(PApplet p) { + p.fill(255, 0, 0); + p.rect(5, 5, 15, 40); + p.fill(0, 255, 0); + p.rect(20, 5, 15, 40); + p.fill(0, 0, 255); + p.rect(35, 5, 10, 40); + } + }, new TestConfig(50, 50)); + } + + @Test + @Order(2) + @DisplayName("Fill with alpha transparency") + public void testFillAlpha() { + assertVisualMatch("shapes/color-fill-alpha", new ProcessingSketch() { + @Override + public void setup(PApplet p) { + p.background(255); + p.noStroke(); + } + @Override + public void draw(PApplet p) { + p.fill(255, 0, 0); + p.rect(5, 5, 30, 40); + p.fill(0, 0, 255, 128); + p.rect(15, 5, 30, 40); + } + }, new TestConfig(50, 50)); + } + + @Test + @Order(3) + @DisplayName("Stroke color") + public void testStrokeColor() { + assertVisualMatch("shapes/color-stroke", new ProcessingSketch() { + @Override + public void setup(PApplet p) { + p.background(255); + p.strokeWeight(3); + p.noFill(); + } + @Override + public void draw(PApplet p) { + p.stroke(255, 0, 0); + p.rect(5, 5, 15, 15); + p.stroke(0, 255, 0); + p.rect(25, 5, 15, 15); + p.stroke(0, 0, 255); + p.rect(5, 25, 15, 15); + p.stroke(255, 165, 0); + p.rect(25, 25, 15, 15); + } + }, new TestConfig(50, 50)); + } + + @Test + @Order(4) + @DisplayName("HSB color mode") + public void testHSBColorMode() { + assertVisualMatch("shapes/color-hsb", new ProcessingSketch() { + @Override + public void setup(PApplet p) { + p.background(255); + p.noStroke(); + p.colorMode(PApplet.HSB, 360, 100, 100); + } + @Override + public void draw(PApplet p) { + for (int i = 0; i < 5; i++) { + p.fill(i * 72, 80, 90); + p.rect(i * 10, 10, 10, 30); + } + } + }, new TestConfig(50, 50)); + } + + @Test + @Order(5) + @DisplayName("Background color") + public void testBackgroundColor() { + assertVisualMatch("shapes/color-background", new ProcessingSketch() { + @Override + public void setup(PApplet p) { + p.noStroke(); + } + @Override + public void draw(PApplet p) { + p.background(100, 150, 200); + p.fill(255); + p.rect(10, 10, 30, 30); + } + }, new TestConfig(50, 50)); + } +} + diff --git a/core/test/processing/visual/src/test/shapes/ImageTest.java b/core/test/processing/visual/src/test/shapes/ImageTest.java new file mode 100644 index 000000000..9aa0fd1b4 --- /dev/null +++ b/core/test/processing/visual/src/test/shapes/ImageTest.java @@ -0,0 +1,85 @@ +package processing.visual.src.test.shapes; + +import org.junit.jupiter.api.*; +import processing.core.*; +import processing.visual.src.test.base.VisualTest; +import processing.visual.src.core.ProcessingSketch; +import processing.visual.src.core.TestConfig; + +@Tag("shapes") +@Tag("image") +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class ImageTest extends VisualTest { + + @Test + @Order(1) + @DisplayName("Draw PImage") + public void testDrawImage() { + assertVisualMatch("shapes/image-draw", new ProcessingSketch() { + PImage img; + @Override + public void setup(PApplet p) { + img = p.createImage(20, 20, PApplet.RGB); + img.loadPixels(); + for (int i = 0; i < img.pixels.length; i++) { + img.pixels[i] = p.color(255, 0, 0); + } + img.updatePixels(); + } + @Override + public void draw(PApplet p) { + p.background(255); + p.image(img, 10, 10); + } + }, new TestConfig(50, 50)); + } + + @Test + @Order(2) + @DisplayName("Tint image") + public void testTintImage() { + assertVisualMatch("shapes/image-tint", new ProcessingSketch() { + PImage img; + @Override + public void setup(PApplet p) { + img = p.createImage(20, 20, PApplet.RGB); + img.loadPixels(); + for (int i = 0; i < img.pixels.length; i++) { + img.pixels[i] = p.color(255); + } + img.updatePixels(); + } + @Override + public void draw(PApplet p) { + p.background(255); + p.tint(0, 150, 255); + p.image(img, 5, 5); + p.noTint(); + p.image(img, 25, 25); + } + }, new TestConfig(50, 50)); + } + + @Test + @Order(3) + @DisplayName("Resize image") + public void testResizeImage() { + assertVisualMatch("shapes/image-resize", new ProcessingSketch() { + PImage img; + @Override + public void setup(PApplet p) { + img = p.createImage(10, 10, PApplet.RGB); + img.loadPixels(); + for (int i = 0; i < img.pixels.length; i++) { + img.pixels[i] = p.color(0, 200, 100); + } + img.updatePixels(); + } + @Override + public void draw(PApplet p) { + p.background(255); + p.image(img, 5, 5, 40, 40); + } + }, new TestConfig(50, 50)); + } +} \ No newline at end of file