diff --git a/core/test/processing/visual/__screenshots__/blend-modes/add-win32.png b/core/test/processing/visual/__screenshots__/blend-modes/add-win32.png new file mode 100644 index 000000000..2bfdb0da3 Binary files /dev/null and b/core/test/processing/visual/__screenshots__/blend-modes/add-win32.png differ diff --git a/core/test/processing/visual/__screenshots__/blend-modes/blend-win32.png b/core/test/processing/visual/__screenshots__/blend-modes/blend-win32.png new file mode 100644 index 000000000..5cea6a3e4 Binary files /dev/null and b/core/test/processing/visual/__screenshots__/blend-modes/blend-win32.png differ diff --git a/core/test/processing/visual/__screenshots__/blend-modes/darkest-win32.png b/core/test/processing/visual/__screenshots__/blend-modes/darkest-win32.png new file mode 100644 index 000000000..67bf78fe3 Binary files /dev/null and b/core/test/processing/visual/__screenshots__/blend-modes/darkest-win32.png differ diff --git a/core/test/processing/visual/__screenshots__/blend-modes/difference-win32.png b/core/test/processing/visual/__screenshots__/blend-modes/difference-win32.png new file mode 100644 index 000000000..f313c08fd Binary files /dev/null and b/core/test/processing/visual/__screenshots__/blend-modes/difference-win32.png differ diff --git a/core/test/processing/visual/__screenshots__/blend-modes/exclusion-win32.png b/core/test/processing/visual/__screenshots__/blend-modes/exclusion-win32.png new file mode 100644 index 000000000..5f1adf7b7 Binary files /dev/null and b/core/test/processing/visual/__screenshots__/blend-modes/exclusion-win32.png differ diff --git a/core/test/processing/visual/__screenshots__/blend-modes/lightest-win32.png b/core/test/processing/visual/__screenshots__/blend-modes/lightest-win32.png new file mode 100644 index 000000000..c8793a25f Binary files /dev/null and b/core/test/processing/visual/__screenshots__/blend-modes/lightest-win32.png differ diff --git a/core/test/processing/visual/__screenshots__/blend-modes/mode-switch-win32.png b/core/test/processing/visual/__screenshots__/blend-modes/mode-switch-win32.png new file mode 100644 index 000000000..983869942 Binary files /dev/null and b/core/test/processing/visual/__screenshots__/blend-modes/mode-switch-win32.png differ diff --git a/core/test/processing/visual/__screenshots__/blend-modes/multiply-win32.png b/core/test/processing/visual/__screenshots__/blend-modes/multiply-win32.png new file mode 100644 index 000000000..77727795c Binary files /dev/null and b/core/test/processing/visual/__screenshots__/blend-modes/multiply-win32.png differ diff --git a/core/test/processing/visual/__screenshots__/blend-modes/replace-win32.png b/core/test/processing/visual/__screenshots__/blend-modes/replace-win32.png new file mode 100644 index 000000000..eb857e595 Binary files /dev/null and b/core/test/processing/visual/__screenshots__/blend-modes/replace-win32.png differ diff --git a/core/test/processing/visual/__screenshots__/blend-modes/screen-win32.png b/core/test/processing/visual/__screenshots__/blend-modes/screen-win32.png new file mode 100644 index 000000000..7e50c094a Binary files /dev/null and b/core/test/processing/visual/__screenshots__/blend-modes/screen-win32.png differ diff --git a/core/test/processing/visual/__screenshots__/blend-modes/subtract-win32.png b/core/test/processing/visual/__screenshots__/blend-modes/subtract-win32.png new file mode 100644 index 000000000..31bf7abd5 Binary files /dev/null and b/core/test/processing/visual/__screenshots__/blend-modes/subtract-win32.png differ diff --git a/core/test/processing/visual/src/test/blendmodes/BlendModeTest.java b/core/test/processing/visual/src/test/blendmodes/BlendModeTest.java new file mode 100644 index 000000000..74531b75b --- /dev/null +++ b/core/test/processing/visual/src/test/blendmodes/BlendModeTest.java @@ -0,0 +1,161 @@ +package processing.visual.src.test.blendmodes; + +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("blend-modes") +@Tag("rendering") +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class BlendModeTest extends VisualTest { + + // Draws base rects with BLEND, then overlays a green rect using the given mode + private ProcessingSketch createBlendTest(int mode) { + return new ProcessingSketch() { + @Override + public void setup(PApplet p) { + p.background(128); + p.noStroke(); + } + + @Override + public void draw(PApplet p) { + // Base layer — always drawn with normal BLEND + p.blendMode(PApplet.BLEND); + p.fill(200, 60, 60); + p.rect(5, 5, 30, 30); + p.fill(60, 60, 200); + p.rect(15, 15, 30, 30); + + p.blendMode(mode); + p.fill(60, 200, 60, 160); + p.rect(10, 10, 30, 30); + } + }; + } + + // ========== Individual Blend Modes ========== + + @Test + @Order(1) + @DisplayName("blendMode(BLEND)") + public void testBlend() { + assertVisualMatch("blend-modes/blend", + createBlendTest(PApplet.BLEND), + new TestConfig(50, 50)); + } + + @Test + @Order(2) + @DisplayName("blendMode(ADD)") + public void testAdd() { + assertVisualMatch("blend-modes/add", + createBlendTest(PApplet.ADD), + new TestConfig(50, 50)); + } + + @Test + @Order(3) + @DisplayName("blendMode(SUBTRACT)") + public void testSubtract() { + assertVisualMatch("blend-modes/subtract", + createBlendTest(PApplet.SUBTRACT), + new TestConfig(50, 50)); + } + + @Test + @Order(4) + @DisplayName("blendMode(MULTIPLY)") + public void testMultiply() { + assertVisualMatch("blend-modes/multiply", + createBlendTest(PApplet.MULTIPLY), + new TestConfig(50, 50)); + } + + @Test + @Order(5) + @DisplayName("blendMode(SCREEN)") + public void testScreen() { + assertVisualMatch("blend-modes/screen", + createBlendTest(PApplet.SCREEN), + new TestConfig(50, 50)); + } + + @Test + @Order(6) + @DisplayName("blendMode(DARKEST)") + public void testDarkest() { + assertVisualMatch("blend-modes/darkest", + createBlendTest(PApplet.DARKEST), + new TestConfig(50, 50)); + } + + @Test + @Order(7) + @DisplayName("blendMode(LIGHTEST)") + public void testLightest() { + assertVisualMatch("blend-modes/lightest", + createBlendTest(PApplet.LIGHTEST), + new TestConfig(50, 50)); + } + + @Test + @Order(8) + @DisplayName("blendMode(DIFFERENCE)") + public void testDifference() { + assertVisualMatch("blend-modes/difference", + createBlendTest(PApplet.DIFFERENCE), + new TestConfig(50, 50)); + } + + @Test + @Order(9) + @DisplayName("blendMode(EXCLUSION)") + public void testExclusion() { + assertVisualMatch("blend-modes/exclusion", + createBlendTest(PApplet.EXCLUSION), + new TestConfig(50, 50)); + } + + @Test + @Order(10) + @DisplayName("blendMode(REPLACE)") + public void testReplace() { + assertVisualMatch("blend-modes/replace", + createBlendTest(PApplet.REPLACE), + new TestConfig(50, 50)); + } + + // ========== Sequential Mode Switch ========== + + @Test + @Order(11) + @DisplayName("Switching blend modes mid-sketch") + public void testModeSwitch() { + assertVisualMatch("blend-modes/mode-switch", new ProcessingSketch() { + @Override + public void setup(PApplet p) { + p.background(128); + p.noStroke(); + } + + @Override + public void draw(PApplet p) { + // Each strip should only reflect its own blend mode + p.blendMode(PApplet.ADD); + p.fill(200, 60, 60, 160); + p.rect(5, 5, 20, 40); + + p.blendMode(PApplet.MULTIPLY); + p.fill(60, 200, 60, 160); + p.rect(15, 5, 20, 40); + + p.blendMode(PApplet.BLEND); + p.fill(60, 60, 200, 160); + p.rect(25, 5, 20, 40); + } + }, new TestConfig(50, 50)); + } +}