blob: 99bc14960f10c5c39314adda48a7aa55b48b7b86 [file] [log] [blame]
/*
* 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.render.bitmap;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.util.EnumMap;
import org.apache.fop.apps.FOPException;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.configuration.Configuration;
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;
/**
* The Bitmap renderer config data object.
*/
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);
}
/**
* The parser for the Bitmap renderer configuration data.
*/
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) {
// We don't use setParam here because we want to force a null value
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) {
Object defaultValue = option.getDefaultValue();
Object result = cfg.getChild(option.getName()).getValue(null);
if (result == null || "".equals(result)) {
result = defaultValue;
}
if (result == null) {
return null;
}
if (result instanceof Color) {
return ColorUtil.colorToString((Color) result);
}
return result.toString();
}
public String getMimeType() {
return mimeType;
}
}
}