| /***************************************************************************** |
| * Copyright (C) The Apache Software Foundation. All rights reserved. * |
| * ------------------------------------------------------------------------- * |
| * This software is published under the terms of the Apache Software License * |
| * version 1.1, a copy of which has been included with this distribution in * |
| * the LICENSE file. * |
| *****************************************************************************/ |
| |
| package org.apache.fop.svg; |
| |
| import java.awt.AlphaComposite; |
| import java.awt.Cursor; |
| import java.awt.Dimension; |
| import java.awt.Graphics2D; |
| import java.awt.Paint; |
| import java.awt.Point; |
| import java.awt.Rectangle; |
| import java.awt.Shape; |
| |
| import java.awt.geom.AffineTransform; |
| import java.awt.geom.Dimension2D; |
| import java.awt.geom.Rectangle2D; |
| import java.awt.image.BufferedImage; |
| |
| import java.awt.*; |
| import java.awt.event.*; |
| import java.awt.geom.*; |
| import java.awt.font.*; |
| |
| import java.net.MalformedURLException; |
| import java.net.URL; |
| |
| import java.util.HashSet; |
| import java.util.Set; |
| |
| import org.apache.batik.transcoder.*; |
| |
| import org.apache.batik.bridge.BridgeContext; |
| import org.apache.batik.bridge.BridgeException; |
| import org.apache.batik.bridge.GVTBuilder; |
| import org.apache.batik.bridge.UserAgent; |
| import org.apache.batik.bridge.ViewBox; |
| |
| import org.apache.batik.dom.svg.DefaultSVGContext; |
| import org.apache.batik.dom.svg.SAXSVGDocumentFactory; |
| import org.apache.batik.dom.svg.SVGDOMImplementation; |
| import org.apache.batik.dom.svg.SVGOMDocument; |
| import org.apache.batik.dom.util.DocumentFactory; |
| |
| import org.apache.batik.ext.awt.image.GraphicsUtil; |
| |
| import org.apache.batik.gvt.GraphicsNode; |
| import org.apache.batik.gvt.GraphicsNodeRenderContext; |
| import org.apache.batik.gvt.event.EventDispatcher; |
| import org.apache.batik.gvt.renderer.ImageRenderer; |
| import org.apache.batik.gvt.renderer.ImageRendererFactory; |
| |
| import org.apache.batik.transcoder.TranscoderException; |
| import org.apache.batik.transcoder.TranscoderOutput; |
| import org.apache.batik.transcoder.TranscodingHints; |
| import org.apache.batik.transcoder.XMLAbstractTranscoder; |
| import org.apache.batik.transcoder.image.resources.Messages; |
| |
| import org.apache.batik.transcoder.keys.BooleanKey; |
| import org.apache.batik.transcoder.keys.FloatKey; |
| import org.apache.batik.transcoder.keys.LengthKey; |
| import org.apache.batik.transcoder.keys.PaintKey; |
| import org.apache.batik.transcoder.keys.PaintKey; |
| import org.apache.batik.transcoder.keys.Rectangle2DKey; |
| import org.apache.batik.transcoder.keys.StringKey; |
| import org.apache.batik.transcoder.*; |
| |
| import org.apache.batik.util.SVGConstants; |
| |
| import org.apache.batik.bridge.*; |
| import org.apache.batik.swing.svg.*; |
| import org.apache.batik.swing.gvt.*; |
| import org.apache.batik.gvt.*; |
| import org.apache.batik.gvt.renderer.*; |
| import org.apache.batik.gvt.filter.*; |
| import org.apache.batik.gvt.event.*; |
| |
| import org.w3c.dom.*; |
| import org.w3c.dom.svg.*; |
| import org.w3c.dom.css.*; |
| import org.w3c.dom.svg.SVGLength; |
| |
| import org.apache.fop.svg.*; |
| |
| import org.w3c.dom.DOMException; |
| import org.w3c.dom.DOMImplementation; |
| import org.w3c.dom.Document; |
| import org.w3c.dom.svg.SVGAElement; |
| import org.w3c.dom.svg.SVGDocument; |
| import org.w3c.dom.svg.SVGSVGElement; |
| |
| // <!> FIXME : Those import clauses will change with new design |
| import org.apache.batik.gvt.renderer.StaticRendererFactory; |
| |
| /** |
| * This class enables to transcode an input to an image of any format. |
| * |
| * <p>Two transcoding hints (<tt>KEY_WIDTH</tt> and |
| * <tt>KEY_HEIGHT</tt>) can be used to respectively specify the image |
| * width and the image height. If only one of these keys is specified, |
| * the transcoder preserves the aspect ratio of the original image. |
| * |
| * <p>The <tt>KEY_BACKGROUND_COLOR</tt> defines the background color |
| * to use for opaque image formats, or the background color that may |
| * be used for image formats that support alpha channel. |
| * |
| * <p>The <tt>KEY_AOI</tt> represents the area of interest to paint |
| * in device space. |
| * |
| * <p>Three additional transcoding hints that act on the SVG |
| * processor can be specified: |
| * |
| * <p><tt>KEY_LANGUAGE</tt> to set the default language to use (may be |
| * used by a <switch> SVG element for example), |
| * <tt>KEY_USER_STYLESHEET_URI</tt> to fix the URI of a user |
| * stylesheet, and <tt>KEY_PIXEL_TO_MM</tt> to specify the pixel to |
| * millimeter conversion factor. |
| * |
| * @author <a href="mailto:Thierry.Kormann@sophia.inria.fr">Thierry Kormann</a> |
| * @version $Id$ |
| */ |
| public class PDFTranscoder extends XMLAbstractTranscoder { |
| |
| /** The user agent dedicated to an <tt>ImageTranscoder</tt>. */ |
| protected UserAgent userAgent = new ImageTranscoderUserAgent(); |
| |
| /** |
| * Constructs a new <tt>ImageTranscoder</tt>. |
| */ |
| public PDFTranscoder() { |
| hints.put(KEY_DOCUMENT_ELEMENT_NAMESPACE_URI, |
| SVGConstants.SVG_NAMESPACE_URI); |
| hints.put(KEY_DOCUMENT_ELEMENT, |
| SVGConstants.SVG_SVG_TAG); |
| hints.put(KEY_DOM_IMPLEMENTATION, |
| SVGDOMImplementation.getDOMImplementation()); |
| } |
| |
| /** |
| * Transcodes the specified Document as an image in the specified output. |
| * |
| * @param document the document to transcode |
| * @param uri the uri of the document or null if any |
| * @param output the ouput where to transcode |
| * @exception TranscoderException if an error occured while transcoding |
| */ |
| protected void transcode(Document document, |
| String uri, |
| TranscoderOutput output) |
| throws TranscoderException { |
| |
| if (!(document instanceof SVGOMDocument)) { |
| throw new TranscoderException( |
| Messages.formatMessage("notsvg", null)); |
| } |
| SVGDocument svgDoc = (SVGDocument)document; |
| SVGSVGElement root = svgDoc.getRootElement(); |
| // initialize the SVG document with the appropriate context |
| String parserClassname = (String)hints.get(KEY_XML_PARSER_CLASSNAME); |
| DefaultSVGContext svgCtx = new DefaultSVGContext(); |
| svgCtx.setPixelToMM(userAgent.getPixelToMM()); |
| ((SVGOMDocument)document).setSVGContext(svgCtx); |
| |
| // build the GVT tree |
| GVTBuilder builder = new GVTBuilder(); |
| ImageRendererFactory rendFactory = new StaticRendererFactory(); |
| GraphicsNodeRenderContext rc = getRenderContext(); |
| BridgeContext ctx = new BridgeContext(userAgent, rc); |
| GraphicsNode gvtRoot; |
| try { |
| gvtRoot = builder.build(ctx, svgDoc); |
| } catch (BridgeException ex) { |
| throw new TranscoderException(ex); |
| } |
| // get the 'width' and 'height' attributes of the SVG document |
| float docWidth = (float)ctx.getDocumentSize().getWidth(); |
| float docHeight = (float)ctx.getDocumentSize().getHeight(); |
| ctx = null; |
| builder = null; |
| |
| // compute the image's width and height according the hints |
| float imgWidth = -1; |
| if (hints.containsKey(KEY_WIDTH)) { |
| imgWidth = ((Float)hints.get(KEY_WIDTH)).floatValue(); |
| } |
| float imgHeight = -1; |
| if (hints.containsKey(KEY_HEIGHT)) { |
| imgHeight = ((Float)hints.get(KEY_HEIGHT)).floatValue(); |
| } |
| float width, height; |
| if (imgWidth > 0 && imgHeight > 0) { |
| width = imgWidth; |
| height = imgHeight; |
| } else if (imgHeight > 0) { |
| width = (docWidth * imgHeight) / docHeight; |
| height = imgHeight; |
| } else if (imgWidth > 0) { |
| width = imgWidth; |
| height = (docHeight * imgWidth) / docWidth; |
| } else { |
| width = docWidth; |
| height = docHeight; |
| } |
| // compute the preserveAspectRatio matrix |
| AffineTransform Px; |
| String ref = null; |
| try { |
| ref = new URL(uri).getRef(); |
| } catch (MalformedURLException ex) { |
| // nothing to do, catched previously |
| } |
| |
| try { |
| Px = ViewBox.getViewTransform(ref, root, width, height); |
| } catch (BridgeException ex) { |
| throw new TranscoderException(ex); |
| } |
| |
| if (Px.isIdentity() && (width != docWidth || height != docHeight)) { |
| // The document has no viewBox, we need to resize it by hand. |
| // we want to keep the document size ratio |
| float d = Math.max(docWidth, docHeight); |
| float dd = Math.max(width, height); |
| float scale = dd/d; |
| Px = AffineTransform.getScaleInstance(scale, scale); |
| } |
| // take the AOI into account if any |
| if (hints.containsKey(KEY_AOI)) { |
| Rectangle2D aoi = (Rectangle2D)hints.get(KEY_AOI); |
| // transform the AOI into the image's coordinate system |
| aoi = Px.createTransformedShape(aoi).getBounds2D(); |
| AffineTransform Mx = new AffineTransform(); |
| double sx = width / aoi.getWidth(); |
| double sy = height / aoi.getHeight(); |
| Mx.scale(sx, sy); |
| double tx = -aoi.getX(); |
| double ty = -aoi.getY(); |
| Mx.translate(tx, ty); |
| // take the AOI transformation matrix into account |
| // we apply first the preserveAspectRatio matrix |
| Px.preConcatenate(Mx); |
| } |
| // prepare the image to be painted |
| int w = (int)width; |
| int h = (int)height; |
| |
| PDFDocumentGraphics2D graphics = new PDFDocumentGraphics2D(true, output.getOutputStream(), w, h); |
| // GraphicsNodeRenderContext rc = getRenderContext(); |
| graphics.setGraphicContext(new org.apache.batik.ext.awt.g2d.GraphicContext()); |
| graphics.setRenderingHints(rc.getRenderingHints()); |
| |
| gvtRoot.paint(graphics, rc); |
| |
| try { |
| graphics.finish(); |
| } catch (Exception ex) { |
| ex.printStackTrace(); |
| throw new TranscoderException(ex); |
| } |
| /* |
| // paint the SVG document using the bridge package |
| // create the appropriate renderer |
| ImageRenderer renderer = rendFactory.createImageRenderer(); |
| renderer.updateOffScreen(w, h); |
| renderer.setTransform(Px); |
| renderer.setTree(gvtRoot); |
| gvtRoot = null; // We're done with it... |
| |
| try { |
| // now we are sure that the aoi is the image size |
| Shape raoi = new Rectangle2D.Float(0, 0, width, height); |
| // Warning: the renderer's AOI must be in user space |
| renderer.repaint(Px.createInverse().createTransformedShape(raoi)); |
| BufferedImage rend = renderer.getOffScreen(); |
| renderer = null; // We're done with it... |
| |
| // BufferedImage dest = createImage(w, h); |
| |
| //Graphics2D g2d = GraphicsUtil.createGraphics(dest); |
| |
| //g2d.drawRenderedImage(rend, new AffineTransform()); |
| } catch (Exception ex) { |
| throw new TranscoderException(ex); |
| } |
| */ |
| } |
| |
| public GraphicsNodeRenderContext getRenderContext() { |
| GraphicsNodeRenderContext nodeRenderContext = null; |
| if (nodeRenderContext == null) { |
| RenderingHints hints = new RenderingHints(null); |
| hints.put(RenderingHints.KEY_ANTIALIASING, |
| RenderingHints.VALUE_ANTIALIAS_ON); |
| |
| hints.put(RenderingHints.KEY_INTERPOLATION, |
| RenderingHints.VALUE_INTERPOLATION_BILINEAR); |
| |
| FontRenderContext fontRenderContext = |
| new FontRenderContext(new AffineTransform(), true, true); |
| |
| TextPainter textPainter = new StrokingTextPainter(); |
| |
| GraphicsNodeRableFactory gnrFactory = |
| new ConcreteGraphicsNodeRableFactory(); |
| |
| nodeRenderContext = |
| new GraphicsNodeRenderContext(new AffineTransform(), |
| null, |
| hints, |
| fontRenderContext, |
| textPainter, |
| gnrFactory); |
| nodeRenderContext.setTextPainter(textPainter); |
| } |
| |
| return nodeRenderContext; |
| } |
| |
| /** |
| * Creates a <tt>DocumentFactory</tt> that is used to create an SVG DOM |
| * tree. The specified DOM Implementation is ignored and the Batik |
| * SVG DOM Implementation is automatically used. |
| * |
| * @param domImpl the DOM Implementation (not used) |
| * @param parserClassname the XML parser classname |
| */ |
| protected DocumentFactory createDocumentFactory(DOMImplementation domImpl, |
| String parserClassname) { |
| return new SAXSVGDocumentFactory(parserClassname); |
| } |
| |
| // -------------------------------------------------------------------- |
| // UserAgent implementation |
| // -------------------------------------------------------------------- |
| |
| /** |
| * A user agent implementation for <tt>ImageTranscoder</tt>. |
| */ |
| protected class ImageTranscoderUserAgent implements UserAgent { |
| |
| /** |
| * Returns the default size of this user agent (400x400). |
| */ |
| public Dimension2D getViewportSize() { |
| return new Dimension(400, 400); |
| } |
| |
| /** |
| * Displays the specified error message using the <tt>ErrorHandler</tt>. |
| */ |
| public void displayError(String message) { |
| try { |
| getErrorHandler().error(new TranscoderException(message)); |
| } catch (TranscoderException ex) { |
| throw new RuntimeException(); |
| } |
| } |
| |
| /** |
| * Displays the specified error using the <tt>ErrorHandler</tt>. |
| */ |
| public void displayError(Exception e) { |
| try { |
| getErrorHandler().error(new TranscoderException(e)); |
| } catch (TranscoderException ex) { |
| throw new RuntimeException(); |
| } |
| } |
| |
| /** |
| * Displays the specified message using the <tt>ErrorHandler</tt>. |
| */ |
| public void displayMessage(String message) { |
| try { |
| getErrorHandler().warning(new TranscoderException(message)); |
| } catch (TranscoderException ex) { |
| throw new RuntimeException(); |
| } |
| } |
| |
| /** |
| * Returns the pixel to millimeter conversion factor specified in the |
| * <tt>TranscodingHints</tt> or 0.3528 if any. |
| */ |
| public float getPixelToMM() { |
| if (getTranscodingHints().containsKey(KEY_PIXEL_TO_MM)) { |
| return ((Float)getTranscodingHints().get(KEY_PIXEL_TO_MM)).floatValue(); |
| } else { |
| // return 0.3528f; // 72 dpi |
| return 0.26458333333333333333333333333333f; // 96dpi |
| } |
| } |
| |
| /** |
| * Returns the user language specified in the |
| * <tt>TranscodingHints</tt> or "en" (english) if any. |
| */ |
| public String getLanguages() { |
| if (getTranscodingHints().containsKey(KEY_LANGUAGE)) { |
| return (String)getTranscodingHints().get(KEY_LANGUAGE); |
| } else { |
| return "en"; |
| } |
| } |
| |
| /** |
| * Returns the user stylesheet specified in the |
| * <tt>TranscodingHints</tt> or null if any. |
| */ |
| public String getUserStyleSheetURI() { |
| return (String)getTranscodingHints().get(KEY_USER_STYLESHEET_URI); |
| } |
| |
| /** |
| * Returns the XML parser to use from the TranscodingHints. |
| */ |
| public String getXMLParserClassName() { |
| return (String)getTranscodingHints().get(KEY_XML_PARSER_CLASSNAME); |
| } |
| |
| /** |
| * Unsupported operation. |
| */ |
| public EventDispatcher getEventDispatcher() { |
| return null; |
| } |
| |
| /** |
| * Unsupported operation. |
| */ |
| public void openLink(SVGAElement elt) { } |
| |
| /** |
| * Unsupported operation. |
| */ |
| public void setSVGCursor(Cursor cursor) { } |
| |
| /** |
| * Unsupported operation. |
| */ |
| public void runThread(Thread t) { } |
| |
| /** |
| * Unsupported operation. |
| */ |
| public AffineTransform getTransform() { |
| return null; |
| } |
| |
| /** |
| * Unsupported operation. |
| */ |
| public Point getClientAreaLocationOnScreen() { |
| return new Point(); |
| } |
| |
| /** |
| * Tells whether the given feature is supported by this |
| * user agent. |
| */ |
| public boolean hasFeature(String s) { |
| return FEATURES.contains(s); |
| } |
| |
| /** |
| * Tells whether the given extension is supported by this |
| * user agent. |
| */ |
| public boolean supportExtension(String s) { |
| return false; |
| } |
| |
| public void registerExtension(BridgeExtension be) |
| { |
| } |
| } |
| |
| protected final static Set FEATURES = new HashSet(); |
| static { |
| FEATURES.add(SVGConstants.SVG_ORG_W3C_SVG_FEATURE); |
| FEATURES.add(SVGConstants.SVG_ORG_W3C_SVG_LANG_FEATURE); |
| FEATURES.add(SVGConstants.SVG_ORG_W3C_SVG_STATIC_FEATURE); |
| } |
| |
| // -------------------------------------------------------------------- |
| // Keys definition |
| // -------------------------------------------------------------------- |
| |
| /** |
| * The image width key. |
| * <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="1"> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Key: </TH> |
| * <TD VALIGN="TOP">KEY_WIDTH</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Value: </TH> |
| * <TD VALIGN="TOP">Float</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Default: </TH> |
| * <TD VALIGN="TOP">The width of the top most svg element</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Required: </TH> |
| * <TD VALIGN="TOP">No</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Description: </TH> |
| * <TD VALIGN="TOP">Specify the width of the image to create.</TD></TR> |
| * </TABLE> */ |
| public static final TranscodingHints.Key KEY_WIDTH |
| = new LengthKey(); |
| |
| /** |
| * The image height key. |
| * <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="1"> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Key: </TH> |
| * <TD VALIGN="TOP">KEY_HEIGHT</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Value: </TH> |
| * <TD VALIGN="TOP">Float</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Default: </TH> |
| * <TD VALIGN="TOP">The height of the top most svg element</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Required: </TH> |
| * <TD VALIGN="TOP">No</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Description: </TH> |
| * <TD VALIGN="TOP">Specify the height of the image to create.</TD></TR> |
| * </TABLE> */ |
| public static final TranscodingHints.Key KEY_HEIGHT |
| = new LengthKey(); |
| |
| /** |
| * The area of interest key. |
| * <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="1"> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Key: </TH> |
| * <TD VALIGN="TOP">KEY_AOI</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Value: </TH> |
| * <TD VALIGN="TOP">Rectangle2D</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Default: </TH> |
| * <TD VALIGN="TOP">The document's size</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Required: </TH> |
| * <TD VALIGN="TOP">No</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Description: </TH> |
| * <TD VALIGN="TOP">Specify the area of interest to render. The |
| * rectangle coordinates must be specified in pixels and in the |
| * document coordinates system.</TD></TR> |
| * </TABLE> |
| */ |
| public static final TranscodingHints.Key KEY_AOI |
| = new Rectangle2DKey(); |
| |
| /** |
| * The language key. |
| * <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="1"> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Key: </TH> |
| * <TD VALIGN="TOP">KEY_LANGUAGE</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Value: </TH> |
| * <TD VALIGN="TOP">String</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Default: </TH> |
| * <TD VALIGN="TOP">"en"</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Required: </TH> |
| * <TD VALIGN="TOP">No</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Description: </TH> |
| * <TD VALIGN="TOP">Specify the preferred language of the document. |
| * </TD></TR> |
| * </TABLE> |
| */ |
| public static final TranscodingHints.Key KEY_LANGUAGE |
| = new StringKey(); |
| |
| /** |
| * The user stylesheet URI key. |
| * <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="1"> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Key: </TH> |
| * <TD VALIGN="TOP">KEY_USER_STYLESHEET_URI</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Value: </TH> |
| * <TD VALIGN="TOP">String</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Default: </TH> |
| * <TD VALIGN="TOP">null</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Required: </TH> |
| * <TD VALIGN="TOP">No</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Description: </TH> |
| * <TD VALIGN="TOP">Specify the user style sheet.</TD></TR> |
| * </TABLE> |
| */ |
| public static final TranscodingHints.Key KEY_USER_STYLESHEET_URI |
| = new StringKey(); |
| |
| /** |
| * The pixel to millimeter conversion factor key. |
| * <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="1"> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Key: </TH> |
| * <TD VALIGN="TOP">KEY_PIXEL_TO_MM</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Value: </TH> |
| * <TD VALIGN="TOP">Float</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Default: </TH> |
| * <TD VALIGN="TOP">0.33</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Required: </TH> |
| * <TD VALIGN="TOP">No</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Description: </TH> |
| * <TD VALIGN="TOP">Specify the pixel to millimeter conversion factor. |
| * </TD></TR> |
| * </TABLE> |
| */ |
| public static final TranscodingHints.Key KEY_PIXEL_TO_MM |
| = new FloatKey(); |
| |
| /** |
| * The image background paint key. |
| * <TABLE BORDER="0" CELLSPACING="0" CELLPADDING="1"> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Key: </TH> |
| * <TD VALIGN="TOP">KEY_BACKGROUND_COLOR</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Value: </TH> |
| * <TD VALIGN="TOP">Paint</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Default: </TH> |
| * <TD VALIGN="TOP">null</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Required: </TH> |
| * <TD VALIGN="TOP">No</TD></TR> |
| * <TR> |
| * <TH VALIGN="TOP" ALIGN="RIGHT"><P ALIGN="RIGHT">Description: </TH> |
| * <TD VALIGN="TOP">Specify the background color to use. |
| * The color is required by opaque image formats and is used by |
| * image formats that support alpha channel.</TD></TR> |
| * </TABLE> |
| */ |
| public static final TranscodingHints.Key KEY_BACKGROUND_COLOR |
| = new PaintKey(); |
| |
| } |