blob: 19953d781db6c3ff83b928f45b2629599b624e4f [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: PDFReferenceTestCase.java 1551536 2013-12-17 13:15:06Z vhennebert $ */
package org.apache.fop.pdf;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import org.junit.Test;
import static org.junit.Assert.assertTrue;
/**
* Test case for {@link PDFResources}.
*/
public class PDFResourcesTestCase {
private AtomicInteger patternCount = new AtomicInteger(0);
private AtomicInteger objectNummerCount = new AtomicInteger(0);
/**
* Test PDF resources output with color space, pattern and shading.
* @throws IOException
*/
@Test
public void testOutput() throws IOException {
PDFDocument pdfDoc = new PDFDocument(null);
PDFResources res = new PDFResources(pdfDoc);
res.addColorSpace(this.createColorSpace());
PDFResourceContext context = new PDFResourceContext(res);
context.addPattern(this.createPDFPattern(res, pdfDoc));
context.addShading(this.createPDFShading(res, pdfDoc));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
res.output(baos);
String expectedShading = "/Shading << /Sh2 4 0 R >>";
String expectedPattern = "/Pattern << /Pa1 2 0 R >>\n";
String expectedColorspace = "/ColorSpace << /cs1 [/Separation /cs1 /DeviceRGB 1 0 R] >>\n";
String outputString = baos.toString();
assertTrue(outputString.contains(expectedShading));
assertTrue(outputString.contains(expectedPattern));
assertTrue(outputString.contains(expectedColorspace));
}
/**
* Test PDF resources output with color space, pattern and shading,
* if the PDF resource object has a parent resource object.
* @throws IOException
*/
@Test
public void testOutputWithParent() throws IOException {
PDFDocument pdfDoc = new PDFDocument(null);
PDFResources res = new PDFResources(pdfDoc);
PDFResources resParent = new PDFResources(pdfDoc);
res.setParentResources(resParent);
resParent.addColorSpace(this.createColorSpace());
PDFResourceContext context = new PDFResourceContext(resParent);
context.addPattern(this.createPDFPattern(resParent, pdfDoc));
context.addShading(this.createPDFShading(resParent, pdfDoc));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
res.output(baos);
String expectedShading = "/Shading << /Sh2 4 0 R >>";
String expectedPattern = "/Pattern << /Pa1 2 0 R >>\n";
String expectedColorspace = "/ColorSpace << /cs1 [/Separation /cs1 /DeviceRGB 1 0 R] >>\n";
String outputString = baos.toString();
assertTrue(outputString.contains(expectedShading));
assertTrue(outputString.contains(expectedPattern));
assertTrue(outputString.contains(expectedColorspace));
}
/**
* Test PDF resources output with color space, pattern and shading,
* if the PDF resource object has a parent resource object, that also has
* color spaces, patterns and shadings.
* @throws IOException
*/
@Test
public void testOutputWithParent2() throws IOException {
PDFDocument pdfDoc = new PDFDocument(null);
PDFResources res = new PDFResources(pdfDoc);
PDFDictionary shadingDict = new PDFDictionary();
shadingDict.put("Sh1-1718006973", new PDFReference("9 0"));
res.put("Shading", shadingDict);
PDFDictionary patternDict = new PDFDictionary();
patternDict.put("Pa1-1718006973", new PDFReference("10 0"));
res.put("Pattern", patternDict);
PDFDictionary colorSpaceDict = new PDFDictionary();
colorSpaceDict.put("DefaultRGB", new PDFReference("11 0"));
res.put("ColorSpace", colorSpaceDict);
PDFResources resParent = new PDFResources(pdfDoc);
res.setParentResources(resParent);
resParent.addColorSpace(this.createColorSpace());
PDFResourceContext context = new PDFResourceContext(resParent);
context.addPattern(this.createPDFPattern(resParent, pdfDoc));
context.addShading(this.createPDFShading(resParent, pdfDoc));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
res.output(baos);
String outputString = baos.toString();
String expectedShading = "/Shading << /Sh1-1718006973 9 0 R /Sh2 4 0 R >>";
String expectedPattern = "/Shading << /Sh1-1718006973 9 0 R /Sh2 4 0 R >>";
String expectedColorspace = "/ColorSpace << /DefaultRGB 11 0 R"
+ " /cs1 [/Separation /cs1 /DeviceRGB 1 0 R] >>";
assertTrue(outputString.contains(expectedShading));
assertTrue(outputString.contains(expectedPattern));
assertTrue(outputString.contains(expectedColorspace));
}
private PDFShading createPDFShading(PDFResources res, PDFDocument pdfDoc) {
List<Double> coords = new ArrayList<Double>(4);
coords.add(1d);
coords.add(1d);
coords.add(1d);
coords.add(1d);
PDFFunction pdfFunction = createPDFFunction();
PDFDeviceColorSpace deviceColorspace = new PDFDeviceColorSpace(PDFDeviceColorSpace.DEVICE_RGB);
PDFShading shading = new PDFShading(2, deviceColorspace, coords, pdfFunction);
shading.setObjectNumber(objectNummerCount.incrementAndGet());
shading.setDocument(pdfDoc);
shading.setName("Sh" + patternCount.incrementAndGet());
return shading;
}
private PDFColorSpace createColorSpace() {
PDFFunction tintFunction = createPDFFunction();
return new PDFSeparationColorSpace("cs1", tintFunction);
}
private PDFFunction createPDFFunction() {
final Double zero = 0d;
final Double one = 1d;
List<Double> domain = Arrays.asList(new Double[] {zero, one});
List<Double> range = Arrays.asList(new Double[] {zero, one, zero, one, zero, one});
float[] cZero = new float[] {1f, 1f, 1f};
float[] cOne = {0f, 0f, 0f};
PDFFunction tintFunction = new PDFFunction(domain, range, cZero, cOne, 1.0d);
tintFunction.setObjectNumber(objectNummerCount.incrementAndGet());
return tintFunction;
}
private PDFPattern createPDFPattern(PDFResources res, PDFDocument pdfDoc) {
List<Double> bbox = new ArrayList<Double>();
bbox.add(1d);
bbox.add(1d);
bbox.add(1d);
bbox.add(1d);
List<Double> theMatrix = new ArrayList<Double>();
for (int i = 0; i < 6; i++) {
theMatrix.add(1d);
}
PDFPattern pattern = new PDFPattern(res, 1, 1, 1, bbox, 1, 1, theMatrix, null,
new StringBuffer());
pattern.setObjectNumber(objectNummerCount.incrementAndGet());
pattern.setDocument(pdfDoc);
pattern.setName("Pa" + patternCount.incrementAndGet());
return pattern;
}
}