You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by je...@apache.org on 2009/02/22 13:40:55 UTC
svn commit: r746664 [4/8] - in /xmlgraphics/fop/trunk: ./
examples/embedding/java/embedding/atxml/
examples/embedding/java/embedding/intermediate/
examples/embedding/xml/xslt/ examples/plan/src/org/apache/fop/plan/ lib/
src/documentation/content/xdocs/...
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/type1/Type1FontLoader.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/type1/Type1FontLoader.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/type1/Type1FontLoader.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/fonts/type1/Type1FontLoader.java Sun Feb 22 12:40:44 2009
@@ -45,12 +45,13 @@
* Constructs a new Type 1 font loader.
* @param fontFileURI the URI to the PFB file of a Type 1 font
* @param embedded indicates whether the font is embedded or referenced
+ * @param useKerning indicates whether to load kerning information if available
* @param resolver the font resolver used to resolve URIs
* @throws IOException In case of an I/O error
*/
- public Type1FontLoader(String fontFileURI, boolean embedded, FontResolver resolver)
- throws IOException {
- super(fontFileURI, embedded, resolver);
+ public Type1FontLoader(String fontFileURI, boolean embedded, boolean useKerning,
+ FontResolver resolver) throws IOException {
+ super(fontFileURI, embedded, useKerning, resolver);
}
private String getPFMURI(String pfbURI) {
@@ -322,7 +323,9 @@
singleFont.setWidth(chm.getCharCode(), (int)Math.round(chm.getWidthX()));
}
}
- returnFont.replaceKerningMap(afm.createXKerningMapEncoded());
+ if (useKerning) {
+ returnFont.replaceKerningMap(afm.createXKerningMapEncoded());
+ }
} else {
returnFont.setFlags(pfm.getFlags());
returnFont.setFirstChar(pfm.getFirstChar());
@@ -330,7 +333,9 @@
for (short i = pfm.getFirstChar(); i <= pfm.getLastChar(); i++) {
singleFont.setWidth(i, pfm.getCharWidth(i));
}
- returnFont.replaceKerningMap(pfm.getKerning());
+ if (useKerning) {
+ returnFont.replaceKerningMap(pfm.getKerning());
+ }
}
}
Propchange: xmlgraphics/fop/trunk/src/java/org/apache/fop/image/loader/batik/Graphics2DImagePainterImpl.java
('svn:mergeinfo' removed)
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/image/loader/batik/PreloaderSVG.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/image/loader/batik/PreloaderSVG.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/image/loader/batik/PreloaderSVG.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/image/loader/batik/PreloaderSVG.java Sun Feb 22 12:40:44 2009
@@ -34,7 +34,6 @@
import org.apache.batik.bridge.UnitProcessor;
import org.apache.batik.bridge.UserAgent;
import org.apache.batik.dom.svg.SAXSVGDocumentFactory;
-import org.apache.batik.dom.svg.SVGDOMImplementation;
import org.apache.batik.dom.svg.SVGOMDocument;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -198,7 +197,7 @@
//The whole image had to be loaded for this, so keep it
ImageXMLDOM xmlImage = new ImageXMLDOM(info,
- doc, SVGDOMImplementation.SVG_NAMESPACE_URI);
+ doc, BatikImageFlavors.SVG_DOM);
info.getCustomObjects().put(ImageInfo.ORIGINAL_IMAGE, xmlImage);
return info;
}
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFNumber.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFNumber.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFNumber.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFNumber.java Sun Feb 22 12:40:44 2009
@@ -19,13 +19,11 @@
package org.apache.fop.pdf;
-import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
-import java.util.Locale;
+import org.apache.fop.util.DecimalFormatCache;
/**
* This class represents a simple number object. It also contains contains some
- * utility methods for outputing numbers to PDF.
+ * utility methods for outputting numbers to PDF.
*/
public class PDFNumber extends PDFObject {
@@ -67,33 +65,6 @@
return doubleOut(doubleDown, 6);
}
- private static final String BASE_FORMAT = "0.################";
-
- private static class DecimalFormatThreadLocal extends ThreadLocal {
-
- private int dec;
-
- public DecimalFormatThreadLocal(int dec) {
- this.dec = dec;
- }
-
- protected synchronized Object initialValue() {
- String s = "0";
- if (dec > 0) {
- s = BASE_FORMAT.substring(0, dec + 2);
- }
- DecimalFormat df = new DecimalFormat(s, new DecimalFormatSymbols(Locale.US));
- return df;
- }
- };
- //DecimalFormat is not thread-safe!
- private static final ThreadLocal[] DECIMAL_FORMAT_CACHE = new DecimalFormatThreadLocal[17];
- static {
- for (int i = 0, c = DECIMAL_FORMAT_CACHE.length; i < c; i++) {
- DECIMAL_FORMAT_CACHE[i] = new DecimalFormatThreadLocal(i);
- }
- }
-
/**
* Output a double value to a string suitable for PDF.
* In this method it is possible to set the maximum
@@ -104,12 +75,7 @@
* @return the value as a string
*/
public static String doubleOut(double doubleDown, int dec) {
- if (dec < 0 || dec >= DECIMAL_FORMAT_CACHE.length) {
- throw new IllegalArgumentException("Parameter dec must be between 1 and "
- + (DECIMAL_FORMAT_CACHE.length + 1));
- }
- DecimalFormat df = (DecimalFormat)DECIMAL_FORMAT_CACHE[dec].get();
- return df.format(doubleDown);
+ return DecimalFormatCache.getDecimalFormat(dec).format(doubleDown);
}
/** {@inheritDoc} */
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFPaintingState.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFPaintingState.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFPaintingState.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFPaintingState.java Sun Feb 22 12:40:44 2009
@@ -62,14 +62,15 @@
* @return true if the new paint changes the current paint
*/
public boolean setPaint(Paint p) {
- Paint paint = ((PDFData)getData()).paint;
+ PDFData data = getPDFData();
+ Paint paint = data.paint;
if (paint == null) {
if (p != null) {
- ((PDFData)getData()).paint = p;
+ data.paint = p;
return true;
}
} else if (!paint.equals(p)) {
- ((PDFData)getData()).paint = p;
+ data.paint = p;
return true;
}
return false;
@@ -88,7 +89,7 @@
* @return true if the clip will change the current clip.
*/
public boolean checkClip(Shape cl) {
- Shape clip = ((PDFData)getData()).clip;
+ Shape clip = getPDFData().clip;
if (clip == null) {
if (cl != null) {
return true;
@@ -108,17 +109,40 @@
* @param cl the new clip in the current state
*/
public void setClip(Shape cl) {
- Shape clip = ((PDFData)getData()).clip;
+ PDFData data = getPDFData();
+ Shape clip = data.clip;
if (clip != null) {
Area newClip = new Area(clip);
newClip.intersect(new Area(cl));
- ((PDFData)getData()).clip = new GeneralPath(newClip);
+ data.clip = new GeneralPath(newClip);
} else {
- ((PDFData)getData()).clip = cl;
+ data.clip = cl;
}
}
/**
+ * Sets the character spacing (Tc).
+ * @param value the new value
+ * @return true if the value was changed with respect to the previous value
+ */
+ public boolean setCharacterSpacing(float value) {
+ PDFData data = getPDFData();
+ if (value != data.characterSpacing) {
+ data.characterSpacing = value;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Returns the current character spacing (Tc) value.
+ * @return the Tc value
+ */
+ public float getCharacterSpacing() {
+ return getPDFData().characterSpacing;
+ }
+
+ /**
* Get the current stack level.
*
* @return the current stack level
@@ -149,8 +173,8 @@
newState.addValues(state);
}
}
- if (((PDFData)getData()).gstate != null) {
- newState.addValues(((PDFData)getData()).gstate);
+ if (getPDFData().gstate != null) {
+ newState.addValues(getPDFData().gstate);
}
return newState;
}
@@ -177,32 +201,38 @@
getStateStack().add(copy);
}
+ private PDFData getPDFData() {
+ return (PDFData)getData();
+ }
+
private class PDFData extends org.apache.fop.util.AbstractPaintingState.AbstractData {
private static final long serialVersionUID = 3527950647293177764L;
private Paint paint = null;
private Paint backPaint = null;
- private int lineCap = 0;
- private int lineJoin = 0;
- private float miterLimit = 0;
- private boolean text = false;
- private int dashOffset = 0;
+ //private int lineCap = 0; //Disabled the ones that are not used, yet
+ //private int lineJoin = 0;
+ //private float miterLimit = 0;
+ //private int dashOffset = 0;
private Shape clip = null;
private PDFGState gstate = null;
+ //text state
+ private float characterSpacing = 0f;
+
/** {@inheritDoc} */
public Object clone() {
PDFData obj = (PDFData)super.clone();
obj.paint = this.paint;
obj.backPaint = this.paint;
- obj.lineCap = this.lineCap;
- obj.lineJoin = this.lineJoin;
- obj.miterLimit = this.miterLimit;
- obj.text = this.text;
- obj.dashOffset = this.dashOffset;
+ //obj.lineCap = this.lineCap;
+ //obj.lineJoin = this.lineJoin;
+ //obj.miterLimit = this.miterLimit;
+ //obj.dashOffset = this.dashOffset;
obj.clip = this.clip;
obj.gstate = this.gstate;
+ obj.characterSpacing = this.characterSpacing;
return obj;
}
@@ -211,10 +241,9 @@
return super.toString()
+ ", paint=" + paint
+ ", backPaint=" + backPaint
- + ", lineCap=" + lineCap
- + ", miterLimit=" + miterLimit
- + ", text=" + text
- + ", dashOffset=" + dashOffset
+ //+ ", lineCap=" + lineCap
+ //+ ", miterLimit=" + miterLimit
+ //+ ", dashOffset=" + dashOffset
+ ", clip=" + clip
+ ", gstate=" + gstate;
}
Propchange: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFPaintingState.java
('svn:mergeinfo' removed)
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFReference.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFReference.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFReference.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFReference.java Sun Feb 22 12:40:44 2009
@@ -33,7 +33,8 @@
*/
public class PDFReference implements PDFWritable {
- private String indirectReference;
+ private int objectNumber;
+ private int generation;
private Reference objReference;
@@ -42,7 +43,8 @@
* @param obj the object to be referenced
*/
public PDFReference(PDFObject obj) {
- this.indirectReference = obj.referencePDF();
+ this.objectNumber = obj.getObjectNumber();
+ this.generation = obj.getGeneration();
this.objReference = new SoftReference(obj);
}
@@ -54,7 +56,11 @@
if (ref == null) {
throw new NullPointerException("ref must not be null");
}
- this.indirectReference = ref;
+ String[] parts = ref.split(" ");
+ assert parts.length == 3;
+ this.objectNumber = Integer.parseInt(parts[0]);
+ this.generation = Integer.parseInt(parts[1]);
+ assert "R".equals(parts[2]);
}
/**
@@ -73,9 +79,25 @@
}
}
+ /**
+ * Returns the object number.
+ * @return the object number
+ */
+ public int getObjectNumber() {
+ return this.objectNumber;
+ }
+
+ /**
+ * Returns the generation.
+ * @return the generation
+ */
+ public int getGeneration() {
+ return this.generation;
+ }
+
/** {@inheritDoc} */
public String toString() {
- return this.indirectReference;
+ return getObjectNumber() + " " + getGeneration() + " R";
}
/** {@inheritDoc} */
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFTextUtil.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFTextUtil.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFTextUtil.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFTextUtil.java Sun Feb 22 12:40:44 2009
@@ -270,7 +270,15 @@
* @param adjust the glyph adjust value in thousands of text unit space.
*/
public void adjustGlyphTJ(double adjust) {
- bufTJ.append(endText).append(" ");
+ if (bufTJ == null) {
+ bufTJ = new StringBuffer();
+ }
+ if (bufTJ.length() > 0) {
+ bufTJ.append(endText).append(" ");
+ }
+ if (bufTJ.length() == 0) {
+ bufTJ.append("[");
+ }
bufTJ.append(PDFNumber.doubleOut(adjust, DEC - 4));
bufTJ.append(" ");
bufTJ.append(startText);
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFUri.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFUri.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFUri.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/pdf/PDFUri.java Sun Feb 22 12:40:44 2009
@@ -41,14 +41,22 @@
* @return the action to place next to /A within a Link
*/
public String getAction() {
+ if (hasObjectNumber()) {
+ return referencePDF();
+ } else {
+ return getDictString();
+ }
+ }
+
+ private String getDictString() {
return "<< /URI (" + uri + ")\n/S /URI >>";
}
- /**
- * {@inheritDoc}
- */
+ /** {@inheritDoc} */
public String toPDFString() {
- throw new UnsupportedOperationException("This method should not be called");
+ //TODO Convert this class into a dictionary
+ return getObjectID() + getDictString() + "\nendobj\n";
+ //throw new UnsupportedOperationException("This method should not be called");
}
}
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractGenericSVGHandler.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractGenericSVGHandler.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractGenericSVGHandler.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractGenericSVGHandler.java Sun Feb 22 12:40:44 2009
@@ -33,11 +33,9 @@
import org.apache.batik.gvt.GraphicsNode;
import org.apache.xmlgraphics.java2d.Graphics2DImagePainter;
-import org.apache.xmlgraphics.util.QName;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.events.EventBroadcaster;
-import org.apache.fop.fo.extensions.ExtensionElementMapping;
import org.apache.fop.image.loader.batik.BatikUtil;
import org.apache.fop.image.loader.batik.Graphics2DImagePainterImpl;
import org.apache.fop.render.RendererContext.RendererContextWrapper;
@@ -52,13 +50,6 @@
*/
public abstract class AbstractGenericSVGHandler implements XMLHandler, RendererContextConstants {
- /** Qualified name for the "conversion-mode" extension attribute. */
- protected static final QName CONVERSION_MODE = new QName(
- ExtensionElementMapping.URI, null, "conversion-mode");
-
- /** "bitmap" value for the "conversion-mode" extension attribute. */
- protected static final String BITMAP = "bitmap";
-
/** {@inheritDoc} */
public void handleXML(RendererContext context,
Document doc, String ns) throws Exception {
@@ -82,9 +73,9 @@
}
/**
- * Builds the GVT root
+ * Builds the GVT root.
*
- * @param rendererContext the renderer context
+ * @param userAgent the user agent
* @param ctx the batik bridge context
* @param doc the document
* @return a built GVT root tree
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractImageHandlerRegistry.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractImageHandlerRegistry.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractImageHandlerRegistry.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractImageHandlerRegistry.java Sun Feb 22 12:40:44 2009
@@ -27,6 +27,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
import org.apache.xmlgraphics.image.loader.Image;
import org.apache.xmlgraphics.image.loader.ImageFlavor;
import org.apache.xmlgraphics.util.Service;
@@ -43,8 +44,8 @@
private static final Comparator HANDLER_COMPARATOR = new Comparator() {
public int compare(Object o1, Object o2) {
- ImageHandler h1 = (ImageHandler)o1;
- ImageHandler h2 = (ImageHandler)o2;
+ ImageHandlerBase h1 = (ImageHandlerBase)o1;
+ ImageHandlerBase h2 = (ImageHandlerBase)o2;
return h1.getPriority() - h2.getPriority();
}
};
@@ -76,8 +77,8 @@
*/
public void addHandler(String classname) {
try {
- ImageHandler handlerInstance
- = (ImageHandler)Class.forName(classname).newInstance();
+ ImageHandlerBase handlerInstance
+ = (ImageHandlerBase)Class.forName(classname).newInstance();
addHandler(handlerInstance);
} catch (ClassNotFoundException e) {
throw new IllegalArgumentException("Could not find "
@@ -99,13 +100,13 @@
* Add an image handler. The handler itself is inspected to find out what it supports.
* @param handler the ImageHandler instance
*/
- public synchronized void addHandler(ImageHandler handler) {
+ public synchronized void addHandler(ImageHandlerBase handler) {
this.handlers.put(handler.getSupportedImageClass(), handler);
//Sorted insert
ListIterator iter = this.handlerList.listIterator();
while (iter.hasNext()) {
- ImageHandler h = (ImageHandler)iter.next();
+ ImageHandlerBase h = (ImageHandlerBase)iter.next();
if (getHandlerComparator().compare(handler, h) < 0) {
iter.previous();
break;
@@ -121,7 +122,7 @@
* @param img the Image to be handled
* @return the ImageHandler responsible for handling the image or null if none is available
*/
- public ImageHandler getHandler(Image img) {
+ public ImageHandlerBase getHandler(Image img) {
return getHandler(img.getClass());
}
@@ -131,11 +132,11 @@
* @param imageClass the Image subclass for which to get a handler
* @return the ImageHandler responsible for handling the image or null if none is available
*/
- public synchronized ImageHandler getHandler(Class imageClass) {
- ImageHandler handler = null;
+ public synchronized ImageHandlerBase getHandler(Class imageClass) {
+ ImageHandlerBase handler = null;
Class cl = imageClass;
while (cl != null) {
- handler = (ImageHandler)handlers.get(cl);
+ handler = (ImageHandlerBase)handlers.get(cl);
if (handler != null) {
break;
}
@@ -154,7 +155,7 @@
List flavors = new java.util.ArrayList();
Iterator iter = this.handlerList.iterator();
while (iter.hasNext()) {
- ImageFlavor[] f = ((ImageHandler)iter.next()).getSupportedImageFlavors();
+ ImageFlavor[] f = ((ImageHandlerBase)iter.next()).getSupportedImageFlavors();
for (int i = 0; i < f.length; i++) {
flavors.add(f[i]);
}
@@ -175,7 +176,7 @@
Iterator providers = Service.providers(imageHandlerClass);
if (providers != null) {
while (providers.hasNext()) {
- ImageHandler handler = (ImageHandler)providers.next();
+ ImageHandlerBase handler = (ImageHandlerBase)providers.next();
try {
if (log.isDebugEnabled()) {
log.debug("Dynamically adding ImageHandler: "
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractPathOrientedRenderer.java Sun Feb 22 12:40:44 2009
@@ -475,7 +475,8 @@
}
}
- private static final QName FOX_TRANSFORM
+ /** Constant for the fox:transform extension attribute */
+ protected static final QName FOX_TRANSFORM
= new QName(ExtensionElementMapping.URI, "fox:transform");
/** {@inheritDoc} */
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractRenderer.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractRenderer.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractRenderer.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractRenderer.java Sun Feb 22 12:40:44 2009
@@ -21,6 +21,7 @@
// Java
import java.awt.Rectangle;
+import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.io.IOException;
import java.io.OutputStream;
@@ -111,7 +112,7 @@
private Set warnedXMLHandlers;
/** {@inheritDoc} */
- public abstract void setupFontInfo(FontInfo fontInfo);
+ public abstract void setupFontInfo(FontInfo fontInfo) throws FOPException;
/** {@inheritDoc} */
public void setUserAgent(FOUserAgent agent) {
@@ -833,4 +834,34 @@
public String getMimeType() {
return null;
}
+
+ /**
+ * Converts a millipoint-based transformation matrix to points.
+ * @param at a millipoint-based transformation matrix
+ * @return a point-based transformation matrix
+ */
+ protected AffineTransform mptToPt(AffineTransform at) {
+ double[] matrix = new double[6];
+ at.getMatrix(matrix);
+ //Convert to points
+ matrix[4] = matrix[4] / 1000;
+ matrix[5] = matrix[5] / 1000;
+ return new AffineTransform(matrix);
+ }
+
+ /**
+ * Converts a point-based transformation matrix to millipoints.
+ * @param at a point-based transformation matrix
+ * @return a millipoint-based transformation matrix
+ */
+ protected AffineTransform ptToMpt(AffineTransform at) {
+ double[] matrix = new double[6];
+ at.getMatrix(matrix);
+ //Convert to millipoints
+ //Math.round() because things like this can happen: 65.6 * 1000 = 65.599999999999999
+ //which is bad for testing
+ matrix[4] = Math.round(matrix[4] * 1000);
+ matrix[5] = Math.round(matrix[5] * 1000);
+ return new AffineTransform(matrix);
+ }
}
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractRendererConfigurator.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractRendererConfigurator.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractRendererConfigurator.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/AbstractRendererConfigurator.java Sun Feb 22 12:40:44 2009
@@ -23,6 +23,7 @@
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
import org.apache.fop.apps.FOUserAgent;
/**
@@ -68,7 +69,7 @@
* @param mimeType the MIME type of the renderer
* @return the requested configuration subtree, null if there's no configuration
*/
- private Configuration getRendererConfig(String mimeType) {
+ protected Configuration getRendererConfig(String mimeType) {
Configuration cfg = userAgent.getFactory().getUserConfig();
if (cfg == null) {
if (log.isDebugEnabled()) {
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/Graphics2DImagePainter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/Graphics2DImagePainter.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/Graphics2DImagePainter.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/Graphics2DImagePainter.java Sun Feb 22 12:40:44 2009
@@ -27,4 +27,4 @@
public interface Graphics2DImagePainter
extends org.apache.xmlgraphics.java2d.Graphics2DImagePainter {
-}
\ No newline at end of file
+}
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/ImageAdapter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/ImageAdapter.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/ImageAdapter.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/ImageAdapter.java Sun Feb 22 12:40:44 2009
@@ -34,10 +34,10 @@
* Paints an image at the given position.
* @param image the image which will be painted
* @param context the renderer context for the current renderer
- * @param x X position of the image
- * @param y Y position of the image
- * @param width width of the image
- * @param height height of the image
+ * @param x X position of the image (in millipoints)
+ * @param y Y position of the image (in millipoints)
+ * @param width width of the image (in millipoints)
+ * @param height height of the image (in millipoints)
* @throws IOException In case of an I/O error while writing the output format
*/
void paintImage(RenderedImage image,
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/PrintRenderer.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/PrintRenderer.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/PrintRenderer.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/PrintRenderer.java Sun Feb 22 12:40:44 2009
@@ -24,6 +24,9 @@
import java.util.List;
import java.util.Map;
+import org.w3c.dom.Document;
+
+import org.apache.fop.apps.FOPException;
import org.apache.fop.area.Area;
import org.apache.fop.area.Trait;
import org.apache.fop.fonts.CustomFontCollection;
@@ -34,7 +37,6 @@
import org.apache.fop.fonts.FontResolver;
import org.apache.fop.fonts.FontTriplet;
import org.apache.fop.fonts.base14.Base14FontCollection;
-import org.w3c.dom.Document;
/** Abstract base class of "Print" type renderers. */
public abstract class PrintRenderer extends AbstractRenderer {
@@ -74,12 +76,8 @@
return this.embedFontInfoList;
}
- /**
- * Set up the font info
- *
- * @param inFontInfo font info to set up
- */
- public void setupFontInfo(FontInfo inFontInfo) {
+ /** {@inheritDoc} */
+ public void setupFontInfo(FontInfo inFontInfo) throws FOPException {
this.fontInfo = inFontInfo;
FontManager fontManager = userAgent.getFactory().getFontManager();
FontCollection[] fontCollections = new FontCollection[] {
@@ -96,7 +94,13 @@
*/
protected String getInternalFontNameForArea(Area area) {
FontTriplet triplet = (FontTriplet)area.getTrait(Trait.FONT);
- return fontInfo.getInternalFontKey(triplet);
+ String key = fontInfo.getInternalFontKey(triplet);
+ if (key == null) {
+ //Find a default fallback font as last resort
+ triplet = new FontTriplet("any", Font.STYLE_NORMAL, Font.WEIGHT_NORMAL);
+ key = fontInfo.getInternalFontKey(triplet);
+ }
+ return key;
}
/**
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/PrintRendererConfigurator.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/PrintRendererConfigurator.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/PrintRendererConfigurator.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/PrintRendererConfigurator.java Sun Feb 22 12:40:44 2009
@@ -41,9 +41,11 @@
import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.FopFactory;
+import org.apache.fop.fonts.CustomFontCollection;
import org.apache.fop.fonts.EmbedFontInfo;
import org.apache.fop.fonts.EncodingMode;
import org.apache.fop.fonts.FontCache;
+import org.apache.fop.fonts.FontCollection;
import org.apache.fop.fonts.FontEventAdapter;
import org.apache.fop.fonts.FontEventListener;
import org.apache.fop.fonts.FontInfo;
@@ -53,13 +55,16 @@
import org.apache.fop.fonts.FontUtil;
import org.apache.fop.fonts.autodetect.FontFileFinder;
import org.apache.fop.fonts.autodetect.FontInfoFinder;
+import org.apache.fop.fonts.base14.Base14FontCollection;
+import org.apache.fop.render.intermediate.IFDocumentHandler;
+import org.apache.fop.render.intermediate.IFDocumentHandlerConfigurator;
import org.apache.fop.util.LogUtil;
/**
* Base Print renderer configurator (mostly handles font configuration)
*/
public class PrintRendererConfigurator extends AbstractRendererConfigurator
- implements RendererConfigurator {
+ implements RendererConfigurator, IFDocumentHandlerConfigurator {
/** logger instance */
protected static Log log = LogFactory.getLog(PrintRendererConfigurator.class);
@@ -87,6 +92,23 @@
PrintRenderer printRenderer = (PrintRenderer)renderer;
FontResolver fontResolver = printRenderer.getFontResolver();
+
+ FontEventListener listener = new FontEventAdapter(
+ renderer.getUserAgent().getEventBroadcaster());
+ List embedFontInfoList = buildFontList(cfg, fontResolver, listener);
+ printRenderer.addFontList(embedFontInfoList);
+ }
+
+ /**
+ * Builds the font list from configuration.
+ * @param cfg the configuration object
+ * @param fontResolver a font resolver
+ * @param listener the font event listener
+ * @return the list of {@code EmbedFontInfo} objects
+ * @throws FOPException if an error occurs while processing the configuration
+ */
+ protected List buildFontList(Configuration cfg, FontResolver fontResolver,
+ FontEventListener listener) throws FOPException {
FopFactory factory = userAgent.getFactory();
FontManager fontManager = factory.getFontManager();
if (fontResolver == null) {
@@ -97,15 +119,13 @@
boolean strict = factory.validateUserConfigStrictly();
FontCache fontCache = fontManager.getFontCache();
- FontEventListener listener = new FontEventAdapter(
- renderer.getUserAgent().getEventBroadcaster());
List/*<EmbedFontInfo>*/ embedFontInfoList = buildFontListFromConfiguration(cfg,
fontResolver, strict, fontManager, listener);
if (fontCache != null && fontCache.hasChanged()) {
fontCache.save();
}
- printRenderer.addFontList(embedFontInfoList);
+ return embedFontInfoList;
}
/**
@@ -437,4 +457,33 @@
return embedFontInfo;
}
+ // ---=== IFDocumentHandler configuration ===---
+
+ /** {@inheritDoc} */
+ public void configure(IFDocumentHandler documentHandler) throws FOPException {
+ //nop
+ }
+
+ /** {@inheritDoc} */
+ public void setupFontInfo(IFDocumentHandler documentHandler, FontInfo fontInfo)
+ throws FOPException {
+ FontManager fontManager = userAgent.getFactory().getFontManager();
+ List fontCollections = new java.util.ArrayList();
+ fontCollections.add(new Base14FontCollection(fontManager.isBase14KerningEnabled()));
+
+ Configuration cfg = super.getRendererConfig(documentHandler.getMimeType());
+ if (cfg != null) {
+ FontResolver fontResolver = new DefaultFontResolver(userAgent);
+ FontEventListener listener = new FontEventAdapter(
+ userAgent.getEventBroadcaster());
+ List fontList = buildFontList(cfg, fontResolver, listener);
+ fontCollections.add(new CustomFontCollection(fontResolver, fontList));
+ }
+
+ fontManager.setup(fontInfo,
+ (FontCollection[])fontCollections.toArray(
+ new FontCollection[fontCollections.size()]));
+ documentHandler.setFontInfo(fontInfo);
+ }
+
}
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/Renderer.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/Renderer.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/Renderer.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/Renderer.java Sun Feb 22 12:40:44 2009
@@ -98,8 +98,9 @@
* Set up the given FontInfo.
*
* @param fontInfo The font information
+ * @throws FOPException if an error occurs while setting up the font info object
*/
- void setupFontInfo(FontInfo fontInfo);
+ void setupFontInfo(FontInfo fontInfo) throws FOPException;
/**
* Reports if out of order rendering is supported. <p>
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/RendererContext.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/RendererContext.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/RendererContext.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/RendererContext.java Sun Feb 22 12:40:44 2009
@@ -24,8 +24,6 @@
import java.util.Map;
import org.apache.fop.apps.FOUserAgent;
-import org.apache.fop.fo.extensions.ExtensionElementMapping;
-import org.apache.xmlgraphics.util.QName;
/**
* The Render Context for external handlers. This provides a rendering context
@@ -33,12 +31,6 @@
* render target.
*/
public class RendererContext {
- /** conversion-mode extension attribute */
- protected static final QName CONVERSION_MODE = new QName(
- ExtensionElementMapping.URI, null, "conversion-mode");
-
- /** "bitmap" value for the "conversion-mode" extension attribute. */
- protected static final String BITMAP = "bitmap";
private final String mime;
private final AbstractRenderer renderer;
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/RendererFactory.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/RendererFactory.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/RendererFactory.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/RendererFactory.java Sun Feb 22 12:40:44 2009
@@ -34,6 +34,10 @@
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.area.AreaTreeHandler;
import org.apache.fop.fo.FOEventHandler;
+import org.apache.fop.render.intermediate.AbstractIFDocumentHandlerMaker;
+import org.apache.fop.render.intermediate.IFDocumentHandler;
+import org.apache.fop.render.intermediate.IFDocumentHandlerConfigurator;
+import org.apache.fop.render.intermediate.IFRenderer;
/**
* Factory for FOEventHandlers and Renderers.
@@ -45,7 +49,7 @@
private Map rendererMakerMapping = new java.util.HashMap();
private Map eventHandlerMakerMapping = new java.util.HashMap();
-
+ private Map documentHandlerMakerMapping = new java.util.HashMap();
/**
* Main constructor.
@@ -53,6 +57,7 @@
public RendererFactory() {
discoverRenderers();
discoverFOEventHandlers();
+ discoverDocumentHandlers();
}
/**
@@ -90,6 +95,23 @@
}
/**
+ * Add a new document handler maker. If another maker has already been registered for a
+ * particular MIME type, this call overwrites the existing one.
+ * @param maker the intermediate format document handler maker
+ */
+ public void addDocumentHandlerMaker(AbstractIFDocumentHandlerMaker maker) {
+ String[] mimes = maker.getSupportedMimeTypes();
+ for (int i = 0; i < mimes.length; i++) {
+ //This overrides any renderer previously set for a MIME type
+ if (documentHandlerMakerMapping.get(mimes[i]) != null) {
+ log.trace("Overriding document handler for " + mimes[i]
+ + " with " + maker.getClass().getName());
+ }
+ documentHandlerMakerMapping.put(mimes[i], maker);
+ }
+ }
+
+ /**
* Add a new RendererMaker. If another maker has already been registered for a
* particular MIME type, this call overwrites the existing one.
* @param className the fully qualified class name of the RendererMaker
@@ -142,6 +164,32 @@
}
/**
+ * Add a new document handler maker. If another maker has already been registered for a
+ * particular MIME type, this call overwrites the existing one.
+ * @param className the fully qualified class name of the document handler maker
+ */
+ public void addDocumentHandlerMaker(String className) {
+ try {
+ AbstractIFDocumentHandlerMaker makerInstance
+ = (AbstractIFDocumentHandlerMaker)Class.forName(className).newInstance();
+ addDocumentHandlerMaker(makerInstance);
+ } catch (ClassNotFoundException e) {
+ throw new IllegalArgumentException("Could not find "
+ + className);
+ } catch (InstantiationException e) {
+ throw new IllegalArgumentException("Could not instantiate "
+ + className);
+ } catch (IllegalAccessException e) {
+ throw new IllegalArgumentException("Could not access "
+ + className);
+ } catch (ClassCastException e) {
+ throw new IllegalArgumentException(className
+ + " is not an "
+ + AbstractIFDocumentHandlerMaker.class.getName());
+ }
+ }
+
+ /**
* Returns a RendererMaker which handles the given MIME type.
* @param mime the requested output format
* @return the requested RendererMaker or null if none is available
@@ -164,6 +212,17 @@
}
/**
+ * Returns a RendererMaker which handles the given MIME type.
+ * @param mime the requested output format
+ * @return the requested RendererMaker or null if none is available
+ */
+ public AbstractIFDocumentHandlerMaker getDocumentHandlerMaker(String mime) {
+ AbstractIFDocumentHandlerMaker maker
+ = (AbstractIFDocumentHandlerMaker)documentHandlerMakerMapping.get(mime);
+ return maker;
+ }
+
+ /**
* Creates a Renderer object based on render-type desired
* @param userAgent the user agent for access to configuration
* @param outputFormat the MIME type of the output format to use (ex. "application/pdf").
@@ -172,24 +231,41 @@
*/
public Renderer createRenderer(FOUserAgent userAgent, String outputFormat)
throws FOPException {
- if (userAgent.getRendererOverride() != null) {
+ if (userAgent.getDocumentHandlerOverride() != null) {
+ return createRendererForDocumentHandler(userAgent.getDocumentHandlerOverride());
+ } else if (userAgent.getRendererOverride() != null) {
return userAgent.getRendererOverride();
} else {
AbstractRendererMaker maker = getRendererMaker(outputFormat);
- if (maker == null) {
- throw new UnsupportedOperationException(
- "No renderer for the requested format available: " + outputFormat);
- }
- Renderer rend = maker.makeRenderer(userAgent);
- rend.setUserAgent(userAgent);
- RendererConfigurator configurator = maker.getConfigurator(userAgent);
- if (configurator != null) {
- configurator.configure(rend);
+ if (maker != null) {
+ Renderer rend = maker.makeRenderer(userAgent);
+ rend.setUserAgent(userAgent);
+ RendererConfigurator configurator = maker.getConfigurator(userAgent);
+ if (configurator != null) {
+ configurator.configure(rend);
+ }
+ return rend;
+ } else {
+ AbstractIFDocumentHandlerMaker documentHandlerMaker
+ = getDocumentHandlerMaker(outputFormat);
+ if (documentHandlerMaker != null) {
+ IFDocumentHandler documentHandler = createDocumentHandler(
+ userAgent, outputFormat);
+ return createRendererForDocumentHandler(documentHandler);
+ } else {
+ throw new UnsupportedOperationException(
+ "No renderer for the requested format available: " + outputFormat);
+ }
}
- return rend;
}
}
+ private Renderer createRendererForDocumentHandler(IFDocumentHandler documentHandler) {
+ IFRenderer rend = new IFRenderer();
+ rend.setUserAgent(documentHandler.getContext().getUserAgent());
+ rend.setDocumentHandler(documentHandler);
+ return rend;
+ }
/**
* Creates FOEventHandler instances based on the desired output.
@@ -206,30 +282,65 @@
return userAgent.getFOEventHandlerOverride();
} else {
AbstractFOEventHandlerMaker maker = getFOEventHandlerMaker(outputFormat);
- if (maker == null) {
+ if (maker != null) {
+ return maker.makeFOEventHandler(userAgent, out);
+ } else {
AbstractRendererMaker rendMaker = getRendererMaker(outputFormat);
- if (rendMaker == null && userAgent.getRendererOverride() == null) {
- throw new UnsupportedOperationException(
- "Don't know how to handle \"" + outputFormat + "\" as an output format."
- + " Neither an FOEventHandler, nor a Renderer could be found"
- + " for this output format.");
+ AbstractIFDocumentHandlerMaker documentHandlerMaker = null;
+ boolean outputStreamMissing = (userAgent.getRendererOverride() == null)
+ && (userAgent.getDocumentHandlerOverride() == null);
+ if (rendMaker == null) {
+ documentHandlerMaker = getDocumentHandlerMaker(outputFormat);
+ if (documentHandlerMaker != null) {
+ outputStreamMissing &= (out == null)
+ && (documentHandlerMaker.needsOutputStream());
+ }
} else {
- if (out == null
- && userAgent.getRendererOverride() == null
- && rendMaker.needsOutputStream()) {
+ outputStreamMissing &= (out == null) && (rendMaker.needsOutputStream());
+ }
+ if (userAgent.getRendererOverride() != null
+ || rendMaker != null
+ || userAgent.getDocumentHandlerOverride() != null
+ || documentHandlerMaker != null) {
+ if (outputStreamMissing) {
throw new FOPException(
"OutputStream has not been set");
}
//Found a Renderer so we need to construct an AreaTreeHandler.
return new AreaTreeHandler(userAgent, outputFormat, out);
+ } else {
+ throw new UnsupportedOperationException(
+ "Don't know how to handle \"" + outputFormat + "\" as an output format."
+ + " Neither an FOEventHandler, nor a Renderer could be found"
+ + " for this output format.");
}
- } else {
- return maker.makeFOEventHandler(userAgent, out);
}
}
}
/**
+ * Creates a {@code IFDocumentHandler} object based on the desired output format.
+ * @param userAgent the user agent for access to configuration
+ * @param outputFormat the MIME type of the output format to use (ex. "application/pdf").
+ * @return the new {@code IFDocumentHandler} instance
+ * @throws FOPException if the document handler cannot be properly constructed
+ */
+ public IFDocumentHandler createDocumentHandler(FOUserAgent userAgent, String outputFormat)
+ throws FOPException {
+ AbstractIFDocumentHandlerMaker maker = getDocumentHandlerMaker(outputFormat);
+ if (maker == null) {
+ throw new UnsupportedOperationException(
+ "No IF document handler for the requested format available: " + outputFormat);
+ }
+ IFDocumentHandler documentHandler = maker.makeIFDocumentHandler(userAgent);
+ IFDocumentHandlerConfigurator configurator = documentHandler.getConfigurator();
+ if (configurator != null) {
+ configurator.configure(documentHandler);
+ }
+ return documentHandler;
+ }
+
+ /**
* @return an array of all supported MIME types
*/
public String[] listSupportedMimeTypes() {
@@ -242,6 +353,10 @@
while (iter.hasNext()) {
lst.add(((String)iter.next()));
}
+ iter = this.documentHandlerMakerMapping.keySet().iterator();
+ while (iter.hasNext()) {
+ lst.add(((String)iter.next()));
+ }
Collections.sort(lst);
return (String[])lst.toArray(new String[lst.size()]);
}
@@ -296,4 +411,29 @@
}
}
+ /**
+ * Discovers {@code IFDocumentHandler} implementations through the classpath and dynamically
+ * registers them.
+ */
+ private void discoverDocumentHandlers() {
+ // add mappings from available services
+ Iterator providers = Service.providers(IFDocumentHandler.class);
+ if (providers != null) {
+ while (providers.hasNext()) {
+ AbstractIFDocumentHandlerMaker maker
+ = (AbstractIFDocumentHandlerMaker)providers.next();
+ try {
+ if (log.isDebugEnabled()) {
+ log.debug("Dynamically adding maker for IFDocumentHandler: "
+ + maker.getClass().getName());
+ }
+ addDocumentHandlerMaker(maker);
+ } catch (IllegalArgumentException e) {
+ log.error("Error while adding maker for IFDocumentHandler", e);
+ }
+
+ }
+ }
+ }
+
}
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPForeignAttributeReader.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPForeignAttributeReader.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPForeignAttributeReader.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPForeignAttributeReader.java Sun Feb 22 12:40:44 2009
@@ -24,10 +24,12 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
+import org.apache.xmlgraphics.util.QName;
+
import org.apache.fop.afp.AFPResourceInfo;
import org.apache.fop.afp.AFPResourceLevel;
import org.apache.fop.render.afp.extensions.AFPElementMapping;
-import org.apache.xmlgraphics.util.QName;
/**
* Parses any AFP foreign attributes
@@ -36,13 +38,16 @@
private static final Log log = LogFactory.getLog("org.apache.xmlgraphics.afp");
/** the resource-name attribute */
- public static final String RESOURCE_NAME = "afp:resource-name";
+ public static final QName RESOURCE_NAME = new QName(
+ AFPElementMapping.NAMESPACE, "afp:resource-name");
/** the resource-level attribute */
- public static final String RESOURCE_LEVEL = "afp:resource-level";
+ public static final QName RESOURCE_LEVEL = new QName(
+ AFPElementMapping.NAMESPACE, "afp:resource-level");
/** the resource-group-file attribute */
- public static final String RESOURCE_GROUP_FILE = "afp:resource-group-file";
+ public static final QName RESOURCE_GROUP_FILE = new QName(
+ AFPElementMapping.NAMESPACE, "afp:resource-group-file");
/**
* Main constructor
@@ -59,8 +64,7 @@
public AFPResourceInfo getResourceInfo(Map/*<QName, String>*/ foreignAttributes) {
AFPResourceInfo resourceInfo = new AFPResourceInfo();
if (foreignAttributes != null && !foreignAttributes.isEmpty()) {
- QName resourceNameKey = new QName(AFPElementMapping.NAMESPACE, RESOURCE_NAME);
- String resourceName = (String)foreignAttributes.get(resourceNameKey);
+ String resourceName = (String)foreignAttributes.get(RESOURCE_NAME);
if (resourceName != null) {
resourceInfo.setName(resourceName);
}
@@ -81,16 +85,13 @@
public AFPResourceLevel getResourceLevel(Map/*<QName, String>*/ foreignAttributes) {
AFPResourceLevel resourceLevel = null;
if (foreignAttributes != null && !foreignAttributes.isEmpty()) {
- QName resourceLevelKey = new QName(AFPElementMapping.NAMESPACE, RESOURCE_LEVEL);
- if (foreignAttributes.containsKey(resourceLevelKey)) {
- String levelString = (String)foreignAttributes.get(resourceLevelKey);
+ if (foreignAttributes.containsKey(RESOURCE_LEVEL)) {
+ String levelString = (String)foreignAttributes.get(RESOURCE_LEVEL);
resourceLevel = AFPResourceLevel.valueOf(levelString);
// if external get resource group file attributes
if (resourceLevel != null && resourceLevel.isExternal()) {
- QName resourceGroupFileKey = new QName(AFPElementMapping.NAMESPACE,
- RESOURCE_GROUP_FILE);
String resourceGroupFile
- = (String)foreignAttributes.get(resourceGroupFileKey);
+ = (String)foreignAttributes.get(RESOURCE_GROUP_FILE);
if (resourceGroupFile == null) {
String msg = RESOURCE_GROUP_FILE + " not specified";
log.error(msg);
Propchange: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPForeignAttributeReader.java
('svn:mergeinfo' removed)
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPImageHandler.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPImageHandler.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPImageHandler.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPImageHandler.java Sun Feb 22 12:40:44 2009
@@ -20,6 +20,7 @@
package org.apache.fop.render.afp;
import java.awt.Point;
+import java.awt.Rectangle;
import java.awt.geom.Rectangle2D;
import java.io.IOException;
import java.util.Map;
@@ -29,12 +30,12 @@
import org.apache.fop.afp.AFPPaintingState;
import org.apache.fop.afp.AFPResourceInfo;
import org.apache.fop.afp.AFPUnitConverter;
-import org.apache.fop.render.ImageHandler;
+import org.apache.fop.render.ImageHandlerBase;
/**
* A base abstract AFP image handler
*/
-public abstract class AFPImageHandler implements ImageHandler {
+public abstract class AFPImageHandler implements ImageHandlerBase {
private static final int X = 0;
private static final int Y = 1;
@@ -55,33 +56,64 @@
AFPDataObjectInfo dataObjectInfo = createDataObjectInfo();
// set resource information
- Map foreignAttributes = rendererImageInfo.getForeignAttributes();
- AFPResourceInfo resourceInfo
- = foreignAttributeReader.getResourceInfo(foreignAttributes);
- resourceInfo.setUri(rendererImageInfo.getURI());
- dataObjectInfo.setResourceInfo(resourceInfo);
+ setResourceInformation(dataObjectInfo,
+ rendererImageInfo.getURI(),
+ rendererImageInfo.getForeignAttributes());
- // set object area
- AFPObjectAreaInfo objectAreaInfo = new AFPObjectAreaInfo();
Point origin = rendererImageInfo.getOrigin();
Rectangle2D position = rendererImageInfo.getPosition();
- float srcX = origin.x + (float)position.getX();
- float srcY = origin.y + (float)position.getY();
+ int srcX = Math.round(origin.x + (float)position.getX());
+ int srcY = Math.round(origin.y + (float)position.getY());
+ Rectangle targetRect = new Rectangle(
+ srcX,
+ srcY,
+ (int)Math.round(position.getWidth()),
+ (int)Math.round(position.getHeight()));
AFPRendererContext rendererContext
= (AFPRendererContext)rendererImageInfo.getRendererContext();
AFPInfo afpInfo = rendererContext.getInfo();
AFPPaintingState paintingState = afpInfo.getPaintingState();
+
+ dataObjectInfo.setObjectAreaInfo(createObjectAreaInfo(paintingState, targetRect));
+
+ return dataObjectInfo;
+ }
+
+ /**
+ * Sets resource information on the data object info.
+ * @param dataObjectInfo the data object info instance
+ * @param uri the image's URI (or null if no URI is available)
+ * @param foreignAttributes a Map of foreign attributes (or null)
+ */
+ protected void setResourceInformation(AFPDataObjectInfo dataObjectInfo,
+ String uri, Map foreignAttributes) {
+ AFPResourceInfo resourceInfo
+ = foreignAttributeReader.getResourceInfo(foreignAttributes);
+ resourceInfo.setUri(uri);
+ dataObjectInfo.setResourceInfo(resourceInfo);
+ }
+
+ /**
+ * Creates and returns an {@link AFPObjectAreaInfo} instance for the placement of the image.
+ * @param paintingState the painting state
+ * @param targetRect the target rectangle in which to place the image (coordinates in mpt)
+ * @return the newly created object area info instance
+ */
+ public static AFPObjectAreaInfo createObjectAreaInfo(AFPPaintingState paintingState,
+ Rectangle targetRect) {
+ AFPObjectAreaInfo objectAreaInfo = new AFPObjectAreaInfo();
AFPUnitConverter unitConv = paintingState.getUnitConverter();
- int[] coords = unitConv.mpts2units(new float[] {srcX, srcY});
+
+ int[] coords = unitConv.mpts2units(new float[] {targetRect.x, targetRect.y});
objectAreaInfo.setX(coords[X]);
objectAreaInfo.setY(coords[Y]);
- int width = Math.round(unitConv.mpt2units((float)position.getWidth()));
+ int width = Math.round(unitConv.mpt2units(targetRect.width));
objectAreaInfo.setWidth(width);
- int height = Math.round(unitConv.mpt2units((float)position.getHeight()));
+ int height = Math.round(unitConv.mpt2units(targetRect.height));
objectAreaInfo.setHeight(height);
int resolution = paintingState.getResolution();
@@ -89,10 +121,7 @@
objectAreaInfo.setWidthRes(resolution);
objectAreaInfo.setRotation(paintingState.getRotation());
-
- dataObjectInfo.setObjectAreaInfo(objectAreaInfo);
-
- return dataObjectInfo;
+ return objectAreaInfo;
}
/**
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPImageHandlerGraphics2D.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPImageHandlerGraphics2D.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPImageHandlerGraphics2D.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPImageHandlerGraphics2D.java Sun Feb 22 12:40:44 2009
@@ -19,8 +19,10 @@
package org.apache.fop.render.afp;
+import java.awt.Rectangle;
import java.io.IOException;
+import org.apache.xmlgraphics.image.loader.Image;
import org.apache.xmlgraphics.image.loader.ImageFlavor;
import org.apache.xmlgraphics.image.loader.impl.ImageGraphics2D;
import org.apache.xmlgraphics.java2d.Graphics2DImagePainter;
@@ -31,12 +33,16 @@
import org.apache.fop.afp.AFPGraphicsObjectInfo;
import org.apache.fop.afp.AFPPaintingState;
import org.apache.fop.afp.AFPResourceInfo;
+import org.apache.fop.afp.AFPResourceManager;
import org.apache.fop.afp.modca.ResourceObject;
+import org.apache.fop.render.ImageHandler;
+import org.apache.fop.render.ImageHandlerUtil;
+import org.apache.fop.render.RenderingContext;
/**
* PDFImageHandler implementation which handles Graphics2D images.
*/
-public class AFPImageHandlerGraphics2D extends AFPImageHandler {
+public class AFPImageHandlerGraphics2D extends AFPImageHandler implements ImageHandler {
private static final ImageFlavor[] FLAVORS = new ImageFlavor[] {
ImageFlavor.GRAPHICS2D
@@ -65,18 +71,13 @@
AFPGraphicsObjectInfo graphicsObjectInfo
= (AFPGraphicsObjectInfo)super.generateDataObjectInfo(rendererImageInfo);
- AFPResourceInfo resourceInfo = graphicsObjectInfo.getResourceInfo();
- if (!resourceInfo.levelChanged()) {
- resourceInfo.setLevel(afpInfo.getResourceManager().getResourceLevelDefaults()
- .getDefaultResourceLevel(ResourceObject.TYPE_GRAPHIC));
- }
+ setDefaultResourceLevel(graphicsObjectInfo, afpInfo.getResourceManager());
// set mime type (unsupported by MOD:CA registry)
graphicsObjectInfo.setMimeType(MimeConstants.MIME_AFP_GOCA);
// set g2d
boolean textAsShapes = false;
-
AFPGraphics2D g2d = afpInfo.createGraphics2D(textAsShapes);
graphicsObjectInfo.setGraphics2D(g2d);
@@ -88,6 +89,15 @@
}
}
+ private void setDefaultResourceLevel(AFPGraphicsObjectInfo graphicsObjectInfo,
+ AFPResourceManager resourceManager) {
+ AFPResourceInfo resourceInfo = graphicsObjectInfo.getResourceInfo();
+ if (!resourceInfo.levelChanged()) {
+ resourceInfo.setLevel(resourceManager.getResourceLevelDefaults()
+ .getDefaultResourceLevel(ResourceObject.TYPE_GRAPHIC));
+ }
+ }
+
/** {@inheritDoc} */
public int getPriority() {
return 200;
@@ -107,4 +117,54 @@
protected AFPDataObjectInfo createDataObjectInfo() {
return new AFPGraphicsObjectInfo();
}
+
+ /** {@inheritDoc} */
+ public void handleImage(RenderingContext context, Image image, Rectangle pos)
+ throws IOException {
+ AFPRenderingContext afpContext = (AFPRenderingContext)context;
+
+ AFPGraphicsObjectInfo graphicsObjectInfo = (AFPGraphicsObjectInfo)createDataObjectInfo();
+
+ // set resource information
+ setResourceInformation(graphicsObjectInfo,
+ image.getInfo().getOriginalURI(),
+ afpContext.getForeignAttributes());
+
+ // Positioning
+ graphicsObjectInfo.setObjectAreaInfo(
+ createObjectAreaInfo(afpContext.getPaintingState(), pos));
+
+ setDefaultResourceLevel(graphicsObjectInfo, afpContext.getResourceManager());
+
+ // Image content
+ ImageGraphics2D imageG2D = (ImageGraphics2D)image;
+ boolean textAsShapes = false; //TODO Make configurable
+ AFPGraphics2D g2d = new AFPGraphics2D(
+ textAsShapes,
+ afpContext.getPaintingState(),
+ afpContext.getResourceManager(),
+ graphicsObjectInfo.getResourceInfo(),
+ afpContext.getFontInfo());
+ g2d.setGraphicContext(new org.apache.xmlgraphics.java2d.GraphicContext());
+
+ graphicsObjectInfo.setGraphics2D(g2d);
+ graphicsObjectInfo.setPainter(imageG2D.getGraphics2DImagePainter());
+
+ // Create image
+ afpContext.getResourceManager().createObject(graphicsObjectInfo);
+ }
+
+ /** {@inheritDoc} */
+ public boolean isCompatible(RenderingContext targetContext, Image image) {
+ boolean supported = (image == null || image instanceof ImageGraphics2D)
+ && targetContext instanceof AFPRenderingContext;
+ if (supported) {
+ String mode = (String)targetContext.getHint(ImageHandlerUtil.CONVERSION_MODE);
+ if (ImageHandlerUtil.isConversionModeBitmap(mode)) {
+ //Disabling this image handler automatically causes a bitmap to be generated
+ return false;
+ }
+ }
+ return supported;
+ }
}
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPImageHandlerRawCCITTFax.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPImageHandlerRawCCITTFax.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPImageHandlerRawCCITTFax.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPImageHandlerRawCCITTFax.java Sun Feb 22 12:40:44 2009
@@ -19,12 +19,15 @@
package org.apache.fop.render.afp;
-import java.io.IOException;
+import org.apache.xmlgraphics.image.loader.Image;
+import org.apache.xmlgraphics.image.loader.ImageFlavor;
+import org.apache.xmlgraphics.image.loader.impl.ImageRawCCITTFax;
+import org.apache.xmlgraphics.image.loader.impl.ImageRawStream;
+import org.apache.xmlgraphics.util.MimeConstants;
import org.apache.fop.afp.AFPDataObjectInfo;
import org.apache.fop.afp.AFPImageObjectInfo;
-import org.apache.xmlgraphics.image.loader.ImageFlavor;
-import org.apache.xmlgraphics.image.loader.impl.ImageRawCCITTFax;
+import org.apache.fop.render.RenderingContext;
/**
* AFPImageHandler implementation which handles CCITT encoded images (CCITT fax group 3/4).
@@ -36,17 +39,18 @@
};
/** {@inheritDoc} */
- public AFPDataObjectInfo generateDataObjectInfo(
- AFPRendererImageInfo rendererImageInfo) throws IOException {
- AFPImageObjectInfo imageObjectInfo
- = (AFPImageObjectInfo)super.generateDataObjectInfo(rendererImageInfo);
-
- ImageRawCCITTFax ccitt = (ImageRawCCITTFax) rendererImageInfo.getImage();
+ protected void setAdditionalParameters(AFPDataObjectInfo dataObjectInfo,
+ ImageRawStream image) {
+ AFPImageObjectInfo imageObjectInfo = (AFPImageObjectInfo)dataObjectInfo;
+ ImageRawCCITTFax ccitt = (ImageRawCCITTFax)image;
int compression = ccitt.getCompression();
imageObjectInfo.setCompression(compression);
imageObjectInfo.setBitsPerPixel(1);
- return imageObjectInfo;
+
+ //CCITTFax flavor doesn't have TIFF associated but the AFP library listens to
+ //that to identify CCITT encoded images. CCITT is not exclusive to TIFF.
+ imageObjectInfo.setMimeType(MimeConstants.MIME_TIFF);
}
/** {@inheritDoc} */
@@ -69,4 +73,14 @@
return FLAVORS;
}
+ /** {@inheritDoc} */
+ public boolean isCompatible(RenderingContext targetContext, Image image) {
+ if (targetContext instanceof AFPRenderingContext) {
+ AFPRenderingContext afpContext = (AFPRenderingContext)targetContext;
+ return (afpContext.getPaintingState().isNativeImagesSupported())
+ && (image == null || image instanceof ImageRawCCITTFax);
+ }
+ return false;
+ }
+
}
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPImageHandlerRawStream.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPImageHandlerRawStream.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPImageHandlerRawStream.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPImageHandlerRawStream.java Sun Feb 22 12:40:44 2009
@@ -19,10 +19,15 @@
package org.apache.fop.render.afp;
-import org.apache.fop.afp.AFPDataObjectInfo;
+import org.apache.xmlgraphics.image.loader.Image;
import org.apache.xmlgraphics.image.loader.ImageFlavor;
+import org.apache.xmlgraphics.image.loader.impl.ImageRawEPS;
+import org.apache.xmlgraphics.image.loader.impl.ImageRawJPEG;
import org.apache.xmlgraphics.image.loader.impl.ImageRawStream;
+import org.apache.fop.afp.AFPDataObjectInfo;
+import org.apache.fop.render.RenderingContext;
+
/**
* AFPImageHandler implementation which handles raw stream images.
*/
@@ -52,4 +57,14 @@
protected AFPDataObjectInfo createDataObjectInfo() {
return new AFPDataObjectInfo();
}
+
+ /** {@inheritDoc} */
+ public boolean isCompatible(RenderingContext targetContext, Image image) {
+ if (targetContext instanceof AFPRenderingContext) {
+ AFPRenderingContext afpContext = (AFPRenderingContext)targetContext;
+ return (afpContext.getPaintingState().isNativeImagesSupported())
+ && (image == null || image instanceof ImageRawJPEG || image instanceof ImageRawEPS);
+ }
+ return false;
+ }
}
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPImageHandlerRenderedImage.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPImageHandlerRenderedImage.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPImageHandlerRenderedImage.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPImageHandlerRenderedImage.java Sun Feb 22 12:40:44 2009
@@ -20,6 +20,7 @@
package org.apache.fop.render.afp;
import java.awt.Dimension;
+import java.awt.Rectangle;
import java.awt.image.ColorModel;
import java.awt.image.RenderedImage;
import java.io.IOException;
@@ -28,6 +29,7 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.apache.xmlgraphics.image.loader.Image;
import org.apache.xmlgraphics.image.loader.ImageFlavor;
import org.apache.xmlgraphics.image.loader.ImageInfo;
import org.apache.xmlgraphics.image.loader.ImageSize;
@@ -41,13 +43,16 @@
import org.apache.fop.afp.AFPObjectAreaInfo;
import org.apache.fop.afp.AFPPaintingState;
import org.apache.fop.afp.AFPResourceInfo;
+import org.apache.fop.afp.AFPResourceManager;
import org.apache.fop.afp.modca.ResourceObject;
+import org.apache.fop.render.ImageHandler;
+import org.apache.fop.render.RenderingContext;
import org.apache.fop.util.bitmap.BitmapImageUtil;
/**
* PDFImageHandler implementation which handles RenderedImage instances.
*/
-public class AFPImageHandlerRenderedImage extends AFPImageHandler {
+public class AFPImageHandlerRenderedImage extends AFPImageHandler implements ImageHandler {
/** logging instance */
private static Log log = LogFactory.getLog(AFPImageHandlerRenderedImage.class);
@@ -67,34 +72,40 @@
= (AFPRendererContext)rendererImageInfo.getRendererContext();
AFPInfo afpInfo = rendererContext.getInfo();
- AFPResourceInfo resourceInfo = imageObjectInfo.getResourceInfo();
- if (!resourceInfo.levelChanged()) {
- resourceInfo.setLevel(afpInfo.getResourceManager().getResourceLevelDefaults()
- .getDefaultResourceLevel(ResourceObject.TYPE_IMAGE));
- }
+ setDefaultResourceLevel(imageObjectInfo, afpInfo.getResourceManager());
AFPPaintingState paintingState = afpInfo.getPaintingState();
+ ImageRendered imageRendered = (ImageRendered) rendererImageInfo.img;
+ Dimension targetSize = new Dimension(afpInfo.getWidth(), afpInfo.getHeight());
+
+ updateDataObjectInfo(imageObjectInfo, paintingState, imageRendered, targetSize);
+ return imageObjectInfo;
+ }
+
+ private AFPDataObjectInfo updateDataObjectInfo(AFPImageObjectInfo imageObjectInfo,
+ AFPPaintingState paintingState, ImageRendered imageRendered, Dimension targetSize)
+ throws IOException {
+
int resolution = paintingState.getResolution();
int maxPixelSize = paintingState.getBitsPerPixel();
if (paintingState.isColorImages()) {
maxPixelSize *= 3; //RGB only at the moment
}
- ImageRendered imageRendered = (ImageRendered) rendererImageInfo.img;
RenderedImage renderedImage = imageRendered.getRenderedImage();
- ImageInfo imageInfo = rendererImageInfo.getImageInfo();
+ ImageInfo imageInfo = imageRendered.getInfo();
ImageSize intrinsicSize = imageInfo.getSize();
boolean useFS10 = (maxPixelSize == 1) || BitmapImageUtil.isMonochromeImage(renderedImage);
boolean usePageSegments = useFS10
- && !resourceInfo.getLevel().isInline();
+ && !imageObjectInfo.getResourceInfo().getLevel().isInline();
ImageSize effIntrinsicSize = intrinsicSize;
if (usePageSegments) {
//Resize, optionally resample and convert image
Dimension resampledDim = new Dimension(
- (int)Math.ceil(UnitConv.mpt2px(afpInfo.getWidth(), resolution)),
- (int)Math.ceil(UnitConv.mpt2px(afpInfo.getHeight(), resolution)));
+ (int)Math.ceil(UnitConv.mpt2px(targetSize.getWidth(), resolution)),
+ (int)Math.ceil(UnitConv.mpt2px(targetSize.getHeight(), resolution)));
imageObjectInfo.setCreatePageSegment(true);
imageObjectInfo.getResourceInfo().setImageDimension(resampledDim);
@@ -130,6 +141,8 @@
int dataWidth = renderedImage.getWidth();
imageObjectInfo.setDataWidth(dataWidth);
+ //TODO To reduce AFP file size, investigate using a compression scheme.
+ //Currently, all image data is uncompressed.
ColorModel cm = renderedImage.getColorModel();
if (log.isTraceEnabled()) {
log.trace("ColorModel: " + cm);
@@ -209,6 +222,15 @@
return imageObjectInfo;
}
+ private void setDefaultResourceLevel(AFPImageObjectInfo imageObjectInfo,
+ AFPResourceManager resourceManager) {
+ AFPResourceInfo resourceInfo = imageObjectInfo.getResourceInfo();
+ if (!resourceInfo.levelChanged()) {
+ resourceInfo.setLevel(resourceManager.getResourceLevelDefaults()
+ .getDefaultResourceLevel(ResourceObject.TYPE_IMAGE));
+ }
+ }
+
/** {@inheritDoc} */
protected AFPDataObjectInfo createDataObjectInfo() {
return new AFPImageObjectInfo();
@@ -229,4 +251,35 @@
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());
+ setDefaultResourceLevel(imageObjectInfo, afpContext.getResourceManager());
+
+ // Positioning
+ imageObjectInfo.setObjectAreaInfo(createObjectAreaInfo(afpContext.getPaintingState(), pos));
+ Dimension targetSize = pos.getSize();
+
+ // Image content
+ ImageRendered imageRend = (ImageRendered)image;
+ updateDataObjectInfo(imageObjectInfo, afpContext.getPaintingState(), imageRend, targetSize);
+
+ // Create image
+ afpContext.getResourceManager().createObject(imageObjectInfo);
+ }
+
+ /** {@inheritDoc} */
+ public boolean isCompatible(RenderingContext targetContext, Image image) {
+ return (image == null || image instanceof ImageRendered)
+ && targetContext instanceof AFPRenderingContext;
+ }
+
}
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPRenderer.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPRenderer.java?rev=746664&r1=746663&r2=746664&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPRenderer.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPRenderer.java Sun Feb 22 12:40:44 2009
@@ -136,7 +136,7 @@
* (ie. at the start or end of the page).
*
*/
-public class AFPRenderer extends AbstractPathOrientedRenderer {
+public class AFPRenderer extends AbstractPathOrientedRenderer implements AFPCustomizable {
private static final int X = 0;
private static final int Y = 1;
@@ -543,6 +543,7 @@
int textWordSpaceAdjust = text.getTextWordSpaceAdjust();
int textLetterSpaceAdjust = text.getTextLetterSpaceAdjust();
int textWidth = font.getWidth(' ', fontSize) / 1000;
+ textWidth = 0; //JM, the above is strange
int variableSpaceCharacterIncrement
= textWidth + textWordSpaceAdjust + textLetterSpaceAdjust;
@@ -679,7 +680,7 @@
}
/**
- * Sets the rotation to be used for landsacpe pages, valid values are 0, 90,
+ * Sets the rotation to be used for landscape pages, valid values are 0, 90,
* 180, 270 (default).
*
* @param rotation
@@ -689,68 +690,39 @@
paintingState.setLandscapeRotation(rotation);
}
- /**
- * Sets the number of bits used per pixel
- *
- * @param bitsPerPixel
- * number of bits per pixel
- */
+ // ---=== AFPCustomizable ===---
+
+ /** {@inheritDoc} */
public void setBitsPerPixel(int bitsPerPixel) {
paintingState.setBitsPerPixel(bitsPerPixel);
}
- /**
- * Sets whether images are color or not
- *
- * @param colorImages
- * color image output
- */
+ /** {@inheritDoc} */
public void setColorImages(boolean colorImages) {
paintingState.setColorImages(colorImages);
}
- /**
- * Sets whether images are supported natively or not
- *
- * @param nativeImages
- * native image support
- */
+ /** {@inheritDoc} */
public void setNativeImagesSupported(boolean nativeImages) {
paintingState.setNativeImagesSupported(nativeImages);
}
- /**
- * Sets the output/device resolution
- *
- * @param resolution
- * the output resolution (dpi)
- */
+ /** {@inheritDoc} */
public void setResolution(int resolution) {
paintingState.setResolution(resolution);
}
- /**
- * Returns the output/device resolution.
- *
- * @return the resolution in dpi
- */
+ /** {@inheritDoc} */
public int getResolution() {
return paintingState.getResolution();
}
- /**
- * Sets the default resource group file path
- * @param filePath the default resource group file path
- */
+ /** {@inheritDoc} */
public void setDefaultResourceGroupFilePath(String filePath) {
resourceManager.setDefaultResourceGroupFilePath(filePath);
}
- /**
- * Sets the resource level defaults. The object passed in provides information which resource
- * level shall be used by default for various kinds of resources.
- * @param defaults the resource level defaults
- */
+ /** {@inheritDoc} */
public void setResourceLevelDefaults(AFPResourceLevelDefaults defaults) {
resourceManager.setResourceLevelDefaults(defaults);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org