Browse Source

AFP Output: Added a configuration option to override the resource level defaults in the code. The chosen defaults in code may not always be the best. For example, a user reported that they can't use print-level images for some reason and it is not possible to switch on inlining for background images.

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@741068 13f79535-47bb-0310-9956-ffa450edef68
pull/37/head
Jeremias Maerki 15 years ago
parent
commit
f541dedc7f

+ 24
- 2
src/documentation/content/xdocs/trunk/output.xml View File

]]></source> ]]></source>
<note>Be careful when using this option not to overwrite existing resource files from previous rendering runs.</note> <note>Be careful when using this option not to overwrite existing resource files from previous rendering runs.</note>
</section> </section>
<section id="afp-resource-level-defaults">
<title>Resource Level Defaults</title>
<p>
By default, bitmap image objects (or page segments derived from them) are put in the
print-file-level resource group and GOCA graphics are inlined for compatibility with
the AFP Workbench tool.
</p>
<p>
It is possible to override these defaults, either per image (see the
<link href="#afp-foreign-attributes-resource">afp:resource-level</link>
extension attribute below) or by specifying different defaults in the configuration:
</p>
<source><![CDATA[
<default-resource-levels goca="print-file" bitmap="inline"/>]]></source>
<p>
"goca" refers to GOCA graphics and "bitmap" refers to IOCA images. The possible values
for the attributes are "inline" and "print-file". In the future,
additional possibilities may be added.
</p>
</section>
</section> </section>
<section id="afp-extensions"> <section id="afp-extensions">
<title>Extensions</title> <title>Extensions</title>
]]></source> ]]></source>
<p>The resource-level attribute where the resource object will reside in the AFP output datastream. <p>The resource-level attribute where the resource object will reside in the AFP output datastream.
The possible values for this are "inline", "print-file" and "external". The possible values for this are "inline", "print-file" and "external".
When no resource-level attribute is provided, resources are by default placed at "print-file" level.
When "external" is used a resource-group-file attribute must also be specified.</p>
When "external" is used a resource-group-file attribute must also be specified.
Please refer to the <link href="#afp-resource-level-defaults">Resource Level Defaults</link>
above to see what is used if the resource-level attribute is not specified.
</p>
<p></p> <p></p>
</section> </section>
</section> </section>

+ 67
- 65
src/java/org/apache/fop/afp/AFPGraphics2D.java View File

import org.apache.commons.io.output.ByteArrayOutputStream; import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.apache.fop.afp.goca.GraphicsSetLineType;
import org.apache.fop.afp.modca.GraphicsObject;
import org.apache.fop.afp.svg.AFPGraphicsConfiguration;
import org.apache.fop.fonts.FontInfo;
import org.apache.fop.svg.NativeImageHandler;

import org.apache.xmlgraphics.image.loader.ImageInfo; import org.apache.xmlgraphics.image.loader.ImageInfo;
import org.apache.xmlgraphics.image.loader.ImageSize; import org.apache.xmlgraphics.image.loader.ImageSize;
import org.apache.xmlgraphics.image.loader.impl.ImageRendered; import org.apache.xmlgraphics.image.loader.impl.ImageRendered;
import org.apache.xmlgraphics.ps.ImageEncodingHelper; import org.apache.xmlgraphics.ps.ImageEncodingHelper;
import org.apache.xmlgraphics.util.MimeConstants; import org.apache.xmlgraphics.util.MimeConstants;


import org.apache.fop.afp.goca.GraphicsSetLineType;
import org.apache.fop.afp.modca.GraphicsObject;
import org.apache.fop.afp.svg.AFPGraphicsConfiguration;
import org.apache.fop.fonts.FontInfo;
import org.apache.fop.svg.NativeImageHandler;

