/* * Copyright 2016 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; import com.jhlabs.image.CausticsFilter; import com.jhlabs.image.TransformFilter; import pixelitor.utils.ImageUtils; import java.awt.image.BufferedImage; import java.awt.image.BufferedImageOp; public class PerformanceTests { private static final FilterWrapper[] filters = { new FilterWrapper(new CausticsFilter("PerformanceTests")), // new FilterWrapper(new BrushedMetalFilter()), // new FilterWrapper(new CircleFilter()), // new FilterWrapper(new CircleToSquareFilter()), // new FilterWrapper(new DiffuseFilter()), // new FilterWrapper(new KaleidoscopeFilter()), // new FilterWrapper(new MagnifyFilter()), // new FilterWrapper(new MarbleFilter()), // new FilterWrapper(new MirrorFilter()), // new FilterWrapper(new OffsetFilter()), // new FilterWrapper(new PerspectiveFilter()), // new FilterWrapper(new PolarFilter()), // new FilterWrapper(new RippleFilter()), // new FilterWrapper(new SphereFilter()), // new FilterWrapper(new SwirlFilter()), // new FilterWrapper(new TileFilter()), // new FilterWrapper(new WaterFilter()) }; private PerformanceTests() { } private static void testTransformFilter(BufferedImage image, FilterWrapper filterWrapper) { filterWrapper.setInterpolation(TransformFilter.NEAREST_NEIGHBOUR); double timeNN = testFilter("NEAREST_NEIGHBOUR", filterWrapper, image); System.out.println(); filterWrapper.setInterpolation(TransformFilter.NEAREST_NEIGHBOUR_OLD); double timeNNOld = testFilter("NEAREST_NEIGHBOUR_OLD", filterWrapper, image); double percentOfOld = timeNN * 100.0/ timeNNOld; System.out.println(String.format("(%.2f %%)", percentOfOld)); filterWrapper.setInterpolation(TransformFilter.BILINEAR); double timeBL = testFilter("BILINEAR", filterWrapper, image); System.out.println(); filterWrapper.setInterpolation(TransformFilter.BILINEAR_OLD); double timeBLOLD = testFilter("BILINEAR_OLD", filterWrapper, image); percentOfOld = timeBL * 100.0/ timeBLOLD; System.out.println(String.format("(%.2f %%)", percentOfOld)); } private static double testFilter(String what, FilterWrapper filterWrapper, BufferedImage src) { System.out.print(" " + what + ": "); BufferedImage dest = ImageUtils.createImageWithSameColorModel(src); BufferedImageOp filter = filterWrapper.getFilter(); for (int i = 0; i < 2; i++) { filter.filter(src, dest); } long startTime = System.nanoTime(); for (int i = 0; i < 10; i++) { filter.filter(src, dest); } double estimatedSeconds = (System.nanoTime() - startTime) / 100000000.0; System.out.print(String.format("%.2f", estimatedSeconds)); return estimatedSeconds; } } class FilterWrapper { private final BufferedImageOp filter; private final String description; FilterWrapper(BufferedImageOp filter) { this(filter, filter.getClass().getSimpleName()); } private FilterWrapper(BufferedImageOp filter, String description) { this.filter = filter; this.description = description; if(filter instanceof TransformFilter) { ((TransformFilter)filter).setEdgeAction(TransformFilter.WRAP_AROUND); } } public void setInterpolation(int interpolation) { ((TransformFilter)filter).setInterpolation(interpolation); } BufferedImageOp getFilter() { return filter; } String getDescription() { return description; } boolean isTransformFilter() { return filter instanceof TransformFilter; } }