diff options
author | Adrian Cumiskey <acumiskey@apache.org> | 2008-05-12 08:58:21 +0000 |
---|---|---|
committer | Adrian Cumiskey <acumiskey@apache.org> | 2008-05-12 08:58:21 +0000 |
commit | df8430fb6c4d776b404455baeb5c56617b54f0db (patch) | |
tree | bd76246c5b3753f40e7510c1200a4c98520751b3 /src | |
parent | d972250786d5575d56a55aede884e9df46450c60 (diff) | |
download | xmlgraphics-fop-df8430fb6c4d776b404455baeb5c56617b54f0db.tar.gz xmlgraphics-fop-df8430fb6c4d776b404455baeb5c56617b54f0db.zip |
Merged revisions 654783,654849,654869,654946,654982,655085,655093,655275,655281,655285,655309,655349,655370 via svnmerge from
https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk
........
r654783 | vhennebert | 2008-05-09 13:30:40 +0100 (Fri, 09 May 2008) | 3 lines
Checkstyle and minor typo fixes
Set svn:keywords and svn:eol-style properties on new files
........
r654849 | acumiskey | 2008-05-09 16:14:37 +0100 (Fri, 09 May 2008) | 1 line
Unwanted list self concatenation :).
........
r654869 | acumiskey | 2008-05-09 17:13:47 +0100 (Fri, 09 May 2008) | 1 line
Moved the instantiation of the FontManager to the constructor along with all the other aggregated objects.
........
r654946 | adelmelle | 2008-05-09 22:40:14 +0100 (Fri, 09 May 2008) | 6 lines
Bugzilla 44794:
Added support for page-number-citation and page-number-citation-last of fo:inline.
Corrected behavior for page-number-citation-last of fo:block - forward references properly resolved.
(+ support for page-number-citation-last on list-related FOs)
........
r654982 | acumiskey | 2008-05-10 00:47:28 +0100 (Sat, 10 May 2008) | 1 line
Checkstyle cleanup and javadoc
........
r655085 | adelmelle | 2008-05-10 14:44:09 +0100 (Sat, 10 May 2008) | 5 lines
Tweaks:
-> remove split in CommonFont: font-size is resolved early, so no need anymore for CachedCommonFont
-> allow disabling the PropertyCache via a system property (just in case...)
........
r655093 | adelmelle | 2008-05-10 15:23:56 +0100 (Sat, 10 May 2008) | 1 line
Correction: set default to true...
........
r655275 | maxberger | 2008-05-11 08:30:55 +0100 (Sun, 11 May 2008) | 1 line
made sure warning for missing glyphs is emitted in all cases
........
r655281 | maxberger | 2008-05-11 10:01:31 +0100 (Sun, 11 May 2008) | 1 line
Support character-by-character font-selection strategy on fo:character element
........
r655285 | maxberger | 2008-05-11 10:17:07 +0100 (Sun, 11 May 2008) | 1 line
Forgot to update testcases
........
r655309 | adelmelle | 2008-05-11 13:22:22 +0100 (Sun, 11 May 2008) | 3 lines
Make the LM clean up on end-of-layout, if possible.
Added clearChildNodes() method to FObj to release the reference to the FO's children.
........
r655349 | spepping | 2008-05-11 19:05:51 +0100 (Sun, 11 May 2008) | 2 lines
The spec requires rounding, not truncating
........
r655370 | adelmelle | 2008-05-11 22:03:41 +0100 (Sun, 11 May 2008) | 1 line
Avoid creation of unnecessary dummy areas.
........
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_AFPGOCAResources@655445 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src')
56 files changed, 998 insertions, 1003 deletions
diff --git a/src/codegen/fonts/font-file.xsl b/src/codegen/fonts/font-file.xsl index 21a6507b8..85b968808 100644 --- a/src/codegen/fonts/font-file.xsl +++ b/src/codegen/fonts/font-file.xsl @@ -42,6 +42,7 @@ import java.util.Set; import org.apache.fop.fonts.FontType; import org.apache.fop.fonts.Base14Font; import org.apache.fop.fonts.CodePointMapping; +import org.apache.fop.fonts.Typeface;; public class <xsl:value-of select="class-name"/> extends Base14Font { private final static String fontName = "<xsl:value-of select="font-name"/>"; @@ -169,7 +170,8 @@ public class <xsl:value-of select="class-name"/> extends Base14Font { if (d != 0) { return d; } else { - return '#'; + this.warnMissingGlyph(c); + return Typeface.NOT_FOUND; } } diff --git a/src/java/org/apache/fop/apps/FOURIResolver.java b/src/java/org/apache/fop/apps/FOURIResolver.java index bc0ca25b5..76b0bedd5 100644 --- a/src/java/org/apache/fop/apps/FOURIResolver.java +++ b/src/java/org/apache/fop/apps/FOURIResolver.java @@ -52,7 +52,7 @@ public class FOURIResolver implements javax.xml.transform.URIResolver { /** URIResolver for RFC 2397 data URLs */ private URIResolver dataURIResolver = new DataURIResolver(); - + /** A user settable URI Resolver */ private URIResolver uriResolver = null; @@ -77,7 +77,7 @@ public class FOURIResolver implements javax.xml.transform.URIResolver { } File dir = new File(base); try { - base = (dir.isDirectory() ? dir.toURL() : new URL(base)).toExternalForm(); + base = (dir.isDirectory() ? dir.toURL() : new URL(base)).toExternalForm(); } catch (MalformedURLException mfue) { if (throwExceptions) { throw mfue; @@ -147,11 +147,11 @@ public class FOURIResolver implements javax.xml.transform.URIResolver { */ public Source resolve(String href, String base) throws TransformerException { Source source = null; - + // data URLs can be quite long so evaluate early and don't try to build a File // (can lead to problems) source = dataURIResolver.resolve(href, base); - + // Custom uri resolution if (source == null && uriResolver != null) { source = uriResolver.resolve(href, base); diff --git a/src/java/org/apache/fop/apps/FOUserAgent.java b/src/java/org/apache/fop/apps/FOUserAgent.java index f4c68933e..c7a904f29 100644 --- a/src/java/org/apache/fop/apps/FOUserAgent.java +++ b/src/java/org/apache/fop/apps/FOUserAgent.java @@ -76,7 +76,7 @@ public class FOUserAgent { private static Log log = LogFactory.getLog("FOP"); private FopFactory factory; - + /** * The base URL for all URL resolutions, especially for * external-graphics. @@ -88,7 +88,7 @@ public class FOUserAgent { /** A user settable URI Resolver */ private URIResolver uriResolver = null; - + private float targetResolution = FopFactoryConfigurator.DEFAULT_TARGET_RESOLUTION; private Map rendererOptions = new java.util.HashMap(); private File outputFile = null; @@ -96,7 +96,7 @@ public class FOUserAgent { private FOEventHandler foEventHandlerOverride = null; private boolean locatorEnabled = true; // true by default (for error messages). private EventBroadcaster eventBroadcaster = new FOPEventBroadcaster(); - + /** Producer: Metadata element for the system/software that produces * the document. (Some renderers can store this in the document.) */ @@ -107,18 +107,18 @@ public class FOUserAgent { */ protected String creator = null; - /** Creation Date: Override of the date the document was created. + /** Creation Date: Override of the date the document was created. * (Some renderers can store this in the document.) */ protected Date creationDate = null; - + /** Author of the content of the document. */ protected String author = null; /** Title of the document. */ protected String title = null; /** Set of keywords applicable to this document. */ protected String keywords = null; - + private ImageSessionContext imageSessionContext = new AbstractImageSessionContext() { public ImageContext getParentContext() { @@ -132,11 +132,11 @@ public class FOUserAgent { public Source resolveURI(String uri) { return FOUserAgent.this.resolveURI(uri); } - + }; - + /** - * Main constructor. <b>This constructor should not be called directly. Please use the + * Main constructor. <b>This constructor should not be called directly. Please use the * methods from FopFactory to construct FOUserAgent instances!</b> * @param factory the factory that provides environment-level information * @see org.apache.fop.apps.FopFactory @@ -150,17 +150,17 @@ public class FOUserAgent { setFontBaseURL(factory.getFontManager().getFontBaseURL()); setTargetResolution(factory.getTargetResolution()); } - + /** @return the associated FopFactory instance */ public FopFactory getFactory() { return this.factory; } - + // ---------------------------------------------- rendering-run dependent stuff - + /** - * Sets an explicit renderer to use which overrides the one defined by the - * render type setting. + * Sets an explicit renderer to use which overrides the one defined by the + * render type setting. * @param renderer the Renderer instance to use */ public void setRendererOverride(Renderer renderer) { @@ -177,7 +177,7 @@ public class FOUserAgent { /** * Sets an explicit FOEventHandler instance which overrides the one - * defined by the render type setting. + * defined by the render type setting. * @param handler the FOEventHandler instance */ public void setFOEventHandlerOverride(FOEventHandler handler) { @@ -193,7 +193,7 @@ public class FOUserAgent { } /** - * Sets the producer of the document. + * Sets the producer of the document. * @param producer source of document */ public void setProducer(String producer) { @@ -209,7 +209,7 @@ public class FOUserAgent { } /** - * Sets the creator of the document. + * Sets the creator of the document. * @param creator of document */ public void setCreator(String creator) { @@ -225,7 +225,7 @@ public class FOUserAgent { } /** - * Sets the creation date of the document. + * Sets the creation date of the document. * @param creationDate date of document */ public void setCreationDate(Date creationDate) { @@ -241,7 +241,7 @@ public class FOUserAgent { } /** - * Sets the author of the document. + * Sets the author of the document. * @param author of document */ public void setAuthor(String author) { @@ -258,7 +258,7 @@ public class FOUserAgent { /** * Sets the title of the document. This will override any title coming from - * an fo:title element. + * an fo:title element. * @param title of document */ public void setTitle(String title) { @@ -274,7 +274,7 @@ public class FOUserAgent { } /** - * Sets the keywords for the document. + * Sets the keywords for the document. * @param keywords for the document */ public void setKeywords(String keywords) { @@ -296,7 +296,7 @@ public class FOUserAgent { public Map getRendererOptions() { return rendererOptions; } - + /** * Sets the base URL. * @param baseUrl base URL @@ -343,7 +343,7 @@ public class FOUserAgent { * to the default resolver. * @param uri URI to access * @return A {@link javax.xml.transform.Source} object, or null if the URI - * cannot be resolved. + * cannot be resolved. * @see org.apache.fop.apps.FOURIResolver */ public Source resolveURI(String uri) { @@ -357,7 +357,7 @@ public class FOUserAgent { * @param href URI to access * @param base the base URI to resolve against * @return A {@link javax.xml.transform.Source} object, or null if the URI - * cannot be resolved. + * cannot be resolved. * @see org.apache.fop.apps.FOURIResolver */ public Source resolveURI(String href, String base) { @@ -402,9 +402,9 @@ public class FOUserAgent { * @see #getTargetResolution() */ public float getTargetPixelUnitToMillimeter() { - return 25.4f / this.targetResolution; + return 25.4f / this.targetResolution; } - + /** @return the resolution for resolution-dependant output */ public float getTargetResolution() { return this.targetResolution; @@ -419,7 +419,7 @@ public class FOUserAgent { public void setTargetResolution(float dpi) { this.targetResolution = dpi; if (log.isDebugEnabled()) { - log.debug("target-resolution set to: " + targetResolution + log.debug("target-resolution set to: " + targetResolution + "dpi (px2mm=" + getTargetPixelUnitToMillimeter() + ")"); } } @@ -433,7 +433,7 @@ public class FOUserAgent { public void setTargetResolution(int dpi) { setTargetResolution((float)dpi); } - + /** * Returns the image session context for the image package. * @return the ImageSessionContext instance for this rendering run @@ -441,7 +441,7 @@ public class FOUserAgent { public ImageSessionContext getImageSessionContext() { return this.imageSessionContext; } - + // ---------------------------------------------- environment-level stuff // (convenience access to FopFactory methods) @@ -457,9 +457,9 @@ public class FOUserAgent { * @see #getSourceResolution() */ public float getSourcePixelUnitToMillimeter() { - return getFactory().getSourcePixelUnitToMillimeter(); + return getFactory().getSourcePixelUnitToMillimeter(); } - + /** @return the resolution for resolution-dependant input */ public float getSourceResolution() { return getFactory().getSourceResolution(); @@ -475,7 +475,7 @@ public class FOUserAgent { public String getPageHeight() { return getFactory().getPageHeight(); } - + /** * Gets the default page-width to use as fallback, * in case page-width="auto" @@ -486,7 +486,7 @@ public class FOUserAgent { public String getPageWidth() { return getFactory().getPageWidth(); } - + /** * Returns whether FOP is strictly validating input XSL * @return true of strict validation turned on, false otherwise @@ -497,7 +497,7 @@ public class FOUserAgent { } /** - * @return true if the indent inheritance should be broken when crossing reference area + * @return true if the indent inheritance should be broken when crossing reference area * boundaries (for more info, see the javadoc for the relative member variable) * @see FopFactory#isBreakIndentInheritanceOnReferenceAreaBoundary() */ @@ -518,7 +518,7 @@ public class FOUserAgent { public XMLHandlerRegistry getXMLHandlerRegistry() { return getFactory().getXMLHandlerRegistry(); } - + /** * Controls the use of SAXLocators to provide location information in error * messages. @@ -550,7 +550,7 @@ public class FOUserAgent { private class FOPEventBroadcaster extends DefaultEventBroadcaster { private EventListener rootListener; - + public FOPEventBroadcaster() { //Install a temporary event listener that catches the first event to //do some initialization. @@ -569,13 +569,13 @@ public class FOUserAgent { } }; } - + /** {@inheritDoc} */ public void broadcastEvent(Event event) { rootListener.processEvent(event); } } - + } diff --git a/src/java/org/apache/fop/apps/FopFactory.java b/src/java/org/apache/fop/apps/FopFactory.java index c196e1204..2d4029da8 100644 --- a/src/java/org/apache/fop/apps/FopFactory.java +++ b/src/java/org/apache/fop/apps/FopFactory.java @@ -59,37 +59,37 @@ import org.apache.fop.util.ContentHandlerFactoryRegistry; * found and managed in the FOUserAgent. */ public class FopFactory implements ImageContext { - + /** logger instance */ private static Log log = LogFactory.getLog(FopFactory.class); - + /** Factory for Renderers and FOEventHandlers */ private RendererFactory rendererFactory; - + /** Registry for XML handlers */ private XMLHandlerRegistry xmlHandlers; - + /** The registry for ElementMapping instances */ private ElementMappingRegistry elementMappingRegistry; - /** The registry for ContentHandlerFactory instance */ - private ContentHandlerFactoryRegistry contentHandlerFactoryRegistry + /** The registry for ContentHandlerFactory instance */ + private ContentHandlerFactoryRegistry contentHandlerFactoryRegistry = new ContentHandlerFactoryRegistry(); - + /** The resolver for user-supplied hyphenation patterns */ private HyphenationTreeResolver hyphResolver = null; private ColorSpaceCache colorSpaceCache = null; - + /** Image manager for loading and caching image objects */ private ImageManager imageManager; /** Font manager for font substitution, autodetection and caching **/ private FontManager fontManager; - + /** Configuration layer used to configure fop */ private FopFactoryConfigurator config = null; - + /** * The base URL for all URL resolutions, especially for * external-graphics. @@ -101,10 +101,10 @@ public class FopFactory implements ImageContext { /** * FOP has the ability, for some FO's, to continue processing even if the - * input XSL violates that FO's content model. This is the default + * input XSL violates that FO's content model. This is the default * behavior for FOP. However, this flag, if set, provides the user the * ability for FOP to halt on all content model violations if desired. - */ + */ private boolean strictFOValidation = FopFactoryConfigurator.DEFAULT_STRICT_FO_VALIDATION; /** @@ -113,7 +113,7 @@ public class FopFactory implements ImageContext { */ private boolean strictUserConfigValidation = FopFactoryConfigurator.DEFAULT_STRICT_USERCONFIG_VALIDATION; - + /** Source resolution in dpi */ private float sourceResolution = FopFactoryConfigurator.DEFAULT_SOURCE_RESOLUTION; @@ -122,7 +122,7 @@ public class FopFactory implements ImageContext { /** Page height */ private String pageHeight = FopFactoryConfigurator.DEFAULT_PAGE_HEIGHT; - + /** Page width */ private String pageWidth = FopFactoryConfigurator.DEFAULT_PAGE_WIDTH; @@ -136,7 +136,7 @@ public class FopFactory implements ImageContext { private Set ignoredNamespaces; private FOURIResolver foURIResolver; - + /** * Main constructor. */ @@ -144,13 +144,21 @@ public class FopFactory implements ImageContext { this.config = new FopFactoryConfigurator(this); this.elementMappingRegistry = new ElementMappingRegistry(this); this.foURIResolver = new FOURIResolver(validateUserConfigStrictly()); + this.fontManager = new FontManager() { + + /** {@inheritDoc} */ + public void setFontBaseURL(String fontBase) throws MalformedURLException { + super.setFontBaseURL(getFOURIResolver().checkBaseURL(fontBase)); + } + + }; this.colorSpaceCache = new ColorSpaceCache(foURIResolver); this.imageManager = new ImageManager(this); this.rendererFactory = new RendererFactory(); this.xmlHandlers = new XMLHandlerRegistry(); this.ignoredNamespaces = new java.util.HashSet(); } - + /** * Returns a new FopFactory instance. * @return the requested FopFactory instance. @@ -158,13 +166,13 @@ public class FopFactory implements ImageContext { public static FopFactory newInstance() { return new FopFactory(); } - + /** * Returns a new FOUserAgent instance. Use the FOUserAgent to configure special values that * are particular to a rendering run. Don't reuse instances over multiple rendering runs but * instead create a new one each time and reuse the FopFactory. * @return the newly created FOUserAgent instance initialized with default values - * @throws FOPException + * @throws FOPException */ public FOUserAgent newFOUserAgent() { FOUserAgent userAgent = new FOUserAgent(this); @@ -172,12 +180,12 @@ public class FopFactory implements ImageContext { } /** - * Returns a new {@link Fop} instance. FOP will be configured with a default user agent + * Returns a new {@link Fop} instance. FOP will be configured with a default user agent * instance. * <p> * MIME types are used to select the output format (ex. "application/pdf" for PDF). You can * use the constants defined in {@link MimeConstants}. - * @param outputFormat the MIME type of the output format to use (ex. "application/pdf"). + * @param outputFormat the MIME type of the output format to use (ex. "application/pdf"). * @return the new Fop instance * @throws FOPException when the constructor fails */ @@ -186,29 +194,29 @@ public class FopFactory implements ImageContext { } /** - * Returns a new {@link Fop} instance. Use this factory method if you want to configure this + * Returns a new {@link Fop} instance. Use this factory method if you want to configure this * very rendering run, i.e. if you want to set some metadata like the title and author of the - * document you want to render. In that case, create a new {@link FOUserAgent} + * document you want to render. In that case, create a new {@link FOUserAgent} * instance using {@link #newFOUserAgent()}. * <p> * MIME types are used to select the output format (ex. "application/pdf" for PDF). You can * use the constants defined in {@link MimeConstants}. * @param outputFormat the MIME type of the output format to use (ex. "application/pdf"). - * @param userAgent the user agent that will be used to control the rendering run + * @param userAgent the user agent that will be used to control the rendering run * @return the new Fop instance * @throws FOPException when the constructor fails */ public Fop newFop(String outputFormat, FOUserAgent userAgent) throws FOPException { return newFop(outputFormat, userAgent, null); } - + /** - * Returns a new {@link Fop} instance. FOP will be configured with a default user agent + * Returns a new {@link Fop} instance. FOP will be configured with a default user agent * instance. Use this factory method if your output type requires an output stream. * <p> * MIME types are used to select the output format (ex. "application/pdf" for PDF). You can * use the constants defined in {@link MimeConstants}. - * @param outputFormat the MIME type of the output format to use (ex. "application/pdf"). + * @param outputFormat the MIME type of the output format to use (ex. "application/pdf"). * @param stream the output stream * @return the new Fop instance * @throws FOPException when the constructor fails @@ -227,30 +235,30 @@ public class FopFactory implements ImageContext { * MIME types are used to select the output format (ex. "application/pdf" for PDF). You can * use the constants defined in {@link MimeConstants}. * @param outputFormat the MIME type of the output format to use (ex. "application/pdf"). - * @param userAgent the user agent that will be used to control the rendering run + * @param userAgent the user agent that will be used to control the rendering run * @param stream the output stream * @return the new Fop instance * @throws FOPException when the constructor fails */ - public Fop newFop(String outputFormat, FOUserAgent userAgent, OutputStream stream) + public Fop newFop(String outputFormat, FOUserAgent userAgent, OutputStream stream) throws FOPException { if (userAgent == null) { throw new NullPointerException("The userAgent parameter must not be null!"); } return new Fop(outputFormat, userAgent, stream); } - + /** * Returns a new {@link Fop} instance. Use this factory method if you want to supply your - * own {@link org.apache.fop.render.Renderer Renderer} or - * {@link org.apache.fop.fo.FOEventHandler FOEventHandler} + * own {@link org.apache.fop.render.Renderer Renderer} or + * {@link org.apache.fop.fo.FOEventHandler FOEventHandler} * instance instead of the default ones created internally by FOP. - * @param userAgent the user agent that will be used to control the rendering run + * @param userAgent the user agent that will be used to control the rendering run * @return the new Fop instance * @throws FOPException when the constructor fails */ public Fop newFop(FOUserAgent userAgent) throws FOPException { - if (userAgent.getRendererOverride() == null + if (userAgent.getRendererOverride() == null && userAgent.getFOEventHandlerOverride() == null) { throw new IllegalStateException("Either the overriding renderer or the overriding" + " FOEventHandler must be set when this factory method is used!"); @@ -267,7 +275,7 @@ public class FopFactory implements ImageContext { public XMLHandlerRegistry getXMLHandlerRegistry() { return this.xmlHandlers; } - + /** @return the element mapping registry */ public ElementMappingRegistry getElementMappingRegistry() { return this.elementMappingRegistry; @@ -310,7 +318,7 @@ public class FopFactory implements ImageContext { public LayoutManagerMaker getLayoutManagerMakerOverride() { return this.lmMakerOverride; } - + /** * Sets the base URL. * @param base the base URL @@ -327,7 +335,7 @@ public class FopFactory implements ImageContext { public String getBaseURL() { return this.base; } - + /** * Sets the font base URL. * @param fontBase font base URL @@ -367,10 +375,10 @@ public class FopFactory implements ImageContext { } this.hyphenBase = foURIResolver.checkBaseURL(hyphenBase); } - + /** * Sets the URI Resolver. It is used for resolving factory-level URIs like hyphenation - * patterns and as backup for URI resolution performed during a rendering run. + * patterns and as backup for URI resolution performed during a rendering run. * @param uriResolver the new URI resolver */ public void setURIResolver(URIResolver uriResolver) { @@ -397,7 +405,7 @@ public class FopFactory implements ImageContext { public HyphenationTreeResolver getHyphenationTreeResolver() { return this.hyphResolver; } - + /** * Sets the HyphenationTreeResolver to be used for resolving user-supplied hyphenation files. * @param hyphResolver the HyphenationTreeResolver instance @@ -424,7 +432,7 @@ public class FopFactory implements ImageContext { } /** - * @return true if the indent inheritance should be broken when crossing reference area + * @return true if the indent inheritance should be broken when crossing reference area * boundaries (for more info, see the javadoc for the relative member variable) */ public boolean isBreakIndentInheritanceOnReferenceAreaBoundary() { @@ -447,7 +455,7 @@ public class FopFactory implements ImageContext { public void setBreakIndentInheritanceOnReferenceAreaBoundary(boolean value) { this.breakIndentInheritanceOnReferenceAreaBoundary = value; } - + /** * @return true if kerning on base 14 fonts is enabled * @deprecated use getFontManager().isBase14KerningEnabled() instead @@ -455,7 +463,7 @@ public class FopFactory implements ImageContext { public boolean isBase14KerningEnabled() { return getFontManager().isBase14KerningEnabled(); } - + /** * Controls whether kerning is activated on base 14 fonts. * @param value true if kerning should be activated @@ -464,7 +472,7 @@ public class FopFactory implements ImageContext { public void setBase14KerningEnabled(boolean value) { getFontManager().setBase14KerningEnabled(value); } - + /** @return the resolution for resolution-dependant input */ public float getSourceResolution() { return this.sourceResolution; @@ -477,7 +485,7 @@ public class FopFactory implements ImageContext { * @see #getSourceResolution() */ public float getSourcePixelUnitToMillimeter() { - return 25.4f / getSourceResolution(); + return 25.4f / getSourceResolution(); } /** @@ -488,7 +496,7 @@ public class FopFactory implements ImageContext { public void setSourceResolution(float dpi) { this.sourceResolution = dpi; if (log.isDebugEnabled()) { - log.debug("source-resolution set to: " + sourceResolution + log.debug("source-resolution set to: " + sourceResolution + "dpi (px2mm=" + getSourcePixelUnitToMillimeter() + ")"); } } @@ -505,7 +513,7 @@ public class FopFactory implements ImageContext { * @see #getTargetResolution() */ public float getTargetPixelUnitToMillimeter() { - return 25.4f / this.targetResolution; + return 25.4f / this.targetResolution; } /** @@ -525,7 +533,7 @@ public class FopFactory implements ImageContext { public void setSourceResolution(int dpi) { setSourceResolution((float)dpi); } - + /** * Gets the default page-height to use as fallback, * in case page-height="auto" @@ -535,7 +543,7 @@ public class FopFactory implements ImageContext { public String getPageHeight() { return this.pageHeight; } - + /** * Sets the page-height to use as fallback, in case * page-height="auto" @@ -548,7 +556,7 @@ public class FopFactory implements ImageContext { log.debug("Default page-height set to: " + pageHeight); } } - + /** * Gets the default page-width to use as fallback, * in case page-width="auto" @@ -558,7 +566,7 @@ public class FopFactory implements ImageContext { public String getPageWidth() { return this.pageWidth; } - + /** * Sets the page-width to use as fallback, in case * page-width="auto" @@ -571,27 +579,27 @@ public class FopFactory implements ImageContext { log.debug("Default page-width set to: " + pageWidth); } } - + /** * Adds a namespace to the set of ignored namespaces. - * If FOP encounters a namespace which it cannot handle, it issues a warning except if this + * If FOP encounters a namespace which it cannot handle, it issues a warning except if this * namespace is in the ignored set. * @param namespaceURI the namespace URI */ public void ignoreNamespace(String namespaceURI) { this.ignoredNamespaces.add(namespaceURI); } - + /** * Adds a collection of namespaces to the set of ignored namespaces. - * If FOP encounters a namespace which it cannot handle, it issues a warning except if this + * If FOP encounters a namespace which it cannot handle, it issues a warning except if this * namespace is in the ignored set. * @param namespaceURIs the namespace URIs */ public void ignoreNamespaces(Collection namespaceURIs) { this.ignoredNamespaces.addAll(namespaceURIs); } - + /** * Indicates whether a namespace URI is on the ignored list. * @param namespaceURI the namespace URI @@ -600,14 +608,14 @@ public class FopFactory implements ImageContext { public boolean isNamespaceIgnored(String namespaceURI) { return this.ignoredNamespaces.contains(namespaceURI); } - + /** @return the set of namespaces that are ignored by FOP */ public Set getIgnoredNamespace() { return Collections.unmodifiableSet(this.ignoredNamespaces); } //------------------------------------------- Configuration stuff - + /** * Set the user configuration. * @param userConfigFile the configuration file @@ -627,11 +635,11 @@ public class FopFactory implements ImageContext { public void setUserConfig(String uri) throws SAXException, IOException { config.setUserConfig(uri); } - + /** * Set the user configuration. * @param userConfig configuration - * @throws FOPException if a configuration problem occurs + * @throws FOPException if a configuration problem occurs */ public void setUserConfig(Configuration userConfig) throws FOPException { config.setUserConfig(userConfig); @@ -690,25 +698,15 @@ public class FopFactory implements ImageContext { public FontCache getFontCache() { return getFontManager().getFontCache(); } - + /** * Returns the font manager. * @return the font manager */ public FontManager getFontManager() { - if (fontManager == null) { - this.fontManager = new FontManager() { - - /** {@inheritDoc} */ - public void setFontBaseURL(String fontBase) throws MalformedURLException { - super.setFontBaseURL(getFOURIResolver().checkBaseURL(fontBase)); - } - - }; - } return this.fontManager; } - + /** * Attempts to resolve the given URI. * Will use the configured resolver and if not successful fall back @@ -716,7 +714,7 @@ public class FopFactory implements ImageContext { * @param href URI to access * @param baseUri the base URI to resolve against * @return A {@link javax.xml.transform.Source} object, or null if the URI - * cannot be resolved. + * cannot be resolved. * @see org.apache.fop.apps.FOURIResolver */ public Source resolveURI(String href, String baseUri) { @@ -728,19 +726,19 @@ public class FopFactory implements ImageContext { } return source; } - + /** * Create (if needed) and return an ICC ColorSpace instance. * * The ICC profile source is taken from the src attribute of the color-profile FO element. * If the ICC ColorSpace is not yet in the cache a new one is created and stored in the cache. * - * The FOP URI resolver is used to try and locate the ICC file. + * The FOP URI resolver is used to try and locate the ICC file. * If that fails null is returned. * * @param baseUri a base URI to resolve relative URIs * @param iccProfileSrc ICC Profile source to return a ColorSpace for - * @return ICC ColorSpace object or null if ColorSpace could not be created + * @return ICC ColorSpace object or null if ColorSpace could not be created */ public ColorSpace getColorSpace(String baseUri, String iccProfileSrc) { return colorSpaceCache.get(baseUri, iccProfileSrc); diff --git a/src/java/org/apache/fop/apps/FopFactoryConfigurator.java b/src/java/org/apache/fop/apps/FopFactoryConfigurator.java index cc3ce2d0b..ffcc1332b 100644 --- a/src/java/org/apache/fop/apps/FopFactoryConfigurator.java +++ b/src/java/org/apache/fop/apps/FopFactoryConfigurator.java @@ -42,25 +42,25 @@ public class FopFactoryConfigurator { /** Defines if FOP should use an alternative rule to determine text indents */ public static final boolean DEFAULT_BREAK_INDENT_INHERITANCE = false; - + /** Defines if FOP should validate the user config strictly */ public static final boolean DEFAULT_STRICT_USERCONFIG_VALIDATION = true; - + /** Defines if FOP should use strict validation for FO and user config */ public static final boolean DEFAULT_STRICT_FO_VALIDATION = true; - + /** Defines the default page-width */ public static final String DEFAULT_PAGE_WIDTH = "8.26in"; - + /** Defines the default page-height */ public static final String DEFAULT_PAGE_HEIGHT = "11in"; - + /** Defines the default source resolution (72dpi) for FOP */ public static final float DEFAULT_SOURCE_RESOLUTION = 72.0f; //dpi - + /** Defines the default target resolution (72dpi) for FOP */ public static final float DEFAULT_TARGET_RESOLUTION = 72.0f; //dpi - + /** logger instance */ private final Log log = LogFactory.getLog(FopFactoryConfigurator.class); @@ -78,7 +78,7 @@ public class FopFactoryConfigurator { super(); this.factory = factory; } - + /** * Initializes user agent settings from the user configuration * file, if present: baseURL, resolution, default page size,... @@ -87,7 +87,7 @@ public class FopFactoryConfigurator { */ public void configure(FopFactory factory) throws FOPException { if (log.isDebugEnabled()) { - log.debug("Initializing FopFactory Configuration"); + log.debug("Initializing FopFactory Configuration"); } // strict configuration @@ -98,9 +98,9 @@ public class FopFactoryConfigurator { } catch (ConfigurationException e) { LogUtil.handleException(log, e, false); } - } + } boolean strict = factory.validateUserConfigStrictly(); - + // strict fo validation if (cfg.getChild("strict-validation", false) != null) { try { @@ -128,14 +128,14 @@ public class FopFactoryConfigurator { LogUtil.handleException(log, mfue, strict); } } - + // renderer options if (cfg.getChild("source-resolution", false) != null) { factory.setSourceResolution( cfg.getChild("source-resolution").getValueAsFloat( FopFactoryConfigurator.DEFAULT_SOURCE_RESOLUTION)); if (log.isDebugEnabled()) { - log.debug("source-resolution set to: " + factory.getSourceResolution() + log.debug("source-resolution set to: " + factory.getSourceResolution() + "dpi (px2mm=" + factory.getSourcePixelUnitToMillimeter() + ")"); } } @@ -144,9 +144,9 @@ public class FopFactoryConfigurator { cfg.getChild("target-resolution").getValueAsFloat( FopFactoryConfigurator.DEFAULT_TARGET_RESOLUTION)); if (log.isDebugEnabled()) { - log.debug("target-resolution set to: " + factory.getTargetResolution() + log.debug("target-resolution set to: " + factory.getTargetResolution() + "dpi (px2mm=" + factory.getTargetPixelUnitToMillimeter() - + ")"); + + ")"); } } if (cfg.getChild("break-indent-inheritance", false) != null) { @@ -156,13 +156,13 @@ public class FopFactoryConfigurator { } catch (ConfigurationException e) { LogUtil.handleException(log, e, strict); } - } + } Configuration pageConfig = cfg.getChild("default-page-settings"); if (pageConfig.getAttribute("height", null) != null) { factory.setPageHeight( pageConfig.getAttribute("height", FopFactoryConfigurator.DEFAULT_PAGE_HEIGHT)); if (log.isInfoEnabled()) { - log.info("Default page-height set to: " + factory.getPageHeight()); + log.info("Default page-height set to: " + factory.getPageHeight()); } } if (pageConfig.getAttribute("width", null) != null) { @@ -178,7 +178,7 @@ public class FopFactoryConfigurator { FontManagerConfigurator fontManagerConfigurator = new FontManagerConfigurator(cfg); fontManagerConfigurator.configure(fontManager, strict); } - + /** * Set the user configuration. * @param userConfigFile the configuration file @@ -193,7 +193,7 @@ public class FopFactoryConfigurator { throw new FOPException(e); } } - + /** * Set the user configuration from an URI. * @param uri the URI to the configuration file @@ -208,22 +208,22 @@ public class FopFactoryConfigurator { throw new FOPException(e); } } - + /** * Set the user configuration. * @param cfg avalon configuration - * @throws FOPException if a configuration problem occurs + * @throws FOPException if a configuration problem occurs */ public void setUserConfig(Configuration cfg) throws FOPException { this.cfg = cfg; configure(this.factory); } - + /** * Get the avalon user configuration. * @return the user configuration */ public Configuration getUserConfig() { return this.cfg; - } + } } diff --git a/src/java/org/apache/fop/fo/FOPropertyMapping.java b/src/java/org/apache/fop/fo/FOPropertyMapping.java index 643fc7b73..8fed90a35 100644 --- a/src/java/org/apache/fop/fo/FOPropertyMapping.java +++ b/src/java/org/apache/fop/fo/FOPropertyMapping.java @@ -963,7 +963,7 @@ public final class FOPropertyMapping implements Constants { // font-family m = new FontFamilyProperty.Maker(PR_FONT_FAMILY); m.setInherited(true); - m.setDefault("sans-serif"); + m.setDefault("sans-serif,Symbol,ZapfDingbats"); m.addShorthand(s_generics[PR_FONT]); addPropertyMaker("font-family", m); diff --git a/src/java/org/apache/fop/fo/FObj.java b/src/java/org/apache/fop/fo/FObj.java index 79b04c4d7..0bbec4d47 100644 --- a/src/java/org/apache/fop/fo/FObj.java +++ b/src/java/org/apache/fop/fo/FObj.java @@ -515,6 +515,13 @@ public abstract class FObj extends FONode implements Constants { return -1; } + /** + * Clears the list of child nodes. + */ + public void clearChildNodes() { + this.firstChild = null; + } + /** @return the "id" property. */ public String getId() { return id; @@ -598,7 +605,7 @@ public abstract class FObj extends FONode implements Constants { return (super.toString() + "[@id=" + this.id + "]"); } - + /** Basic {@link FONodeIterator} implementation */ public class FObjIterator implements FONodeIterator { private static final int F_NONE_ALLOWED = 0; diff --git a/src/java/org/apache/fop/fo/properties/CommonFont.java b/src/java/org/apache/fop/fo/properties/CommonFont.java index 1e3f8d43d..ca543a050 100755 --- a/src/java/org/apache/fop/fo/properties/CommonFont.java +++ b/src/java/org/apache/fop/fo/properties/CommonFont.java @@ -39,177 +39,60 @@ public final class CommonFont { * absolute font-size and font-size-adjust) */ private static final PropertyCache cache = new PropertyCache(CommonFont.class); - /** - * Class holding canonical instances of bundles of the - * cacheable (non-relative) CommonFont properties - * - */ - protected static final class CachedCommonFont { - - /** cache holding all canonical instances */ - private static final PropertyCache cache = new PropertyCache(CachedCommonFont.class); - - private int hash = 0; - - /** - * The "font-family" property. - */ - private final FontFamilyProperty fontFamily; - - /** - * The "font-selection-strategy" property. - */ - private final EnumProperty fontSelectionStrategy; + /** hashcode of this instance */ + private int hash = 0; - /** - * The "font-stretch" property. - */ - private final EnumProperty fontStretch; + /** The "font-family" property. */ + private final FontFamilyProperty fontFamily; - /** - * The "font-style" property. - */ - private final EnumProperty fontStyle; + /** The "font-selection-strategy" property. */ + private final EnumProperty fontSelectionStrategy; - /** - * The "font-variant" property. - */ - private final EnumProperty fontVariant; + /** The "font-stretch" property. */ + private final EnumProperty fontStretch; - /** - * The "font-weight" property. - */ - private final EnumProperty fontWeight; - - /** - * Constructor - * - * @param fontFamily the font-family property - * @param fontSelectionStrategy the font-selection-strategy property - * @param fontStretch the font-stretch property - * @param fontStyle the font-style property - * @param fontVariant the font-variant property - * @param fontWeight the font-weight property - */ - private CachedCommonFont(FontFamilyProperty fontFamily, - EnumProperty fontSelectionStrategy, - EnumProperty fontStretch, - EnumProperty fontStyle, - EnumProperty fontVariant, - EnumProperty fontWeight) { - this.fontFamily = fontFamily; - this.fontSelectionStrategy = fontSelectionStrategy; - this.fontStretch = fontStretch; - this.fontStyle = fontStyle; - this.fontVariant = fontVariant; - this.fontWeight = fontWeight; - } - - /** - * Returns the canonical instance corresponding to the given - * properties - * - * @param fontFamily the font-family property - * @param fontSelectionStrategy the font-selection-strategy property - * @param fontStretch the font-stretch property - * @param fontStyle the font-style property - * @param fontVariant the font-variant property - * @param fontWeight the font-weight property - * @return the canonical instance - */ - private static final CachedCommonFont getInstance(FontFamilyProperty fontFamily, - EnumProperty fontSelectionStrategy, - EnumProperty fontStretch, - EnumProperty fontStyle, - EnumProperty fontVariant, - EnumProperty fontWeight) { - return cache.fetch(new CachedCommonFont( - fontFamily, - fontSelectionStrategy, - fontStretch, - fontStyle, - fontVariant, - fontWeight)); - } - - /** @return the first font-family name in the list */ - private String getFirstFontFamily() { - return ((Property) fontFamily.list.get(0)).getString(); - } - - /** @return an array with the font-family names */ - private String[] getFontFamily() { - List lst = fontFamily.getList(); - String[] fontFamily = new String[lst.size()]; - for (int i = 0, c = lst.size(); i < c; i++) { - fontFamily[i] = ((Property)lst.get(i)).getString(); - } - return fontFamily; - } - - /** {@inheritDoc} */ - public boolean equals(Object o) { - if (this == o) { - return true; - } - - if (o instanceof CachedCommonFont) { - CachedCommonFont ccf = (CachedCommonFont) o; - return (ccf.fontFamily == this.fontFamily) - && (ccf.fontSelectionStrategy == this.fontSelectionStrategy) - && (ccf.fontStretch == this.fontStretch) - && (ccf.fontStyle == this.fontStyle) - && (ccf.fontVariant == this.fontVariant) - && (ccf.fontWeight == this.fontWeight); - } - return false; - } - - /** {@inheritDoc} */ - public int hashCode() { - if (this.hash == 0) { - int hash = 17; - hash = 37 * hash + (fontFamily == null ? 0 : fontFamily.hashCode()); - hash = 37 * hash + (fontSelectionStrategy == null ? 0 : fontSelectionStrategy.hashCode()); - hash = 37 * hash + (fontStretch == null ? 0 : fontStretch.hashCode()); - hash = 37 * hash + (fontStyle == null ? 0 : fontStyle.hashCode()); - hash = 37 * hash + (fontVariant == null ? 0 : fontVariant.hashCode()); - hash = 37 * hash + (fontStretch == null ? 0 : fontStretch.hashCode()); - this.hash = hash; - } - return this.hash; - } - - } + /** The "font-style" property. */ + private final EnumProperty fontStyle; - /** - * The cached CommonFont properties (access these through the getters) - * The remaining properties, font-size and font-size-adjust, - * will only be cached values if they are absolute. - */ - private final CachedCommonFont cachedCommonFont; + /** The "font-variant" property. */ + private final EnumProperty fontVariant; + + /** The "font-weight" property. */ + private final EnumProperty fontWeight; - /** - * The "font-size" property. - */ + /** The "font-size" property. */ public final Length fontSize; - /** - * The "font-size-adjust" property. - */ + /** The "font-size-adjust" property. */ public final Numeric fontSizeAdjust; + /** * Construct a CommonFont instance * - * @param ccf the cached CommonFont properties + * @param fontFamily the font-family property + * @param fontSelectionStrategy the font-selection-strategy property + * @param fontStretch the font-stretch property + * @param fontStyle the font-style property + * @param fontVariant the font-variant property + * @param fontWeight the font-weight property * @param fontSize the font-size (possibly non-cached) * @param fontSizeAdjust the font-size-adjust (possibly non-cached) */ - private CommonFont(CachedCommonFont ccf, + private CommonFont(FontFamilyProperty fontFamily, + EnumProperty fontSelectionStrategy, + EnumProperty fontStretch, + EnumProperty fontStyle, + EnumProperty fontVariant, + EnumProperty fontWeight, Length fontSize, Numeric fontSizeAdjust) { - this.cachedCommonFont = ccf; + this.fontFamily = fontFamily; + this.fontSelectionStrategy = fontSelectionStrategy; + this.fontStretch = fontStretch; + this.fontStyle = fontStyle; + this.fontVariant = fontVariant; + this.fontWeight = fontWeight; this.fontSize = fontSize; this.fontSizeAdjust = fontSizeAdjust; } @@ -232,53 +115,59 @@ public final class CommonFont { EnumProperty fontStyle = (EnumProperty) pList.get(Constants.PR_FONT_STYLE); EnumProperty fontVariant = (EnumProperty) pList.get(Constants.PR_FONT_VARIANT); EnumProperty fontWeight = (EnumProperty) pList.get(Constants.PR_FONT_WEIGHT); - CachedCommonFont cachedCommonFont = CachedCommonFont.getInstance( - fontFamily, - fontSelectionStrategy, - fontStretch, - fontStyle, - fontVariant, - fontWeight); - Numeric fontSizeAdjust = pList.get(Constants.PR_FONT_SIZE_ADJUST).getNumeric(); Length fontSize = pList.get(Constants.PR_FONT_SIZE).getLength(); - CommonFont cf = new CommonFont(cachedCommonFont, fontSize, fontSizeAdjust); - if (fontSize.isAbsolute() && fontSizeAdjust.isAbsolute()) { - return cache.fetch(cf); - } else { - return cf; - } + CommonFont commonFont = new CommonFont(fontFamily, + fontSelectionStrategy, + fontStretch, + fontStyle, + fontVariant, + fontWeight, + fontSize, + fontSizeAdjust); + + return cache.fetch(commonFont); } + /** @return an array with the font-family names */ + private String[] getFontFamily() { + List lst = fontFamily.getList(); + String[] fontFamily = new String[lst.size()]; + for (int i = 0, c = lst.size(); i < c; i++) { + fontFamily[i] = ((Property)lst.get(i)).getString(); + } + return fontFamily; + } + /** @return the first font-family name in the list */ public String getFirstFontFamily() { - return cachedCommonFont.getFirstFontFamily(); + return ((Property) fontFamily.list.get(0)).getString(); } /** @return the "font-selection-strategy" property */ public int getFontSelectionStrategy() { - return cachedCommonFont.fontSelectionStrategy.getEnum(); + return fontSelectionStrategy.getEnum(); } /** @return the "font-stretch" property */ public int getFontStretch() { - return cachedCommonFont.fontStretch.getEnum(); + return fontStretch.getEnum(); } /** @return the "font-style" property */ public int getFontStyle() { - return cachedCommonFont.fontStyle.getEnum(); + return fontStyle.getEnum(); } /** @return the "font-variant" property */ public int getFontVariant() { - return cachedCommonFont.fontVariant.getEnum(); + return fontVariant.getEnum(); } /** @return the "font-weight" property */ public int getFontWeight() { - return cachedCommonFont.fontWeight.getEnum(); + return fontWeight.getEnum(); } /** @@ -290,7 +179,7 @@ public final class CommonFont { */ public FontTriplet[] getFontState(FontInfo fontInfo) { int font_weight; - switch (cachedCommonFont.fontWeight.getEnum()) { + switch (fontWeight.getEnum()) { case Constants.EN_100: font_weight = 100; break; case Constants.EN_200: font_weight = 200; break; case Constants.EN_300: font_weight = 300; break; @@ -304,7 +193,7 @@ public final class CommonFont { } String style; - switch (cachedCommonFont.fontStyle.getEnum()) { + switch (fontStyle.getEnum()) { case Constants.EN_ITALIC: style = "italic"; break; @@ -321,32 +210,53 @@ public final class CommonFont { // various kinds of keywords too //int fontVariant = propertyList.get("font-variant").getEnum(); FontTriplet[] triplets = fontInfo.fontLookup( - cachedCommonFont.getFontFamily(), + getFontFamily(), style, font_weight); return triplets; } /** {@inheritDoc} */ public boolean equals(Object o) { + + if (o == null) { + return false; + } + if (this == o) { return true; } if (o instanceof CommonFont) { CommonFont cf = (CommonFont) o; - return (cf.cachedCommonFont == this.cachedCommonFont - && cf.fontSize == this.fontSize - && cf.fontSizeAdjust == this.fontSizeAdjust); + return (cf.fontFamily == this.fontFamily) + && (cf.fontSelectionStrategy == this.fontSelectionStrategy) + && (cf.fontStretch == this.fontStretch) + && (cf.fontStyle == this.fontStyle) + && (cf.fontVariant == this.fontVariant) + && (cf.fontWeight == this.fontWeight) + && (cf.fontSize == this.fontSize) + && (cf.fontSizeAdjust == this.fontSizeAdjust); } return false; + } /** {@inheritDoc} */ public int hashCode() { - int hash = 17; - hash = 37 * hash + cachedCommonFont.hashCode(); - hash = 37 * hash + fontSize.hashCode(); - hash = 37 * hash + fontSizeAdjust.hashCode(); + + if (this.hash == -1) { + int hash = 17; + hash = 37 * hash + (fontSize == null ? 0 : fontSize.hashCode()); + hash = 37 * hash + (fontSizeAdjust == null ? 0 : fontSizeAdjust.hashCode()); + hash = 37 * hash + (fontFamily == null ? 0 : fontFamily.hashCode()); + hash = 37 * hash + (fontSelectionStrategy == null ? 0 : fontSelectionStrategy.hashCode()); + hash = 37 * hash + (fontStretch == null ? 0 : fontStretch.hashCode()); + hash = 37 * hash + (fontStyle == null ? 0 : fontStyle.hashCode()); + hash = 37 * hash + (fontVariant == null ? 0 : fontVariant.hashCode()); + hash = 37 * hash + (fontStretch == null ? 0 : fontStretch.hashCode()); + this.hash = hash; + } return hash; + } } diff --git a/src/java/org/apache/fop/fo/properties/NumberProperty.java b/src/java/org/apache/fop/fo/properties/NumberProperty.java index 0ba5300ae..aa4791889 100644 --- a/src/java/org/apache/fop/fo/properties/NumberProperty.java +++ b/src/java/org/apache/fop/fo/properties/NumberProperty.java @@ -91,7 +91,7 @@ public final class NumberProperty extends Property implements Numeric { } Number val = p.getNumber(); if (val != null) { - int i = val.intValue(); + int i = Math.round(val.floatValue()); if (i <= 0) { i = 1; } diff --git a/src/java/org/apache/fop/fo/properties/PropertyCache.java b/src/java/org/apache/fop/fo/properties/PropertyCache.java index 2c51bc081..b5f4f90ba 100644 --- a/src/java/org/apache/fop/fo/properties/PropertyCache.java +++ b/src/java/org/apache/fop/fo/properties/PropertyCache.java @@ -36,6 +36,12 @@ public final class PropertyCache { /** bitmask to apply to the hash to get to the * corresponding cache segment */ private static final int SEGMENT_MASK = 0x1F; + /** + * Indicates whether the cache should be used at all + * Can be controlled by the system property: + * org.apache.fop.fo.properties.use-cache + */ + private final boolean useCache; /** the segments array (length = 32) */ private CacheSegment[] segments = new CacheSegment[SEGMENT_MASK + 1]; @@ -262,8 +268,13 @@ public final class PropertyCache { * @param c Runtime type of the objects that will be stored in the cache */ public PropertyCache(Class c) { - for (int i = SEGMENT_MASK + 1; --i >= 0;) { - segments[i] = new CacheSegment(); + this.useCache = Boolean.valueOf(System.getProperty( + "org.apache.fop.fo.properties.use-cache", "true") + ).booleanValue(); + if (useCache) { + for (int i = SEGMENT_MASK + 1; --i >= 0;) { + segments[i] = new CacheSegment(); + } } this.runtimeType = c; } @@ -278,6 +289,10 @@ public final class PropertyCache { * @return the cached instance */ private Object fetch(Object obj) { + if (!this.useCache) { + return obj; + } + if (obj == null) { return null; } @@ -291,7 +306,7 @@ public final class PropertyCache { } /** - * Checks if the given <code>Property</code> is present in the cache - + * Checks if the given {@link Property} is present in the cache - * if so, returns a reference to the cached instance. * Otherwise the given object is added to the cache and returned. * @@ -304,7 +319,7 @@ public final class PropertyCache { } /** - * Checks if the given <code>CommonHyphenation</code> is present in the cache - + * Checks if the given {@link CommonHyphenation} is present in the cache - * if so, returns a reference to the cached instance. * Otherwise the given object is added to the cache and returned. * @@ -317,20 +332,7 @@ public final class PropertyCache { } /** - * Checks if the given <code>CachedCommonFont</code> is present in the cache - - * if so, returns a reference to the cached instance. - * Otherwise the given object is added to the cache and returned. - * - * @param ccf the CachedCommonFont instance to check for - * @return the cached instance - */ - public final CommonFont.CachedCommonFont fetch(CommonFont.CachedCommonFont ccf) { - - return (CommonFont.CachedCommonFont) fetch((Object) ccf); - } - - /** - * Checks if the given <code>CommonFont</code> is present in the cache - + * Checks if the given {@link CommonFont} is present in the cache - * if so, returns a reference to the cached instance. * Otherwise the given object is added to the cache and returned. * diff --git a/src/java/org/apache/fop/fonts/CustomFontCollection.java b/src/java/org/apache/fop/fonts/CustomFontCollection.java index 3c0ffbed4..5e5a61189 100644 --- a/src/java/org/apache/fop/fonts/CustomFontCollection.java +++ b/src/java/org/apache/fop/fonts/CustomFontCollection.java @@ -15,7 +15,8 @@ * limitations under the License. */ -/* $Id: $ */ +/* $Id$ */ + package org.apache.fop.fonts; import java.util.List; @@ -26,7 +27,7 @@ import org.apache.fop.render.PrintRenderer; * Sets up a set of custom (embedded) fonts */ public class CustomFontCollection implements FontCollection { - + private PrintRenderer renderer = null; /** @@ -51,7 +52,7 @@ public class CustomFontCollection implements FontCollection { //Ensure that we have minimal font resolution capabilities resolver = FontManager.createMinimalFontResolver(); } - + String internalName = null; //FontReader reader = null; @@ -67,7 +68,7 @@ public class CustomFontCollection implements FontCollection { reader.setFontEmbedPath(configFontInfo.getEmbedFile()); fontInfo.addMetrics(internalName, reader.getFont()); */ - + LazyFont font = new LazyFont(embedFontInfo, resolver); fontInfo.addMetrics(internalName, font); @@ -78,5 +79,5 @@ public class CustomFontCollection implements FontCollection { } } return num; - } -}
\ No newline at end of file + } +} diff --git a/src/java/org/apache/fop/fonts/EmbedFontInfo.java b/src/java/org/apache/fop/fonts/EmbedFontInfo.java index 0d0bcafdb..9496b8459 100644 --- a/src/java/org/apache/fop/fonts/EmbedFontInfo.java +++ b/src/java/org/apache/fop/fonts/EmbedFontInfo.java @@ -16,7 +16,7 @@ */ /* $Id$ */ - + package org.apache.fop.fonts; import java.io.IOException; @@ -27,17 +27,17 @@ import java.util.List; * FontInfo contains meta information on fonts (where is the metrics file etc.) */ public class EmbedFontInfo implements Serializable { - + /** Serialization Version UID */ private static final long serialVersionUID = 8755432068669997367L; - + /** filename of the metrics file */ protected String metricsFile; /** filename of the main font file */ protected String embedFile; /** false, to disable kerning */ protected boolean kerning; - + /** the PostScript name of the font */ protected String postScriptName = null; /** the sub-fontname of the font (used for TrueType Collections, null otherwise) */ @@ -47,7 +47,7 @@ public class EmbedFontInfo implements Serializable { private List/*<FontTriplet>*/ fontTriplets = null; private transient boolean embedded = true; - + /** * Main constructor * @param metricsFile Path to the xml file containing font metrics @@ -64,7 +64,7 @@ public class EmbedFontInfo implements Serializable { this.fontTriplets = fontTriplets; this.subFontName = subFontName; } - + /** * Returns the path to the metrics file * @return the metrics file path @@ -88,16 +88,16 @@ public class EmbedFontInfo implements Serializable { public boolean getKerning() { return kerning; } - + /** - * Returns the sub-font name name of the font. This is primarily used for TrueType Collections - * to select one of the sub-fonts. For all other fonts, this is always null. + * Returns the sub-font name of the font. This is primarily used for TrueType Collections + * to select one of the sub-fonts. For all other fonts, this is always null. * @return the sub-font name (or null) */ public String getSubFontName() { return this.subFontName; } - + /** * Returns the PostScript name of the font. * @return the PostScript name @@ -105,7 +105,7 @@ public class EmbedFontInfo implements Serializable { public String getPostScriptName() { return postScriptName; } - + /** * Sets the PostScript name of the font * @param postScriptName the PostScript name @@ -113,7 +113,7 @@ public class EmbedFontInfo implements Serializable { public void setPostScriptName(String postScriptName) { this.postScriptName = postScriptName; } - + /** * Returns the list of font triplets associated with this font. * @return List of font triplets @@ -121,7 +121,7 @@ public class EmbedFontInfo implements Serializable { public List/*<FontTriplet>*/ getFontTriplets() { return fontTriplets; } - + /** * Indicates whether the font is only referenced rather than embedded. * @return true if the font is embedded, false if it is referenced. @@ -133,7 +133,7 @@ public class EmbedFontInfo implements Serializable { return this.embedded; } } - + /** * Defines whether the font is embedded or not. * @param value true to embed the font, false to reference it @@ -141,19 +141,19 @@ public class EmbedFontInfo implements Serializable { public void setEmbedded(boolean value) { this.embedded = value; } - + private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); this.embedded = true; } - + /** {@inheritDoc} */ public String toString() { return "metrics-url=" + metricsFile + ",embed-url=" + embedFile + ", kerning=" + kerning + ", " + "font-triplet=" + fontTriplets + (getSubFontName() != null ? ", sub-font=" + getSubFontName() : "") - + (isEmbedded() ? "" : ", NOT embedded"); + + (isEmbedded() ? "" : ", NOT embedded"); } } diff --git a/src/java/org/apache/fop/fonts/Font.java b/src/java/org/apache/fop/fonts/Font.java index 4ce3cbfbd..3a0d82046 100644 --- a/src/java/org/apache/fop/fonts/Font.java +++ b/src/java/org/apache/fop/fonts/Font.java @@ -32,10 +32,10 @@ public class Font { /** Extra Bold font weight */ public static final int WEIGHT_EXTRA_BOLD = 800; - + /** Bold font weight */ public static final int WEIGHT_BOLD = 700; - + /** Normal font weight */ public static final int WEIGHT_NORMAL = 400; @@ -56,7 +56,7 @@ public class Font { /** Default selection priority */ public static final int PRIORITY_DEFAULT = 0; - + /** Default fallback key */ public static final FontTriplet DEFAULT_FONT = new FontTriplet( "any", STYLE_NORMAL, WEIGHT_NORMAL, PRIORITY_DEFAULT); @@ -96,7 +96,7 @@ public class Font { public FontMetrics getFontMetrics() { return this.metric; } - + /** * Returns the font's ascender. * @return the ascender @@ -128,7 +128,7 @@ public class Font { public String getFontName() { return fontName; } - + /** @return the font triplet that selected this font */ public FontTriplet getFontTriplet() { return this.triplet; @@ -154,7 +154,7 @@ public class Font { public boolean hasKerning() { return metric.hasKerningInfo(); } - + /** * Returns the font's kerning table * @return the kerning table @@ -166,7 +166,7 @@ public class Font { return java.util.Collections.EMPTY_MAP; } } - + /** * Returns the amount of kerning between two characters. * @param ch1 first character @@ -212,12 +212,12 @@ public class Font { c = d; } else { log.warn("Glyph " + (int) c + " not available in font " + fontName); - c = '#'; + c = Typeface.NOT_FOUND; } return c; } - + /** * Determines whether this font contains a particular character/glyph. * @param c character to check diff --git a/src/java/org/apache/fop/fonts/FontCache.java b/src/java/org/apache/fop/fonts/FontCache.java index ba9529c02..f2ca741ff 100644 --- a/src/java/org/apache/fop/fonts/FontCache.java +++ b/src/java/org/apache/fop/fonts/FontCache.java @@ -43,7 +43,7 @@ import org.apache.fop.util.LogUtil; * Fop cache (currently only used for font info caching) */ public final class FontCache implements Serializable { - + /** * Serialization Version UID. Change this value if you want to make sure the user's cache * file is purged after an update. @@ -59,13 +59,13 @@ public final class FontCache implements Serializable { /** font cache file path */ private static final String DEFAULT_CACHE_FILENAME = "fop-fonts.cache"; - + /** has this cache been changed since it was last read? */ private transient boolean changed = false; - + /** change lock */ private transient Object changeLock = new Object(); - + /** master mapping of font url -> font info. This needs to be * a list, since a TTC file may contain more than 1 font. */ private Map/*<String, CachedFontFile>*/ fontfileMap = null; @@ -96,7 +96,7 @@ public final class FontCache implements Serializable { } return null; } - + /** * Returns the default font cache file. * @param forWriting true if the user directory should be created @@ -113,7 +113,7 @@ public final class FontCache implements Serializable { } return new File(FOP_USER_DIR); } - + /** * Reads the default font cache file and returns its contents. * @return the font cache deserialized from the file (or null if no cache file exists or if @@ -122,7 +122,7 @@ public final class FontCache implements Serializable { public static FontCache load() { return loadFrom(getDefaultCacheFile(false)); } - + /** * Reads a font cache file and returns its contents. * @param cacheFile the cache file @@ -145,11 +145,11 @@ public final class FontCache implements Serializable { } } catch (ClassNotFoundException e) { //We don't really care about the exception since it's just a cache file - log.warn("Could not read font cache. Discarding font cache file. Reason: " + log.warn("Could not read font cache. Discarding font cache file. Reason: " + e.getMessage()); } catch (IOException ioe) { //We don't really care about the exception since it's just a cache file - log.warn("I/O exception while reading font cache (" + ioe.getMessage() + log.warn("I/O exception while reading font cache (" + ioe.getMessage() + "). Discarding font cache file."); try { cacheFile.delete(); @@ -160,7 +160,7 @@ public final class FontCache implements Serializable { } return null; } - + /** * Writes the font cache to disk. * @throws FOPException fop exception @@ -168,10 +168,10 @@ public final class FontCache implements Serializable { public void save() throws FOPException { saveTo(getDefaultCacheFile(true)); } - + /** * Writes the font cache to disk. - * @param cacheFile the file to write to + * @param cacheFile the file to write to * @throws FOPException fop exception */ public void saveTo(File cacheFile) throws FOPException { @@ -219,7 +219,7 @@ public final class FontCache implements Serializable { public boolean hasChanged() { return this.changed; } - + /** * is this font in the cache? * @param embedUrl font info @@ -248,11 +248,11 @@ public final class FontCache implements Serializable { * Tries to identify a File instance from an array of URLs. If there's no file URL in the * array, the method returns null. * @param urls array of possible font urls - * @return file font file + * @return file font file */ public static File getFileFromUrls(String[] urls) { for (int i = 0; i < urls.length; i++) { - String urlStr = urls[i]; + String urlStr = urls[i]; if (urlStr != null) { File fontFile = null; if (urlStr.startsWith("file:")) { @@ -270,7 +270,7 @@ public final class FontCache implements Serializable { return fontFile; } } - } + } return null; } @@ -280,7 +280,7 @@ public final class FontCache implements Serializable { } return fontfileMap; } - + /** * Adds a font info to cache * @param fontInfo font info @@ -313,7 +313,7 @@ public final class FontCache implements Serializable { /** * Returns a font from the cache. * @param embedUrl font info - * @return CachedFontFile object + * @return CachedFontFile object */ public CachedFontFile getFontFile(String embedUrl) { if (containsFont(embedUrl)) { @@ -321,7 +321,7 @@ public final class FontCache implements Serializable { } return null; } - + /** * Returns the EmbedFontInfo instances belonging to a font file. If the font file was * modified since it was cached the entry is removed and null is returned. @@ -338,7 +338,7 @@ public final class FontCache implements Serializable { return null; } } - + /** * removes font from cache * @param embedUrl embed url @@ -354,7 +354,7 @@ public final class FontCache implements Serializable { } } } - + /** * has this font previously failed to load? * @param embedUrl embed url @@ -370,7 +370,7 @@ public final class FontCache implements Serializable { // from failed font map for now getFailedFontMap().remove(embedUrl); changed = true; - } + } } return true; } @@ -397,7 +397,7 @@ public final class FontCache implements Serializable { } return failedFontMap; } - + /** * Clears font cache */ @@ -411,7 +411,7 @@ public final class FontCache implements Serializable { changed = true; } } - + /** * Retrieve the last modified date/time of a URL. * @param url the URL @@ -432,7 +432,7 @@ public final class FontCache implements Serializable { return 0; } } - + private static class CachedFontFile implements Serializable { private static final long serialVersionUID = 4524237324330578883L; @@ -440,18 +440,18 @@ public final class FontCache implements Serializable { private long lastModified = -1; private Map/*<String, EmbedFontInfo>*/ filefontsMap = null; - + public CachedFontFile(long lastModified) { setLastModified(lastModified); } private Map/*<String, EmbedFontInfo>*/ getFileFontsMap() { if (filefontsMap == null) { - filefontsMap = new java.util.HashMap/*<String, EmbedFontInfo>*/(); + filefontsMap = new java.util.HashMap/*<String, EmbedFontInfo>*/(); } return filefontsMap; } - + void put(EmbedFontInfo efi) { getFileFontsMap().put(efi.getPostScriptName(), efi); } @@ -467,7 +467,7 @@ public final class FontCache implements Serializable { return (EmbedFontInfo[])getFileFontsMap().values().toArray( new EmbedFontInfo[getFileFontsMap().size()]); } - + /** * Gets the modified timestamp for font file (not always available) * @return modified timestamp @@ -478,15 +478,15 @@ public final class FontCache implements Serializable { /** * Gets the modified timestamp for font file - * (used for the purposes of font info caching) + * (used for the purposes of font info caching) * @param lastModified modified font file timestamp */ public void setLastModified(long lastModified) { this.lastModified = lastModified; } - + /** - * @return string representation of this object + * @return string representation of this object * {@inheritDoc} */ public String toString() { diff --git a/src/java/org/apache/fop/fonts/FontCollection.java b/src/java/org/apache/fop/fonts/FontCollection.java index c83f2523a..331d2639f 100644 --- a/src/java/org/apache/fop/fonts/FontCollection.java +++ b/src/java/org/apache/fop/fonts/FontCollection.java @@ -15,7 +15,7 @@ * limitations under the License. */ -/* $Id: $ */ +/* $Id$ */ package org.apache.fop.fonts; diff --git a/src/java/org/apache/fop/fonts/FontDescriptor.java b/src/java/org/apache/fop/fonts/FontDescriptor.java index 73cb235e8..841d99de2 100644 --- a/src/java/org/apache/fop/fonts/FontDescriptor.java +++ b/src/java/org/apache/fop/fonts/FontDescriptor.java @@ -16,12 +16,12 @@ */ /* $Id$ */ - + package org.apache.fop.fonts; /** * This interface enhances the font metrics interface with access methods to - * value needed to register fonts in various target formats like PDF or + * value needed to register fonts in various target formats like PDF or * PostScript. */ public interface FontDescriptor extends FontMetrics { @@ -31,55 +31,55 @@ public interface FontDescriptor extends FontMetrics { * @return the ascender */ int getAscender(); - - + + /** * Returns the capital height of the font. * @return the capital height */ int getCapHeight(); - - + + /** * Returns the descender value of the font. (Descent in pdf spec) * @return the descender value */ int getDescender(); - - + + /** * Returns the flags for the font. (See pdf spec) * @return the flags */ int getFlags(); - - + + /** * Returns the font's bounding box. * @return the bounding box */ int[] getFontBBox(); - - + + /** * Returns the italic angle for the font. * @return the italic angle */ int getItalicAngle(); - - + + /** * Returns the vertical stem width for the font. * @return the vertical stem width */ int getStemV(); - + /** * Indicates if this font may be embedded. * @return True, if embedding is possible/permitted */ boolean isEmbeddable(); - - + + } diff --git a/src/java/org/apache/fop/fonts/FontInfo.java b/src/java/org/apache/fop/fonts/FontInfo.java index 9ac4c1e6a..4e327c782 100644 --- a/src/java/org/apache/fop/fonts/FontInfo.java +++ b/src/java/org/apache/fop/fonts/FontInfo.java @@ -39,34 +39,34 @@ import org.apache.commons.logging.LogFactory; * implemented. */ public class FontInfo { - + private static final FontTriplet[] TRIPLETS_TYPE = new FontTriplet[1]; - + /** logging instance */ protected static Log log = LogFactory.getLog(FontInfo.class); /** Map containing fonts that have been used */ private Map/*<String,FontMetrics>*/ usedFonts = null; //(String = font key) - + /** look up a font-triplet to find a font-name */ private Map/*<FontTriplet,String>*/ triplets = null; //(String = font key) - + /** look up a font-triplet to find its priority * (only used inside addFontProperties()) */ private Map/*<FontTriplet,Integer>*/ tripletPriorities = null; //Map<FontTriplet,Integer> /** look up a font-name to get a font (that implements FontMetrics at least) */ private Map/*<String,FontMetrics>*/ fonts = null; //(String = font key) - + /** - * a collection of missing fonts; used to make sure the user gets + * a collection of missing fonts; used to make sure the user gets * a warning for a missing font only once (not every time the font is used) */ private Set/*<FontTriplet>*/ loggedFontKeys = null; /** Cache for Font instances. */ private Map/*<FontTriplet, Map>*/ fontInstanceCache = null; - + /** Event listener for font events */ private FontEventListener eventListener = null; @@ -79,7 +79,7 @@ public class FontInfo { this.fonts = new java.util.HashMap/*<String, FontMetrics>*/(); this.usedFonts = new java.util.HashMap/*<String,FontMetrics>*/(); } - + /** * Sets the font event listener that can be used to receive events about particular events * in this class. @@ -88,9 +88,9 @@ public class FontInfo { public void setEventListener(FontEventListener listener) { this.eventListener = listener; } - + /** - * Checks if the font setup is valid (At least the ultimate fallback font + * Checks if the font setup is valid (At least the ultimate fallback font * must be registered.) * @return True if valid */ @@ -188,7 +188,7 @@ public class FontInfo { * @param family font family * @param style font style * @param weight font weight - * @param substFont true if the font may be substituted with the + * @param substFont true if the font may be substituted with the * default font if not found * @return internal font triplet key */ @@ -196,8 +196,8 @@ public class FontInfo { int weight, boolean substFont) { if (log.isTraceEnabled()) { log.trace("Font lookup: " + family + " " + style + " " + weight); - } - + } + FontTriplet startKey = createFontKey(family, style, weight); FontTriplet fontTriplet = startKey; // first try given parameters @@ -227,7 +227,7 @@ public class FontInfo { return key; } } - + // adjust weight, favouring normal or bold key = findAdjustWeight(family, style, weight); internalFontKey = getInternalFontKey(key); @@ -235,7 +235,7 @@ public class FontInfo { if (!substFont && internalFontKey == null) { return null; } - + // only if the font may be substituted // fallback 1: try the same font-family and weight with default style if (internalFontKey == null && style != Font.STYLE_NORMAL) { @@ -260,14 +260,14 @@ public class FontInfo { } } } - + // fallback 2: try the same font-family with default style and weight /* obsolete: replaced by the loop above if (f == null) { key = createFontKey(family, Font.STYLE_NORMAL, Font.WEIGHT_NORMAL); f = getInternalFontKey(key); }*/ - + // fallback 3: try any family with orig style/weight if (internalFontKey == null) { return fuzzyFontLookup("any", style, weight, startKey, false); @@ -285,7 +285,7 @@ public class FontInfo { return null; } } - + /** * Tells this class that the font with the given internal name has been used. * @param internalName the internal font name (F1, F2 etc.) @@ -293,7 +293,7 @@ public class FontInfo { public void useFont(String internalName) { usedFonts.put(internalName, fonts.get(internalName)); } - + private Map/*<FontTriplet,Map<Integer,Font>>*/ getFontInstanceCache() { if (fontInstanceCache == null) { fontInstanceCache = new java.util.HashMap/*<FontTriplet, Map<Integer,Font>>*/(); @@ -302,7 +302,7 @@ public class FontInfo { } /** - * Retrieves a (possibly cached) Font instance based on a FontTriplet and a font size. + * Retrieves a (possibly cached) Font instance based on a FontTriplet and a font size. * @param triplet the font triplet designating the requested font * @param fontSize the font size * @return the requested Font instance @@ -325,7 +325,7 @@ public class FontInfo { } return font; } - + /** * Lookup a font. * <br> @@ -342,7 +342,7 @@ public class FontInfo { int weight) { return fontLookup(family, style, weight, true); } - + /** * Looks up a set of fonts. * <br> @@ -383,14 +383,14 @@ public class FontInfo { "fontLookup must return an array with at least one " + "FontTriplet on the last call. Lookup: " + sb.toString()); } - + private Set/*<FontTriplet>*/ getLoggedFontKeys() { if (loggedFontKeys == null) { loggedFontKeys = new java.util.HashSet/*<FontTriplet>*/(); } return loggedFontKeys; } - + private void notifyFontReplacement(FontTriplet replacedKey, FontTriplet newKey) { if (!getLoggedFontKeys().contains(replacedKey)) { getLoggedFontKeys().add(replacedKey); @@ -402,7 +402,7 @@ public class FontInfo { } } } - + /** * Find a font with a given family and style by trying * different font weights according to the spec. @@ -476,7 +476,7 @@ public class FontInfo { public String getInternalFontKey(FontTriplet triplet) { return (String)triplets.get(triplet); } - + /** * Creates a key from the given strings. * @param family font family @@ -504,7 +504,7 @@ public class FontInfo { public Map/*<FontTriplet,String>*/ getFontTriplets() { return this.triplets; } - + /** * This is used by the renderers to retrieve all the * fonts used in the document. @@ -541,7 +541,7 @@ public class FontInfo { } return foundTriplets; } - + /** * Returns the first triplet matching the given font name. * As there may be multiple triplets matching the font name @@ -557,7 +557,7 @@ public class FontInfo { } return null; } - + /** * Returns the font style for a particular font. * There may be multiple font styles matching this font. Only the first @@ -574,7 +574,7 @@ public class FontInfo { return ""; } } - + /** * Returns the font weight for a particular font. * There may be multiple font weights matching this font. Only the first @@ -591,14 +591,14 @@ public class FontInfo { return 0; } } - + /** - * Diagnostic method for logging all registered fonts to System.out. + * Diagnostic method for logging all registered fonts to System.out. */ public void dumpAllTripletsToSystemOut() { System.out.print(toString()); } - + /** * {@inheritDoc} */ @@ -608,7 +608,7 @@ public class FontInfo { while (iter.hasNext()) { FontTriplet triplet = (FontTriplet)iter.next(); String key = getInternalFontKey(triplet); - FontMetrics metrics = getMetricsFor(key); + FontMetrics metrics = getMetricsFor(key); entries.add(triplet.toString() + " -> " + key + " -> " + metrics.getFontName() + "\n"); } StringBuffer stringBuffer = new StringBuffer(); diff --git a/src/java/org/apache/fop/fonts/FontManager.java b/src/java/org/apache/fop/fonts/FontManager.java index d25d2d390..c180fbcc9 100644 --- a/src/java/org/apache/fop/fonts/FontManager.java +++ b/src/java/org/apache/fop/fonts/FontManager.java @@ -15,7 +15,7 @@ * limitations under the License. */ -/* $Id: $ */ +/* $Id$ */ package org.apache.fop.fonts; @@ -29,7 +29,7 @@ import org.apache.fop.fonts.FontTriplet.Matcher; import org.apache.fop.fonts.substitute.FontSubstitutions; import org.apache.fop.render.PrintRenderer; -// TODO: Refactor fonts package so major font activities (autodetection etc) +// TODO: Refactor fonts package so major font activities (autodetection etc) // are all centrally managed and delegated from this class, also remove dependency on FopFactory // and start using POJO config/properties type classes @@ -62,7 +62,7 @@ public class FontManager { public FontManager() { setUseCache(DEFAULT_USE_CACHE); } - + /** * Sets the font base URL. * @param fontBase font base URL @@ -90,7 +90,7 @@ public class FontManager { * @param value true if kerning should be activated */ public void setBase14KerningEnabled(boolean value) { - this.enableBase14Kerning = value; + this.enableBase14Kerning = value; } /** @@ -100,7 +100,7 @@ public class FontManager { public void setFontSubstitutions(FontSubstitutions substitutions) { this.fontSubstitutions = substitutions; } - + /** * Returns the font substitution catalog * @return the font substitution catalog @@ -142,7 +142,7 @@ public class FontManager { public FontCache getFontCache() { return this.fontCache; } - + /** * Sets up the fonts on a given PrintRenderer * @param renderer a print renderer @@ -151,7 +151,7 @@ public class FontManager { FontInfo fontInfo = renderer.getFontInfo(); int startNum = 1; - + // Configure base 14 fonts org.apache.fop.fonts.base14.Base14FontCollection base14FontCollection = new org.apache.fop.fonts.base14.Base14FontCollection(this.enableBase14Kerning); @@ -161,7 +161,7 @@ public class FontManager { org.apache.fop.fonts.CustomFontCollection customFontCollection = new org.apache.fop.fonts.CustomFontCollection(renderer); startNum = customFontCollection.setup(startNum, fontInfo); - + // Make any defined substitutions in the font info getFontSubstitutions().adjustFontInfo(fontInfo); } @@ -179,7 +179,7 @@ public class FontManager { // setup base 14 fonts org.apache.fop.render.java2d.Base14FontCollection base14FontCollection = new org.apache.fop.render.java2d.Base14FontCollection(graphics2D); - + // setup any custom font collection startNum = base14FontCollection.setup(startNum, fontInfo); @@ -194,7 +194,7 @@ public class FontManager { startNum = configuredFontCollection.setup(startNum, fontInfo); // Make any defined substitutions in the font info - getFontSubstitutions().adjustFontInfo(fontInfo); + getFontSubstitutions().adjustFontInfo(fontInfo); } /** @return a new FontResolver to be used by the font subsystem */ diff --git a/src/java/org/apache/fop/fonts/FontManagerConfigurator.java b/src/java/org/apache/fop/fonts/FontManagerConfigurator.java index d44470e6b..7f1c267da 100644 --- a/src/java/org/apache/fop/fonts/FontManagerConfigurator.java +++ b/src/java/org/apache/fop/fonts/FontManagerConfigurator.java @@ -15,7 +15,7 @@ * limitations under the License. */ -/* $Id: $ */ +/* $Id$ */ package org.apache.fop.fonts; @@ -37,12 +37,12 @@ import org.apache.fop.util.LogUtil; * Configurator of the FontManager */ public class FontManagerConfigurator { - + /** logger instance */ private static Log log = LogFactory.getLog(FontManagerConfigurator.class); private Configuration cfg; - + /** * Main constructor * @param cfg the font manager configuration object @@ -58,7 +58,7 @@ public class FontManagerConfigurator { * @throws FOPException if an exception occurs while processing the configuration */ public void configure(FontManager fontManager, boolean strict) throws FOPException { - + // caching (fonts) if (cfg.getChild("use-cache", false) != null) { try { @@ -84,12 +84,12 @@ public class FontManagerConfigurator { Configuration substitutionsCfg = fontsCfg.getChild("substitutions", false); if (substitutionsCfg != null) { FontSubstitutionsConfigurator fontSubstitutionsConfigurator - = new FontSubstitutionsConfigurator(substitutionsCfg); + = new FontSubstitutionsConfigurator(substitutionsCfg); FontSubstitutions substitutions = new FontSubstitutions(); fontSubstitutionsConfigurator.configure(substitutions); fontManager.setFontSubstitutions(substitutions); } - + // referenced fonts (fonts which are not to be embedded) Configuration referencedFontsCfg = fontsCfg.getChild("referenced-fonts", false); if (referencedFontsCfg != null) { @@ -121,11 +121,11 @@ public class FontManagerConfigurator { private static class OrFontTripletMatcher implements FontTriplet.Matcher { private FontTriplet.Matcher[] matchers; - + public OrFontTripletMatcher(FontTriplet.Matcher[] matchers) { this.matchers = matchers; } - + /** {@inheritDoc} */ public boolean matches(FontTriplet triplet) { for (int i = 0, c = matchers.length; i < c; i++) { @@ -135,22 +135,22 @@ public class FontManagerConfigurator { } return false; } - + } - + private static class FontFamilyRegExFontTripletMatcher implements FontTriplet.Matcher { private Pattern regex; - + public FontFamilyRegExFontTripletMatcher(String regex) { this.regex = Pattern.compile(regex); } - + /** {@inheritDoc} */ public boolean matches(FontTriplet triplet) { return regex.matcher(triplet.getName()).matches(); } - + } - + } diff --git a/src/java/org/apache/fop/fonts/FontSetup.java b/src/java/org/apache/fop/fonts/FontSetup.java index 9aa8440db..7629e67c3 100644 --- a/src/java/org/apache/fop/fonts/FontSetup.java +++ b/src/java/org/apache/fop/fonts/FontSetup.java @@ -182,7 +182,7 @@ public class FontSetup { // All base 14 configured now, so any custom embedded fonts start from 15 final int startNum = 15; - + /* Add configured fonts */ addConfiguredFonts(fontInfo, embedFontInfoList, startNum, resolver); } @@ -204,7 +204,7 @@ public class FontSetup { //Ensure that we have minimal font resolution capabilities resolver = createMinimalFontResolver1(); } - + String internalName = null; for (int i = 0; i < embedFontInfoList.size(); i++) { @@ -212,7 +212,7 @@ public class FontSetup { internalName = "F" + num; num++; - + LazyFont font = new LazyFont(embedFontInfo, resolver); fontInfo.addMetrics(internalName, font); @@ -234,5 +234,5 @@ public class FontSetup { return new StreamSource(href); } }; - } + } } diff --git a/src/java/org/apache/fop/fonts/FontTriplet.java b/src/java/org/apache/fop/fonts/FontTriplet.java index a989cf0f7..906698e53 100644 --- a/src/java/org/apache/fop/fonts/FontTriplet.java +++ b/src/java/org/apache/fop/fonts/FontTriplet.java @@ -16,7 +16,7 @@ */ /* $Id$ */ - + package org.apache.fop.fonts; import java.io.Serializable; @@ -25,15 +25,15 @@ import java.io.Serializable; * FontTriplet contains information on name, style and weight of one font */ public class FontTriplet implements Comparable, Serializable { - + /** serial version UID */ private static final long serialVersionUID = 1168991106658033508L; - + private String name; private String style; private int weight; private int priority; // priority of this triplet/font mapping - + //This is only a cache private transient String key; @@ -78,7 +78,7 @@ public class FontTriplet implements Comparable, Serializable { public String getStyle() { return style; } - + /** @return the font weight */ public int getWeight() { return weight; @@ -96,7 +96,7 @@ public class FontTriplet implements Comparable, Serializable { } return this.key; } - + /** {@inheritDoc} */ public int compareTo(Object o) { return getKey().compareTo(((FontTriplet)o).getKey()); @@ -117,7 +117,7 @@ public class FontTriplet implements Comparable, Serializable { if (obj instanceof FontTriplet) { FontTriplet other = (FontTriplet)obj; return (getName().equals(other.getName()) - && getStyle().equals(other.getStyle()) + && getStyle().equals(other.getStyle()) && (getWeight() == other.getWeight())); } } @@ -128,13 +128,13 @@ public class FontTriplet implements Comparable, Serializable { public String toString() { return getKey(); } - - + + /** * Matcher interface for {@link FontTriplet}. */ public interface Matcher { - + /** * Indicates whether the given {@link FontTriplet} matches a particular criterium. * @param triplet the font triplet @@ -142,6 +142,6 @@ public class FontTriplet implements Comparable, Serializable { */ boolean matches(FontTriplet triplet); } - + } diff --git a/src/java/org/apache/fop/fonts/FontUtil.java b/src/java/org/apache/fop/fonts/FontUtil.java index d72e283cf..5df5707f0 100644 --- a/src/java/org/apache/fop/fonts/FontUtil.java +++ b/src/java/org/apache/fop/fonts/FontUtil.java @@ -16,7 +16,7 @@ */ /* $Id$ */ - + package org.apache.fop.fonts; /** @@ -25,7 +25,7 @@ package org.apache.fop.fonts; public class FontUtil { /** - * Parses an CSS2 (SVG and XSL-FO) font weight (normal, bold, 100-900) to + * Parses an CSS2 (SVG and XSL-FO) font weight (normal, bold, 100-900) to * an integer. * See http://www.w3.org/TR/REC-CSS2/fonts.html#propdef-font-weight * TODO: Implement "lighter" and "bolder". @@ -47,7 +47,7 @@ public class FontUtil { weight = 700; } else { throw new IllegalArgumentException( - "Illegal value for font weight: '" + "Illegal value for font weight: '" + text + "'. Use one of: 100, 200, 300, " + "400, 500, 600, 700, 800, 900, " @@ -90,7 +90,7 @@ public class FontUtil { /** font constituent names which identify a font as being of "bold" weight */ private static final String[] BOLD_WORDS = {"bold"}; /** font constituent names which identify a font as being of "extra bold" weight */ - private static final String[] EXTRA_BOLD_WORDS = {"extrabold", "extra bold", "black", + private static final String[] EXTRA_BOLD_WORDS = {"extrabold", "extra bold", "black", "heavy", "ultra", "super"}; /** @@ -102,7 +102,7 @@ public class FontUtil { if (fontName != null) { for (int i = 0; i < ITALIC_WORDS.length; i++) { if (fontName.indexOf(ITALIC_WORDS[i]) != -1) { - return Font.STYLE_ITALIC; + return Font.STYLE_ITALIC; } } } @@ -117,18 +117,18 @@ public class FontUtil { public static int guessWeight(String fontName) { // weight int weight = Font.WEIGHT_NORMAL; - + for (int i = 0; i < BOLD_WORDS.length; i++) { if (fontName.indexOf(BOLD_WORDS[i]) != -1) { weight = Font.WEIGHT_BOLD; break; - } + } } for (int i = 0; i < MEDIUM_WORDS.length; i++) { if (fontName.indexOf(MEDIUM_WORDS[i]) != -1) { weight = Font.WEIGHT_NORMAL + 100; //500 break; - } + } } //Search for "semi/demi" before "light", but after "bold" //(normally semi/demi-bold is meant, but it can also be semi/demi-light) @@ -136,19 +136,19 @@ public class FontUtil { if (fontName.indexOf(DEMI_WORDS[i]) != -1) { weight = Font.WEIGHT_BOLD - 100; //600 break; - } + } } for (int i = 0; i < EXTRA_BOLD_WORDS.length; i++) { if (fontName.indexOf(EXTRA_BOLD_WORDS[i]) != -1) { weight = Font.WEIGHT_EXTRA_BOLD; break; - } + } } for (int i = 0; i < LIGHT_WORDS.length; i++) { if (fontName.indexOf(LIGHT_WORDS[i]) != -1) { weight = Font.WEIGHT_LIGHT; break; - } + } } return weight; } diff --git a/src/java/org/apache/fop/fonts/MultiByteFont.java b/src/java/org/apache/fop/fonts/MultiByteFont.java index 5849379bd..2f3031646 100644 --- a/src/java/org/apache/fop/fonts/MultiByteFont.java +++ b/src/java/org/apache/fop/fonts/MultiByteFont.java @@ -30,7 +30,7 @@ public class MultiByteFont extends CIDFont { private static int uniqueCounter = -1; private static final DecimalFormat COUNTER_FORMAT = new DecimalFormat("00000"); - + private String ttcName = null; private String encoding = "Identity-H"; @@ -158,7 +158,7 @@ public class MultiByteFont extends CIDFont { */ private int findGlyphIndex(char c) { int idx = (int)c; - int retIdx = 0; //.notdef + int retIdx = SingleByteEncoding.NOT_FOUND_CODE_POINT; for (int i = 0; (i < bfentries.length) && retIdx == 0; i++) { if (bfentries[i].getUnicodeStart() <= idx @@ -176,17 +176,19 @@ public class MultiByteFont extends CIDFont { public char mapChar(char c) { notifyMapOperation(); int glyphIndex = findGlyphIndex(c); - + if (glyphIndex == SingleByteEncoding.NOT_FOUND_CODE_POINT) { + warnMissingGlyph(c); + glyphIndex = findGlyphIndex(Typeface.NOT_FOUND); + } if (isEmbeddable()) { glyphIndex = subset.mapSubsetChar(glyphIndex, c); } - return (char)glyphIndex; } /** {@inheritDoc} */ public boolean hasChar(char c) { - return (findGlyphIndex(c) > 0); + return (findGlyphIndex(c) != SingleByteEncoding.NOT_FOUND_CODE_POINT); } /** diff --git a/src/java/org/apache/fop/fonts/SingleByteFont.java b/src/java/org/apache/fop/fonts/SingleByteFont.java index feb1b440c..f1b7b1b48 100644 --- a/src/java/org/apache/fop/fonts/SingleByteFont.java +++ b/src/java/org/apache/fop/fonts/SingleByteFont.java @@ -21,21 +21,15 @@ package org.apache.fop.fonts; import java.util.List; import java.util.Map; -import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.xmlgraphics.fonts.Glyphs; - /** * Generic SingleByte font */ public class SingleByteFont extends CustomFont { - /** Code point that is used if no code point for a specific character has been found. */ - public static final char NOT_FOUND = '#'; - /** logger */ private static Log log = LogFactory.getLog(SingleByteFont.class); @@ -43,8 +37,6 @@ public class SingleByteFont extends CustomFont { private int[] width = null; - private Set warnedChars; - private Map unencodedCharacters; //Map<Character, UnencodedCharacter> private List additionalEncodings; @@ -115,27 +107,8 @@ public class SingleByteFont extends CustomFont { if (d != SingleByteEncoding.NOT_FOUND_CODE_POINT) { return d; } - - //Give up, character is not available - Character ch = new Character(c); - if (warnedChars == null) { - warnedChars = new java.util.HashSet(); - } - if (warnedChars.size() < 8 && !warnedChars.contains(ch)) { - warnedChars.add(ch); - if (this.eventListener != null) { - this.eventListener.glyphNotAvailable(this, c, getFontName()); - } else { - if (warnedChars.size() == 8) { - log.warn("Many requested glyphs are not available in font " + getFontName()); - } else { - log.warn("Glyph " + (int)c + " (0x" + Integer.toHexString(c) - + ", " + Glyphs.charToGlyphName(c) - + ") not available in font " + getFontName()); - } - } - } - return NOT_FOUND; + this.warnMissingGlyph(c); + return Typeface.NOT_FOUND; } private char mapUnencodedChar(char ch) { diff --git a/src/java/org/apache/fop/fonts/Typeface.java b/src/java/org/apache/fop/fonts/Typeface.java index b6c78a3b0..4a434745c 100644 --- a/src/java/org/apache/fop/fonts/Typeface.java +++ b/src/java/org/apache/fop/fonts/Typeface.java @@ -19,20 +19,38 @@ package org.apache.fop.fonts; +import java.util.Set; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.xmlgraphics.fonts.Glyphs; + /** * Base class for font classes */ public abstract class Typeface implements FontMetrics { /** - * Used to identify whether a font has been used (a character map operation is used as - * the trigger). This could just as well be a boolean but is a long out of statistical interest. + * Code point that is used if no code point for a specific character has + * been found. + */ + public static final char NOT_FOUND = '#'; + + /** logger */ + private static Log log = LogFactory.getLog(Typeface.class); + + /** + * Used to identify whether a font has been used (a character map operation + * is used as the trigger). This could just as well be a boolean but is a + * long out of statistical interest. */ private long charMapOps = 0; /** An optional event listener that receives events such as missing glyphs etc. */ protected FontEventListener eventListener; - + + private Set warnedChars; + /** * Get the encoding of the font. * @return the encoding @@ -92,5 +110,33 @@ public abstract class Typeface implements FontMetrics { this.eventListener = listener; } + /** + * Provide proper warning if a glyph is not available. + * + * @param c + * the character which is missing. + */ + protected void warnMissingGlyph(char c) { + // Give up, character is not available + Character ch = new Character(c); + if (warnedChars == null) { + warnedChars = new java.util.HashSet(); + } + if (warnedChars.size() < 8 && !warnedChars.contains(ch)) { + warnedChars.add(ch); + if (this.eventListener != null) { + this.eventListener.glyphNotAvailable(this, c, getFontName()); + } else { + if (warnedChars.size() == 8) { + log.warn("Many requested glyphs are not available in font " + + getFontName()); + } else { + log.warn("Glyph " + (int) c + " (0x" + + Integer.toHexString(c) + ", " + + Glyphs.charToGlyphName(c) + + ") not available in font " + getFontName()); + } + } + } + } } - diff --git a/src/java/org/apache/fop/fonts/autodetect/FontFileFinder.java b/src/java/org/apache/fop/fonts/autodetect/FontFileFinder.java index 11b52f916..c0cc03276 100644 --- a/src/java/org/apache/fop/fonts/autodetect/FontFileFinder.java +++ b/src/java/org/apache/fop/fonts/autodetect/FontFileFinder.java @@ -44,22 +44,22 @@ public class FontFileFinder extends DirectoryWalker implements FontFinder { /** default depth limit of recursion when searching for font files **/ public static final int DEFAULT_DEPTH_LIMIT = -1; - + /** - * Default constructor + * Default constructor */ public FontFileFinder() { super(getDirectoryFilter(), getFileFilter(), DEFAULT_DEPTH_LIMIT); } /** - * Constructor + * Constructor * @param depthLimit recursion depth limit */ public FontFileFinder(int depthLimit) { super(getDirectoryFilter(), getFileFilter(), depthLimit); } - + /** * Font directory filter. Currently ignores hidden directories. * @return IOFileFilter font directory filter @@ -70,7 +70,7 @@ public class FontFileFinder extends DirectoryWalker implements FontFinder { FileFilterUtils.notFileFilter(FileFilterUtils.prefixFileFilter(".")) ); } - + /** * Font file filter. Currently searches for files with .ttf, .ttc, .otf, and .pfb extensions. * @return IOFileFilter font file filter @@ -83,13 +83,13 @@ public class FontFileFinder extends DirectoryWalker implements FontFinder { IOCase.INSENSITIVE) ); } - + /** * @param directory directory to handle * @param depth recursion depth * @param results collection * @return whether directory should be handled - * {@inheritDoc} + * {@inheritDoc} */ protected boolean handleDirectory(File directory, int depth, Collection results) { return true; @@ -99,7 +99,7 @@ public class FontFileFinder extends DirectoryWalker implements FontFinder { * @param file file to handle * @param depth recursion depth * @param results collection - * {@inheritDoc} + * {@inheritDoc} */ protected void handleFile(File file, int depth, Collection results) { try { @@ -109,7 +109,7 @@ public class FontFileFinder extends DirectoryWalker implements FontFinder { log.debug("MalformedURLException" + e.getMessage()); } } - + /** * @param directory the directory being processed * @param depth the current directory level @@ -119,10 +119,10 @@ public class FontFileFinder extends DirectoryWalker implements FontFinder { protected void handleDirectoryEnd(File directory, int depth, Collection results) { if (log.isDebugEnabled()) { log.debug(directory + ": found " + results.size() + " font" - + ((results.size() == 1) ? "" : "s")); + + ((results.size() == 1) ? "" : "s")); } - } - + } + /** * Automagically finds a list of font files on local system * @@ -162,5 +162,5 @@ public class FontFileFinder extends DirectoryWalker implements FontFinder { List results = new java.util.ArrayList(); super.walk(new File(dir), results); return results; - } + } } diff --git a/src/java/org/apache/fop/fonts/autodetect/FontInfoFinder.java b/src/java/org/apache/fop/fonts/autodetect/FontInfoFinder.java index 987b7e918..9ab04282d 100644 --- a/src/java/org/apache/fop/fonts/autodetect/FontInfoFinder.java +++ b/src/java/org/apache/fop/fonts/autodetect/FontInfoFinder.java @@ -49,12 +49,12 @@ import org.apache.fop.fonts.truetype.TTFFontLoader; * Attempts to determine correct FontInfo */ public class FontInfoFinder { - + /** logging instance */ private Log log = LogFactory.getLog(FontInfoFinder.class); private FontEventListener eventListener; - + /** * Sets the font event listener that can be used to receive events about particular events * in this class. @@ -63,7 +63,7 @@ public class FontInfoFinder { public void setEventListener(FontEventListener listener) { this.eventListener = listener; } - + /** * Attempts to determine FontTriplets from a given CustomFont. * It seems to be fairly accurate but will probably require some tweaking over time @@ -73,9 +73,9 @@ public class FontInfoFinder { */ private void generateTripletsFromFont(CustomFont customFont, Collection triplets) { if (log.isTraceEnabled()) { - log.trace("Font: " + customFont.getFullName() - + ", family: " + customFont.getFamilyNames() - + ", PS: " + customFont.getFontName() + log.trace("Font: " + customFont.getFullName() + + ", family: " + customFont.getFamilyNames() + + ", PS: " + customFont.getFontName() + ", EmbedName: " + customFont.getEmbedFontName()); } @@ -87,7 +87,7 @@ public class FontInfoFinder { String style = guessStyle(customFont, searchName); int weight; //= customFont.getWeight(); - int guessedWeight = FontUtil.guessWeight(searchName); + int guessedWeight = FontUtil.guessWeight(searchName); //We always take the guessed weight for now since it yield much better results. //OpenType's OS/2 usWeightClass value proves to be unreliable. weight = guessedWeight; @@ -114,9 +114,9 @@ public class FontInfoFinder { } } } - + private final Pattern quotePattern = Pattern.compile("'"); - + private String stripQuotes(String name) { return quotePattern.matcher(name).replaceAll(""); } @@ -125,13 +125,13 @@ public class FontInfoFinder { // style String style = Font.STYLE_NORMAL; if (customFont.getItalicAngle() > 0) { - style = Font.STYLE_ITALIC; + style = Font.STYLE_ITALIC; } else { style = FontUtil.guessStyle(fontName); } return style; } - + /** * Attempts to determine FontInfo from a given custom font * @param fontUrl the font URL @@ -151,13 +151,13 @@ public class FontInfoFinder { } EmbedFontInfo fontInfo = new EmbedFontInfo(null, customFont.isKerningEnabled(), fontTripletList, embedUrl, subFontName); - fontInfo.setPostScriptName(customFont.getFontName()); + fontInfo.setPostScriptName(customFont.getFontName()); if (fontCache != null) { fontCache.addFont(fontInfo); } return fontInfo; } - + /** * Attempts to determine EmbedFontInfo from a given font file. * @@ -170,7 +170,7 @@ public class FontInfoFinder { public EmbedFontInfo[] find(URL fontUrl, FontResolver resolver, FontCache fontCache) { String embedUrl = null; embedUrl = fontUrl.toExternalForm(); - + long fileLastModified = -1; if (fontCache != null) { fileLastModified = FontCache.getLastModified(fontUrl); @@ -188,8 +188,8 @@ public class FontInfoFinder { return null; } } - - + + // try to determine triplet information from font file CustomFont customFont = null; if (fontUrl.toExternalForm().endsWith(".ttc")) { @@ -241,7 +241,7 @@ public class FontInfoFinder { EmbedFontInfo fi = getFontInfoFromCustomFont(fontUrl, customFont, fontCache); if (fi != null) { embedFontInfoList.add(fi); - } + } } return (EmbedFontInfo[])embedFontInfoList.toArray( new EmbedFontInfo[embedFontInfoList.size()]); diff --git a/src/java/org/apache/fop/fonts/base14/Base14FontCollection.java b/src/java/org/apache/fop/fonts/base14/Base14FontCollection.java index 68324f13a..7bebccc88 100644 --- a/src/java/org/apache/fop/fonts/base14/Base14FontCollection.java +++ b/src/java/org/apache/fop/fonts/base14/Base14FontCollection.java @@ -15,7 +15,7 @@ * limitations under the License. */ -/* $Id: $ */ +/* $Id$ */ package org.apache.fop.fonts.base14; @@ -27,7 +27,7 @@ import org.apache.fop.fonts.FontInfo; * Sets up Base 14 fonts */ public class Base14FontCollection implements FontCollection { - + private boolean kerning = false; /** @@ -38,7 +38,7 @@ public class Base14FontCollection implements FontCollection { public Base14FontCollection(boolean kerning) { this.kerning = kerning; } - + /** * {@inheritDoc} */ @@ -143,7 +143,7 @@ public class Base14FontCollection implements FontCollection { fontInfo.addFontProperties("F8", "Times Roman", Font.STYLE_ITALIC, Font.WEIGHT_BOLD); fontInfo.addFontProperties("F9", "Computer-Modern-Typewriter", Font.STYLE_NORMAL, Font.WEIGHT_NORMAL); - + return 15; } } diff --git a/src/java/org/apache/fop/fonts/substitute/AttributeValue.java b/src/java/org/apache/fop/fonts/substitute/AttributeValue.java index 1c697dc02..44f2ff571 100644 --- a/src/java/org/apache/fop/fonts/substitute/AttributeValue.java +++ b/src/java/org/apache/fop/fonts/substitute/AttributeValue.java @@ -15,7 +15,7 @@ * limitations under the License. */ -/* $Id: $ */ +/* $Id$ */ package org.apache.fop.fonts.substitute; @@ -25,7 +25,7 @@ import java.util.StringTokenizer; * Encapsulates a font attribute value */ public class AttributeValue extends java.util.ArrayList { - + private static final long serialVersionUID = 748610847500940557L; /** @@ -38,15 +38,15 @@ public class AttributeValue extends java.util.ArrayList { */ public static AttributeValue valueOf(String valuesString) { AttributeValue attribute = new AttributeValue(); - StringTokenizer stringTokenzier = new StringTokenizer(valuesString, ","); - if (stringTokenzier.countTokens() > 1) { - while (stringTokenzier.hasMoreTokens()) { - String token = stringTokenzier.nextToken().trim(); + StringTokenizer stringTokenizer = new StringTokenizer(valuesString, ","); + if (stringTokenizer.countTokens() > 1) { + while (stringTokenizer.hasMoreTokens()) { + String token = stringTokenizer.nextToken().trim(); AttributeValue tokenAttribute = AttributeValue.valueOf(token); attribute.addAll(tokenAttribute); } } else { - String token = stringTokenzier.nextToken().trim(); + String token = stringTokenizer.nextToken().trim(); Object value = null; try { value = Integer.valueOf(token); @@ -60,6 +60,6 @@ public class AttributeValue extends java.util.ArrayList { attribute.add(value); } } - return attribute; + return attribute; } } diff --git a/src/java/org/apache/fop/fonts/substitute/FontQualifier.java b/src/java/org/apache/fop/fonts/substitute/FontQualifier.java index a68bb2ccd..63ec13db1 100644 --- a/src/java/org/apache/fop/fonts/substitute/FontQualifier.java +++ b/src/java/org/apache/fop/fonts/substitute/FontQualifier.java @@ -15,7 +15,7 @@ * limitations under the License. */ -/* $Id: $ */ +/* $Id$ */ package org.apache.fop.fonts.substitute; @@ -32,7 +32,7 @@ import org.apache.fop.fonts.FontTriplet; import org.apache.fop.fonts.FontUtil; /** - * Encapsulates a font substitution qualifier + * Encapsulates a font substitution qualifier */ public class FontQualifier { @@ -47,15 +47,15 @@ public class FontQualifier { /** font weight attribute value */ private AttributeValue fontWeightAttributeValue = null; - + /** * Default constructor */ public FontQualifier() { } - + /** - * Sets the font family + * Sets the font family * @param fontFamily the font family */ public void setFontFamily(String fontFamily) { @@ -66,20 +66,20 @@ public class FontQualifier { } this.fontFamilyAttributeValue = fontFamilyAttribute; } - + /** - * Sets the font style + * Sets the font style * @param fontStyle the font style */ public void setFontStyle(String fontStyle) { AttributeValue fontStyleAttribute = AttributeValue.valueOf(fontStyle); if (fontStyleAttribute != null) { - this.fontStyleAttributeValue = fontStyleAttribute; + this.fontStyleAttributeValue = fontStyleAttribute; } } /** - * Sets the font weight + * Sets the font weight * @param fontWeight the font weight */ public void setFontWeight(String fontWeight) { @@ -100,7 +100,7 @@ public class FontQualifier { this.fontWeightAttributeValue = fontWeightAttribute; } } - + /** * @return the font family attribute */ @@ -117,7 +117,7 @@ public class FontQualifier { } return this.fontStyleAttributeValue; } - + /** * @return the font weight attribute */ @@ -141,7 +141,7 @@ public class FontQualifier { public boolean hasFontStyle() { return this.fontStyleAttributeValue != null; } - + /** * Returns a list of matching font triplet found in a given font info * @@ -154,7 +154,7 @@ public class FontQualifier { AttributeValue styleValue = getFontStyle(); List/*<FontTriplet>*/ matchingTriplets = new java.util.ArrayList/*<FontTriplet>*/(); - + // try to find matching destination font triplet for (Iterator attrIt = fontFamilyValue.iterator(); attrIt.hasNext();) { String fontFamilyString = (String)attrIt.next(); @@ -165,7 +165,7 @@ public class FontQualifier { tripletIt.hasNext();) { FontTriplet triplet = (FontTriplet)tripletIt.next(); String fontName = triplet.getName(); - + // matched font family name if (fontFamilyString.toLowerCase().equals(fontName.toLowerCase())) { @@ -194,7 +194,7 @@ public class FontQualifier { } } } - + // try and match font style boolean styleMatched = false; String fontStyleString = triplet.getStyle(); @@ -204,17 +204,17 @@ public class FontQualifier { styleMatched = true; } } - + if (weightMatched && styleMatched) { matchingTriplets.add(triplet); } } } - } + } } return matchingTriplets; } - + /** * Returns the highest priority matching font triplet found in a given font info * @param fontInfo the font info @@ -240,25 +240,25 @@ public class FontQualifier { } return bestTriplet; } - + /** * @return a list of font triplets matching this qualifier */ public List/*<FontTriplet>*/ getTriplets() { List/*<FontTriplet>*/ triplets = new java.util.ArrayList/*<FontTriplet>*/(); - + AttributeValue fontFamilyValue = getFontFamily(); for (Iterator fontFamilyIt = fontFamilyValue.iterator(); fontFamilyIt.hasNext();) { String name = (String)fontFamilyIt.next(); - + AttributeValue styleValue = getFontStyle(); for (Iterator styleIt = styleValue.iterator(); styleIt.hasNext();) { String style = (String)styleIt.next(); - + AttributeValue weightValue = getFontWeight(); for (Iterator weightIt = weightValue.iterator(); weightIt.hasNext();) { Object weightObj = weightIt.next(); - + if (weightObj instanceof FontWeightRange) { FontWeightRange fontWeightRange = (FontWeightRange)weightObj; int[] weightRange = fontWeightRange.toArray(); @@ -292,14 +292,14 @@ public class FontQualifier { if (str.length() > 0) { str += ", "; } - str += "font-style=" + fontStyleAttributeValue; + str += "font-style=" + fontStyleAttributeValue; } if (fontWeightAttributeValue != null) { if (str.length() > 0) { str += ", "; } - str += "font-weight=" + fontWeightAttributeValue; + str += "font-weight=" + fontWeightAttributeValue; } return str; } -}
\ No newline at end of file +} diff --git a/src/java/org/apache/fop/fonts/substitute/FontSubstitution.java b/src/java/org/apache/fop/fonts/substitute/FontSubstitution.java index 5f71e7b7c..7e9709a51 100644 --- a/src/java/org/apache/fop/fonts/substitute/FontSubstitution.java +++ b/src/java/org/apache/fop/fonts/substitute/FontSubstitution.java @@ -15,7 +15,7 @@ * limitations under the License. */ -/* $Id: $ */ +/* $Id$ */ package org.apache.fop.fonts.substitute; @@ -23,7 +23,7 @@ package org.apache.fop.fonts.substitute; * Encapsulates a pair of substitution qualifiers */ public class FontSubstitution { - + private FontQualifier fromQualifier; private FontQualifier toQualifier; @@ -51,11 +51,11 @@ public class FontSubstitution { public FontQualifier getToQualifier() { return toQualifier; } - + /** * {@inheritDoc} */ public String toString() { return "from=" + fromQualifier + ", to=" + toQualifier; } -}
\ No newline at end of file +} diff --git a/src/java/org/apache/fop/fonts/substitute/FontSubstitutions.java b/src/java/org/apache/fop/fonts/substitute/FontSubstitutions.java index 346b967e2..cc4e74143 100644 --- a/src/java/org/apache/fop/fonts/substitute/FontSubstitutions.java +++ b/src/java/org/apache/fop/fonts/substitute/FontSubstitutions.java @@ -15,7 +15,7 @@ * limitations under the License. */ -/* $Id: $ */ +/* $Id$ */ package org.apache.fop.fonts.substitute; @@ -44,9 +44,9 @@ public class FontSubstitutions extends java.util.ArrayList/*<Substitutions>*/ { public void adjustFontInfo(FontInfo fontInfo) { for (Iterator/*<FontSubstitution>*/ subsIt = super.iterator(); subsIt.hasNext();) { FontSubstitution substitution = (FontSubstitution)subsIt.next(); - + // find the best matching font triplet - FontQualifier toQualifier = substitution.getToQualifier(); + FontQualifier toQualifier = substitution.getToQualifier(); FontTriplet fontTriplet = toQualifier.bestMatch(fontInfo); if (fontTriplet == null) { log.error("Unable to match font substitution for destination qualifier " @@ -54,7 +54,7 @@ public class FontSubstitutions extends java.util.ArrayList/*<Substitutions>*/ { continue; } String internalFontKey = fontInfo.getInternalFontKey(fontTriplet); - + FontQualifier fromQualifier = substitution.getFromQualifier(); List/*<FontTriplet>*/ tripletList = fromQualifier.getTriplets(); for (Iterator tripletit = tripletList.iterator(); tripletit.hasNext();) { @@ -62,5 +62,5 @@ public class FontSubstitutions extends java.util.ArrayList/*<Substitutions>*/ { fontInfo.addFontProperties(internalFontKey, triplet); } } - } + } } diff --git a/src/java/org/apache/fop/fonts/substitute/FontSubstitutionsConfigurator.java b/src/java/org/apache/fop/fonts/substitute/FontSubstitutionsConfigurator.java index 53045c601..44950221d 100644 --- a/src/java/org/apache/fop/fonts/substitute/FontSubstitutionsConfigurator.java +++ b/src/java/org/apache/fop/fonts/substitute/FontSubstitutionsConfigurator.java @@ -15,7 +15,7 @@ * limitations under the License. */ -/* $Id: $ */ +/* $Id$ */ package org.apache.fop.fonts.substitute; @@ -37,7 +37,7 @@ public class FontSubstitutionsConfigurator { public FontSubstitutionsConfigurator(Configuration cfg) { this.cfg = cfg; } - + private static FontQualifier getQualfierFromConfiguration(Configuration cfg) throws FOPException { String fontFamily = cfg.getAttribute("font-family", null); @@ -56,7 +56,7 @@ public class FontSubstitutionsConfigurator { } return qualifier; } - + /** * Configures a font substitution catalog * @@ -74,7 +74,7 @@ public class FontSubstitutionsConfigurator { if (fromCfg == null) { throw new FOPException("'substitution' element without child 'to' element"); } - FontQualifier fromQualifier = getQualfierFromConfiguration(fromCfg); + FontQualifier fromQualifier = getQualfierFromConfiguration(fromCfg); FontQualifier toQualifier = getQualfierFromConfiguration(toCfg); FontSubstitution substitution = new FontSubstitution(fromQualifier, toQualifier); substitutions.add(substitution); diff --git a/src/java/org/apache/fop/fonts/substitute/FontWeightRange.java b/src/java/org/apache/fop/fonts/substitute/FontWeightRange.java index 630bc1895..890d6cf7b 100644 --- a/src/java/org/apache/fop/fonts/substitute/FontWeightRange.java +++ b/src/java/org/apache/fop/fonts/substitute/FontWeightRange.java @@ -15,7 +15,7 @@ * limitations under the License. */ -/* $Id: $ */ +/* $Id$ */ package org.apache.fop.fonts.substitute; @@ -23,13 +23,12 @@ import java.util.StringTokenizer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.fop.fonts.FontUtil; /** * Encapsulates a range of font weight values */ public class FontWeightRange { - + /** logging instance */ protected static Log log = LogFactory.getLog("org.apache.fop.render.fonts"); @@ -68,7 +67,7 @@ public class FontWeightRange { /** the start range */ private int start; - + /** the end range */ private int end; @@ -81,7 +80,7 @@ public class FontWeightRange { this.start = start; this.end = end; } - + /** * Returns true if the given integer value is within this integer range * @param value the integer value @@ -90,7 +89,7 @@ public class FontWeightRange { public boolean isWithinRange(int value) { return (value >= start && value <= end); } - + /** * {@inheritDoc} */ @@ -111,5 +110,5 @@ public class FontWeightRange { range[i] = start + (i * 100); } return range; - } + } } diff --git a/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java b/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java index f83434f47..3f2143bae 100644 --- a/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/AbstractLayoutManager.java @@ -38,7 +38,7 @@ import org.apache.fop.fo.flow.RetrieveMarker; /** * The base class for most LayoutManagers. */ -public abstract class AbstractLayoutManager extends AbstractBaseLayoutManager +public abstract class AbstractLayoutManager extends AbstractBaseLayoutManager implements Constants { /** @@ -56,14 +56,14 @@ public abstract class AbstractLayoutManager extends AbstractBaseLayoutManager private Map markers = null; /** True if this LayoutManager has handled all of its content. */ - private boolean bFinished = false; - + private boolean isFinished = false; + /** child LM during getNextKnuthElement phase */ protected LayoutManager curChildLM = null; - + /** child LM iterator during getNextKnuthElement phase */ protected ListIterator childLMiter = null; - + private int lastGeneratedPosition = -1; private int smallestPosNumberChecked = Integer.MAX_VALUE; @@ -136,7 +136,7 @@ public abstract class AbstractLayoutManager extends AbstractBaseLayoutManager * ie. the last one returned represents the end of the content. */ public boolean isFinished() { - return bFinished; + return isFinished; } /** @@ -144,18 +144,14 @@ public abstract class AbstractLayoutManager extends AbstractBaseLayoutManager * @param fin the flag value to be set */ public void setFinished(boolean fin) { - bFinished = fin; + isFinished = fin; } - /** - * {@inheritDoc} - */ + /** {@inheritDoc} */ public void addAreas(PositionIterator posIter, LayoutContext context) { } - /** - * {@inheritDoc} - */ + /** {@inheritDoc} */ public LinkedList getNextKnuthElements(LayoutContext context, int alignment) { log.warn("null implementation of getNextKnuthElements() called!"); @@ -163,9 +159,7 @@ public abstract class AbstractLayoutManager extends AbstractBaseLayoutManager return null; } - /** - * {@inheritDoc} - */ + /** {@inheritDoc} */ public LinkedList getChangedKnuthElements(List oldList, int alignment) { log.warn("null implementation of getChangeKnuthElement() called!"); @@ -229,20 +223,20 @@ public abstract class AbstractLayoutManager extends AbstractBaseLayoutManager public PageSequenceLayoutManager getPSLM() { return parentLM.getPSLM(); } - + /** * @see PageSequenceLayoutManager#getCurrentPage() * @return the {@link Page} instance corresponding to the current page */ public Page getCurrentPage() { return getPSLM().getCurrentPage(); - } - + } + /** @return the current page viewport */ public PageViewport getCurrentPV() { return getPSLM().getCurrentPage().getPageViewport(); - } - + } + /** * {@inheritDoc} */ @@ -302,11 +296,12 @@ public abstract class AbstractLayoutManager extends AbstractBaseLayoutManager if (pos.getIndex() >= 0) { throw new IllegalStateException("Position already got its index"); } + lastGeneratedPosition++; pos.setIndex(lastGeneratedPosition); return pos; } - + /** * Indicates whether the given Position is the first area-generating Position of this LM. * @param pos the Position (must be one with a position index) @@ -326,7 +321,7 @@ public abstract class AbstractLayoutManager extends AbstractBaseLayoutManager return false; } } - + /** * Indicates whether the given Position is the last area-generating Position of this LM. * @param pos the Position (must be one with a position index) @@ -349,7 +344,7 @@ public abstract class AbstractLayoutManager extends AbstractBaseLayoutManager Map atts = fobj.getForeignAttributes(); targetArea.setForeignAttributes(atts); } - + /** * Registers the FO's markers on the current PageViewport * @@ -360,9 +355,9 @@ public abstract class AbstractLayoutManager extends AbstractBaseLayoutManager protected void addMarkersToPage(boolean isStarting, boolean isFirst, boolean isLast) { if (this.markers != null) { getCurrentPV().addMarkers( - this.markers, - isStarting, - isFirst, + this.markers, + isStarting, + isFirst, isLast); } } @@ -386,9 +381,49 @@ public abstract class AbstractLayoutManager extends AbstractBaseLayoutManager } } + /** + * Checks to see if the incoming {@link Position} + * is the last one for this LM, and if so, calls + * {@link #notifyEndOfLayout()} and cleans up. + * + * @param pos the {@link Position} to check + */ + protected void checkEndOfLayout(Position pos) { + if (pos != null + && pos.getLM() == this + && this.isLast(pos)) { + + notifyEndOfLayout(); + + /* References to the child LMs are no longer needed + */ + childLMs = null; + curChildLM = null; + childLMiter = null; + + /* markers that qualify have been transferred to the page + */ + markers = null; + + /* References to the FO's children can be released if the + * LM is a descendant of the FlowLM. For static-content + * the FO may still be needed on following pages. + */ + LayoutManager lm = this.parentLM; + while (!(lm instanceof FlowLayoutManager + || lm instanceof PageSequenceLayoutManager)) { + lm = lm.getParent(); + } + if (lm instanceof FlowLayoutManager) { + fobj.clearChildNodes(); + fobjIter = null; + } + } + } + /** {@inheritDoc} */ public String toString() { return (super.toString() + (fobj != null ? "[fobj=" + fobj.toString() + "]" : "")); } - + } diff --git a/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java b/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java index d129be666..c5c7d9445 100644 --- a/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/BlockLayoutManager.java @@ -392,8 +392,8 @@ public class BlockLayoutManager extends BlockStackingLayoutManager curBlockArea = null; resetSpaces(); - // Notify end of block layout manager to the PSLM - notifyEndOfLayout(); + //Notify end of block layout manager to the PSLM + checkEndOfLayout(lastPos); } /** diff --git a/src/java/org/apache/fop/layoutmgr/inline/CharacterLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/CharacterLayoutManager.java index b53e442d4..b292d97bf 100644 --- a/src/java/org/apache/fop/layoutmgr/inline/CharacterLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/inline/CharacterLayoutManager.java @@ -61,11 +61,8 @@ public class CharacterLayoutManager extends LeafNodeLayoutManager { /** {@inheritDoc} */ public void initialize() { - Character fobj = (Character)this.fobj; - - FontInfo fi = fobj.getFOEventHandler().getFontInfo(); - FontTriplet[] fontkeys = fobj.getCommonFont().getFontState(fi); - font = fi.getFontInstance(fontkeys[0], fobj.getCommonFont().fontSize.getValue(this)); + Character fobj = (Character)this.fobj; + font = this.selectFontForCharacter(fobj); SpaceVal ls = SpaceVal.makeLetterSpacing(fobj.getLetterSpacing()); letterSpaceIPD = ls.getSpace(); hyphIPD = fobj.getCommonHyphenation().getHyphIPD(font); @@ -75,6 +72,33 @@ public class CharacterLayoutManager extends LeafNodeLayoutManager { chArea.setBaselineOffset(font.getAscender()); setCurrentArea(chArea); } + + /** + * Selects a font which is able to display the given character. + * <p> + * Please note: this implements the font-selection-strategy + * character-by-character. + * <p> + * TODO: The same function could apply to other elements as well. + * + * @param fobj + * a Character object containing the character and its + * attributed. + * @return a Font object. + */ + private Font selectFontForCharacter(Character fobj) { + FontInfo fi = fobj.getFOEventHandler().getFontInfo(); + FontTriplet[] fontkeys = fobj.getCommonFont().getFontState(fi); + for (int i = 0; i < fontkeys.length; i++) { + font = fi.getFontInstance(fontkeys[i], + fobj.getCommonFont().fontSize.getValue(this)); + if (font.hasChar(fobj.getCharacter())) { + return font; + } + } + return fi.getFontInstance(fontkeys[0], + fobj.getCommonFont().fontSize.getValue(this)); + } private org.apache.fop.area.inline.TextArea getCharacterInlineArea(Character node) { org.apache.fop.area.inline.TextArea text diff --git a/src/java/org/apache/fop/layoutmgr/inline/InlineLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/InlineLayoutManager.java index b59f0466a..7c2e4748a 100755 --- a/src/java/org/apache/fop/layoutmgr/inline/InlineLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/inline/InlineLayoutManager.java @@ -518,6 +518,7 @@ public class InlineLayoutManager extends InlineStackingLayoutManager { context.setFlags(LayoutContext.LAST_AREA, isLast); areaCreated = true; + checkEndOfLayout(lastPos); } /** {@inheritDoc} */ diff --git a/src/java/org/apache/fop/layoutmgr/inline/WrapperLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/WrapperLayoutManager.java index 8108bbf40..a5bbdb33c 100644 --- a/src/java/org/apache/fop/layoutmgr/inline/WrapperLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/inline/WrapperLayoutManager.java @@ -74,12 +74,7 @@ public class WrapperLayoutManager extends LeafNodeLayoutManager { if (parentLM instanceof BlockStackingLayoutManager && !(parentLM instanceof BlockLayoutManager)) { Block helperBlock = new Block(); - LineArea helperLine = new LineArea(); - InlineParent helperInline = new InlineParent(); - helperInline.addChildArea(area); - helperLine.addInlineArea(helperInline); - helperLine.updateExtentsFromChildren(); - helperBlock.addLineArea(helperLine); + TraitSetter.setProducerID(helperBlock, fobj.getId()); parentLM.addChildArea(helperBlock); } else { parentLM.addChildArea(area); diff --git a/src/java/org/apache/fop/layoutmgr/list/ListBlockLayoutManager.java b/src/java/org/apache/fop/layoutmgr/list/ListBlockLayoutManager.java index 7be146d0d..dfffbdd04 100644 --- a/src/java/org/apache/fop/layoutmgr/list/ListBlockLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/list/ListBlockLayoutManager.java @@ -219,7 +219,7 @@ public class ListBlockLayoutManager extends BlockStackingLayoutManager curBlockArea = null; resetSpaces(); - notifyEndOfLayout(); + checkEndOfLayout(lastPos); } /** diff --git a/src/java/org/apache/fop/layoutmgr/list/ListItemContentLayoutManager.java b/src/java/org/apache/fop/layoutmgr/list/ListItemContentLayoutManager.java index edee772d6..549244267 100644 --- a/src/java/org/apache/fop/layoutmgr/list/ListItemContentLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/list/ListItemContentLayoutManager.java @@ -172,7 +172,7 @@ public class ListItemContentLayoutManager extends BlockStackingLayoutManager { curBlockArea = null; - notifyEndOfLayout(); + checkEndOfLayout(lastPos); } /** diff --git a/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java b/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java index d0e8665e7..6a3a38db1 100644 --- a/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java @@ -557,7 +557,7 @@ public class ListItemLayoutManager extends BlockStackingLayoutManager curBlockArea = null; resetSpaces(); - notifyEndOfLayout(); + checkEndOfLayout(lastPos); } /** diff --git a/src/java/org/apache/fop/render/AbstractRendererConfigurator.java b/src/java/org/apache/fop/render/AbstractRendererConfigurator.java index bce5abfbd..982b23f05 100644 --- a/src/java/org/apache/fop/render/AbstractRendererConfigurator.java +++ b/src/java/org/apache/fop/render/AbstractRendererConfigurator.java @@ -36,7 +36,7 @@ public abstract class AbstractRendererConfigurator { /** fop factory configuration */ protected FOUserAgent userAgent = null; - + /** * Default constructor * @param userAgent user agent @@ -45,7 +45,7 @@ public abstract class AbstractRendererConfigurator { super(); this.userAgent = userAgent; } - + /** * Returns the configuration subtree for a specific renderer. * @param renderer the renderer @@ -59,7 +59,7 @@ public abstract class AbstractRendererConfigurator { } return null; } - + return getRendererConfig(mimeType); } @@ -74,11 +74,11 @@ public abstract class AbstractRendererConfigurator { if (log.isDebugEnabled()) { log.debug("userconfig is null"); } - return null; + return null; } - + Configuration userRendererConfig = null; - + Configuration[] cfgs = cfg.getChild("renderers").getChildren("renderer"); for (int i = 0; i < cfgs.length; ++i) { diff --git a/src/java/org/apache/fop/render/PrintRenderer.java b/src/java/org/apache/fop/render/PrintRenderer.java index 23f8a1f62..35630d628 100644 --- a/src/java/org/apache/fop/render/PrintRenderer.java +++ b/src/java/org/apache/fop/render/PrintRenderer.java @@ -45,7 +45,7 @@ public abstract class PrintRenderer extends AbstractRenderer { /** list of fonts */ protected List/*<EmbedFontInfo>*/ embedFontInfoList = null; - + /** * Adds a font list to current list of fonts * @param fontList a font info list @@ -54,10 +54,10 @@ public abstract class PrintRenderer extends AbstractRenderer { if (embedFontInfoList == null) { setFontList(fontList); } else { - fontList.addAll(fontList); + embedFontInfoList.addAll(fontList); } } - + /** * @param embedFontInfoList list of available fonts */ @@ -91,7 +91,7 @@ public abstract class PrintRenderer extends AbstractRenderer { FontTriplet triplet = (FontTriplet)area.getTrait(Trait.FONT); return fontInfo.getInternalFontKey(triplet); } - + /** * Returns a Font object constructed based on the font traits in an area * @param area the area from which to retrieve the font triplet information @@ -102,7 +102,7 @@ public abstract class PrintRenderer extends AbstractRenderer { int size = ((Integer)area.getTrait(Trait.FONT_SIZE)).intValue(); return fontInfo.getFontInstance(triplet, size); } - + /** * Lightens up a color for groove, ridge, inset and outset border effects. * @param col the color to lighten up @@ -135,7 +135,7 @@ public abstract class PrintRenderer extends AbstractRenderer { * @param foreignAttributes a Map or foreign attributes, may be null * @return the RendererContext */ - protected RendererContext createRendererContext(int x, int y, int width, int height, + protected RendererContext createRendererContext(int x, int y, int width, int height, Map foreignAttributes) { RendererContext context; context = new RendererContext(this, getMimeType()); @@ -149,7 +149,7 @@ public abstract class PrintRenderer extends AbstractRenderer { new Integer(x)); context.setProperty(RendererContextConstants.YPOS, new Integer(y)); - context.setProperty(RendererContextConstants.PAGE_VIEWPORT, + context.setProperty(RendererContextConstants.PAGE_VIEWPORT, getCurrentPageViewport()); if (foreignAttributes != null) { context.setProperty(RendererContextConstants.FOREIGN_ATTRIBUTES, foreignAttributes); @@ -165,12 +165,12 @@ public abstract class PrintRenderer extends AbstractRenderer { * @param foreignAttributes the foreign attributes containing rendering hints, or null */ public void renderDocument(Document doc, String ns, Rectangle2D pos, Map foreignAttributes) { - int x = currentIPPosition + (int) pos.getX(); + int x = currentIPPosition + (int) pos.getX(); int y = currentBPPosition + (int) pos.getY(); int width = (int)pos.getWidth(); int height = (int)pos.getHeight(); RendererContext context = createRendererContext(x, y, width, height, foreignAttributes); - + renderXML(context, doc, ns); } @@ -185,7 +185,7 @@ public abstract class PrintRenderer extends AbstractRenderer { } return this.fontResolver; } - + /** * @return the font info */ diff --git a/src/java/org/apache/fop/render/PrintRendererConfigurator.java b/src/java/org/apache/fop/render/PrintRendererConfigurator.java index 50d06932d..6849f867f 100644 --- a/src/java/org/apache/fop/render/PrintRendererConfigurator.java +++ b/src/java/org/apache/fop/render/PrintRendererConfigurator.java @@ -55,7 +55,7 @@ import org.apache.fop.util.LogUtil; /** * Base Print renderer configurator (mostly handles font configuration) */ -public class PrintRendererConfigurator extends AbstractRendererConfigurator +public class PrintRendererConfigurator extends AbstractRendererConfigurator implements RendererConfigurator { /** logger instance */ @@ -94,9 +94,9 @@ public class PrintRendererConfigurator extends AbstractRendererConfigurator boolean strict = factory.validateUserConfigStrictly(); FontCache fontCache = fontManager.getFontCache(); - List/*<EmbedFontInfo>*/ embedFontInfoList = buildFontListFromConfiguration(cfg, + List/*<EmbedFontInfo>*/ embedFontInfoList = buildFontListFromConfiguration(cfg, fontResolver, strict, fontManager); - + if (fontCache != null && fontCache.hasChanged()) { fontCache.save(); } @@ -113,13 +113,13 @@ public class PrintRendererConfigurator extends AbstractRendererConfigurator * @return a List of EmbedFontInfo objects. * @throws FOPException If an error occurs while processing the configuration */ - public static List/*<EmbedFontInfo>*/ buildFontListFromConfiguration(Configuration cfg, - FontResolver fontResolver, + public static List/*<EmbedFontInfo>*/ buildFontListFromConfiguration(Configuration cfg, + FontResolver fontResolver, boolean strict, FontManager fontManager) throws FOPException { FontCache fontCache = fontManager.getFontCache(); String fontBaseURL = fontManager.getFontBaseURL(); List/*<EmbedFontInfo>*/ fontInfoList - = new java.util.ArrayList/*<EmbedFontInfo>*/(); + = new java.util.ArrayList/*<EmbedFontInfo>*/(); Configuration fonts = cfg.getChild("fonts", false); if (fonts != null) { @@ -128,7 +128,7 @@ public class PrintRendererConfigurator extends AbstractRendererConfigurator log.debug("Starting font configuration..."); start = System.currentTimeMillis(); } - + // native o/s search (autodetect) configuration boolean autodetectFonts = (fonts.getChild("auto-detect", false) != null); if (autodetectFonts) { @@ -203,7 +203,7 @@ public class PrintRendererConfigurator extends AbstractRendererConfigurator LogUtil.handleException(log, e, strict); } } - + // font file (singular) configuration Configuration[] font = fonts.getChildren("font"); for (int i = 0; i < font.length; i++) { @@ -216,9 +216,9 @@ public class PrintRendererConfigurator extends AbstractRendererConfigurator // Update referenced fonts (fonts which are not to be embedded) updateReferencedFonts(fontInfoList, fontManager.getReferencedFontsMatcher()); - + if (log.isDebugEnabled()) { - log.debug("Finished font configuration in " + log.debug("Finished font configuration in " + (System.currentTimeMillis() - start) + "ms"); } } @@ -243,7 +243,7 @@ public class PrintRendererConfigurator extends AbstractRendererConfigurator } } - + /** * Iterates over font file list adding font info to list * @param fontFileList font file list @@ -258,7 +258,7 @@ public class PrintRendererConfigurator extends AbstractRendererConfigurator // parse font to ascertain font info FontInfoFinder finder = new FontInfoFinder(); //EmbedFontInfo fontInfo = finder.find(fontUrl, resolver, fontCache); - + //List<EmbedFontInfo> embedFontInfoList = finder.find(fontUrl, resolver, fontCache); EmbedFontInfo[] embedFontInfos = finder.find(fontUrl, resolver, fontCache); @@ -299,14 +299,14 @@ public class PrintRendererConfigurator extends AbstractRendererConfigurator LogUtil.handleError(log, "font-triplet without name", strict); return null; } - + String weightStr = tripletCfg.getAttribute("weight"); if (weightStr == null) { LogUtil.handleError(log, "font-triplet without weight", strict); return null; } int weight = FontUtil.parseCSS2FontWeight(FontUtil.stripWhiteSpace(weightStr)); - + String style = tripletCfg.getAttribute("style"); if (style == null) { LogUtil.handleError(log, "font-triplet without style", strict); @@ -320,7 +320,7 @@ public class PrintRendererConfigurator extends AbstractRendererConfigurator } return null; } - + /** * Returns a font info from a font node Configuration definition * @@ -337,7 +337,7 @@ public class PrintRendererConfigurator extends AbstractRendererConfigurator String metricsUrl = fontCfg.getAttribute("metrics-url", null); String embedUrl = fontCfg.getAttribute("embed-url", null); String subFont = fontCfg.getAttribute("sub-font", null); - + if (metricsUrl == null && embedUrl == null) { LogUtil.handleError(log, "Font configuration without metric-url or embed-url attribute", @@ -366,13 +366,13 @@ public class PrintRendererConfigurator extends AbstractRendererConfigurator } } } - + Configuration[] tripletCfg = fontCfg.getChildren("font-triplet"); - + // no font triplet info if (tripletCfg.length == 0) { LogUtil.handleError(log, "font without font-triplet", strict); - + File fontFile = FontCache.getFileFromUrls(new String[] {embedUrl, metricsUrl}); URL fontUrl; try { @@ -384,28 +384,28 @@ public class PrintRendererConfigurator extends AbstractRendererConfigurator } if (fontFile != null) { FontInfoFinder finder = new FontInfoFinder(); - EmbedFontInfo[] infos = finder.find(fontUrl, fontResolver, fontCache); + EmbedFontInfo[] infos = finder.find(fontUrl, fontResolver, fontCache); return infos[0]; //When subFont is set, only one font is returned } else { return null; } } - + List/*<FontTriplet>*/ tripletList = new java.util.ArrayList/*<FontTriplet>*/(); for (int j = 0; j < tripletCfg.length; j++) { FontTriplet fontTriplet = getFontTripletFromConfiguration(tripletCfg[j], strict); tripletList.add(fontTriplet); } - + boolean useKerning = fontCfg.getAttributeAsBoolean("kerning", true); EmbedFontInfo embedFontInfo - = new EmbedFontInfo(metricsUrl, useKerning, tripletList, embedUrl, subFont); + = new EmbedFontInfo(metricsUrl, useKerning, tripletList, embedUrl, subFont); if (fontCache != null) { if (!fontCache.containsFont(embedFontInfo)) { - fontCache.addFont(embedFontInfo); + fontCache.addFont(embedFontInfo); } } - + if (log.isDebugEnabled()) { String embedFile = embedFontInfo.getEmbedFile(); log.debug("Adding font " + (embedFile != null ? embedFile + ", " : "") @@ -417,8 +417,8 @@ public class PrintRendererConfigurator extends AbstractRendererConfigurator + triplet.getStyle() + ", " + triplet.getWeight()); } - } + } return embedFontInfo; } - + } diff --git a/src/java/org/apache/fop/render/afp/AFPRenderer.java b/src/java/org/apache/fop/render/afp/AFPRenderer.java index 14eb33510..626ca47da 100644 --- a/src/java/org/apache/fop/render/afp/AFPRenderer.java +++ b/src/java/org/apache/fop/render/afp/AFPRenderer.java @@ -502,7 +502,7 @@ public class AFPRenderer extends AbstractPathOrientedRenderer { AffineTransform positionTransform = new AffineTransform(); positionTransform.translate(bv.getXOffset(), bv.getYOffset()); - + //"left/"top" (bv.getX/YOffset()) specify the position of the content rectangle positionTransform.translate(-borderPaddingStart, -borderPaddingBefore); @@ -511,7 +511,7 @@ public class AFPRenderer extends AbstractPathOrientedRenderer { //saveGraphicsState(); //Viewport position //concatenateTransformationMatrix(mptToPt(positionTransform)); - + //Background and borders float bpwidth = (borderPaddingStart + bv.getBorderAndPaddingWidthEnd()) / 1000f; float bpheight = (borderPaddingBefore + bv.getBorderAndPaddingWidthAfter()) / 1000f; @@ -542,7 +542,7 @@ public class AFPRenderer extends AbstractPathOrientedRenderer { //concatenateTransformationMatrix(mptToPt(contentTransform)); contentRect = new Rectangle2D.Double(0, 0, 1000 * width, 1000 * height); pushViewPortPos(new ViewPortPos(contentRect, new CTM(contentTransform))); - + currentIPPosition = 0; currentBPPosition = 0; renderBlocks(bv, children); @@ -600,7 +600,7 @@ public class AFPRenderer extends AbstractPathOrientedRenderer { //Not used here since AFPRenderer defines its own renderBlockViewport() method. throw new UnsupportedOperationException("NYI"); } - + /** * {@inheritDoc} */ @@ -930,7 +930,7 @@ public class AFPRenderer extends AbstractPathOrientedRenderer { private static final ImageFlavor[] FLAVORS = new ImageFlavor[] {ImageFlavor.RAW_CCITTFAX, ImageFlavor.GRAPHICS2D, - ImageFlavor.BUFFERED_IMAGE, + ImageFlavor.BUFFERED_IMAGE, ImageFlavor.RENDERED_IMAGE, ImageFlavor.XML_DOM}; @@ -957,12 +957,12 @@ public class AFPRenderer extends AbstractPathOrientedRenderer { try { ImageSessionContext sessionContext = getUserAgent().getImageSessionContext(); info = manager.getImageInfo(uri, sessionContext); - + //Only now fully load/prepare the image Map hints = ImageUtil.getDefaultHints(sessionContext); org.apache.xmlgraphics.image.loader.Image img = manager.getImage( info, FLAVORS, hints, sessionContext); - + //...and process the image if (img instanceof ImageGraphics2D) { ImageGraphics2D imageG2D = (ImageGraphics2D)img; @@ -1066,7 +1066,7 @@ public class AFPRenderer extends AbstractPathOrientedRenderer { IOUtils.closeQuietly(in); } } - + /* ImageFactory fact = userAgent.getFactory().getImageFactory(); FopImage fopimage = fact.getImage(url, userAgent); @@ -1139,7 +1139,7 @@ public class AFPRenderer extends AbstractPathOrientedRenderer { if (!fopimage.load(FopImage.BITMAP)) { return; } - convertToGrayScaleImage(io, fopimage.getBitmaps(), + convertToGrayScaleImage(io, fopimage.getBitmaps(), fopimage.getWidth(), fopimage.getHeight()); } } else { @@ -1474,9 +1474,9 @@ public class AFPRenderer extends AbstractPathOrientedRenderer { */ // UNUSED // public void setOptions(Map options) { -// +// // this.afpOptions = options; -// +// // } /** * Determines the orientation from the string representation, this method @@ -1543,7 +1543,7 @@ public class AFPRenderer extends AbstractPathOrientedRenderer { /** * Sets the rotation to be used for landsacpe pages, valid values are 0, 90, * 180, 270 (default). - * + * * @param rotation * The rotation in degrees. */ @@ -1714,7 +1714,7 @@ public class AFPRenderer extends AbstractPathOrientedRenderer { io.setImageIDESize((byte) bitsPerPixel); io.setImageData(bw); } - + private final class ViewPortPos { private int x = 0; @@ -1882,7 +1882,7 @@ public class AFPRenderer extends AbstractPathOrientedRenderer { } this.resolution = resolution; } - + /** * Returns the output/device resolution. * @return the resolution in dpi diff --git a/src/java/org/apache/fop/render/java2d/Base14FontCollection.java b/src/java/org/apache/fop/render/java2d/Base14FontCollection.java index f97a68191..ca4a4bce3 100644 --- a/src/java/org/apache/fop/render/java2d/Base14FontCollection.java +++ b/src/java/org/apache/fop/render/java2d/Base14FontCollection.java @@ -15,7 +15,7 @@ * limitations under the License. */ -/* $Id: $ */ +/* $Id$ */ package org.apache.fop.render.java2d; @@ -31,7 +31,7 @@ import org.apache.fop.fonts.FontInfo; public class Base14FontCollection implements FontCollection { private Graphics2D graphics2d = null; - + /** * Main constructor * @param graphics2d a graphics 2D @@ -39,7 +39,7 @@ public class Base14FontCollection implements FontCollection { public Base14FontCollection(Graphics2D graphics2d) { this.graphics2d = graphics2d; } - + /** * {@inheritDoc} */ @@ -175,7 +175,7 @@ public class Base14FontCollection implements FontCollection { fontInfo.addFontProperties("F8", "Times Roman", Font.STYLE_ITALIC, Font.WEIGHT_BOLD); fontInfo.addFontProperties("F9", "Computer-Modern-Typewriter", "normal", Font.WEIGHT_NORMAL); - + return 15; } } diff --git a/src/java/org/apache/fop/render/java2d/ConfiguredFontCollection.java b/src/java/org/apache/fop/render/java2d/ConfiguredFontCollection.java index 4981905fa..843ab8413 100644 --- a/src/java/org/apache/fop/render/java2d/ConfiguredFontCollection.java +++ b/src/java/org/apache/fop/render/java2d/ConfiguredFontCollection.java @@ -15,7 +15,7 @@ * limitations under the License. */ -/* $Id: $ */ +/* $Id$ */ package org.apache.fop.render.java2d; @@ -54,7 +54,7 @@ public class ConfiguredFontCollection implements FontCollection { public ConfiguredFontCollection(PrintRenderer renderer) { this.renderer = renderer; } - + /** * {@inheritDoc} */ diff --git a/src/java/org/apache/fop/render/java2d/InstalledFontCollection.java b/src/java/org/apache/fop/render/java2d/InstalledFontCollection.java index 4cdd30c41..4eac922e8 100644 --- a/src/java/org/apache/fop/render/java2d/InstalledFontCollection.java +++ b/src/java/org/apache/fop/render/java2d/InstalledFontCollection.java @@ -15,7 +15,7 @@ * limitations under the License. */ -/* $Id: $ */ +/* $Id$ */ package org.apache.fop.render.java2d; @@ -67,7 +67,7 @@ public class InstalledFontCollection implements FontCollection { public InstalledFontCollection(Graphics2D graphics2D) { this.graphics2D = graphics2D; } - + /** * {@inheritDoc} */ diff --git a/src/java/org/apache/fop/render/java2d/Java2DRenderer.java b/src/java/org/apache/fop/render/java2d/Java2DRenderer.java index eea165525..e39ae5831 100644 --- a/src/java/org/apache/fop/render/java2d/Java2DRenderer.java +++ b/src/java/org/apache/fop/render/java2d/Java2DRenderer.java @@ -129,17 +129,17 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem /** false: paints a non-transparent white background, true: for a transparent background */ protected boolean transparentPageBackground = false; - + /** The current state, holds a Graphics2D and its context */ protected Java2DGraphicsState state; - + private Stack stateStack = new Stack(); /** true if the renderer has finished rendering all the pages */ private boolean renderingDone; private GeneralPath currentPath = null; - + /** Default constructor */ public Java2DRenderer() { } @@ -150,7 +150,7 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem public void setUserAgent(FOUserAgent foUserAgent) { super.setUserAgent(foUserAgent); userAgent.setRendererOverride(this); // for document regeneration - + String s = (String)userAgent.getRendererOptions().get(JAVA2D_TRANSPARENT_PAGE_BACKGROUND); if (s != null) { this.transparentPageBackground = "true".equalsIgnoreCase(s); @@ -173,9 +173,9 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem BufferedImage.TYPE_INT_RGB); Graphics2D graphics2D = fontImage.createGraphics(); //The next line is important to get accurate font metrics! - graphics2D.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, + graphics2D.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); - + userAgent.getFactory().getFontManager().setupRenderer(this, graphics2D); } @@ -218,7 +218,7 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem public boolean isRenderingDone() { return this.renderingDone; } - + /** * @return The 0-based current page number */ @@ -279,7 +279,7 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem assert pageViewport.getPageIndex() >= 0; pageViewportList.add(pageViewport); } - + /** * Generates a desired page from the renderer's page viewport list. * @@ -300,18 +300,18 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem + " (pageWidth " + pageWidth + ", pageHeight " + pageHeight + ")"); - double scaleX = scaleFactor - * (25.4 / FopFactoryConfigurator.DEFAULT_TARGET_RESOLUTION) + double scaleX = scaleFactor + * (25.4 / FopFactoryConfigurator.DEFAULT_TARGET_RESOLUTION) / userAgent.getTargetPixelUnitToMillimeter(); double scaleY = scaleFactor * (25.4 / FopFactoryConfigurator.DEFAULT_TARGET_RESOLUTION) / userAgent.getTargetPixelUnitToMillimeter(); int bitmapWidth = (int) ((pageWidth * scaleX) + 0.5); int bitmapHeight = (int) ((pageHeight * scaleY) + 0.5); - - + + BufferedImage currentPageImage = getBufferedImage(bitmapWidth, bitmapHeight); - + Graphics2D graphics = currentPageImage.createGraphics(); graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); @@ -374,7 +374,7 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem return new BufferedImage( bitmapWidth, bitmapHeight, BufferedImage.TYPE_INT_ARGB); } - + /** * Returns a page viewport. * @param pageIndex the page index (zero-based) @@ -414,21 +414,21 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem state.dispose(); state = (Java2DGraphicsState)stateStack.pop(); } - + /** {@inheritDoc} */ protected void concatenateTransformationMatrix(AffineTransform at) { state.transform(at); } - + /** {@inheritDoc} */ protected void startVParea(CTM ctm, Rectangle2D clippingRect) { saveGraphicsState(); if (clippingRect != null) { - clipRect((float)clippingRect.getX() / 1000f, - (float)clippingRect.getY() / 1000f, - (float)clippingRect.getWidth() / 1000f, + clipRect((float)clippingRect.getX() / 1000f, + (float)clippingRect.getY() / 1000f, + (float)clippingRect.getWidth() / 1000f, (float)clippingRect.getHeight() / 1000f); } @@ -465,7 +465,7 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem */ protected void restoreStateStackAfterBreakOut(List breakOutList) { log.debug("Block.FIXED --> restoring context after break-out"); - + Iterator i = breakOutList.iterator(); while (i.hasNext()) { Java2DGraphicsState s = (Java2DGraphicsState)i.next(); @@ -475,7 +475,7 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem } /** - * {@inheritDoc} + * {@inheritDoc} */ protected void updateColor(Color col, boolean fill) { state.updateColor(col); @@ -500,7 +500,7 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem } /** - * {@inheritDoc} + * {@inheritDoc} */ protected void lineTo(float x, float y) { if (currentPath == null) { @@ -510,7 +510,7 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem } /** - * {@inheritDoc} + * {@inheritDoc} */ protected void moveTo(float x, float y) { if (currentPath == null) { @@ -520,26 +520,26 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem } /** - * {@inheritDoc} + * {@inheritDoc} */ protected void clipRect(float x, float y, float width, float height) { state.updateClip(new Rectangle2D.Float(x, y, width, height)); } /** - * {@inheritDoc} + * {@inheritDoc} */ protected void fillRect(float x, float y, float width, float height) { state.getGraph().fill(new Rectangle2D.Float(x, y, width, height)); } - + /** - * {@inheritDoc} + * {@inheritDoc} */ - protected void drawBorderLine(float x1, float y1, float x2, float y2, + protected void drawBorderLine(float x1, float y1, float x2, float y2, boolean horz, boolean startOrBefore, int style, Color col) { Graphics2D g2d = state.getGraph(); - drawBorderLine(new Rectangle2D.Float(x1, y1, x2 - x1, y2 - y1), + drawBorderLine(new Rectangle2D.Float(x1, y1, x2 - x1, y2 - y1), horz, startOrBefore, style, col, g2d); } @@ -547,13 +547,13 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem * Draw a border segment of an XSL-FO style border. * @param lineRect the line defined by its bounding rectangle * @param horz true for horizontal border segments, false for vertical border segments - * @param startOrBefore true for border segments on the start or before edge, + * @param startOrBefore true for border segments on the start or before edge, * false for end or after. * @param style the border style (one of Constants.EN_DASHED etc.) * @param col the color for the border segment * @param g2d the Graphics2D instance to paint to */ - public static void drawBorderLine(Rectangle2D.Float lineRect, + public static void drawBorderLine(Rectangle2D.Float lineRect, boolean horz, boolean startOrBefore, int style, Color col, Graphics2D g2d) { float x1 = lineRect.x; float y1 = lineRect.y; @@ -566,7 +566,7 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem return; } switch (style) { - case Constants.EN_DASHED: + case Constants.EN_DASHED: g2d.setColor(col); if (horz) { float unit = Math.abs(2 * h); @@ -576,7 +576,7 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem } unit = w / rep; float ym = y1 + (h / 2); - BasicStroke s = new BasicStroke(h, BasicStroke.CAP_BUTT, + BasicStroke s = new BasicStroke(h, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, new float[] {unit}, 0); g2d.setStroke(s); g2d.draw(new Line2D.Float(x1, ym, x2, ym)); @@ -588,7 +588,7 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem } unit = h / rep; float xm = x1 + (w / 2); - BasicStroke s = new BasicStroke(w, BasicStroke.CAP_BUTT, + BasicStroke s = new BasicStroke(w, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, new float[] {unit}, 0); g2d.setStroke(s); g2d.draw(new Line2D.Float(xm, y1, xm, y2)); @@ -604,7 +604,7 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem } unit = w / rep; float ym = y1 + (h / 2); - BasicStroke s = new BasicStroke(h, BasicStroke.CAP_ROUND, + BasicStroke s = new BasicStroke(h, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER, 10.0f, new float[] {0, unit}, 0); g2d.setStroke(s); g2d.draw(new Line2D.Float(x1, ym, x2, ym)); @@ -616,7 +616,7 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem } unit = h / rep; float xm = x1 + (w / 2); - BasicStroke s = new BasicStroke(w, BasicStroke.CAP_ROUND, + BasicStroke s = new BasicStroke(w, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER, 10.0f, new float[] {0, unit}, 0); g2d.setStroke(s); g2d.draw(new Line2D.Float(xm, y1, xm, y2)); @@ -722,7 +722,7 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem state.transform(at); renderText(text, state.getGraph(), font); restoreGraphicsState(); - + currentIPPosition = saveIP + text.getAllocIPD(); //super.renderText(text); @@ -755,8 +755,8 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem int[] letterAdjust = word.getLetterAdjustArray(); GlyphVector gv = g2d.getFont().createGlyphVector(g2d.getFontRenderContext(), s); double additionalWidth = 0.0; - if (letterAdjust == null - && text.getTextLetterSpaceAdjust() == 0 + if (letterAdjust == null + && text.getTextLetterSpaceAdjust() == 0 && text.getTextWordSpaceAdjust() == 0) { //nop } else { @@ -776,8 +776,8 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem SpaceArea space = (SpaceArea)child; String s = space.getSpace(); char sp = s.charAt(0); - int tws = (space.isAdjustable() - ? text.getTextWordSpaceAdjust() + int tws = (space.isAdjustable() + ? text.getTextWordSpaceAdjust() + 2 * text.getTextLetterSpaceAdjust() : 0); @@ -787,8 +787,8 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem } } } - - private static int[] getGlyphOffsets(String s, Font font, TextArea text, + + private static int[] getGlyphOffsets(String s, Font font, TextArea text, int[] letterAdjust) { int textLen = s.length(); int[] offsets = new int[textLen]; @@ -804,11 +804,11 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem } int cw = font.getWidth(mapped); int ladj = (letterAdjust != null && i < textLen - 1 ? letterAdjust[i + 1] : 0); - int tls = (i < textLen - 1 ? text.getTextLetterSpaceAdjust() : 0); + int tls = (i < textLen - 1 ? text.getTextLetterSpaceAdjust() : 0); offsets[i] = cw + ladj + tls + wordSpace; } return offsets; - } + } /** * Render leader area. This renders a leader area which is an area with a @@ -824,7 +824,7 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem float startx = (currentIPPosition + area.getBorderAndPaddingWidthStart()) / 1000f; float starty = ((currentBPPosition + area.getOffset()) / 1000f); - float endx = (currentIPPosition + area.getBorderAndPaddingWidthStart() + float endx = (currentIPPosition + area.getBorderAndPaddingWidthStart() + area.getIPD()) / 1000f; Color col = (Color) area.getTrait(Trait.COLOR); @@ -839,7 +839,7 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem case EN_SOLID: case EN_DASHED: case EN_DOUBLE: - drawBorderLine(startx, starty, endx, starty + ruleThickness, + drawBorderLine(startx, starty, endx, starty + ruleThickness, true, true, style, col); break; case EN_DOTTED: @@ -905,7 +905,7 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem int x = currentIPPosition + (int)Math.round(pos.getX()); int y = currentBPPosition + (int)Math.round(pos.getY()); uri = URISpecification.getURL(uri); - + ImageManager manager = getUserAgent().getFactory().getImageManager(); ImageInfo info = null; try { @@ -913,8 +913,8 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem info = manager.getImageInfo(uri, sessionContext); final ImageFlavor[] flavors = new ImageFlavor[] {ImageFlavor.GRAPHICS2D, - ImageFlavor.BUFFERED_IMAGE, - ImageFlavor.RENDERED_IMAGE, + ImageFlavor.BUFFERED_IMAGE, + ImageFlavor.RENDERED_IMAGE, ImageFlavor.XML_DOM}; Map hints = ImageUtil.getDefaultHints(sessionContext); org.apache.xmlgraphics.image.loader.Image img = manager.getImage( @@ -958,7 +958,7 @@ public abstract class Java2DRenderer extends AbstractPathOrientedRenderer implem } /** {@inheritDoc} */ - protected RendererContext createRendererContext(int x, int y, int width, int height, + protected RendererContext createRendererContext(int x, int y, int width, int height, Map foreignAttributes) { RendererContext context = super.createRendererContext( x, y, width, height, foreignAttributes); diff --git a/src/java/org/apache/fop/render/pcl/PCLRenderer.java b/src/java/org/apache/fop/render/pcl/PCLRenderer.java index 5ffef15ba..007ce4828 100644 --- a/src/java/org/apache/fop/render/pcl/PCLRenderer.java +++ b/src/java/org/apache/fop/render/pcl/PCLRenderer.java @@ -16,7 +16,7 @@ */ /* $Id$ */ - + package org.apache.fop.render.pcl; //Java @@ -111,14 +111,14 @@ public class PCLRenderer extends PrintRenderer { /** The MIME type for PCL */ public static final String MIME_TYPE = MimeConstants.MIME_PCL_ALT; - private static final QName CONV_MODE + private static final QName CONV_MODE = new QName(ExtensionElementMapping.URI, null, "conversion-mode"); - private static final QName SRC_TRANSPARENCY + private static final QName SRC_TRANSPARENCY = new QName(ExtensionElementMapping.URI, null, "source-transparency"); - + /** The OutputStream to write the PCL stream to */ protected OutputStream out; - + /** The PCL generator */ protected PCLGenerator gen; private boolean ioTrouble = false; @@ -130,13 +130,13 @@ public class PCLRenderer extends PrintRenderer { private int currentPrintDirection = 0; private GeneralPath currentPath = null; private java.awt.Color currentFillColor = null; - + /** * Controls whether appearance is more important than speed. False can cause some FO feature - * to be ignored (like the advanced borders). + * to be ignored (like the advanced borders). */ private boolean qualityBeforeSpeed = false; - + /** * Controls whether all text should be painted as text. This is a fallback setting in case * the mixture of native and bitmapped text does not provide the necessary quality. @@ -149,17 +149,17 @@ public class PCLRenderer extends PrintRenderer { * this to true will increase memory consumption. */ private boolean useColorCanvas = false; - + /** - * Controls whether the generation of PJL commands gets disabled. + * Controls whether the generation of PJL commands gets disabled. */ private boolean disabledPJL = false; - + /** contains the pageWith of the last printed page */ private long pageWidth = 0; /** contains the pageHeight of the last printed page */ private long pageHeight = 0; - + /** * Create the PCL renderer */ @@ -182,7 +182,7 @@ public class PCLRenderer extends PrintRenderer { public void setPJLDisabled(boolean disable) { this.disabledPJL = disable; } - + /** * Indicates whether PJL generation is disabled. * @return true if PJL generation is disabled. @@ -190,7 +190,7 @@ public class PCLRenderer extends PrintRenderer { public boolean isPJLDisabled() { return this.disabledPJL; } - + /** * {@inheritDoc} */ @@ -203,9 +203,9 @@ public class PCLRenderer extends PrintRenderer { BufferedImage.TYPE_INT_RGB); Graphics2D graphics2D = fontImage.createGraphics(); //The next line is important to get accurate font metrics! - graphics2D.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, + graphics2D.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); - + userAgent.getFactory().getFontManager().setupRenderer(this, graphics2D); } @@ -231,7 +231,7 @@ public class PCLRenderer extends PrintRenderer { public GraphicContext getGraphicContext() { return this.graphicContext; } - + /** @return the target resolution */ protected int getResolution() { int resolution = (int)Math.round(userAgent.getTargetResolution()); @@ -241,7 +241,7 @@ public class PCLRenderer extends PrintRenderer { return 600; } } - + /** * Sets the current font (NOTE: Hard-coded font mappings ATM!) * @param name the font name (internal F* names for now) @@ -317,25 +317,25 @@ public class PCLRenderer extends PrintRenderer { case 9: // F9 = Courier gen.writeCommand("(0N"); - gen.writeCommand("(s0p" + gen.formatDouble2(120.01f / (size / 1000.00f)) + gen.writeCommand("(s0p" + gen.formatDouble2(120.01f / (size / 1000.00f)) + "h0s0b4099T"); break; case 10: // F10 = Courier Oblique gen.writeCommand("(0N"); - gen.writeCommand("(s0p" + gen.formatDouble2(120.01f / (size / 1000.00f)) + gen.writeCommand("(s0p" + gen.formatDouble2(120.01f / (size / 1000.00f)) + "h1s0b4099T"); break; case 11: // F11 = Courier Bold gen.writeCommand("(0N"); - gen.writeCommand("(s0p" + gen.formatDouble2(120.01f / (size / 1000.00f)) + gen.writeCommand("(s0p" + gen.formatDouble2(120.01f / (size / 1000.00f)) + "h0s3b4099T"); break; case 12: // F12 = Courier Bold Oblique gen.writeCommand("(0N"); - gen.writeCommand("(s0p" + gen.formatDouble2(120.01f / (size / 1000.00f)) + gen.writeCommand("(s0p" + gen.formatDouble2(120.01f / (size / 1000.00f)) + "h1s3b4099T"); break; case 13: // F13 = Symbol @@ -400,52 +400,52 @@ public class PCLRenderer extends PrintRenderer { */ public void renderPage(PageViewport page) throws IOException, FOPException { saveGraphicsState(); - + //Paper source String paperSource = page.getForeignAttributeValue( new QName(PCLElementMapping.NAMESPACE, null, "paper-source")); if (paperSource != null) { gen.selectPaperSource(Integer.parseInt(paperSource)); } - + //Page size final long pagewidth = Math.round(page.getViewArea().getWidth()); final long pageheight = Math.round(page.getViewArea().getHeight()); selectPageFormat(pagewidth, pageheight); - + super.renderPage(page); - + //Eject page gen.formFeed(); restoreGraphicsState(); } private void selectPageFormat(long pagewidth, long pageheight) throws IOException { - //Only set the page format if it changes (otherwise duplex printing won't work) + //Only set the page format if it changes (otherwise duplex printing won't work) if ((pagewidth != this.pageWidth) || (pageheight != this.pageHeight)) { this.pageWidth = pagewidth; this.pageHeight = pageheight; - + this.currentPageDefinition = PCLPageDefinition.getPageDefinition( pagewidth, pageheight, 1000); - + if (this.currentPageDefinition == null) { this.currentPageDefinition = PCLPageDefinition.getDefaultPageDefinition(); - log.warn("Paper type could not be determined. Falling back to: " + log.warn("Paper type could not be determined. Falling back to: " + this.currentPageDefinition.getName()); } if (log.isDebugEnabled()) { log.debug("page size: " + currentPageDefinition.getPhysicalPageSize()); log.debug("logical page: " + currentPageDefinition.getLogicalPageRect()); } - + if (this.currentPageDefinition.isLandscapeFormat()) { gen.writeCommand("&l1O"); //Landscape Orientation } else { gen.writeCommand("&l0O"); //Portrait Orientation } gen.selectPageSize(this.currentPageDefinition.getSelector()); - + gen.clearHorizontalMargins(); gen.setTopMargin(0); } @@ -461,7 +461,7 @@ public class PCLRenderer extends PrintRenderer { protected void restoreGraphicsState() { graphicContext = (GraphicContext)graphicContextStack.pop(); } - + /** * Clip an area. write a clipping operation given coordinates in the current * transform. Coordinates are in points. @@ -478,7 +478,7 @@ public class PCLRenderer extends PrintRenderer { private Point2D transformedPoint(float x, float y) { return transformedPoint(Math.round(x), Math.round(y)); } - + private Point2D transformedPoint(int x, int y) { AffineTransform at = graphicContext.getTransform(); if (log.isTraceEnabled()) { @@ -488,7 +488,7 @@ public class PCLRenderer extends PrintRenderer { Point2D.Float transPoint = new Point2D.Float(); at.transform(orgPoint, transPoint); //At this point we have the absolute position in FOP's coordinate system - + //Now get PCL coordinates taking the current print direction and the logical page //into account. Dimension pageSize = currentPageDefinition.getPhysicalPageSize(); @@ -527,18 +527,18 @@ public class PCLRenderer extends PrintRenderer { } return transPoint; } - + private void changePrintDirection() { AffineTransform at = graphicContext.getTransform(); int newDir; try { - if (at.getScaleX() == 0 && at.getScaleY() == 0 + if (at.getScaleX() == 0 && at.getScaleY() == 0 && at.getShearX() == 1 && at.getShearY() == -1) { newDir = 90; - } else if (at.getScaleX() == -1 && at.getScaleY() == -1 + } else if (at.getScaleX() == -1 && at.getScaleY() == -1 && at.getShearX() == 0 && at.getShearY() == 0) { newDir = 180; - } else if (at.getScaleX() == 0 && at.getScaleY() == 0 + } else if (at.getScaleX() == 0 && at.getScaleY() == 0 && at.getShearX() == -1 && at.getShearY() == 1) { newDir = 270; } else { @@ -588,7 +588,7 @@ public class PCLRenderer extends PrintRenderer { protected void handleBlockTraits(Block block) { int borderPaddingStart = block.getBorderAndPaddingWidthStart(); int borderPaddingBefore = block.getBorderAndPaddingWidthBefore(); - + float startx = currentIPPosition / 1000f; float starty = currentBPPosition / 1000f; float width = block.getIPD() / 1000f; @@ -628,7 +628,7 @@ public class PCLRenderer extends PrintRenderer { */ protected void renderText(final TextArea text) { renderInlineAreaBackAndBorders(text); - + String fontname = getInternalFontNameForArea(text); final int fontsize = text.getTraitAsInteger(Trait.FONT_SIZE); @@ -640,9 +640,9 @@ public class PCLRenderer extends PrintRenderer { try { final Color col = (Color)text.getTrait(Trait.COLOR); - boolean pclFont = allTextAsBitmaps + boolean pclFont = allTextAsBitmaps ? false - : setFont(fontname, fontsize, text.getText()); + : setFont(fontname, fontsize, text.getText()); if (pclFont) { //this.currentFill = col; if (col != null) { @@ -650,7 +650,7 @@ public class PCLRenderer extends PrintRenderer { gen.setTransparencyMode(true, false); gen.selectGrayscale(col); } - + saveGraphicsState(); graphicContext.translate(rx, bl); setCursorPos(0, 0); @@ -667,25 +667,25 @@ public class PCLRenderer extends PrintRenderer { //Use Java2D to paint different fonts via bitmap final Font font = getFontFromArea(text); final int baseline = text.getBaselineOffset(); - + //for cursive fonts, so the text isn't clipped int extraWidth = font.getFontSize() / 3; final FontMetricsMapper mapper = (FontMetricsMapper)fontInfo.getMetricsFor( font.getFontName()); int maxAscent = mapper.getMaxAscent(font.getFontSize()) / 1000; final int additionalBPD = maxAscent - baseline; - + Graphics2DAdapter g2a = getGraphics2DAdapter(); final Rectangle paintRect = new Rectangle( rx, currentBPPosition + text.getOffset() - additionalBPD, text.getIPD() + extraWidth, text.getBPD() + additionalBPD); - RendererContext rc = createRendererContext(paintRect.x, paintRect.y, + RendererContext rc = createRendererContext(paintRect.x, paintRect.y, paintRect.width, paintRect.height, null); Map atts = new java.util.HashMap(); atts.put(CONV_MODE, "bitmap"); atts.put(SRC_TRANSPARENCY, "true"); rc.setProperty(RendererContextConstants.FOREIGN_ATTRIBUTES, atts); - + Graphics2DImagePainter painter = new Graphics2DImagePainter() { public void paint(Graphics2D g2d, Rectangle2D area) { @@ -696,17 +696,17 @@ public class PCLRenderer extends PrintRenderer { Java2DRenderer.renderText(text, g2d, font); renderTextDecoration(g2d, mapper, fontsize, text, 0, 0); } - + public Dimension getImageSize() { return paintRect.getSize(); } - + }; - g2a.paintImage(painter, rc, + g2a.paintImage(painter, rc, paintRect.x, paintRect.y, paintRect.width, paintRect.height); currentIPPosition = saveIP + text.getAllocIPD(); } - + } catch (IOException ioe) { handleIOTrouble(ioe); } @@ -721,11 +721,11 @@ public class PCLRenderer extends PrintRenderer { * @param baseline position of the baseline * @param startx start IPD */ - private static void renderTextDecoration(Graphics2D g2d, - FontMetrics fm, int fontsize, InlineArea inline, + private static void renderTextDecoration(Graphics2D g2d, + FontMetrics fm, int fontsize, InlineArea inline, int baseline, int startx) { - boolean hasTextDeco = inline.hasUnderline() - || inline.hasOverline() + boolean hasTextDeco = inline.hasUnderline() + || inline.hasOverline() || inline.hasLineThrough(); if (hasTextDeco) { float descender = fm.getDescender(fontsize) / 1000f; @@ -737,7 +737,7 @@ public class PCLRenderer extends PrintRenderer { g2d.setColor(ct); float y = baseline - descender / 2f; g2d.setStroke(new BasicStroke(lineWidth)); - g2d.draw(new Line2D.Float(startx / 1000f, y / 1000f, + g2d.draw(new Line2D.Float(startx / 1000f, y / 1000f, endx, y / 1000f)); } if (inline.hasOverline()) { @@ -745,7 +745,7 @@ public class PCLRenderer extends PrintRenderer { g2d.setColor(ct); float y = (float)(baseline - (1.1 * capHeight)); g2d.setStroke(new BasicStroke(lineWidth)); - g2d.draw(new Line2D.Float(startx / 1000f, y / 1000f, + g2d.draw(new Line2D.Float(startx / 1000f, y / 1000f, endx, y / 1000f)); } if (inline.hasLineThrough()) { @@ -753,12 +753,12 @@ public class PCLRenderer extends PrintRenderer { g2d.setColor(ct); float y = (float)(baseline - (0.45 * capHeight)); g2d.setStroke(new BasicStroke(lineWidth)); - g2d.draw(new Line2D.Float(startx / 1000f, y / 1000f, + g2d.draw(new Line2D.Float(startx / 1000f, y / 1000f, endx, y / 1000f)); } } } - + /** * Sets the current cursor position. The coordinates are transformed to the absolute position * on the logical PCL page and then passed on to the PCLGenerator. @@ -784,7 +784,7 @@ public class PCLRenderer extends PrintRenderer { } /** - * Closes the current subpath by appending a straight line segment from + * Closes the current subpath by appending a straight line segment from * the current point to the starting point of the subpath. */ protected void closePath() { @@ -792,8 +792,8 @@ public class PCLRenderer extends PrintRenderer { } /** - * Appends a straight line segment from the current point to (x, y). The - * new current point is (x, y). + * Appends a straight line segment from the current point to (x, y). The + * new current point is (x, y). * @param x x coordinate * @param y y coordinate */ @@ -805,7 +805,7 @@ public class PCLRenderer extends PrintRenderer { } /** - * Moves the current point to (x, y), omitting any connecting line segment. + * Moves the current point to (x, y), omitting any connecting line segment. * @param x x coordinate * @param y y coordinate */ @@ -815,7 +815,7 @@ public class PCLRenderer extends PrintRenderer { } currentPath.moveTo(x, y); } - + /** * Fill a rectangular area. * @param x the x coordinate (in pt) @@ -826,13 +826,13 @@ public class PCLRenderer extends PrintRenderer { protected void fillRect(float x, float y, float width, float height) { try { setCursorPos(x * 1000, y * 1000); - gen.fillRect((int)(width * 1000), (int)(height * 1000), + gen.fillRect((int)(width * 1000), (int)(height * 1000), this.currentFillColor); } catch (IOException ioe) { handleIOTrouble(ioe); } } - + /** * Sets the new current fill color. * @param color the color @@ -866,9 +866,9 @@ public class PCLRenderer extends PrintRenderer { String s = space.getSpace(); char sp = s.charAt(0); Font font = getFontFromArea(textArea); - - int tws = (space.isAdjustable() - ? textArea.getTextWordSpaceAdjust() + + int tws = (space.isAdjustable() + ? textArea.getTextWordSpaceAdjust() + 2 * textArea.getTextLetterSpaceAdjust() : 0); @@ -893,10 +893,10 @@ public class PCLRenderer extends PrintRenderer { float y = (currentBPPosition + viewport.getOffset()) / 1000f; float width = viewport.getIPD() / 1000f; float height = viewport.getBPD() / 1000f; - // TODO: Calculate the border rect correctly. + // TODO: Calculate the border rect correctly. float borderPaddingStart = viewport.getBorderAndPaddingWidthStart() / 1000f; float borderPaddingBefore = viewport.getBorderAndPaddingWidthBefore() / 1000f; - float bpwidth = borderPaddingStart + float bpwidth = borderPaddingStart + (viewport.getBorderAndPaddingWidthEnd() / 1000f); float bpheight = borderPaddingBefore + (viewport.getBorderAndPaddingWidthAfter() / 1000f); @@ -931,7 +931,7 @@ public class PCLRenderer extends PrintRenderer { //This is the content-rect float width = (float)bv.getIPD() / 1000f; float height = (float)bv.getBPD() / 1000f; - + if (bv.getPositioning() == Block.ABSOLUTE || bv.getPositioning() == Block.FIXED) { @@ -943,17 +943,17 @@ public class PCLRenderer extends PrintRenderer { if (bv.getPositioning() == Block.FIXED) { breakOutList = breakOutOfStateStack(); } - + AffineTransform positionTransform = new AffineTransform(); positionTransform.translate(bv.getXOffset(), bv.getYOffset()); - + //"left/"top" (bv.getX/YOffset()) specify the position of the content rectangle positionTransform.translate(-borderPaddingStart, -borderPaddingBefore); saveGraphicsState(); //Viewport position concatenateTransformationMatrix(mptToPt(positionTransform)); - + //Background and borders float bpwidth = (borderPaddingStart + bv.getBorderAndPaddingWidthEnd()) / 1000f; float bpheight = (borderPaddingBefore + bv.getBorderAndPaddingWidthAfter()) / 1000f; @@ -963,7 +963,7 @@ public class PCLRenderer extends PrintRenderer { AffineTransform contentRectTransform = new AffineTransform(); contentRectTransform.translate(borderPaddingStart, borderPaddingBefore); concatenateTransformationMatrix(mptToPt(contentRectTransform)); - + //Clipping if (bv.getClip()) { clipRect(0f, 0f, width, height); @@ -973,7 +973,7 @@ public class PCLRenderer extends PrintRenderer { //Set up coordinate system for content rectangle AffineTransform contentTransform = ctm.toAffineTransform(); concatenateTransformationMatrix(mptToPt(contentTransform)); - + currentIPPosition = 0; currentBPPosition = 0; renderBlocks(bv, children); @@ -984,7 +984,7 @@ public class PCLRenderer extends PrintRenderer { if (breakOutList != null) { restoreStateStackAfterBreakOut(breakOutList); } - + currentIPPosition = saveIP; currentBPPosition = saveBP; } else { @@ -999,16 +999,16 @@ public class PCLRenderer extends PrintRenderer { CTM tempctm = new CTM(containingIPPosition, currentBPPosition); ctm = tempctm.multiply(ctm); - + //Now adjust for border/padding currentBPPosition += borderPaddingBefore; Rectangle2D clippingRect = null; if (bv.getClip()) { - clippingRect = new Rectangle(currentIPPosition, currentBPPosition, + clippingRect = new Rectangle(currentIPPosition, currentBPPosition, bv.getIPD(), bv.getBPD()); } - + startVParea(ctm, clippingRect); currentIPPosition = 0; currentBPPosition = 0; @@ -1017,7 +1017,7 @@ public class PCLRenderer extends PrintRenderer { currentIPPosition = saveIP; currentBPPosition = saveBP; - + currentBPPosition += (int)(bv.getAllocBPD()); } //currentFontName = saveFontName; @@ -1034,7 +1034,7 @@ public class PCLRenderer extends PrintRenderer { changePrintDirection(); } } - + private List breakOutOfStateStack() { log.debug("Block.FIXED --> break out"); List breakOutList = new java.util.ArrayList(); @@ -1054,7 +1054,7 @@ public class PCLRenderer extends PrintRenderer { } /** {@inheritDoc} */ - protected RendererContext createRendererContext(int x, int y, int width, int height, + protected RendererContext createRendererContext(int x, int y, int width, int height, Map foreignAttributes) { RendererContext context = super.createRendererContext( x, y, width, height, foreignAttributes); @@ -1070,7 +1070,7 @@ public class PCLRenderer extends PrintRenderer { private static final ImageFlavor[] FLAVORS = new ImageFlavor[] {ImageFlavor.GRAPHICS2D, - ImageFlavor.BUFFERED_IMAGE, + ImageFlavor.BUFFERED_IMAGE, ImageFlavor.RENDERED_IMAGE, ImageFlavor.XML_DOM}; /** @@ -1089,18 +1089,18 @@ public class PCLRenderer extends PrintRenderer { Point origin = new Point(currentIPPosition, currentBPPosition); int x = origin.x + posInt.x; int y = origin.y + posInt.y; - + ImageManager manager = getUserAgent().getFactory().getImageManager(); ImageInfo info = null; try { ImageSessionContext sessionContext = getUserAgent().getImageSessionContext(); info = manager.getImageInfo(uri, sessionContext); - + //Only now fully load/prepare the image Map hints = ImageUtil.getDefaultHints(sessionContext); org.apache.xmlgraphics.image.loader.Image img = manager.getImage( info, FLAVORS, hints, sessionContext); - + //...and process the image if (img instanceof ImageGraphics2D) { ImageGraphics2D imageG2D = (ImageGraphics2D)img; @@ -1113,8 +1113,8 @@ public class PCLRenderer extends PrintRenderer { ImageRendered imgRend = (ImageRendered)img; RenderedImage ri = imgRend.getRenderedImage(); setCursorPos(x, y); - gen.paintBitmap(ri, - new Dimension(posInt.width, posInt.height), + gen.paintBitmap(ri, + new Dimension(posInt.width, posInt.height), false); } else if (img instanceof ImageXMLDOM) { ImageXMLDOM imgXML = (ImageXMLDOM)img; @@ -1160,18 +1160,18 @@ public class PCLRenderer extends PrintRenderer { float height = area.getBPD() / 1000f; float borderPaddingStart = area.getBorderAndPaddingWidthStart() / 1000f; float borderPaddingBefore = area.getBorderAndPaddingWidthBefore() / 1000f; - float bpwidth = borderPaddingStart + float bpwidth = borderPaddingStart + (area.getBorderAndPaddingWidthEnd() / 1000f); float bpheight = borderPaddingBefore + (area.getBorderAndPaddingWidthAfter() / 1000f); - + if (height != 0.0f || bpheight != 0.0f && bpwidth != 0.0f) { drawBackAndBorders(area, x, y - borderPaddingBefore , width + bpwidth , height + bpheight); } } - + /** * Draw the background and borders. This draws the background and border * traits for an area given the position. @@ -1188,18 +1188,18 @@ public class PCLRenderer extends PrintRenderer { BorderProps bpsAfter = (BorderProps) area.getTrait(Trait.BORDER_AFTER); BorderProps bpsStart = (BorderProps) area.getTrait(Trait.BORDER_START); BorderProps bpsEnd = (BorderProps) area.getTrait(Trait.BORDER_END); - + // draw background Trait.Background back; back = (Trait.Background) area.getTrait(Trait.BACKGROUND); if (back != null) { - + // Calculate padding rectangle float sx = startx; float sy = starty; float paddRectWidth = width; float paddRectHeight = height; - + if (bpsStart != null) { sx += bpsStart.width / 1000f; paddRectWidth -= bpsStart.width / 1000f; @@ -1214,15 +1214,15 @@ public class PCLRenderer extends PrintRenderer { if (bpsAfter != null) { paddRectHeight -= bpsAfter.width / 1000f; } - + if (back.getColor() != null) { updateFillColor(back.getColor()); fillRect(sx, sy, paddRectWidth, paddRectHeight); } - + // background image if (back.getImageInfo() != null) { - ImageSize imageSize = back.getImageInfo().getSize(); + ImageSize imageSize = back.getImageInfo().getSize(); saveGraphicsState(); clipRect(sx, sy, paddRectWidth, paddRectHeight); int horzCount = (int) ((paddRectWidth * 1000 / imageSize.getWidthMpt()) + 1.0f); @@ -1250,7 +1250,7 @@ public class PCLRenderer extends PrintRenderer { Rectangle2D pos; // Image positions are relative to the currentIP/BP pos = new Rectangle2D.Float( - sx - currentIPPosition + sx - currentIPPosition + (x * imageSize.getWidthMpt()), sy - currentBPPosition + (y * imageSize.getHeightMpt()), @@ -1262,7 +1262,7 @@ public class PCLRenderer extends PrintRenderer { restoreGraphicsState(); } } - + Rectangle2D.Float borderRect = new Rectangle2D.Float(startx, starty, width, height); drawBorders(borderRect, bpsBefore, bpsAfter, bpsStart, bpsEnd); } @@ -1275,8 +1275,8 @@ public class PCLRenderer extends PrintRenderer { * @param bpsStart the border specification on the start side * @param bpsEnd the border specification on the end side */ - protected void drawBorders(Rectangle2D.Float borderRect, - final BorderProps bpsBefore, final BorderProps bpsAfter, + protected void drawBorders(Rectangle2D.Float borderRect, + final BorderProps bpsBefore, final BorderProps bpsAfter, final BorderProps bpsStart, final BorderProps bpsEnd) { if (bpsBefore == null && bpsAfter == null && bpsStart == null && bpsEnd == null) { return; //no borders to paint @@ -1287,7 +1287,7 @@ public class PCLRenderer extends PrintRenderer { drawFastBorders(borderRect, bpsBefore, bpsAfter, bpsStart, bpsEnd); } } - + /** * Draws borders. Borders are drawn as shaded rectangles with no clipping. * @param borderRect the border rectangle @@ -1296,8 +1296,8 @@ public class PCLRenderer extends PrintRenderer { * @param bpsStart the border specification on the start side * @param bpsEnd the border specification on the end side */ - protected void drawFastBorders(Rectangle2D.Float borderRect, - final BorderProps bpsBefore, final BorderProps bpsAfter, + protected void drawFastBorders(Rectangle2D.Float borderRect, + final BorderProps bpsBefore, final BorderProps bpsAfter, final BorderProps bpsStart, final BorderProps bpsEnd) { float startx = borderRect.x; float starty = borderRect.y; @@ -1311,7 +1311,7 @@ public class PCLRenderer extends PrintRenderer { if (bpsAfter != null) { float borderWidth = bpsAfter.width / 1000f; updateFillColor(bpsAfter.color); - fillRect(startx, (starty + height - borderWidth), + fillRect(startx, (starty + height - borderWidth), width, borderWidth); } if (bpsStart != null) { @@ -1325,7 +1325,7 @@ public class PCLRenderer extends PrintRenderer { fillRect((startx + width - borderWidth), starty, borderWidth, height); } } - + /** * Draws borders. Borders are drawn in-memory and painted as a bitmap. * @param borderRect the border rectangle @@ -1334,8 +1334,8 @@ public class PCLRenderer extends PrintRenderer { * @param bpsStart the border specification on the start side * @param bpsEnd the border specification on the end side */ - protected void drawQualityBorders(Rectangle2D.Float borderRect, - final BorderProps bpsBefore, final BorderProps bpsAfter, + protected void drawQualityBorders(Rectangle2D.Float borderRect, + final BorderProps bpsBefore, final BorderProps bpsAfter, final BorderProps bpsStart, final BorderProps bpsEnd) { Graphics2DAdapter g2a = getGraphics2DAdapter(); final Rectangle.Float effBorderRect = new Rectangle2D.Float( @@ -1345,7 +1345,7 @@ public class PCLRenderer extends PrintRenderer { borderRect.height); final Rectangle paintRect = new Rectangle( (int)Math.round(borderRect.x * 1000f), - (int)Math.round(borderRect.y * 1000f), + (int)Math.round(borderRect.y * 1000f), (int)Math.floor(borderRect.width * 1000f) + 1, (int)Math.floor(borderRect.height * 1000f) + 1); //Add one pixel wide safety margin around the paint area @@ -1356,14 +1356,14 @@ public class PCLRenderer extends PrintRenderer { paintRect.y += yoffset; paintRect.width += 2 * pixelWidth; paintRect.height += 2 * pixelWidth; - - RendererContext rc = createRendererContext(paintRect.x, paintRect.y, + + RendererContext rc = createRendererContext(paintRect.x, paintRect.y, paintRect.width, paintRect.height, null); Map atts = new java.util.HashMap(); atts.put(CONV_MODE, "bitmap"); atts.put(SRC_TRANSPARENCY, "true"); rc.setProperty(RendererContextConstants.FOREIGN_ATTRIBUTES, atts); - + Graphics2DImagePainter painter = new Graphics2DImagePainter() { public void paint(Graphics2D g2d, Rectangle2D area) { @@ -1374,7 +1374,7 @@ public class PCLRenderer extends PrintRenderer { float width = effBorderRect.width; float height = effBorderRect.height; boolean[] b = new boolean[] { - (bpsBefore != null), (bpsEnd != null), + (bpsBefore != null), (bpsEnd != null), (bpsAfter != null), (bpsStart != null)}; if (!b[0] && !b[1] && !b[2] && !b[3]) { return; @@ -1385,9 +1385,9 @@ public class PCLRenderer extends PrintRenderer { (b[2] ? bpsAfter.width / 1000f : 0.0f), (b[3] ? bpsStart.width / 1000f : 0.0f)}; float[] clipw = new float[] { - BorderProps.getClippedWidth(bpsBefore) / 1000f, - BorderProps.getClippedWidth(bpsEnd) / 1000f, - BorderProps.getClippedWidth(bpsAfter) / 1000f, + BorderProps.getClippedWidth(bpsBefore) / 1000f, + BorderProps.getClippedWidth(bpsEnd) / 1000f, + BorderProps.getClippedWidth(bpsAfter) / 1000f, BorderProps.getClippedWidth(bpsStart) / 1000f}; starty += clipw[0]; height -= clipw[0]; @@ -1395,7 +1395,7 @@ public class PCLRenderer extends PrintRenderer { startx += clipw[3]; width -= clipw[3]; width -= clipw[1]; - + boolean[] slant = new boolean[] { (b[3] && b[0]), (b[0] && b[1]), (b[1] && b[2]), (b[2] && b[3])}; if (bpsBefore != null) { @@ -1433,7 +1433,7 @@ public class PCLRenderer extends PrintRenderer { currentPath = null; Rectangle2D.Float lineRect = new Rectangle2D.Float( sx1a, outery, ex1a - sx1a, innery - outery); - Java2DRenderer.drawBorderLine(lineRect, true, true, + Java2DRenderer.drawBorderLine(lineRect, true, true, bpsBefore.style, bpsBefore.color, g); //restoreGraphicsState(); } @@ -1447,7 +1447,7 @@ public class PCLRenderer extends PrintRenderer { float outerx = startx + width + clipw[1]; float clipx = outerx - clipw[1]; float innerx = outerx - bw[1]; - + //saveGraphicsState(); Graphics2D g = (Graphics2D)g2d.create(); moveTo(clipx, sy1); @@ -1472,7 +1472,7 @@ public class PCLRenderer extends PrintRenderer { currentPath = null; Rectangle2D.Float lineRect = new Rectangle2D.Float( innerx, sy1a, outerx - innerx, ey1a - sy1a); - Java2DRenderer.drawBorderLine(lineRect, false, false, + Java2DRenderer.drawBorderLine(lineRect, false, false, bpsEnd.style, bpsEnd.color, g); //restoreGraphicsState(); } @@ -1511,7 +1511,7 @@ public class PCLRenderer extends PrintRenderer { currentPath = null; Rectangle2D.Float lineRect = new Rectangle2D.Float( sx1a, innery, ex1a - sx1a, outery - innery); - Java2DRenderer.drawBorderLine(lineRect, true, false, + Java2DRenderer.drawBorderLine(lineRect, true, false, bpsAfter.style, bpsAfter.color, g); //restoreGraphicsState(); } @@ -1550,7 +1550,7 @@ public class PCLRenderer extends PrintRenderer { currentPath = null; Rectangle2D.Float lineRect = new Rectangle2D.Float( outerx, sy1a, innerx - outerx, ey1a - sy1a); - Java2DRenderer.drawBorderLine(lineRect, false, false, + Java2DRenderer.drawBorderLine(lineRect, false, false, bpsStart.style, bpsStart.color, g); //restoreGraphicsState(); } @@ -1559,10 +1559,10 @@ public class PCLRenderer extends PrintRenderer { public Dimension getImageSize() { return paintRect.getSize(); } - + }; try { - g2a.paintImage(painter, rc, + g2a.paintImage(painter, rc, paintRect.x - xoffset, paintRect.y, paintRect.width, paintRect.height); } catch (IOException ioe) { handleIOTrouble(ioe); @@ -1577,7 +1577,7 @@ public class PCLRenderer extends PrintRenderer { public void setAllTextAsBitmaps(boolean allTextAsBitmaps) { this.allTextAsBitmaps = allTextAsBitmaps; } - - - + + + } diff --git a/src/java/org/apache/fop/render/ps/AbstractPSTranscoder.java b/src/java/org/apache/fop/render/ps/AbstractPSTranscoder.java index ea4cc50bb..aa0fc88b9 100644 --- a/src/java/org/apache/fop/render/ps/AbstractPSTranscoder.java +++ b/src/java/org/apache/fop/render/ps/AbstractPSTranscoder.java @@ -16,7 +16,7 @@ */ /* $Id$ */ - + package org.apache.fop.render.ps; @@ -91,28 +91,28 @@ public abstract class AbstractPSTranscoder extends AbstractFOPTranscoder { * @exception TranscoderException if an error occured while transcoding */ protected void transcode(Document document, String uri, - TranscoderOutput output) + TranscoderOutput output) throws TranscoderException { graphics = createDocumentGraphics2D(); if (!isTextStroked()) { - FontInfo fontInfo = new FontInfo(); - //TODO Do custom font configuration here somewhere/somehow - FontSetup.setup(fontInfo); + FontInfo fontInfo = new FontInfo(); + //TODO Do custom font configuration here somewhere/somehow + FontSetup.setup(fontInfo); graphics.setCustomTextHandler(new NativeTextHandler(graphics, fontInfo)); } super.transcode(document, uri, output); getLogger().trace("document size: " + width + " x " + height); - + // prepare the image to be painted - UnitProcessor.Context uctx = UnitProcessor.createContext(ctx, + UnitProcessor.Context uctx = UnitProcessor.createContext(ctx, document.getDocumentElement()); - float widthInPt = UnitProcessor.userSpaceToSVG(width, SVGLength.SVG_LENGTHTYPE_PT, + float widthInPt = UnitProcessor.userSpaceToSVG(width, SVGLength.SVG_LENGTHTYPE_PT, UnitProcessor.HORIZONTAL_LENGTH, uctx); int w = (int)(widthInPt + 0.5); - float heightInPt = UnitProcessor.userSpaceToSVG(height, SVGLength.SVG_LENGTHTYPE_PT, + float heightInPt = UnitProcessor.userSpaceToSVG(height, SVGLength.SVG_LENGTHTYPE_PT, UnitProcessor.HORIZONTAL_LENGTH, uctx); int h = (int)(heightInPt + 0.5); getLogger().trace("document size: " + w + "pt x " + h + "pt"); @@ -140,7 +140,7 @@ public abstract class AbstractPSTranscoder extends AbstractFOPTranscoder { throw new TranscoderException(ex); } } - + /** {@inheritDoc} */ protected BridgeContext createBridgeContext() { @@ -148,7 +148,7 @@ public abstract class AbstractPSTranscoder extends AbstractFOPTranscoder { if (!isTextStroked()) { TextHandler handler = graphics.getCustomTextHandler(); if (handler instanceof NativeTextHandler) { - NativeTextHandler nativeTextHandler = (NativeTextHandler)handler; + NativeTextHandler nativeTextHandler = (NativeTextHandler)handler; PSTextPainter textPainter = new PSTextPainter(nativeTextHandler); ctx.setTextPainter(textPainter); ctx.putBridge(new PSTextElementBridge(textPainter)); diff --git a/src/java/org/apache/fop/render/ps/NativeTextHandler.java b/src/java/org/apache/fop/render/ps/NativeTextHandler.java index 174fe8077..9f62097e9 100644 --- a/src/java/org/apache/fop/render/ps/NativeTextHandler.java +++ b/src/java/org/apache/fop/render/ps/NativeTextHandler.java @@ -38,16 +38,16 @@ import org.apache.xmlgraphics.ps.PSGenerator; public class NativeTextHandler implements PSTextHandler { private PSGraphics2D g2d; - + /** FontInfo containing all available fonts */ protected FontInfo fontInfo; /** Currently valid Font */ protected Font font; - + /** Overriding FontState */ protected Font overrideFont = null; - + /** the current (internal) font name */ protected String currentFontName; @@ -67,13 +67,13 @@ public class NativeTextHandler implements PSTextHandler { setupFontInfo(); } } - + private void setupFontInfo() { //Sets up a FontInfo with default fonts fontInfo = new FontInfo(); FontSetup.setup(fontInfo); } - + /** * Return the font information associated with this object * @return the FontInfo object @@ -85,7 +85,7 @@ public class NativeTextHandler implements PSTextHandler { private PSGenerator getPSGenerator() { return this.g2d.getPSGenerator(); } - + /** {@inheritDoc} */ public void writeSetup() throws IOException { if (fontInfo != null) { @@ -99,9 +99,9 @@ public class NativeTextHandler implements PSTextHandler { } /** - * Draw a string to the PostScript document. The text is painted using + * Draw a string to the PostScript document. The text is painted using * text operations. - * {@inheritDoc} + * {@inheritDoc} */ public void drawString(String s, float x, float y) throws IOException { g2d.preparePainting(); @@ -112,7 +112,7 @@ public class NativeTextHandler implements PSTextHandler { this.font = this.overrideFont; this.overrideFont = null; } - + //Color and Font state g2d.establishColor(g2d.getColor()); establishCurrentFont(); @@ -130,14 +130,14 @@ public class NativeTextHandler implements PSTextHandler { gen.writeln(gen.formatDouble(x) + " " + gen.formatDouble(y) + " moveto "); gen.writeln("1 -1 scale"); - + StringBuffer sb = new StringBuffer("("); escapeText(s, sb); sb.append(") t "); gen.writeln(sb.toString()); - - gen.restoreGraphicsState(); + + gen.restoreGraphicsState(); } private void escapeText(final String text, StringBuffer target) { @@ -157,7 +157,7 @@ public class NativeTextHandler implements PSTextHandler { int fontSize = 1000 * f.getSize(); String style = f.isItalic() ? "italic" : "normal"; int weight = f.isBold() ? Font.WEIGHT_BOLD : Font.WEIGHT_NORMAL; - + FontTriplet triplet = fontInfo.findAdjustWeight(fontFamily, style, weight); if (triplet == null) { triplet = fontInfo.findAdjustWeight("sans-serif", style, weight); @@ -166,10 +166,10 @@ public class NativeTextHandler implements PSTextHandler { } private void establishCurrentFont() throws IOException { - if ((currentFontName != this.font.getFontName()) + if ((currentFontName != this.font.getFontName()) || (currentFontSize != this.font.getFontSize())) { PSGenerator gen = getPSGenerator(); - gen.writeln(this.font.getFontName() + " " + gen.writeln(this.font.getFontName() + " " + gen.formatDouble(font.getFontSize() / 1000f) + " F"); currentFontName = this.font.getFontName(); currentFontSize = this.font.getFontSize(); @@ -183,6 +183,6 @@ public class NativeTextHandler implements PSTextHandler { public void setOverrideFont(Font override) { this.overrideFont = override; } - + } diff --git a/src/java/org/apache/fop/svg/PDFDocumentGraphics2D.java b/src/java/org/apache/fop/svg/PDFDocumentGraphics2D.java index 513ba4587..5bdfe8c8d 100644 --- a/src/java/org/apache/fop/svg/PDFDocumentGraphics2D.java +++ b/src/java/org/apache/fop/svg/PDFDocumentGraphics2D.java @@ -56,7 +56,7 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D { private int width; private int height; - + //for SVG scaling private float svgWidth; private float svgHeight; @@ -65,7 +65,7 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D { public static final int NORMAL_PDF_RESOLUTION = 72; /** Default device resolution (300dpi is a resonable quality for most purposes) */ public static final int DEFAULT_NATIVE_DPI = 300; - + /** * The device resolution may be different from the normal target resolution. See * http://issues.apache.org/bugzilla/show_bug.cgi?id=37305 @@ -96,7 +96,7 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D { public PDFDocumentGraphics2D(boolean textAsShapes) { super(textAsShapes); - this.pdfDoc = new PDFDocument("Apache FOP Version " + Version.getVersion() + this.pdfDoc = new PDFDocument("Apache FOP Version " + Version.getVersion() + ": PDFDocumentGraphics2D"); this.pdfContext = new PDFContext(); } @@ -150,7 +150,7 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D { } /** - * Setup a default FontInfo instance if none has been setup before. + * Setup a default FontInfo instance if none has been setup before. */ public void setupDefaultFontInfo() { if (fontInfo == null) { @@ -160,7 +160,7 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D { setFontInfo(fontInfo); } } - + /** * Set the device resolution for rendering. Will take effect at the * start of the next page. @@ -184,7 +184,7 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D { public void setFontInfo(FontInfo fontInfo) { this.fontInfo = fontInfo; } - + /** * Get the font info for this pdf document. * @return the font information @@ -208,7 +208,7 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D { public PDFContext getPDFContext() { return this.pdfContext; } - + /** * Set the dimensions of the svg document that will be drawn. * This is useful if the dimensions of the svg document are different @@ -248,9 +248,9 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D { public void nextPage() { closePage(); } - + /** - * Closes the current page and adds it to the PDF file. + * Closes the current page and adds it to the PDF file. */ protected void closePage() { if (!pdfContext.isPagePending()) { @@ -270,7 +270,7 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D { this.pdfDoc.addObject(pdfContext.getCurrentPage()); pdfContext.clearCurrentPage(); } - + /** {@inheritDoc} */ protected void preparePainting() { if (pdfContext.isPagePending()) { @@ -300,7 +300,7 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D { if (this.initialTransform == null) { //Save initial transformation matrix this.initialTransform = getTransform(); - this.initialClip = getClip(); + this.initialClip = getClip(); } else { //Reset transformation matrix setTransform(this.initialTransform); @@ -313,7 +313,7 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D { if (currentStream == null) { currentStream = new StringWriter(); } - + PDFResources pdfResources = this.pdfDoc.getResources(); PDFPage page = this.pdfDoc.getFactory().makePage(pdfResources, width, height); @@ -321,7 +321,7 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D { pdfContext.setCurrentPage(page); pageRef = page.referencePDF(); - AffineTransform at = new AffineTransform(1.0, 0.0, 0.0, -1.0, + AffineTransform at = new AffineTransform(1.0, 0.0, 0.0, -1.0, 0.0, (double)height); currentStream.write("1 0 0 -1 0 " + height + " cm\n"); if (svgWidth != 0) { @@ -336,7 +336,7 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D { at.scale(s, s); currentStream.write("" + PDFNumber.doubleOut(s) + " 0 0 " + PDFNumber.doubleOut(s) + " 0 0 cm\n"); - + scale(1 / s, 1 / s); } // Remember the transform we installed. @@ -344,8 +344,8 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D { pdfContext.increasePageCount(); } - - + + /** * The rendering process has finished. * This should be called after the rendering has completed as there is diff --git a/src/java/org/apache/fop/svg/PDFDocumentGraphics2DConfigurator.java b/src/java/org/apache/fop/svg/PDFDocumentGraphics2DConfigurator.java index 789a7c247..cda1478bb 100644 --- a/src/java/org/apache/fop/svg/PDFDocumentGraphics2DConfigurator.java +++ b/src/java/org/apache/fop/svg/PDFDocumentGraphics2DConfigurator.java @@ -44,23 +44,23 @@ public class PDFDocumentGraphics2DConfigurator { * @param cfg the configuration * @throws ConfigurationException if an error occurs while configuring the object */ - public void configure(PDFDocumentGraphics2D graphics, Configuration cfg) + public void configure(PDFDocumentGraphics2D graphics, Configuration cfg) throws ConfigurationException { PDFDocument pdfDoc = graphics.getPDFDocument(); - + //Filter map pdfDoc.setFilterMap( PDFRendererConfigurator.buildFilterMapFromConfiguration(cfg)); - + //Fonts try { FontResolver fontResolver = FontManager.createMinimalFontResolver(); //TODO The following could be optimized by retaining the FontManager somewhere FontManager fontManager = new FontManager(); - + //TODO Make use of fontBaseURL, font substitution and referencing configuration //Requires a change to the expected configuration layout - + List/*<EmbedFontInfo>*/ embedFontInfoList = PrintRendererConfigurator.buildFontListFromConfiguration( cfg, fontResolver, false, fontManager); @@ -74,5 +74,5 @@ public class PDFDocumentGraphics2DConfigurator { throw new ConfigurationException("Error while setting up fonts", e); } } - + } diff --git a/src/java/org/apache/fop/svg/PDFGraphics2D.java b/src/java/org/apache/fop/svg/PDFGraphics2D.java index 5a147f3be..4d1ee6a6d 100644 --- a/src/java/org/apache/fop/svg/PDFGraphics2D.java +++ b/src/java/org/apache/fop/svg/PDFGraphics2D.java @@ -106,13 +106,13 @@ import org.apache.fop.util.ColorExt; public class PDFGraphics2D extends AbstractGraphics2D { private static final AffineTransform IDENTITY_TRANSFORM = new AffineTransform(); - - /** The number of decimal places. */ + + /** The number of decimal places. */ private static final int DEC = 8; /** Convenience constant for full opacity */ static final int OPAQUE = 255; - + /** * the PDF Document being created */ @@ -308,7 +308,7 @@ public class PDFGraphics2D extends AbstractGraphics2D { public String getPageReference() { return this.pageRef; } - + /** * Set the Graphics context. * @param c the graphics context to use @@ -319,10 +319,10 @@ public class PDFGraphics2D extends AbstractGraphics2D { } private void setPrivateHints() { - setRenderingHint(RenderingHintsKeyExt.KEY_AVOID_TILE_PAINTING, + setRenderingHint(RenderingHintsKeyExt.KEY_AVOID_TILE_PAINTING, RenderingHintsKeyExt.VALUE_AVOID_TILE_PAINTING_ON); } - + /** * Set the override font state for drawing text. * This is used by the PDF text painter so that it can temporarily @@ -362,7 +362,7 @@ public class PDFGraphics2D extends AbstractGraphics2D { concatMatrix(matrix); } } - + /** * This is mainly used for shading patterns which use the document-global coordinate system * instead of the local one. @@ -372,7 +372,7 @@ public class PDFGraphics2D extends AbstractGraphics2D { AffineTransform at = new AffineTransform(graphicsState.getTransform()); return at; } - + /** * This is a pdf specific method used to add a link to the * pdf document. @@ -417,7 +417,7 @@ public class PDFGraphics2D extends AbstractGraphics2D { * @param width the width to draw the image * @param height the height to draw the image */ - void addNativeImage(org.apache.xmlgraphics.image.loader.Image image, float x, float y, + void addNativeImage(org.apache.xmlgraphics.image.loader.Image image, float x, float y, float width, float height) { preparePainting(); String key = image.getInfo().getOriginalURI(); @@ -425,10 +425,10 @@ public class PDFGraphics2D extends AbstractGraphics2D { // Need to include hash code as when invoked from FO you // may have several 'independent' PDFGraphics2D so the // count is not enough. - key = "__AddNative_" + hashCode() + "_" + nativeCount; + key = "__AddNative_" + hashCode() + "_" + nativeCount; nativeCount++; } - + PDFImage pdfImage; if (image instanceof ImageRawJPEG) { pdfImage = new ImageRawJPEGAdapter((ImageRawJPEG)image, key); @@ -438,7 +438,7 @@ public class PDFGraphics2D extends AbstractGraphics2D { throw new IllegalArgumentException( "Unsupported Image subclass: " + image.getClass().getName()); } - + PDFXObject xObject = this.pdfDoc.addImage(resourceContext, pdfImage); if (outputStream != null) { try { @@ -649,7 +649,7 @@ public class PDFGraphics2D extends AbstractGraphics2D { graphicsState.pop(); } } - + /* // in theory we could set the clip using these methods // it doesn't seem to improve the file sizes much @@ -784,8 +784,8 @@ public class PDFGraphics2D extends AbstractGraphics2D { (float) gpaint.getPoint1().getX(), (float) gpaint.getPoint1().getY(), (float) gpaint.getPoint2().getX(), - (float) gpaint.getPoint2().getY(), - new float[] {0, 1}, + (float) gpaint.getPoint2().getY(), + new float[] {0, 1}, new Color[] {gpaint.getColor1(), gpaint.getColor2()}, gpaint.isCyclic() ? LinearGradientPaint.REPEAT : LinearGradientPaint.NO_CYCLE); } @@ -927,7 +927,7 @@ public class PDFGraphics2D extends AbstractGraphics2D { return false; // PDF can't do alpha } - someColors.add(new PDFColor(cc.getRed(), cc.getGreen(), + someColors.add(new PDFColor(cc.getRed(), cc.getGreen(), cc.getBlue())); } @@ -947,7 +947,7 @@ public class PDFGraphics2D extends AbstractGraphics2D { currentStream.write(myPat.getColorSpaceOut(fill)); return true; - } + } if (paint instanceof PatternPaint) { PatternPaint pp = (PatternPaint)paint; return createPattern(pp, fill); @@ -990,14 +990,14 @@ public class PDFGraphics2D extends AbstractGraphics2D { // double patMaxX = rect.getX() + rect.getWidth(); // double patMaxY = rect.getY() + rect.getHeight(); // double stepX = rect.getWidth(); - // double stepY = rect.getHeight(); - // + // double stepY = rect.getHeight(); + // // int startX = (int)((rect.getX() - gnMaxX)/stepX); // int startY = (int)((rect.getY() - gnMaxY)/stepY); - // + // // int endX = (int)((patMaxX - gnMinX)/stepX); // int endY = (int)((patMaxY - gnMinY)/stepY); - // + // // pattGraphic.translate(startX*stepX, startY*stepY); // for (int yIdx=startY; yIdx<=endY; yIdx++) { // for (int xIdx=startX; xIdx<=endX; xIdx++) { @@ -1027,14 +1027,14 @@ public class PDFGraphics2D extends AbstractGraphics2D { } /** @todo see if pdfDoc and res can be linked here, - (currently res <> PDFDocument's resources) so addFonts() + (currently res <> PDFDocument's resources) so addFonts() can be moved to PDFDocument class */ res.addFonts(pdfDoc, specialFontInfo); PDFPattern myPat = pdfDoc.getFactory().makePattern( resourceContext, 1, res, 1, 1, bbox, rect.getWidth(), rect.getHeight(), - theMatrix, null, + theMatrix, null, pattGraphic.getBuffer()); currentStream.write(myPat.getColorSpaceOut(fill)); @@ -1094,7 +1094,7 @@ public class PDFGraphics2D extends AbstractGraphics2D { (rgbCS, 32, 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000, false, DataBuffer.TYPE_BYTE); - PaintContext pctx = paint.createContext(rgbCM, devBounds, usrBounds, + PaintContext pctx = paint.createContext(rgbCM, devBounds, usrBounds, at, getRenderingHints()); PDFXObject imageInfo = pdfDoc.getXObject ("TempImage:" + pctx.toString()); @@ -1112,7 +1112,7 @@ public class PDFGraphics2D extends AbstractGraphics2D { final int[] line = new int[devW]; final byte[] mask; int x, y, val, rgbIdx = 0; - + if (pcm.hasAlpha()) { mask = new byte[devW * devH]; int maskIdx = 0; @@ -1611,7 +1611,7 @@ public class PDFGraphics2D extends AbstractGraphics2D { return; } } - + AffineTransform trans = getTransform(); double[] tranvals = new double[6]; trans.getMatrix(tranvals); @@ -1709,7 +1709,7 @@ public class PDFGraphics2D extends AbstractGraphics2D { iter.next(); } } - + /** * Do the PDF drawing command. * This does the PDF drawing command according to fill |