/* * 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.tools.shapestool; import pixelitor.colors.FgBgColors; import pixelitor.tools.UserDrag; import pixelitor.tools.gradientpaints.AngleGradientPaint; import pixelitor.tools.gradientpaints.DiamondGradientPaint; import pixelitor.tools.gradientpaints.SpiralGradientPaint; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.GradientPaint; import java.awt.Graphics2D; import java.awt.MultipleGradientPaint; import java.awt.Paint; import java.awt.RadialGradientPaint; import java.awt.geom.AffineTransform; import java.awt.geom.Point2D; import static java.awt.AlphaComposite.DST_OUT; import static java.awt.AlphaComposite.SRC_OVER; /** * A Paint type based on two endpoints of a UserDrag. * Used as a fill type in the Shapes Tool. */ enum TwoPointBasedPaint { LINEAR_GRADIENT { @Override protected Paint getPaint(UserDrag ud) { Color fgColor = FgBgColors.getFG(); Color bgColor = FgBgColors.getBG(); return new GradientPaint( (float)ud.getStartXFromCenter(), (float)ud.getStartYFromCenter(), fgColor, (float)ud.getEndX(), (float)ud.getEndY(), bgColor); } @Override public String toString() { return "Linear Gradient"; } }, RADIAL_GRADIENT { private final float[] FRACTIONS = {0.0f, 1.0f}; private final AffineTransform gradientTransform = new AffineTransform(); @Override protected Paint getPaint(UserDrag userDrag) { Color fgColor = FgBgColors.getFG(); Color bgColor = FgBgColors.getBG(); Point2D center = userDrag.getCenterPoint(); float distance = (float) userDrag.getDistance(); return new RadialGradientPaint(center, distance / 2, center, FRACTIONS, new Color[]{fgColor, bgColor}, MultipleGradientPaint.CycleMethod.NO_CYCLE, MultipleGradientPaint.ColorSpaceType.SRGB, gradientTransform); } @Override public String toString() { return "Radial Gradient"; } }, ANGLE_GRADIENT { @Override protected Paint getPaint(UserDrag userDrag) { Color fgColor = FgBgColors.getFG(); Color bgColor = FgBgColors.getBG(); Point2D center = userDrag.getCenterPoint(); UserDrag centerUserDrag = new UserDrag(center.getX(), center.getY(), userDrag.getEndX(), userDrag.getEndY()); return new AngleGradientPaint(centerUserDrag, fgColor, bgColor, MultipleGradientPaint.CycleMethod.NO_CYCLE); } @Override public String toString() { return "Angle Gradient"; } }, SPIRAL_GRADIENT { @Override protected Paint getPaint(UserDrag userDrag) { Color fgColor = FgBgColors.getFG(); Color bgColor = FgBgColors.getBG(); Point2D center = userDrag.getCenterPoint(); UserDrag centerUserDrag = new UserDrag(center.getX(), center.getY(), userDrag.getEndX(), userDrag.getEndY()); return new SpiralGradientPaint(true, centerUserDrag, fgColor, bgColor, MultipleGradientPaint.CycleMethod.NO_CYCLE); } @Override public String toString() { return "Spiral Gradient"; } }, DIAMOND_GRADIENT { @Override protected Paint getPaint(UserDrag userDrag) { Color fgColor = FgBgColors.getFG(); Color bgColor = FgBgColors.getBG(); Point2D center = userDrag.getCenterPoint(); UserDrag centerUserDrag = new UserDrag(center.getX(), center.getY(), userDrag.getEndX(), userDrag.getEndY()); return new DiamondGradientPaint(centerUserDrag, fgColor, bgColor, MultipleGradientPaint.CycleMethod.NO_CYCLE); } @Override public String toString() { return "Diamond Gradient"; } }, FOREGROUND { @Override protected Paint getPaint(UserDrag userDrag) { return FgBgColors.getFG(); } @Override public String toString() { return "Foreground"; } }, BACKGROUND { @Override protected Paint getPaint(UserDrag userDrag) { return FgBgColors.getBG(); } @Override public String toString() { return "Background"; } }, TRANSPARENT { @Override protected Paint getPaint(UserDrag userDrag) { return Color.WHITE; // does not matter } @Override public void setupPaint(Graphics2D g, UserDrag userDrag) { g.setComposite(AlphaComposite.getInstance(DST_OUT)); } @Override public void restorePaint(Graphics2D g) { g.setComposite(AlphaComposite.getInstance(SRC_OVER)); } @Override public String toString() { return "Transparent"; } }; protected abstract Paint getPaint(UserDrag userDrag); public void setupPaint(Graphics2D g, UserDrag userDrag) { g.setPaint(getPaint(userDrag)); } public void restorePaint(Graphics2D g) { } }