blob: e3adce931dfd6b9751d32a8909a1ff74ed52ffa5 [file] [log] [blame]
/*
* 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.xmlgraphics.java2d.ps;
import java.awt.AlphaComposite;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.TexturePaint;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import org.apache.xmlgraphics.java2d.GraphicContext;
import org.apache.xmlgraphics.ps.PSGenerator;
import org.apache.xmlgraphics.ps.PSState;
public class PSGraphics2DTestCase {
private PSGenerator gen;
private PSGraphics2D gfx2d;
private final AffineTransform transform = new AffineTransform(1, 0, 0, -1, 0, 792);
@Before
public void setup() {
gen = mock(PSGenerator.class);
createGraphics2D();
PSState pState = new PSState();
when(gen.getCurrentState()).thenReturn(pState);
}
private void createGraphics2D() {
gfx2d = new PSGraphics2D(false, gen);
gfx2d.setGraphicContext(new GraphicContext());
gfx2d.setTransform(transform);
}
@Test
public void draw() throws IOException {
assertEquals(gfx2d.getTransform(), transform);
gfx2d.draw(new Rectangle(10, 10, 100, 100));
verify(gen, times(1)).concatMatrix(transform);
}
@Test
public void testShouldBeClipped() {
Shape line = new Line2D.Float(10, 10, 50, 50);
Shape clipArea = new Rectangle2D.Float(20, 20, 100, 100);
assertTrue(gfx2d.shouldBeClipped(clipArea, line));
Shape rect = new Rectangle2D.Float(30, 30, 40, 40);
assertFalse(gfx2d.shouldBeClipped(clipArea, rect));
}
@Test
public void testFill() {
ByteArrayOutputStream out = new ByteArrayOutputStream();
PSGenerator gen = new PSGenerator(out);
PSGraphics2D p = new PSGraphics2D(false, gen);
p.setGraphicContext(new GraphicContext());
p.fill(new RoundRectangle2D.Float());
out.reset();
p.fill(new RoundRectangle2D.Float());
assertEquals(out.toString(),
"GS\nN\n/f1943450110{0 0 M\n0 0 L\n0 0 0 0 0 0 C\n0 0 L\n0 0 0 0 0 0 C\n"
+ "0 0 L\n0 0 0 0 0 0 C\n0 0 L\n0 0 0 0 0 0 C\ncp}def\nf1943450110\nf\nGR\n");
out.reset();
BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
p.drawImage(img, 0, 0, null);
String res = "[1 0 0 1 0 0] CT\n"
+ "GS\n"
+ "0 0 translate\n"
+ "%AXGBeginBitmap: java.awt.image.BufferedImage\n"
+ "{{\n"
+ "/RawData currentfile /ASCII85Decode filter def\n"
+ "/Data RawData /FlateDecode filter def\n"
+ "/DeviceRGB setcolorspace\n";
assertTrue(out.toString(), out.toString().startsWith("GS\n" + res));
out.reset();
p.drawRenderedImage(img, new AffineTransform());
assertTrue(out.toString(), out.toString().startsWith("GS\n[1 0 0 1 0 0] CT\n" + res));
out.reset();
p.writeClip(new RoundRectangle2D.Float());
assertEquals(out.toString(), "N\n"
+ "0 0 M\n"
+ "0 0 L\n"
+ "0 0 0 0 0 0 C\n"
+ "0 0 L\n"
+ "0 0 0 0 0 0 C\n"
+ "0 0 L\n"
+ "0 0 0 0 0 0 C\n"
+ "0 0 L\n"
+ "0 0 0 0 0 0 C\n"
+ "cp\n"
+ "clip\n");
out.reset();
p.drawString("hi", 0f, 0f);
assertTrue(out.toString(), out.toString().startsWith("GS\nN\n/f"));
out.reset();
TexturePaint tp = new TexturePaint(img, new Rectangle());
p.setPaint(tp);
p.fill(new Rectangle());
assertTrue(out.toString().startsWith("GS\n<<\n/PatternType 1\n"));
p.dispose();
}
@Test
public void testAcrobatDownsample() {
ByteArrayOutputStream out = new ByteArrayOutputStream();
PSGenerator gen = new PSGenerator(out);
PSGraphics2D p = new PSGraphics2D(false, gen);
p.setGraphicContext(new GraphicContext());
BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
TexturePaint tp = new TexturePaint(img, new Rectangle());
p.setPaint(tp);
p.fill(new Rectangle());
assertTrue(out.toString().contains("1 1 8 matrix\n{<\nffffff\n>} false 3 colorimage"));
out.reset();
gen.setAcrobatDownsample(true);
p.fill(new Rectangle());
assertTrue(out.toString().contains("1 1 4 matrix\n{<\nfff\n>} false 3 colorimage"));
p.dispose();
}
@Test
public void testFillAlpha() {
ByteArrayOutputStream out = new ByteArrayOutputStream();
PSGenerator gen = new PSGenerator(out);
PSGraphics2D p = new PSGraphics2D(false, gen);
p.setGraphicContext(new GraphicContext());
p.setComposite(AlphaComposite.getInstance(3, 0));
p.fill(new Rectangle());
assertEquals(out.toString(), "");
p.setComposite(AlphaComposite.getInstance(3, 0.5f));
p.fill(new Rectangle());
assertTrue(out.toString().contains("\nN\n"));
}
@Test
public void testMask() {
ByteArrayOutputStream out = new ByteArrayOutputStream();
PSGenerator generator = new PSGenerator(out);
PSGraphics2D graphics = new PSGraphics2D(false, generator);
graphics.setGraphicContext(new GraphicContext());
BufferedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
graphics.drawImage(image, 0, 0, null, null, image);
assertTrue(out.toString().contains("imagemask"));
}
}