| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* $Id$ */ |
| |
| package org.apache.fop.render.gradient; |
| |
| import java.awt.Color; |
| import java.awt.geom.AffineTransform; |
| |
| import org.junit.Test; |
| |
| import static org.junit.Assert.assertArrayEquals; |
| import static org.junit.Assert.assertEquals; |
| |
| import org.apache.batik.ext.awt.LinearGradientPaint; |
| import org.apache.batik.ext.awt.RadialGradientPaint; |
| |
| public class GradientTestCase { |
| |
| private static class PatternChecker { |
| |
| private final Pattern pattern; |
| |
| PatternChecker(Pattern pattern) { |
| this.pattern = pattern; |
| } |
| |
| public PatternChecker type(int expectedType) { |
| assertEquals(expectedType, pattern.getPatternType()); |
| return this; |
| } |
| |
| public PatternChecker matrix(Double... expectedMatrix) { |
| assertArrayEquals(expectedMatrix, pattern.getMatrix().toArray()); |
| return this; |
| } |
| |
| public ShadingChecker shading() { |
| return new ShadingChecker(pattern.getShading()); |
| } |
| } |
| |
| private static class ShadingChecker { |
| |
| private final Shading shading; |
| |
| ShadingChecker(Shading shading) { |
| this.shading = shading; |
| } |
| |
| ShadingChecker shadingType(int expectedShadingType) { |
| assertEquals(expectedShadingType, shading.getShadingType()); |
| return this; |
| } |
| |
| ShadingChecker coords(double... expectedCoords) { |
| double[] coords = new double[shading.getCoords().size()]; |
| int index = 0; |
| for (Double d : shading.getCoords()) { |
| coords[index++] = d; |
| } |
| assertArrayEquals(expectedCoords, coords, 0.0001); |
| return this; |
| } |
| |
| ShadingChecker extend(Boolean... expectedExtend) { |
| assertArrayEquals(expectedExtend, shading.getExtend().toArray()); |
| return this; |
| } |
| |
| FunctionChecker function() { |
| return new FunctionChecker(shading.getFunction()); |
| } |
| } |
| |
| private static class FunctionChecker { |
| |
| private final Function function; |
| |
| FunctionChecker(Function function) { |
| this.function = function; |
| } |
| |
| FunctionChecker functionType(int expectedFunctionType) { |
| assertEquals(expectedFunctionType, function.getFunctionType()); |
| return this; |
| } |
| |
| FunctionChecker domain(Double... expectedDomain) { |
| assertArrayEquals(expectedDomain, function.getDomain().toArray()); |
| return this; |
| } |
| |
| FunctionChecker bounds(Float... expectedBounds) { |
| assertArrayEquals(expectedBounds, function.getBounds().toArray()); |
| return this; |
| } |
| |
| FunctionChecker encode(Double... expectedEncode) { |
| assertArrayEquals(expectedEncode, function.getEncode().toArray()); |
| return this; |
| } |
| |
| FunctionChecker cZero(float... expectedCZero) { |
| assertArrayEquals(expectedCZero, function.getCZero(), 0f); |
| return this; |
| } |
| |
| FunctionChecker cOne(float... expectedCOne) { |
| assertArrayEquals(expectedCOne, function.getCOne(), 0f); |
| return this; |
| } |
| |
| FunctionChecker functions(int expectedFunctionCount) { |
| assertEquals(expectedFunctionCount, function.getFunctions().size()); |
| return this; |
| } |
| |
| FunctionChecker function(int index) { |
| return new FunctionChecker(function.getFunctions().get(index)); |
| } |
| } |
| |
| @Test |
| public void simpleLinearGradient() { |
| LinearGradientPaint gradient = new LinearGradientPaint(0f, 0f, 100f, 100f, |
| fractions(0f, 1f), colors(Color.BLUE, Color.RED)); |
| Pattern pattern = GradientMaker.makeLinearGradient(gradient, |
| AffineTransform.getTranslateInstance(10.0, 20.0), |
| AffineTransform.getScaleInstance(100.0, 1000.0)); |
| PatternChecker patternChecker = new PatternChecker(pattern) |
| .type(2) |
| .matrix(100.0, 0.0, 0.0, 1000.0, 10.0, 20.0); |
| ShadingChecker shadingChecker = patternChecker.shading() |
| .shadingType(2) |
| .coords(0.0, 0.0, 100.0, 100.0) |
| .extend(true, true); |
| FunctionChecker functionChecker = shadingChecker.function() |
| .functionType(3) |
| .domain(0.0, 1.0) |
| .bounds() |
| .encode(0.0, 1.0) |
| .functions(1); |
| functionChecker.function(0) |
| .functionType(2) |
| .domain(0.0, 1.0) |
| .cZero(0f, 0f, 1f) |
| .cOne(1f, 0f, 0f) |
| .functions(0); |
| } |
| |
| @Test |
| public void simpleRadialGradient() { |
| RadialGradientPaint gradient = new RadialGradientPaint(100, 200, 50, |
| fractions(0f, 1f), colors(Color.BLUE, Color.RED)); |
| Pattern pattern = GradientMaker.makeRadialGradient(gradient, new AffineTransform(), new AffineTransform()); |
| PatternChecker patternChecker = new PatternChecker(pattern).type(2); |
| ShadingChecker shadingChecker = patternChecker.shading() |
| .shadingType(3) |
| .coords(100.0, 200.0, 0.0, 100.0, 200.0, 50.0) |
| .extend(true, true); |
| FunctionChecker functionChecker = shadingChecker.function() |
| .functionType(3) |
| .domain(0.0, 1.0) |
| .bounds() |
| .encode(0.0, 1.0) |
| .functions(1); |
| functionChecker.function(0) |
| .functionType(2) |
| .domain(0.0, 1.0) |
| .cZero(0f, 0f, 1f) |
| .cOne(1f, 0f, 0f) |
| .functions(0); |
| } |
| |
| @Test |
| public void threeColorLinearGradient() { |
| LinearGradientPaint gradient = new LinearGradientPaint(0f, 10f, 20f, 30f, |
| fractions(0f, 0.5f, 1f), colors(Color.BLUE, Color.RED, Color.GREEN)); |
| Pattern pattern = GradientMaker.makeLinearGradient(gradient, new AffineTransform(), new AffineTransform()); |
| PatternChecker patternChecker = new PatternChecker(pattern) |
| .type(2) |
| .matrix(1.0, 0.0, 0.0, 1.0, 0.0, 0.0); |
| ShadingChecker shadingChecker = patternChecker.shading() |
| .shadingType(2) |
| .coords(0.0, 10.0, 20.0, 30.0) |
| .extend(true, true); |
| FunctionChecker functionChecker = shadingChecker.function() |
| .functionType(3) |
| .domain(0.0, 1.0) |
| .bounds(0.5f) |
| .encode(0.0, 1.0, 0.0, 1.0) |
| .functions(2); |
| functionChecker.function(0) |
| .functionType(2) |
| .domain(0.0, 1.0) |
| .cZero(0f, 0f, 1f) |
| .cOne(1f, 0f, 0f) |
| .functions(0); |
| functionChecker.function(1) |
| .functionType(2) |
| .domain(0.0, 1.0) |
| .cZero(1f, 0f, 0f) |
| .cOne(0f, 1f, 0f) |
| .functions(0); |
| } |
| |
| @Test |
| public void fourColorRadialGradientNonZeroFirstStop() { |
| RadialGradientPaint gradient = new RadialGradientPaint(100, 200, 50, 110, 220, |
| fractions(0.2f, 0.5f, 0.7f, 1f), colors(Color.BLUE, Color.RED, Color.GREEN, Color.WHITE)); |
| Pattern pattern = GradientMaker.makeRadialGradient(gradient, new AffineTransform(), new AffineTransform()); |
| ShadingChecker shadingChecker = new PatternChecker(pattern).shading() |
| .coords(110.0, 220.0, 0.0, 100.0, 200.0, 50.0); |
| FunctionChecker functionChecker = shadingChecker.function() |
| .functionType(3) |
| .bounds(0.2f, 0.5f, 0.7f) |
| .encode(0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0) |
| .functions(4); |
| functionChecker.function(0) |
| .functionType(2) |
| .cZero(0f, 0f, 1f) |
| .cOne(0f, 0f, 1f); |
| functionChecker.function(1) |
| .functionType(2) |
| .cZero(0f, 0f, 1f) |
| .cOne(1f, 0f, 0f); |
| functionChecker.function(2) |
| .functionType(2) |
| .cZero(1f, 0f, 0f) |
| .cOne(0f, 1f, 0f); |
| functionChecker.function(3) |
| .functionType(2) |
| .cZero(0f, 1f, 0f) |
| .cOne(1f, 1f, 1f); |
| } |
| |
| @Test |
| public void fourColorRadialGradientNonZeroLastStopFocalOut() { |
| RadialGradientPaint gradient = new RadialGradientPaint(0, 0, 100, 100, 100, |
| fractions(0f, 0.3f, 0.6f, 0.9f), colors(Color.WHITE, Color.RED, Color.GREEN, Color.BLUE)); |
| Pattern pattern = GradientMaker.makeRadialGradient(gradient, new AffineTransform(), new AffineTransform()); |
| ShadingChecker shadingChecker = new PatternChecker(pattern).shading() |
| .coords(70.7036, 70.7036, 0.0, 0.0, 0.0, 100.0); |
| FunctionChecker functionChecker = shadingChecker.function() |
| .functionType(3) |
| .bounds(0.3f, 0.6f, 0.9f) |
| .encode(0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0) |
| .functions(4); |
| functionChecker.function(0) |
| .functionType(2) |
| .cZero(1f, 1f, 1f) |
| .cOne(1f, 0f, 0f); |
| functionChecker.function(1) |
| .functionType(2) |
| .cZero(1f, 0f, 0f) |
| .cOne(0f, 1f, 0f); |
| functionChecker.function(2) |
| .functionType(2) |
| .cZero(0f, 1f, 0f) |
| .cOne(0f, 0f, 1f); |
| functionChecker.function(3) |
| .functionType(2) |
| .cZero(0f, 0f, 1f) |
| .cOne(0f, 0f, 1f); |
| } |
| |
| private float[] fractions(float... fractions) { |
| return fractions; |
| } |
| |
| private Color[] colors(Color... colors) { |
| return colors; |
| } |
| |
| @Test |
| public void testMakeBounds() { |
| RadialGradientPaint gradient = new RadialGradientPaint(0, 0, 100, 100, 100, |
| fractions(0f, 1f, 0.9f), colors(Color.WHITE, Color.RED, Color.GREEN)); |
| Pattern pattern = GradientMaker.makeRadialGradient(gradient, new AffineTransform(), new AffineTransform()); |
| ShadingChecker shadingChecker = new PatternChecker(pattern).shading() |
| .coords(70.7036, 70.7036, 0.0, 0.0, 0.0, 100.0); |
| shadingChecker.function() |
| .functionType(3) |
| .bounds(1f, 0.9f) |
| .encode(0.0, 1.0, 0.0, 1.0, 0.0, 1.0) |
| .functions(3); |
| } |
| |
| } |