package org.apache.fop.render.java2d;
import java.awt.geom.AffineTransform;
import java.io.IOException;
import java.util.Map;
import org.w3c.dom.Document;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.batik.bridge.BridgeContext;
import org.apache.batik.bridge.DefaultFontFamilyResolver;
import org.apache.batik.bridge.GVTBuilder;
import org.apache.batik.gvt.GraphicsNode;
import org.apache.fop.image.loader.batik.BatikUtil;
import org.apache.fop.render.AbstractGenericSVGHandler;
import org.apache.fop.render.ImageHandlerUtil;
import org.apache.fop.render.Renderer;
import org.apache.fop.render.RendererContext;
import org.apache.fop.render.RendererContextConstants;
import org.apache.fop.svg.SVGEventProducer;
import org.apache.fop.svg.SVGUserAgent;
public class Java2DSVGHandler extends AbstractGenericSVGHandler
implements Java2DRendererContextConstants {
private static Log log = LogFactory.getLog(Java2DSVGHandler.class);
public Java2DSVGHandler() {
}
public static Java2DInfo getJava2DInfo(RendererContext context) {
Java2DInfo pdfi = new Java2DInfo();
pdfi.state = (Java2DGraphicsState)context.getProperty(JAVA2D_STATE);
pdfi.width = (Integer) context.getProperty(WIDTH);
pdfi.height = (Integer) context.getProperty(HEIGHT);
pdfi.currentXPosition = (Integer) context.getProperty(XPOS);
pdfi.currentYPosition = (Integer) context.getProperty(YPOS);
Map foreign = (Map)context.getProperty(RendererContextConstants.FOREIGN_ATTRIBUTES);
pdfi.paintAsBitmap = ImageHandlerUtil.isConversionModeBitmap(foreign);
return pdfi;
}
public static class Java2DInfo {
public Java2DGraphicsState state;
public int width;
public int height;
public int currentXPosition;
public int currentYPosition;
public boolean paintAsBitmap;
public String toString() {
return "Java2DInfo {"
+ "state = " + state + ", "
+ "width = " + width + ", "
+ "height = " + height + ", "
+ "currentXPosition = " + currentXPosition + ", "
+ "currentYPosition = " + currentYPosition + ", "
+ "paintAsBitmap = " + paintAsBitmap + "}";
}
}
protected void renderSVGDocument(RendererContext context,
Document doc) {
Java2DInfo info = getJava2DInfo(context);
if (log.isDebugEnabled()) {
log.debug("renderSVGDocument(" + context + ", " + doc + ", " + info + ")");
}
if (info.paintAsBitmap) {
try {
super.renderSVGDocument(context, doc);
} catch (IOException ioe) {
SVGEventProducer eventProducer = SVGEventProducer.Provider.get(
context.getUserAgent().getEventBroadcaster());
eventProducer.svgRenderingError(this, ioe, getDocumentURI(doc));
}
return;
}
int x = info.currentXPosition;
int y = info.currentYPosition;
SVGUserAgent ua = new SVGUserAgent(context.getUserAgent(), DefaultFontFamilyResolver.SINGLETON,
new AffineTransform());
BridgeContext ctx = new BridgeContext(ua);
Document clonedDoc = BatikUtil.cloneSVGDocument(doc);
GraphicsNode root;
try {
GVTBuilder builder = new GVTBuilder();
root = builder.build(ctx, clonedDoc);
} catch (Exception e) {
SVGEventProducer eventProducer = SVGEventProducer.Provider.get(
context.getUserAgent().getEventBroadcaster());
eventProducer.svgNotBuilt(this, e, getDocumentURI(doc));
return;
}
float iw = (float) ctx.getDocumentSize().getWidth() * 1000f;
float ih = (float) ctx.getDocumentSize().getHeight() * 1000f;
float w = info.width;
float h = info.height;
AffineTransform origTransform = info.state.getGraph().getTransform();
info.state.getGraph().translate(x / 1000f, y / 1000f);
AffineTransform at = AffineTransform.getScaleInstance(w / iw, h / ih);
if (!at.isIdentity()) {
info.state.getGraph().transform(at);
}
try {
root.paint(info.state.getGraph());
} catch (Exception e) {
SVGEventProducer eventProducer = SVGEventProducer.Provider.get(
context.getUserAgent().getEventBroadcaster());
eventProducer.svgRenderingError(this, e, getDocumentURI(doc));
}
info.state.getGraph().setTransform(origTransform);
}
public boolean supportsRenderer(Renderer renderer) {
return (renderer instanceof Java2DRenderer);
}
}