diff options
Diffstat (limited to 'src/java/org/apache/fop/render/pdf/FopPDFImage.java')
-rw-r--r-- | src/java/org/apache/fop/render/pdf/FopPDFImage.java | 374 |
1 files changed, 0 insertions, 374 deletions
diff --git a/src/java/org/apache/fop/render/pdf/FopPDFImage.java b/src/java/org/apache/fop/render/pdf/FopPDFImage.java deleted file mode 100644 index e60c207d6..000000000 --- a/src/java/org/apache/fop/render/pdf/FopPDFImage.java +++ /dev/null @@ -1,374 +0,0 @@ -/* - * 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.pdf; -import java.awt.color.ColorSpace; -import java.awt.color.ICC_Profile; -import java.io.IOException; -import java.io.OutputStream; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import org.apache.fop.image.EPSImage; -import org.apache.fop.image.FopImage; -import org.apache.fop.image.TIFFImage; -import org.apache.fop.pdf.BitmapImage; -import org.apache.fop.pdf.CCFFilter; -import org.apache.fop.pdf.DCTFilter; -import org.apache.fop.pdf.PDFColor; -import org.apache.fop.pdf.PDFConformanceException; -import org.apache.fop.pdf.PDFDeviceColorSpace; -import org.apache.fop.pdf.PDFDictionary; -import org.apache.fop.pdf.PDFDocument; -import org.apache.fop.pdf.PDFFilter; -import org.apache.fop.pdf.PDFFilterList; -import org.apache.fop.pdf.PDFICCBasedColorSpace; -import org.apache.fop.pdf.PDFICCStream; -import org.apache.fop.pdf.PDFImage; -import org.apache.fop.pdf.PDFReference; -import org.apache.fop.util.ColorProfileUtil; - -/** - * PDFImage implementation for the PDF renderer. - */ -public class FopPDFImage implements PDFImage { - - /** logging instance */ - private static Log log = LogFactory.getLog(FopPDFImage.class); - - private FopImage fopImage; - private PDFICCStream pdfICCStream = null; - private PDFFilter pdfFilter = null; - private String maskRef; - private PDFReference softMask; - private boolean isPS = false; - private boolean isCCF = false; - private boolean isDCT = false; - private String key; - - /** - * Creates a new PDFImage from a FopImage - * @param image Image - * @param key XObject key - */ - public FopPDFImage(FopImage image, String key) { - fopImage = image; - this.key = key; - isPS = (fopImage instanceof EPSImage); - } - - /** - * {@inheritDoc} - */ - public String getKey() { - // key to look up XObject - return this.key; - } - - /** - * {@inheritDoc} - */ - public void setup(PDFDocument doc) { - if ("image/jpeg".equals(fopImage.getMimeType())) { - pdfFilter = new DCTFilter(); - pdfFilter.setApplied(true); - isDCT = true; - - } else if ("image/tiff".equals(fopImage.getMimeType()) - && fopImage instanceof TIFFImage) { - TIFFImage tiffImage = (TIFFImage) fopImage; - if (tiffImage.getStripCount() == 1) { - int comp = tiffImage.getCompression(); - if (comp == 1) { - // Nothing to do - } else if (comp == 3) { - pdfFilter = new CCFFilter(); - pdfFilter.setApplied(true); - isCCF = true; - } else if (comp == 4) { - pdfFilter = new CCFFilter(); - pdfFilter.setApplied(true); - PDFDictionary dict = new PDFDictionary(); - dict.put("K", -1); - dict.put("Columns", tiffImage.getWidth()); - ((CCFFilter)pdfFilter).setDecodeParms(dict); - isCCF = true; - } else if (comp == 6) { - pdfFilter = new DCTFilter(); - pdfFilter.setApplied(true); - isDCT = true; - } - } - } - if (isPS || isDCT || isCCF) { - fopImage.load(FopImage.ORIGINAL_DATA); - } else { - fopImage.load(FopImage.BITMAP); - } - ICC_Profile prof = fopImage.getICCProfile(); - PDFDeviceColorSpace pdfCS = toPDFColorSpace(fopImage.getColorSpace()); - if (prof != null) { - boolean defaultsRGB = ColorProfileUtil.isDefaultsRGB(prof); - String desc = ColorProfileUtil.getICCProfileDescription(prof); - if (log.isDebugEnabled()) { - log.debug("Image returns ICC profile: " + desc + ", default sRGB=" + defaultsRGB); - } - PDFICCBasedColorSpace cs = doc.getResources().getICCColorSpaceByProfileName(desc); - if (!defaultsRGB) { - if (cs == null) { - pdfICCStream = doc.getFactory().makePDFICCStream(); - pdfICCStream.setColorSpace(prof, pdfCS); - cs = doc.getFactory().makeICCBasedColorSpace(null, null, pdfICCStream); - } else { - pdfICCStream = cs.getICCStream(); - } - } else { - if (cs == null && "sRGB".equals(desc)) { - //It's the default sRGB profile which we mapped to DefaultRGB in PDFRenderer - cs = doc.getResources().getColorSpace("DefaultRGB"); - } - pdfICCStream = cs.getICCStream(); - } - } - //Handle transparency mask if applicable - if (fopImage.hasSoftMask()) { - doc.getProfile().verifyTransparencyAllowed(fopImage.getOriginalURI()); - //TODO Implement code to combine image with background color if transparency is not - //allowed (need BufferedImage support for that) - byte [] softMaskBitmap = fopImage.getSoftMask(); - if (softMaskBitmap == null) { - return; - } - BitmapImage fopimg = new BitmapImage - ("Mask:" + key, fopImage.getWidth(), fopImage.getHeight(), - softMaskBitmap, null); - fopimg.setColorSpace(new PDFDeviceColorSpace(PDFDeviceColorSpace.DEVICE_GRAY)); - softMask = doc.addImage(null, fopimg).makeReference(); - } - if (doc.getProfile().getPDFAMode().isPDFA1LevelB()) { - if (pdfCS != null - && pdfCS.getColorSpace() != PDFDeviceColorSpace.DEVICE_RGB - && pdfCS.getColorSpace() != PDFDeviceColorSpace.DEVICE_GRAY - && prof == null) { - //See PDF/A-1, ISO 19005:1:2005(E), 6.2.3.3 - //FOP is currently restricted to DeviceRGB if PDF/A-1 is active. - throw new PDFConformanceException( - "PDF/A-1 does not allow mixing DeviceRGB and DeviceCMYK: " - + fopImage.getOriginalURI()); - } - } - } - - /** - * {@inheritDoc} - */ - public int getWidth() { - return fopImage.getWidth(); - } - - /** - * {@inheritDoc} - */ - public int getHeight() { - return fopImage.getHeight(); - } - - /** - * {@inheritDoc} - */ - public PDFDeviceColorSpace getColorSpace() { - // DeviceGray, DeviceRGB, or DeviceCMYK - if (isCCF || isDCT || isPS) { - return toPDFColorSpace(fopImage.getColorSpace()); - } else { - return toPDFColorSpace(ColorSpace.getInstance(ColorSpace.CS_sRGB)); - } - } - - /** - * {@inheritDoc} - */ - public int getBitsPerPixel() { - if (isCCF) { - return fopImage.getBitsPerPixel(); - } else { - return 8; //TODO This is suboptimal, handling everything as RGB - //The image wrappers can mostly only return RGB bitmaps right now. This should - //be improved so the renderers can deal directly with RenderedImage instances. - } - } - - /** - * {@inheritDoc} - */ - public boolean isTransparent() { - return fopImage.isTransparent(); - } - - /** - * {@inheritDoc} - */ - public PDFColor getTransparentColor() { - return new PDFColor(fopImage.getTransparentColor().getRed(), - fopImage.getTransparentColor().getGreen(), - fopImage.getTransparentColor().getBlue()); - } - - /** - * {@inheritDoc} - */ - public String getMask() { - return maskRef; - } - - /** {@inheritDoc} */ - public PDFReference getSoftMaskReference() { - return softMask; - } - - /** @return true for CMYK images generated by Adobe Photoshop */ - public boolean isInverted() { - return fopImage.isInverted(); - } - - /** - * {@inheritDoc} - */ - public boolean isPS() { - return isPS; - } - - /** - * {@inheritDoc} - */ - public PDFFilter getPDFFilter() { - return pdfFilter; - } - - /** - * {@inheritDoc} - */ - public void outputContents(OutputStream out) throws IOException { - if (isPS) { - outputPostScriptContents(out); - } else { - if (fopImage.getBitmapsSize() > 0) { - out.write(fopImage.getBitmaps()); - } else { - out.write(fopImage.getRessourceBytes()); - } - } - } - - /** - * Serializes an EPS image to an OutputStream. - * @param out OutputStream to write to - * @throws IOException in case of an I/O problem - */ - protected void outputPostScriptContents(OutputStream out) throws IOException { - EPSImage epsImage = (EPSImage) fopImage; - int[] bbox = epsImage.getBBox(); - int bboxw = bbox[2] - bbox[0]; - int bboxh = bbox[3] - bbox[1]; - - // delegate the stream work to PDFStream - //PDFStream imgStream = new PDFStream(0); - - StringBuffer preamble = new StringBuffer(); - preamble.append("%%BeginDocument: " + epsImage.getDocName() + "\n"); - - preamble.append("userdict begin % Push userdict on dict stack\n"); - preamble.append("/PreEPS_state save def\n"); - preamble.append("/dict_stack countdictstack def\n"); - preamble.append("/ops_count count 1 sub def\n"); - preamble.append("/showpage {} def\n"); - - - preamble.append((double)(1f / (double) bboxw) + " " - + (double)(1f / (double) bboxh) + " scale\n"); - preamble.append(-bbox[0] + " " + (-bbox[1]) + " translate\n"); - preamble.append(bbox[0] + " " + bbox[1] + " " - + bboxw + " " + bboxh + " rectclip\n"); - preamble.append("newpath\n"); - - StringBuffer post = new StringBuffer(); - post.append("%%EndDocument\n"); - post.append("count ops_count sub {pop} repeat\n"); - post.append("countdictstack dict_stack sub {end} repeat\n"); - post.append("PreEPS_state restore\n"); - post.append("end % userdict\n"); - - //Write Preamble - out.write(PDFDocument.encode(preamble.toString())); - //Write EPS contents - out.write(((EPSImage)fopImage).getEPSImage()); - //Writing trailer - out.write(PDFDocument.encode(post.toString())); - } - - /** - * {@inheritDoc} - */ - public PDFICCStream getICCStream() { - return pdfICCStream; - } - - /** - * Converts a ColorSpace object to a PDFColorSpace object. - * @param cs ColorSpace instance - * @return PDFColorSpace new converted object - */ - public static PDFDeviceColorSpace toPDFColorSpace(ColorSpace cs) { - if (cs == null) { - return null; - } - - PDFDeviceColorSpace pdfCS = new PDFDeviceColorSpace(0); - switch(cs.getType()) { - case ColorSpace.TYPE_CMYK: - pdfCS.setColorSpace(PDFDeviceColorSpace.DEVICE_CMYK); - break; - case ColorSpace.TYPE_RGB: - pdfCS.setColorSpace(PDFDeviceColorSpace.DEVICE_RGB); - break; - case ColorSpace.TYPE_GRAY: - pdfCS.setColorSpace(PDFDeviceColorSpace.DEVICE_GRAY); - break; - } - return pdfCS; - } - - /** - * {@inheritDoc} - */ - public String getFilterHint() { - if (isPS) { - return PDFFilterList.CONTENT_FILTER; - } else if (isDCT) { - return PDFFilterList.JPEG_FILTER; - } else if (isCCF) { - return PDFFilterList.TIFF_FILTER; - } else { - return PDFFilterList.IMAGE_FILTER; - } - } - -} - |