/** /**
* This is a concrete implementation of <tt>AbstractGraphics2D</tt> (and * This is a concrete implementation of <tt>AbstractGraphics2D</tt> (and
* therefore of <tt>Graphics2D</tt>) which is able to generate GOCA byte * therefore of <tt>Graphics2D</tt>) which is able to generate GOCA byte
AFPResourceManager resourceManager, AFPResourceInfo resourceInfo, AFPResourceManager resourceManager, AFPResourceInfo resourceInfo,
FontInfo fontInfo) { FontInfo fontInfo) {
super(textAsShapes); super(textAsShapes);
this.paintingState = paintingState;
this.resourceManager = resourceManager;
this.resourceInfo = resourceInfo;
this.fontInfo = fontInfo;
setPaintingState(paintingState);
setResourceManager(resourceManager);
setResourceInfo(resourceInfo);
setFontInfo(fontInfo);
} }


/** /**
* *
* @param resourceManager the AFP resource manager * @param resourceManager the AFP resource manager
*/ */
public void setResourceManager(AFPResourceManager resourceManager) {
private void setResourceManager(AFPResourceManager resourceManager) {
this.resourceManager = resourceManager; this.resourceManager = resourceManager;
} }


* *
* @param resourceInfo the AFP resource info * @param resourceInfo the AFP resource info
*/ */
public void setResourceInfo(AFPResourceInfo resourceInfo) {
private void setResourceInfo(AFPResourceInfo resourceInfo) {
this.resourceInfo = resourceInfo; this.resourceInfo = resourceInfo;
} }


/**
* Returns the GOCA graphics object
*
* @return the GOCA graphics object
*/
public GraphicsObject getGraphicsObject() {
return this.graphicsObj;
}

/**
* Sets the GOCA graphics object
*
* @param obj the GOCA graphics object
*/
public void setGraphicsObject(GraphicsObject obj) {
this.graphicsObj = obj;
}

/**
* Sets the AFP painting state
*
* @param paintingState the AFP painting state
*/
private void setPaintingState(AFPPaintingState paintingState) {
this.paintingState = paintingState;
}

/**
* Returns the AFP painting state
*
* @return the AFP painting state
*/
public AFPPaintingState getPaintingState() {
return this.paintingState;
}

/**
* Sets the FontInfo
*
* @param fontInfo the FontInfo
*/
private void setFontInfo(FontInfo fontInfo) {
this.fontInfo = fontInfo;
}

/**
* Returns the FontInfo
*
* @return the FontInfo
*/
public FontInfo getFontInfo() {
return this.fontInfo;
}

/** /**
* Sets the GraphicContext * Sets the GraphicContext
* *
this.customTextHandler = handler; this.customTextHandler = handler;
} }


/**
* Returns the GOCA graphics object
*
* @return the GOCA graphics object
*/
public GraphicsObject getGraphicsObject() {
return this.graphicsObj;
}

/**
* Sets the GOCA graphics object
*
* @param obj the GOCA graphics object
*/
public void setGraphicsObject(GraphicsObject obj) {
this.graphicsObj = obj;
}

/**
* Sets the AFP painting state
*
* @param paintingState the AFP painting state
*/
public void setPaintingState(AFPPaintingState paintingState) {
this.paintingState = paintingState;
}

/**
* Returns the AFP painting state
*
* @return the AFP painting state
*/
public AFPPaintingState getPaintingState() {
return this.paintingState;
}

/**
* Sets the FontInfo
*
* @param the FontInfo
*/
public void setFontInfo(FontInfo fontInfo) {
this.fontInfo = fontInfo;
}

/**
* Returns the FontInfo
*
* @return the FontInfo
*/
public FontInfo getFontInfo() {
return this.fontInfo;
}

