/* * Copyright 2017 Laszlo Balazs-Csiki * * This file is part of Pixelitor. Pixelitor is free software: you * can redistribute it and/or modify it under the terms of the GNU * General Public License, version 3 as published by the Free * Software Foundation. * * Pixelitor is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Pixelitor. If not, see <http://www.gnu.org/licenses/>. */ package pixelitor.utils; import pixelitor.AppLogic; import pixelitor.Composition; import pixelitor.colors.ColorUtils; import pixelitor.gui.ImageComponents; import pixelitor.layers.Layer; import pixelitor.layers.LayerMask; import pixelitor.menus.view.ZoomLevel; import java.awt.Color; import java.awt.image.BufferedImage; import java.util.Random; /** * Support for testing with small (3x3) images, * where it is feasible to check every pixel */ public class Tests3x3 { public static final int RED = Color.RED.getRGB(); public static final int GREEN = Color.GREEN.getRGB(); public static final int BLUE = Color.BLUE.getRGB(); public static final int WHITE = Color.WHITE.getRGB(); public static final int GRAY = Color.GRAY.getRGB(); public static final int BLACK = Color.BLACK.getRGB(); public static final int YELLOW = Color.YELLOW.getRGB(); public static final int MAGENTA = Color.MAGENTA.getRGB(); public static final int CYAN = Color.CYAN.getRGB(); public static final int SEMI_TRANSPARENT_WHITE = ColorUtils.toPackedInt(128, 255, 0, 0); public static final int SEMI_TRANSPARENT_GRAY = ColorUtils.toPackedInt(128, 0, 255, 0); public static final int SEMI_TRANSPARENT_BLACK = ColorUtils.toPackedInt(128, 0, 0, 255); private Tests3x3() { } public static BufferedImage getStandardImage1() { BufferedImage img = ImageUtils.createSysCompatibleImage(3, 3); img.setRGB(0, 0, ColorUtils.toPackedInt(255, 223, 235, 120)); img.setRGB(0, 1, ColorUtils.toPackedInt(255, 35, 125, 43)); img.setRGB(0, 2, ColorUtils.toPackedInt(255, 89, 28, 207)); img.setRGB(1, 0, ColorUtils.toPackedInt(255, 101, 224, 114)); img.setRGB(1, 1, ColorUtils.toPackedInt(255, 92, 49, 135)); img.setRGB(1, 2, ColorUtils.toPackedInt(255, 27, 238, 72)); img.setRGB(2, 0, ColorUtils.toPackedInt(255, 255, 91, 179)); img.setRGB(2, 1, ColorUtils.toPackedInt(255, 88, 190, 199)); img.setRGB(2, 2, ColorUtils.toPackedInt(255, 128, 128, 128)); return img; } public static BufferedImage getStandardImage2() { BufferedImage img = ImageUtils.createSysCompatibleImage(3, 3); img.setRGB(0, 0, ColorUtils.toPackedInt(255, 190, 149, 66)); img.setRGB(0, 1, ColorUtils.toPackedInt(255, 37, 159, 8)); img.setRGB(0, 2, ColorUtils.toPackedInt(255, 63, 107, 198)); img.setRGB(1, 0, ColorUtils.toPackedInt(255, 174, 25, 53)); img.setRGB(1, 1, ColorUtils.toPackedInt(255, 146, 58, 135)); img.setRGB(1, 2, ColorUtils.toPackedInt(255, 61, 71, 82)); img.setRGB(2, 0, ColorUtils.toPackedInt(255, 143, 125, 211)); img.setRGB(2, 1, ColorUtils.toPackedInt(255, 208, 84, 44)); img.setRGB(2, 2, ColorUtils.toPackedInt(255, 209, 72, 111)); return img; } public static BufferedImage getRandomImage(boolean withTransparency) { BufferedImage img = ImageUtils.createSysCompatibleImage(3, 3); Random rand = new Random(); for (int y = 0; y < 3; y++) { for (int x = 0; x < 3; x++) { int a; if (withTransparency) { a = rand.nextInt(256); } else { a = 255; } int r = rand.nextInt(256); int g = rand.nextInt(256); int b = rand.nextInt(256); img.setRGB(x, y, ColorUtils.toPackedInt(a, r, g, b)); } } return img; } public static BufferedImage getStandardMaskImage() { BufferedImage img = new BufferedImage(3, 3, BufferedImage.TYPE_BYTE_GRAY); img.setRGB(0, 0, WHITE); img.setRGB(1, 0, WHITE); img.setRGB(2, 0, WHITE); img.setRGB(0, 1, GRAY); img.setRGB(1, 1, WHITE); img.setRGB(2, 1, GRAY); img.setRGB(0, 2, BLACK); img.setRGB(1, 2, GRAY); img.setRGB(2, 2, BLACK); return img; } public static void addStandardImage(boolean withMask) { BufferedImage img = getRandomImage(false); // BufferedImage img = getStandardImage(false); Composition comp = Composition.fromImage(img, null, "3x3 Test"); if(withMask) { BufferedImage maskImg = getStandardMaskImage(); Layer layer = comp.getLayer(0); LayerMask mask = new LayerMask(comp, maskImg, layer, false); layer.addMask(mask); } AppLogic.addCompAsNewImage(comp); comp.getIC().setZoom(ZoomLevel.Z6400, true, null); } // creates expected results from actual ones for regression tests public static String getExpectedFromActual(BufferedImage actual) { String s = "BufferedImage getExpectedImageAfter OP() {\n"; int width = actual.getWidth(); int height = actual.getHeight(); s += String.format("BufferedImage img = ImageUtils.createCompatibleImage(%d, %d);\n", width, height); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { int rgb = actual.getRGB(x, y); int a = (rgb >>> 24) & 0xFF; int r = (rgb >>> 16) & 0xFF; int g = (rgb >>> 8) & 0xFF; int b = rgb & 0xFF; s += String.format(" img.setRGB(%d, %d, toPackedInt(%d, %d, %d, %d));\n", x, y, a, r, g, b); } } s += " return img;\n}\n"; return s; } public static void dumpCompositeOfActive() { BufferedImage img = ImageComponents.getActiveCompOrNull().calculateCompositeImage(); String actual = getExpectedFromActual(img); System.out.println(String.format("Tests3x3::dumpCompositeOfActive: \n%s\n", actual)); } }