aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/org/apache/fop/render/afp/AFPImageHandlerRenderedImage.java
diff options
context:
space:
mode:
authorJeremias Maerki <jeremias@apache.org>2009-01-11 11:31:24 +0000
committerJeremias Maerki <jeremias@apache.org>2009-01-11 11:31:24 +0000
commit25b82eeedf54b42083102ce9d4c3dad3a472d586 (patch)
tree31e89c33e88d6473d092a706c54a4851e148b112 /src/java/org/apache/fop/render/afp/AFPImageHandlerRenderedImage.java
parent04bb06d6912f18601d1623935ac0d202da372e67 (diff)
downloadxmlgraphics-fop-25b82eeedf54b42083102ce9d4c3dad3a472d586.tar.gz
xmlgraphics-fop-25b82eeedf54b42083102ce9d4c3dad3a472d586.zip
Started new IF implementation for AFP (incomplete, supporting filled rects, text and images). Work in progress!
Moved PTOCA (presentation text) command sequence production into the new "ptoca" package. The PtocaBuilder class allows more flexible command sequence production than if you have to pass in an "info object". git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign@733456 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/java/org/apache/fop/render/afp/AFPImageHandlerRenderedImage.java')
-rw-r--r--src/java/org/apache/fop/render/afp/AFPImageHandlerRenderedImage.java63
1 files changed, 57 insertions, 6 deletions
diff --git a/src/java/org/apache/fop/render/afp/AFPImageHandlerRenderedImage.java b/src/java/org/apache/fop/render/afp/AFPImageHandlerRenderedImage.java
index 28c942a08..a618b9edc 100644
--- a/src/java/org/apache/fop/render/afp/AFPImageHandlerRenderedImage.java
+++ b/src/java/org/apache/fop/render/afp/AFPImageHandlerRenderedImage.java
@@ -19,23 +19,29 @@
package org.apache.fop.render.afp;
+import java.awt.Rectangle;
import java.awt.image.RenderedImage;
import java.io.IOException;
import org.apache.commons.io.output.ByteArrayOutputStream;
-import org.apache.fop.afp.AFPDataObjectInfo;
-import org.apache.fop.afp.AFPImageObjectInfo;
-import org.apache.fop.afp.AFPObjectAreaInfo;
-import org.apache.fop.afp.AFPPaintingState;
+
+import org.apache.xmlgraphics.image.loader.Image;
import org.apache.xmlgraphics.image.loader.ImageFlavor;
import org.apache.xmlgraphics.image.loader.impl.ImageRendered;
import org.apache.xmlgraphics.ps.ImageEncodingHelper;
import org.apache.xmlgraphics.util.MimeConstants;
+import org.apache.fop.afp.AFPDataObjectInfo;
+import org.apache.fop.afp.AFPImageObjectInfo;
+import org.apache.fop.afp.AFPObjectAreaInfo;
+import org.apache.fop.afp.AFPPaintingState;
+import org.apache.fop.render.ImageHandler;
+import org.apache.fop.render.RenderingContext;
+
/**
* PDFImageHandler implementation which handles RenderedImage instances.
*/
-public class AFPImageHandlerRenderedImage extends AFPImageHandler {
+public class AFPImageHandlerRenderedImage extends AFPImageHandler implements ImageHandler {
private static final ImageFlavor[] FLAVORS = new ImageFlavor[] {
ImageFlavor.BUFFERED_IMAGE,
@@ -52,13 +58,22 @@ public class AFPImageHandlerRenderedImage extends AFPImageHandler {
= (AFPRendererContext)rendererImageInfo.getRendererContext();
AFPInfo afpInfo = rendererContext.getInfo();
AFPPaintingState paintingState = afpInfo.getPaintingState();
+ ImageRendered imageRendered = (ImageRendered) rendererImageInfo.img;
+
+ updateDataObjectInfo(imageObjectInfo, paintingState, imageRendered);
+ return imageObjectInfo;
+ }
+
+ private AFPDataObjectInfo updateDataObjectInfo(AFPImageObjectInfo imageObjectInfo,
+ AFPPaintingState paintingState, ImageRendered imageRendered)
+ throws IOException {
+
int resolution = paintingState.getResolution();
imageObjectInfo.setMimeType(MimeConstants.MIME_AFP_IOCA_FS45);
imageObjectInfo.setDataHeightRes(resolution);
imageObjectInfo.setDataWidthRes(resolution);
- ImageRendered imageRendered = (ImageRendered) rendererImageInfo.img;
RenderedImage renderedImage = imageRendered.getRenderedImage();
int dataHeight = renderedImage.getHeight();
@@ -67,6 +82,13 @@ public class AFPImageHandlerRenderedImage extends AFPImageHandler {
int dataWidth = renderedImage.getWidth();
imageObjectInfo.setDataWidth(dataWidth);
+ //TODO This needs to be improved: Buffering whole images in memory is bad.
+ //Images with fewer bits per pixel than the required output format are unnecessarily
+ //increased in size (extreme case: 1-bit images are blown up to 24 bits if color is
+ //enabled). For grayscale output, encoding is even a two-step process which
+ //needs to be streamlined to a single step. The resulting bitmap is then still buffered
+ //in memory. To reduce AFP file size, investigate using a compression scheme.
+ //Currently, all image data is uncompressed.
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageEncodingHelper.encodeRenderedImageAsRGB(renderedImage, baos);
byte[] imageData = baos.toByteArray();
@@ -113,4 +135,33 @@ public class AFPImageHandlerRenderedImage extends AFPImageHandler {
return FLAVORS;
}
+ /** {@inheritDoc} */
+ public void handleImage(RenderingContext context, Image image, Rectangle pos)
+ throws IOException {
+ AFPRenderingContext afpContext = (AFPRenderingContext)context;
+
+ AFPImageObjectInfo imageObjectInfo = (AFPImageObjectInfo)createDataObjectInfo();
+
+ // set resource information
+ setResourceInformation(imageObjectInfo,
+ image.getInfo().getOriginalURI(),
+ afpContext.getForeignAttributes());
+
+ // Positioning
+ imageObjectInfo.setObjectAreaInfo(createObjectAreaInfo(afpContext.getPaintingState(), pos));
+
+ // Image content
+ ImageRendered imageRend = (ImageRendered)image;
+ updateDataObjectInfo(imageObjectInfo, afpContext.getPaintingState(), imageRend);
+
+ // Create image
+ afpContext.getResourceManager().createObject(imageObjectInfo);
+ }
+
+ /** {@inheritDoc} */
+ public boolean isCompatible(RenderingContext targetContext, Image image) {
+ return (image == null || image instanceof ImageRendered)
+ && targetContext instanceof AFPRenderingContext;
+ }
+
}