package org.apache.fop.render.bitmap;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.util.EnumMap;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.fonts.DefaultFontConfig;
import org.apache.fop.fonts.DefaultFontConfig.DefaultFontConfigParser;
import org.apache.fop.fonts.FontEventAdapter;
import org.apache.fop.render.RendererConfig;
import org.apache.fop.render.java2d.Java2DRendererConfig;
import org.apache.fop.render.java2d.Java2DRendererConfig.Java2DRendererConfigParser;
import org.apache.fop.util.ColorUtil;
import static org.apache.fop.render.bitmap.BitmapRendererOption.ANTI_ALIASING;
import static org.apache.fop.render.bitmap.BitmapRendererOption.BACKGROUND_COLOR;
import static org.apache.fop.render.bitmap.BitmapRendererOption.COLOR_MODE;
import static org.apache.fop.render.bitmap.BitmapRendererOption.JAVA2D_TRANSPARENT_PAGE_BACKGROUND;
import static org.apache.fop.render.bitmap.BitmapRendererOption.RENDERING_QUALITY;
import static org.apache.fop.render.bitmap.BitmapRendererOption.RENDERING_QUALITY_ELEMENT;
import static org.apache.fop.render.bitmap.BitmapRendererOption.RENDERING_SPEED;
public class BitmapRendererConfig implements RendererConfig {
private final EnumMap<BitmapRendererOption, Object> params
= new EnumMap<BitmapRendererOption, Object>(BitmapRendererOption.class);
private final DefaultFontConfig fontConfig;
BitmapRendererConfig(DefaultFontConfig fontConfig) {
this.fontConfig = fontConfig;
}
public DefaultFontConfig getFontInfoConfig() {
return fontConfig;
}
public Color getBackgroundColor() {
return (Color) get(BACKGROUND_COLOR);
}
public Boolean hasAntiAliasing() {
return (Boolean) get(ANTI_ALIASING);
}
public Boolean isRenderHighQuality() {
return (Boolean) get(RENDERING_QUALITY);
}
public Integer getColorMode() {
return (Integer) get(COLOR_MODE);
}
public boolean hasTransparentBackround() {
Object result = get(JAVA2D_TRANSPARENT_PAGE_BACKGROUND);
return (Boolean) (result != null ? result
: JAVA2D_TRANSPARENT_PAGE_BACKGROUND.getDefaultValue());
}
private Object get(BitmapRendererOption option) {
return params.get(option);
}
public static class BitmapRendererConfigParser implements RendererConfigParser {
private final String mimeType;
public BitmapRendererConfigParser(String mimeType) {
this.mimeType = mimeType;
}
private void setParam(BitmapRendererConfig config, BitmapRendererOption option,
Object value) {
config.params.put(option, value != null ? value : option.getDefaultValue());
}
void build(BitmapRendererConfig config, FOUserAgent userAgent,
Configuration cfg) throws FOPException {
if (cfg != null) {
Java2DRendererConfig j2dConfig = new Java2DRendererConfigParser(null).build(
userAgent, cfg);
Boolean isTransparent = j2dConfig.isPageBackgroundTransparent();
isTransparent = isTransparent == null
? (Boolean) JAVA2D_TRANSPARENT_PAGE_BACKGROUND.getDefaultValue()
: isTransparent;
setParam(config, JAVA2D_TRANSPARENT_PAGE_BACKGROUND, isTransparent);
String background = getValue(cfg, BACKGROUND_COLOR);
if (isTransparent) {
config.params.put(BACKGROUND_COLOR, null);
} else {
setParam(config, BACKGROUND_COLOR,
ColorUtil.parseColorString(userAgent, background));
}
setParam(config, BitmapRendererOption.ANTI_ALIASING,
getChild(cfg, ANTI_ALIASING).getValueAsBoolean(
(Boolean) ANTI_ALIASING.getDefaultValue()));
String optimization = getValue(cfg, RENDERING_QUALITY_ELEMENT);
setParam(config, RENDERING_QUALITY,
!(BitmapRendererOption.getValue(optimization) == RENDERING_SPEED));
String color = getValue(cfg, COLOR_MODE);
setParam(config, COLOR_MODE,
getBufferedImageIntegerFromColor(BitmapRendererOption.getValue(color)));
}
}
public BitmapRendererConfig build(FOUserAgent userAgent, Configuration cfg)
throws FOPException {
BitmapRendererConfig config = new BitmapRendererConfig(new DefaultFontConfigParser()
.parse(cfg, userAgent.validateStrictly(),
new FontEventAdapter(userAgent.getEventBroadcaster())));
build(config, userAgent, cfg);
return config;
}
private Integer getBufferedImageIntegerFromColor(BitmapRendererOption option) {
if (option == null) {
return null;
}
switch (option) {
case COLOR_MODE_RGBA:
return BufferedImage.TYPE_INT_ARGB;
case COLOR_MODE_RGB:
return BufferedImage.TYPE_INT_RGB;
case COLOR_MODE_GRAY:
return BufferedImage.TYPE_BYTE_GRAY;
case COLOR_MODE_BINARY:
case COLOR_MODE_BILEVEL:
return BufferedImage.TYPE_BYTE_BINARY;
default:
return null;
}
}
private Configuration getChild(Configuration cfg, BitmapRendererOption option) {
return cfg.getChild(option.getName());
}
private String getValue(Configuration cfg, BitmapRendererOption option) {
return cfg.getChild(option.getName()).getValue(null);
}
public String getMimeType() {
return mimeType;
}
}
}