/** {@inheritDoc} */ /** {@inheritDoc} */
public void drawRenderableImage(RenderableImage img, AffineTransform xform) { public void drawRenderableImage(RenderableImage img, AffineTransform xform) {
log.debug("drawRenderableImage() NYI: img=" + img + ", xform=" + xform); log.debug("drawRenderableImage() NYI: img=" + img + ", xform=" + xform);

+ 8
- 6
src/java/org/apache/fop/afp/AFPResourceInfo.java View File

* The level at which a resource is to reside in the AFP output * The level at which a resource is to reside in the AFP output
*/ */
public class AFPResourceInfo { public class AFPResourceInfo {
private static final AFPResourceLevel DEFAULT_LEVEL

/** the general default resource level */
public static final AFPResourceLevel DEFAULT_LEVEL
= new AFPResourceLevel(AFPResourceLevel.PRINT_FILE); = new AFPResourceLevel(AFPResourceLevel.PRINT_FILE);


/** the uri of this resource */
/** the URI of this resource */
private String uri = null; private String uri = null;


/** /**
private boolean levelChanged = false; private boolean levelChanged = false;


/** /**
* Sets the data object uri
* Sets the data object URI.
* *
* @param uri the data object uri
* @param uri the data object URI
*/ */
public void setUri(String uri) { public void setUri(String uri) {
this.uri = uri; this.uri = uri;
} }


/** /**
* Returns the uri of this data object
* Returns the URI of this data object.
* *
* @return the uri of this data object
* @return the URI of this data object
*/ */
public String getUri() { public String getUri() {
return uri; return uri;

+ 110
- 0
src/java/org/apache/fop/afp/AFPResourceLevelDefaults.java View File

/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

/* $Id$ */

package org.apache.fop.afp;

import java.util.Iterator;
import java.util.Map;

import org.apache.fop.afp.modca.ResourceObject;

/**
* This class holds resource levels defaults for the various resource types.
*/
public class AFPResourceLevelDefaults {

private static final Map RESOURCE_TYPE_NAMES = new java.util.HashMap();

static {
//Map to be extended as need arises:
registerResourceTypeName("goca", ResourceObject.TYPE_GRAPHIC);
registerResourceTypeName("bitmap", ResourceObject.TYPE_IMAGE);
}

private static void registerResourceTypeName(String name, byte type) {
RESOURCE_TYPE_NAMES.put(name.toLowerCase(), new Byte(type));
}

private static byte getResourceType(String resourceTypeName) {
Byte result = (Byte)RESOURCE_TYPE_NAMES.get(resourceTypeName.toLowerCase());
if (result == null) {
throw new IllegalArgumentException("Unknown resource type name: " + resourceTypeName);
}
return result.byteValue();
}

private Map defaultResourceLevels = new java.util.HashMap();

/**
* Creates a new instance with default values.
*/
public AFPResourceLevelDefaults() {
// level not explicitly set/changed so default to inline for GOCA graphic objects
// (due to a bug in the IBM AFP Workbench Viewer (2.04.01.07), hard copy works just fine)
setDefaultResourceLevel(ResourceObject.TYPE_GRAPHIC,
new AFPResourceLevel(AFPResourceLevel.INLINE));
}

/**
* Sets the default resource level for a particular resource type.
* @param type the resource type name
* @param level the resource level
*/
public void setDefaultResourceLevel(String type, AFPResourceLevel level) {
setDefaultResourceLevel(getResourceType(type), level);
}

/**
* Sets the default resource level for a particular resource type.
* @param type the resource type ({@link ResourceObject}.TYPE_*)
* @param level the resource level
*/
public void setDefaultResourceLevel(byte type, AFPResourceLevel level) {
this.defaultResourceLevels.put(new Byte(type), level);
}

/**
* Returns the default resource level for a particular resource type.
* @param type the resource type ({@link ResourceObject}.TYPE_*)
* @return the default resource level
*/
public AFPResourceLevel getDefaultResourceLevel(byte type) {
AFPResourceLevel result = (AFPResourceLevel)this.defaultResourceLevels.get(new Byte(type));
if (result == null) {
result = AFPResourceInfo.DEFAULT_LEVEL;
}
return result;
}

/**
* Allows to merge the values from one instance into another. Values from the instance passed
* in as a parameter override values of this instance.
* @param other the other instance to get the defaults from
*/
public void mergeFrom(AFPResourceLevelDefaults other) {
Iterator iter = other.defaultResourceLevels.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry)iter.next();
Byte type = (Byte)entry.getKey();
AFPResourceLevel level = (AFPResourceLevel)entry.getValue();
this.defaultResourceLevels.put(type, level);
}
}

}

+ 18
- 0
src/java/org/apache/fop/afp/AFPResourceManager.java View File



private Map pageSegmentMap = new java.util.HashMap(); private Map pageSegmentMap = new java.util.HashMap();


private AFPResourceLevelDefaults resourceLevelDefaults = new AFPResourceLevelDefaults();

/** /**
* Main constructor * Main constructor
*/ */
currentPage.createIncludePageSegment(pageSegmentName, x, y, createHardPageSegments); currentPage.createIncludePageSegment(pageSegmentName, x, y, createHardPageSegments);
} }


/**
* Sets resource level defaults. The existing defaults over merged with the ones passed in
* as parameter.
* @param defaults the new defaults
*/
public void setResourceLevelDefaults(AFPResourceLevelDefaults defaults) {
this.resourceLevelDefaults.mergeFrom(defaults);
}

/**
* Returns the resource level defaults in use with this resource manager.
* @return the resource level defaults
*/
public AFPResourceLevelDefaults getResourceLevelDefaults() {
return this.resourceLevelDefaults;
}
} }

