/*
* 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.test;
import org.jdesktop.swingx.painter.AbstractLayoutPainter;
import org.jdesktop.swingx.painter.effects.ShadowPathEffect;
import pixelitor.Build;
import pixelitor.Canvas;
import pixelitor.Composition;
import pixelitor.MessageHandler;
import pixelitor.NewImage;
import pixelitor.automate.SingleDirChooserPanel;
import pixelitor.colors.FgBgColors;
import pixelitor.colors.FillType;
import pixelitor.filters.ColorWheel;
import pixelitor.filters.ValueNoise;
import pixelitor.filters.jhlabsproxies.JHDropShadow;
import pixelitor.filters.painters.AreaEffects;
import pixelitor.filters.painters.TextFilter;
import pixelitor.filters.painters.TextSettings;
import pixelitor.gui.ImageComponents;
import pixelitor.io.Directories;
import pixelitor.io.OutputFormat;
import pixelitor.layers.BlendingMode;
import pixelitor.layers.ImageLayer;
import pixelitor.tools.GradientTool;
import pixelitor.tools.GradientType;
import pixelitor.tools.UserDrag;
import pixelitor.utils.Messages;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.io.File;
import static java.awt.Color.WHITE;
import static java.awt.MultipleGradientPaint.CycleMethod.REFLECT;
import static pixelitor.ChangeReason.OP_WITHOUT_DIALOG;
import static pixelitor.tools.GradientColorType.BLACK_TO_WHITE;
/**
* Static methods for creating the splash images
*/
public class SplashImageCreator {
// public static final String SPLASH_SCREEN_FONT = "Comic Sans MS";
private static final String SPLASH_SCREEN_FONT = "DejaVu Sans Light";
private SplashImageCreator() {
}
public static void saveManySplashImages() {
boolean okPressed = SingleDirChooserPanel.selectOutputDir(true);
if (!okPressed) {
return;
}
int numCreatedImages = 32;
MessageHandler messageHandler = Messages.getMessageHandler();
String msg = String.format("Save %d Splash Images: ", numCreatedImages);
messageHandler.startProgress(msg, numCreatedImages);
File lastSaveDir = Directories.getLastSaveDir();
for (int i = 0; i < numCreatedImages; i++) {
OutputFormat outputFormat = OutputFormat.getLastUsed();
String fileName = String.format("splash%04d.%s", i, outputFormat.toString());
messageHandler.updateProgress(i);
createSplashImage();
ImageComponents.onActiveICAndComp((ic, comp) -> {
ic.paintImmediately(ic.getBounds());
File f = new File(lastSaveDir, fileName);
outputFormat.saveComp(comp, f, false);
ic.close();
ValueNoise.reseed();
});
}
messageHandler.stopProgress();
messageHandler.showStatusMessage(String.format("Finished saving splash images to %s", lastSaveDir));
}
public static void createSplashImage() {
assert EventQueue.isDispatchThread();
Composition comp = NewImage.addNewImage(FillType.WHITE, 400, 247, "Splash");
ImageLayer layer = (ImageLayer) comp.getLayer(0);
layer.setName("Color Wheel", true);
new ColorWheel().execute(layer, OP_WITHOUT_DIALOG);
layer = addNewLayer(comp, "Value Noise");
ValueNoise valueNoise = new ValueNoise();
valueNoise.setDetails(7);
valueNoise.execute(layer, OP_WITHOUT_DIALOG);
layer.setOpacity(0.3f, true, true, true);
layer.setBlendingMode(BlendingMode.SCREEN, true, true, true);
layer = addNewLayer(comp, "Gradient");
addRadialBWGradientToActiveLayer(layer, true);
layer.setOpacity(0.4f, true, true, true);
layer.setBlendingMode(BlendingMode.LUMINOSITY, true, true, true);
FgBgColors.setFG(WHITE);
Font font = new Font(SPLASH_SCREEN_FONT, Font.BOLD, 48);
layer = addRasterizedTextLayer(comp, "Pixelitor", WHITE, font, -17, BlendingMode.NORMAL, 0.9f, false);
addDropShadow(layer);
font = new Font(SPLASH_SCREEN_FONT, Font.BOLD, 22);
layer = addRasterizedTextLayer(comp, "Loading...", WHITE, font, -70, BlendingMode.NORMAL, 0.9f, false);
addDropShadow(layer);
font = new Font(SPLASH_SCREEN_FONT, Font.PLAIN, 20);
layer = addRasterizedTextLayer(comp, "version " + Build.VERSION_NUMBER, WHITE, font, 50, BlendingMode.NORMAL, 0.9f, false);
addDropShadow(layer);
// font = new Font(Font.SANS_SERIF, Font.PLAIN, 10);
// addRasterizedTextLayer(ic, new Date().toString(), font, 0.8f, 100, false);
}
private static void addDropShadow(ImageLayer layer) {
JHDropShadow dropShadow = new JHDropShadow();
dropShadow.setDistance(5);
dropShadow.setSoftness(5);
dropShadow.setOpacity(0.7f);
dropShadow.execute(layer, OP_WITHOUT_DIALOG);
}
private static ImageLayer addNewLayer(Composition comp, String name) {
ImageLayer imageLayer = comp.addNewEmptyLayer(name, false);
imageLayer.setName(name, true);
return imageLayer;
}
private static void addRasterizedTextLayer(Composition comp, String text, int translationY) {
Font font = new Font(Font.SANS_SERIF, Font.BOLD, 20);
addRasterizedTextLayer(comp, text, WHITE, font, translationY, BlendingMode.NORMAL, 1.0f, false);
}
private static ImageLayer addRasterizedTextLayer(Composition comp, String text, Color textColor, Font font, int translationY, BlendingMode blendingMode, float opacity, boolean dropShadow) {
ImageLayer layer = addNewLayer(comp, text);
TextFilter textFilter = TextFilter.getInstance();
AreaEffects effects = null;
if (dropShadow) {
effects = new AreaEffects();
effects.setDropShadowEffect(new ShadowPathEffect(1.0f));
}
TextSettings settings = new TextSettings(text, font, textColor, effects,
AbstractLayoutPainter.HorizontalAlignment.CENTER,
AbstractLayoutPainter.VerticalAlignment.CENTER, false);
textFilter.setSettings(settings);
textFilter.execute(layer, OP_WITHOUT_DIALOG);
layer.setTranslation(0, translationY);
layer.enlargeImage(layer.getComp().getCanvasBounds());
layer.setOpacity(opacity, true, true, true);
layer.setBlendingMode(blendingMode, true, true, true);
return layer;
}
public static void addRadialBWGradientToActiveLayer(ImageLayer layer, boolean radial) {
Canvas canvas = layer.getComp().getCanvas();
int canvasWidth = canvas.getWidth();
int canvasHeight = canvas.getHeight();
int startX = canvasWidth / 2;
int startY = canvasHeight / 2;
int endX = 0;
int endY = 0;
if (canvasWidth > canvasHeight) {
endX = startX;
} else {
endY = startY;
}
GradientType gradientType;
if (radial) {
gradientType = GradientType.RADIAL;
} else {
gradientType = GradientType.SPIRAL_CW;
}
GradientTool.drawGradient(layer,
gradientType,
BLACK_TO_WHITE,
REFLECT,
AlphaComposite.SrcOver,
new UserDrag(startX, startY, endX, endY),
false);
}
}