1 17 18 19 20 package org.apache.fop.render.bitmap; 21 22 25 import java.awt.image.BufferedImage ; 26 import java.awt.image.DataBuffer ; 27 import java.awt.image.PixelInterleavedSampleModel ; 28 import java.awt.image.RenderedImage ; 29 import java.awt.image.SampleModel ; 30 import java.awt.image.SinglePixelPackedSampleModel ; 31 import java.io.IOException ; 32 import java.io.OutputStream ; 33 import java.util.Iterator ; 34 35 import org.apache.avalon.framework.configuration.Configuration; 36 import org.apache.avalon.framework.configuration.ConfigurationException; 37 38 import org.apache.commons.logging.Log; 39 40 import org.apache.xmlgraphics.image.GraphicsUtil; 41 import org.apache.xmlgraphics.image.rendered.FormatRed; 42 import org.apache.xmlgraphics.image.writer.ImageWriter; 43 import org.apache.xmlgraphics.image.writer.ImageWriterParams; 44 import org.apache.xmlgraphics.image.writer.ImageWriterRegistry; 45 import org.apache.xmlgraphics.image.writer.MultiImageWriter; 46 47 import org.apache.fop.apps.FOPException; 48 import org.apache.fop.apps.FOUserAgent; 49 import org.apache.fop.apps.MimeConstants; 50 import org.apache.fop.render.java2d.Java2DRenderer; 51 52 73 public class TIFFRenderer extends Java2DRenderer { 74 75 76 public static final String MIME_TYPE = MimeConstants.MIME_TIFF; 77 78 private static final String COMPRESSION_PACKBITS = "PackBits"; 81 private static final String COMPRESSION_CCITT_T6 = "CCITT T.6"; private static final String COMPRESSION_CCITT_T4 = "CCITT T.4"; 87 88 private ImageWriterParams writerParams; 89 90 91 private int bufferedImageType = BufferedImage.TYPE_INT_ARGB; 92 93 private OutputStream outputStream; 94 95 96 public String getMimeType() { 97 return MIME_TYPE; 98 } 99 100 101 public TIFFRenderer() { 102 writerParams = new ImageWriterParams(); 103 writerParams.setCompressionMethod(COMPRESSION_PACKBITS); 104 } 105 106 110 public void setUserAgent(FOUserAgent foUserAgent) { 111 super.setUserAgent(foUserAgent); 112 113 int dpi = Math.round(userAgent.getTargetResolution()); 115 writerParams.setResolution(dpi); 116 } 117 118 123 public void configure(Configuration cfg) throws ConfigurationException { 124 super.configure(cfg); 125 126 String name = cfg.getChild("compression").getValue(COMPRESSION_PACKBITS); 128 if (name.equalsIgnoreCase(COMPRESSION_CCITT_T6)) { 130 bufferedImageType = BufferedImage.TYPE_BYTE_BINARY; 131 } else if (name.equalsIgnoreCase(COMPRESSION_CCITT_T4)) { 132 bufferedImageType = BufferedImage.TYPE_BYTE_BINARY; 133 } else { 134 bufferedImageType = BufferedImage.TYPE_INT_ARGB; 135 } 136 if (!"NONE".equalsIgnoreCase(name)) { 137 writerParams.setCompressionMethod(name); 138 } 139 log.info("TIFF compression set to " + name); 140 } 141 142 143 public void startRenderer(OutputStream outputStream) throws IOException { 144 this.outputStream = outputStream; 145 super.startRenderer(outputStream); 146 } 147 148 149 public void stopRenderer() throws IOException { 150 super.stopRenderer(); 151 log.debug("Starting TIFF encoding ..."); 152 153 Iterator pageImagesItr = new LazyPageImagesIterator(getNumberOfPages(), log); 155 156 ImageWriter writer = ImageWriterRegistry.getInstance().getWriterFor(getMimeType()); 158 if (writer == null) { 159 throw new NullPointerException ("No ImageWriter for " + getMimeType() + " available!"); 160 } 161 if (writer.supportsMultiImageWriter()) { 162 MultiImageWriter multiWriter = writer.createMultiImageWriter(outputStream); 163 try { 164 while (pageImagesItr.hasNext()) { 166 RenderedImage img = (RenderedImage ) pageImagesItr.next(); 167 multiWriter.writeImage(img, writerParams); 168 } 169 } finally { 170 multiWriter.close(); 171 } 172 } else { 173 writer.writeImage((RenderedImage ) pageImagesItr.next(), outputStream, writerParams); 174 if (pageImagesItr.hasNext()) { 175 log.error("Image encoder does not support multiple images. Only the first page" 176 + " has been produced."); 177 } 178 } 179 180 outputStream.flush(); 182 clearViewportList(); 183 log.debug("TIFF encoding done."); 184 } 185 186 187 protected BufferedImage getBufferedImage(int bitmapWidth, int bitmapHeight) { 188 return new BufferedImage (bitmapWidth, bitmapHeight, bufferedImageType); 189 } 190 191 192 private class LazyPageImagesIterator implements Iterator { 193 194 private Log log; 195 196 private int count; 197 198 private int current = 0; 199 200 205 public LazyPageImagesIterator(int c, Log log) { 206 count = c; 207 this.log = log; 208 } 209 210 public boolean hasNext() { 211 return current < count; 212 } 213 214 public Object next() { 215 if (log.isDebugEnabled()) { 216 log.debug("[" + (current + 1) + "]"); 217 } 218 219 BufferedImage pageImage = null; 221 try { 222 pageImage = getPageImage(current++); 223 } catch (FOPException e) { 224 log.error(e); 225 return null; 226 } 227 228 if (COMPRESSION_CCITT_T4.equalsIgnoreCase(writerParams.getCompressionMethod()) 229 || COMPRESSION_CCITT_T6.equalsIgnoreCase(writerParams.getCompressionMethod())) { 230 return pageImage; 231 } else { 232 SinglePixelPackedSampleModel sppsm; 234 sppsm = (SinglePixelPackedSampleModel )pageImage.getSampleModel(); 235 236 int bands = sppsm.getNumBands(); 237 int[] off = new int[bands]; 238 int w = pageImage.getWidth(); 239 int h = pageImage.getHeight(); 240 for (int i = 0; i < bands; i++) { 241 off[i] = i; 242 } 243 SampleModel sm = new PixelInterleavedSampleModel ( 244 DataBuffer.TYPE_BYTE, w, h, bands, w * bands, off); 245 246 RenderedImage rimg = new FormatRed(GraphicsUtil.wrap(pageImage), sm); 247 return rimg; 248 } 249 } 250 251 public void remove() { 252 throw new UnsupportedOperationException ( 253 "Method 'remove' is not supported."); 254 } 255 } 256 } 257 | Popular Tags |