+ 8
- 8
src/java/org/apache/fop/render/afp/AFPImageHandlerGraphics2D.java View File



import java.io.IOException; import java.io.IOException;


import org.apache.xmlgraphics.image.loader.ImageFlavor;
import org.apache.xmlgraphics.image.loader.impl.ImageGraphics2D;
import org.apache.xmlgraphics.java2d.Graphics2DImagePainter;
import org.apache.xmlgraphics.util.MimeConstants;

import org.apache.fop.afp.AFPDataObjectInfo; import org.apache.fop.afp.AFPDataObjectInfo;
import org.apache.fop.afp.AFPGraphics2D; import org.apache.fop.afp.AFPGraphics2D;
import org.apache.fop.afp.AFPGraphicsObjectInfo; import org.apache.fop.afp.AFPGraphicsObjectInfo;
import org.apache.fop.afp.AFPPaintingState; import org.apache.fop.afp.AFPPaintingState;
import org.apache.fop.afp.AFPResourceInfo; import org.apache.fop.afp.AFPResourceInfo;
import org.apache.fop.afp.AFPResourceLevel;
import org.apache.xmlgraphics.image.loader.ImageFlavor;
import org.apache.xmlgraphics.image.loader.impl.ImageGraphics2D;
import org.apache.xmlgraphics.java2d.Graphics2DImagePainter;
import org.apache.xmlgraphics.util.MimeConstants;
import org.apache.fop.afp.modca.ResourceObject;


/** /**
* PDFImageHandler implementation which handles Graphics2D images. * PDFImageHandler implementation which handles Graphics2D images.
= (AFPGraphicsObjectInfo)super.generateDataObjectInfo(rendererImageInfo); = (AFPGraphicsObjectInfo)super.generateDataObjectInfo(rendererImageInfo);


AFPResourceInfo resourceInfo = graphicsObjectInfo.getResourceInfo(); AFPResourceInfo resourceInfo = graphicsObjectInfo.getResourceInfo();
//level not explicitly set/changed so default to inline for GOCA graphic objects
// (due to a bug in the IBM AFP Workbench Viewer (2.04.01.07), hard copy works just fine)
if (!resourceInfo.levelChanged()) { if (!resourceInfo.levelChanged()) {
resourceInfo.setLevel(new AFPResourceLevel(AFPResourceLevel.INLINE));
resourceInfo.setLevel(afpInfo.getResourceManager().getResourceLevelDefaults()
.getDefaultResourceLevel(ResourceObject.TYPE_GRAPHIC));
} }


// set mime type (unsupported by MOD:CA registry) // set mime type (unsupported by MOD:CA registry)

+ 13
- 2
src/java/org/apache/fop/render/afp/AFPImageHandlerRenderedImage.java View File

import org.apache.fop.afp.AFPImageObjectInfo; import org.apache.fop.afp.AFPImageObjectInfo;
import org.apache.fop.afp.AFPObjectAreaInfo; import org.apache.fop.afp.AFPObjectAreaInfo;
import org.apache.fop.afp.AFPPaintingState; import org.apache.fop.afp.AFPPaintingState;
import org.apache.fop.afp.AFPResourceInfo;
import org.apache.fop.afp.modca.ResourceObject;
import org.apache.fop.util.bitmap.BitmapImageUtil; import org.apache.fop.util.bitmap.BitmapImageUtil;


/** /**
AFPRendererContext rendererContext AFPRendererContext rendererContext
= (AFPRendererContext)rendererImageInfo.getRendererContext(); = (AFPRendererContext)rendererImageInfo.getRendererContext();
AFPInfo afpInfo = rendererContext.getInfo(); AFPInfo afpInfo = rendererContext.getInfo();

AFPResourceInfo resourceInfo = imageObjectInfo.getResourceInfo();
if (!resourceInfo.levelChanged()) {
resourceInfo.setLevel(afpInfo.getResourceManager().getResourceLevelDefaults()
.getDefaultResourceLevel(ResourceObject.TYPE_IMAGE));
}

AFPPaintingState paintingState = afpInfo.getPaintingState(); AFPPaintingState paintingState = afpInfo.getPaintingState();
int resolution = paintingState.getResolution(); int resolution = paintingState.getResolution();
int maxPixelSize = paintingState.getBitsPerPixel(); int maxPixelSize = paintingState.getBitsPerPixel();
ImageSize intrinsicSize = imageInfo.getSize(); ImageSize intrinsicSize = imageInfo.getSize();


boolean useFS10 = (maxPixelSize == 1) || BitmapImageUtil.isMonochromeImage(renderedImage); boolean useFS10 = (maxPixelSize == 1) || BitmapImageUtil.isMonochromeImage(renderedImage);
boolean usePageSegments = useFS10 && !imageObjectInfo.getResourceInfo().getLevel().isInline();
boolean usePageSegments = useFS10
&& !resourceInfo.getLevel().isInline();


ImageSize effIntrinsicSize = intrinsicSize; ImageSize effIntrinsicSize = intrinsicSize;
if (usePageSegments) { if (usePageSegments) {
+ " to " + resampledDim); + " to " + resampledDim);
} }
renderedImage = BitmapImageUtil.convertToMonochrome(renderedImage, resampledDim); renderedImage = BitmapImageUtil.convertToMonochrome(renderedImage, resampledDim);
effIntrinsicSize = new ImageSize(resampledDim.width, resampledDim.height, resolution);
effIntrinsicSize = new ImageSize(
resampledDim.width, resampledDim.height, resolution);
} }
} }
if (useFS10) { if (useFS10) {

+ 18
- 7
src/java/org/apache/fop/render/afp/AFPRenderer.java View File

import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;


import org.apache.xmlgraphics.image.loader.ImageException;
import org.apache.xmlgraphics.image.loader.ImageFlavor;
import org.apache.xmlgraphics.image.loader.ImageInfo;
import org.apache.xmlgraphics.image.loader.ImageManager;
import org.apache.xmlgraphics.image.loader.ImageSessionContext;
import org.apache.xmlgraphics.image.loader.util.ImageUtil;
import org.apache.xmlgraphics.ps.ImageEncodingHelper;

import org.apache.fop.afp.AFPBorderPainter; import org.apache.fop.afp.AFPBorderPainter;
import org.apache.fop.afp.AFPDataObjectInfo; import org.apache.fop.afp.AFPDataObjectInfo;
import org.apache.fop.afp.AFPEventProducer; import org.apache.fop.afp.AFPEventProducer;
import org.apache.fop.afp.AFPPaintingState; import org.apache.fop.afp.AFPPaintingState;
import org.apache.fop.afp.AFPRectanglePainter; import org.apache.fop.afp.AFPRectanglePainter;
import org.apache.fop.afp.AFPResourceLevelDefaults;
import org.apache.fop.afp.AFPResourceManager; import org.apache.fop.afp.AFPResourceManager;
import org.apache.fop.afp.AFPTextDataInfo; import org.apache.fop.afp.AFPTextDataInfo;
import org.apache.fop.afp.AFPUnitConverter; import org.apache.fop.afp.AFPUnitConverter;
import org.apache.fop.render.RendererContext; import org.apache.fop.render.RendererContext;
import org.apache.fop.render.afp.extensions.AFPElementMapping; import org.apache.fop.render.afp.extensions.AFPElementMapping;
import org.apache.fop.render.afp.extensions.AFPPageSetup; import org.apache.fop.render.afp.extensions.AFPPageSetup;
import org.apache.xmlgraphics.image.loader.ImageException;
import org.apache.xmlgraphics.image.loader.ImageFlavor;
import org.apache.xmlgraphics.image.loader.ImageInfo;
import org.apache.xmlgraphics.image.loader.ImageManager;
import org.apache.xmlgraphics.image.loader.ImageSessionContext;
import org.apache.xmlgraphics.image.loader.util.ImageUtil;
import org.apache.xmlgraphics.ps.ImageEncodingHelper;


/** /**
* This is an implementation of a FOP Renderer that renders areas to AFP. * This is an implementation of a FOP Renderer that renders areas to AFP.
resourceManager.setDefaultResourceGroupFilePath(filePath); resourceManager.setDefaultResourceGroupFilePath(filePath);
} }


/**
* Sets the resource level defaults. The object passed in provides information which resource
* level shall be used by default for various kinds of resources.
* @param defaults the resource level defaults
*/
public void setResourceLevelDefaults(AFPResourceLevelDefaults defaults) {
resourceManager.setResourceLevelDefaults(defaults);
}

/** {@inheritDoc} */ /** {@inheritDoc} */
protected void establishTransformationMatrix(AffineTransform at) { protected void establishTransformationMatrix(AffineTransform at) {
saveGraphicsState(); saveGraphicsState();

+ 22
- 0
src/java/org/apache/fop/render/afp/AFPRendererConfigurator.java View File

import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.avalon.framework.configuration.ConfigurationException;


import org.apache.fop.afp.AFPResourceLevel;
import org.apache.fop.afp.AFPResourceLevelDefaults;
import org.apache.fop.afp.fonts.AFPFontInfo; import org.apache.fop.afp.fonts.AFPFontInfo;
import org.apache.fop.afp.fonts.CharacterSet; import org.apache.fop.afp.fonts.CharacterSet;
import org.apache.fop.afp.fonts.FopCharacterSet; import org.apache.fop.afp.fonts.FopCharacterSet;
+ resourceGroupDest + "'"); + resourceGroupDest + "'");
} }
} }

Configuration defaultResourceLevelCfg = cfg.getChild("default-resource-levels", false);
if (defaultResourceLevelCfg != null) {
AFPResourceLevelDefaults defaults = new AFPResourceLevelDefaults();
String[] types = defaultResourceLevelCfg.getAttributeNames();
for (int i = 0, c = types.length; i < c; i++) {
String type = types[i];
try {
String level = defaultResourceLevelCfg.getAttribute(type);
defaults.setDefaultResourceLevel(type, AFPResourceLevel.valueOf(level));
} catch (IllegalArgumentException iae) {
LogUtil.handleException(log, iae,
userAgent.getFactory().validateUserConfigStrictly());
} catch (ConfigurationException e) {
LogUtil.handleException(log, e,
userAgent.getFactory().validateUserConfigStrictly());
}
}
afpRenderer.setResourceLevelDefaults(defaults);
}
} }
} }
} }

+ 8
- 4
src/java/org/apache/fop/render/afp/AFPRendererContext.java View File

import java.util.Map; import java.util.Map;


import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.Configuration;

import org.apache.fop.afp.AFPPaintingState; import org.apache.fop.afp.AFPPaintingState;
import org.apache.fop.afp.AFPResourceInfo; import org.apache.fop.afp.AFPResourceInfo;
import org.apache.fop.afp.AFPResourceLevel;
import org.apache.fop.afp.AFPResourceManager; import org.apache.fop.afp.AFPResourceManager;
import org.apache.fop.afp.modca.ResourceObject;
import org.apache.fop.render.AbstractRenderer; import org.apache.fop.render.AbstractRenderer;
import org.apache.fop.render.RendererContext; import org.apache.fop.render.RendererContext;
import org.apache.fop.render.RendererContextConstants; import org.apache.fop.render.RendererContextConstants;
= new AFPForeignAttributeReader(); = new AFPForeignAttributeReader();
AFPResourceInfo resourceInfo AFPResourceInfo resourceInfo
= foreignAttributeReader.getResourceInfo(foreignAttributes); = foreignAttributeReader.getResourceInfo(foreignAttributes);
// default to inline level if painted as GOCA
if (!resourceInfo.levelChanged() && !paintAsBitmap) {
resourceInfo.setLevel(new AFPResourceLevel(AFPResourceLevel.INLINE));
// set default resource level if an explicit one hasn't been set
if (!resourceInfo.levelChanged()) {
byte resourceType = paintAsBitmap
? ResourceObject.TYPE_IMAGE : ResourceObject.TYPE_GRAPHIC;
resourceInfo.setLevel(info.getResourceManager().getResourceLevelDefaults()
.getDefaultResourceLevel(resourceType));
} }
info.setResourceInfo(resourceInfo); info.setResourceInfo(resourceInfo);
} }

+ 17
- 6
src/java/org/apache/fop/render/afp/AbstractAFPImageHandlerRawStream.java View File

import java.io.InputStream; import java.io.InputStream;


import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.apache.fop.afp.AFPDataObjectInfo;
import org.apache.fop.afp.AFPObjectAreaInfo;
import org.apache.fop.afp.AFPPaintingState;

import org.apache.xmlgraphics.image.loader.ImageInfo; import org.apache.xmlgraphics.image.loader.ImageInfo;
import org.apache.xmlgraphics.image.loader.ImageSize; import org.apache.xmlgraphics.image.loader.ImageSize;
import org.apache.xmlgraphics.image.loader.impl.ImageRawStream; import org.apache.xmlgraphics.image.loader.impl.ImageRawStream;


import org.apache.fop.afp.AFPDataObjectInfo;
import org.apache.fop.afp.AFPObjectAreaInfo;
import org.apache.fop.afp.AFPPaintingState;
import org.apache.fop.afp.AFPResourceInfo;
import org.apache.fop.afp.modca.ResourceObject;

/** /**
* A base abstract AFP raw stream image handler * A base abstract AFP raw stream image handler
*/ */
public AFPDataObjectInfo generateDataObjectInfo( public AFPDataObjectInfo generateDataObjectInfo(
AFPRendererImageInfo rendererImageInfo) throws IOException { AFPRendererImageInfo rendererImageInfo) throws IOException {
AFPDataObjectInfo dataObjectInfo = super.generateDataObjectInfo(rendererImageInfo); AFPDataObjectInfo dataObjectInfo = super.generateDataObjectInfo(rendererImageInfo);
AFPRendererContext rendererContext
= (AFPRendererContext)rendererImageInfo.getRendererContext();
AFPInfo afpInfo = rendererContext.getInfo();


ImageInfo imageInfo = rendererImageInfo.getImageInfo(); ImageInfo imageInfo = rendererImageInfo.getImageInfo();
String mimeType = imageInfo.getMimeType(); String mimeType = imageInfo.getMimeType();
if (mimeType != null) { if (mimeType != null) {
dataObjectInfo.setMimeType(mimeType); dataObjectInfo.setMimeType(mimeType);
} }

AFPResourceInfo resourceInfo = dataObjectInfo.getResourceInfo();
if (!resourceInfo.levelChanged()) {
resourceInfo.setLevel(afpInfo.getResourceManager().getResourceLevelDefaults()
.getDefaultResourceLevel(ResourceObject.TYPE_IMAGE));
}

ImageRawStream rawStream = (ImageRawStream) rendererImageInfo.getImage(); ImageRawStream rawStream = (ImageRawStream) rendererImageInfo.getImage();
InputStream inputStream = rawStream.createInputStream(); InputStream inputStream = rawStream.createInputStream();
try { try {


// set object area info // set object area info
AFPObjectAreaInfo objectAreaInfo = dataObjectInfo.getObjectAreaInfo(); AFPObjectAreaInfo objectAreaInfo = dataObjectInfo.getObjectAreaInfo();
AFPRendererContext rendererContext
= (AFPRendererContext)rendererImageInfo.getRendererContext();
AFPInfo afpInfo = rendererContext.getInfo();
AFPPaintingState paintingState = afpInfo.getPaintingState(); AFPPaintingState paintingState = afpInfo.getPaintingState();
int resolution = paintingState.getResolution(); int resolution = paintingState.getResolution();
objectAreaInfo.setWidthRes(resolution); objectAreaInfo.setWidthRes(resolution);

+ 4
- 0
status.xml View File

documents. Example: the fix of marks layering will be such a case when it's done. documents. Example: the fix of marks layering will be such a case when it's done.
--> -->
<release version="FOP Trunk" date="TBD"> <release version="FOP Trunk" date="TBD">
<action context="Renderers" dev="JM" type="add">
AFP Output: Added a configuration option to override the resource level defaults in the
code.
</action>
<action context="Code" dev="VH" type="fix" fixes-bug="46638"> <action context="Code" dev="VH" type="fix" fixes-bug="46638">
MinOptMaxUtil.toMinOptMax was converting LengthRangeProperty objects into illegal MinOptMax MinOptMaxUtil.toMinOptMax was converting LengthRangeProperty objects into illegal MinOptMax
objects (in some cases opt could be inferior to min). objects (in some cases opt could be inferior to min).

Loading…
Cancel
Save