/*
* Copyright 2006-2017 ICEsoft Technologies Canada Corp.
*
* Licensed 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.
*/
package org.icepdf.core.util;
import java.awt.*;
/**
* <p>The <code>GraphicsRenderingHints</code> class provides a central place for
* storing Java2D rendering hints settings. The
* <code>GraphicsRenderingHints</code> object is used to apply different rendering
* hints for printing and screen presentation when rending a Page's content.</p>
* <br>
* <p>The "screen" and "print" configuration are configurable with system properties.
* See the <i>ICEpdf Developer's Guide</i> for more information about configuring
* these properites.</p>
*
* @author Mark Collette
* @since 2.0
*/
public class GraphicsRenderingHints {
/**
* Constant used to specify rendering hint specific to screen rendering.
*/
public static final int SCREEN = 1;
/**
* Constant used to specify rendering hint specific to print rendering.
*/
public static final int PRINT = 2;
/**
* Gets the singleton representation of this object.
*
* @return a reference to the singleton GraphicsRenderingHints object.
*/
public static synchronized GraphicsRenderingHints getDefault() {
if (singleton == null) {
singleton = new GraphicsRenderingHints();
}
return singleton;
}
// singleton value of this object.
private static GraphicsRenderingHints singleton;
/**
* Load values from the system properties if any and assign defaults.
*/
private GraphicsRenderingHints() {
setFromProperties();
}
/**
* Gets the rendering hints for either the SCREEN or PRINT mode.
*
* @param hintType SCREEN or PRINT, if incorrectly specified PRINT settings
* are returned.
* @return RenderingHints used by Java2D graphics context.
*/
public RenderingHints getRenderingHints(final int hintType) {
if (hintType == SCREEN)
return (RenderingHints) screenHints.clone();
else
return (RenderingHints) printHints.clone();
}
public Color getPageBackgroundColor(final int hintType) {
if (hintType == SCREEN)
return screenBackground;
else
return printBackground;
}
/**
* Rereads the system properties responsible for setting the rendering hints
* for both the PRINT and SCREEN modes.
*/
public synchronized void reset() {
setFromProperties();
}
/**
* Utility method for reading the system properties.
*/
private void setFromProperties() {
// grab System properties for screen rendering attributes
String property = Defs.sysProperty("org.icepdf.core.screen.alphaInterpolation");
if (property != null) {
if (property.equalsIgnoreCase("VALUE_ALPHA_INTERPOLATION_QUALITY")) {
screenAlphaInterpolocation = RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY;
} else if (property.equalsIgnoreCase("VALUE_ALPHA_INTERPOLATION_DEFAULT")) {
screenAlphaInterpolocation = RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT;
} else if (property.equalsIgnoreCase("VALUE_ALPHA_INTERPOLATION_SPEED")) {
screenAlphaInterpolocation = RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED;
}
}
property = Defs.sysProperty("org.icepdf.core.screen.antiAliasing");
if (property != null) {
if (property.equalsIgnoreCase("VALUE_ANTIALIAS_DEFAULT")) {
screenAntiAliasing = RenderingHints.VALUE_ANTIALIAS_DEFAULT;
} else if (property.equalsIgnoreCase("VALUE_ANTIALIAS_ON")) {
screenAntiAliasing = RenderingHints.VALUE_ANTIALIAS_ON;
} else if (property.equalsIgnoreCase("VALUE_ANTIALIAS_OFF")) {
screenAntiAliasing = RenderingHints.VALUE_ANTIALIAS_OFF;
}
}
property = Defs.sysProperty("org.icepdf.core.screen.textAntiAliasing");
if (property != null) {
if (property.equalsIgnoreCase("VALUE_TEXT_ANTIALIAS_DEFAULT")) {
screenTextAntiAliasing = RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT;
} else if (property.equalsIgnoreCase("VALUE_TEXT_ANTIALIAS_ON")) {
screenTextAntiAliasing = RenderingHints.VALUE_TEXT_ANTIALIAS_ON;
} else if (property.equalsIgnoreCase("VALUE_TEXT_ANTIALIAS_OFF")) {
screenTextAntiAliasing = RenderingHints.VALUE_TEXT_ANTIALIAS_OFF;
}
}
property = Defs.sysProperty("org.icepdf.core.screen.colorRender");
if (property != null) {
if (property.equalsIgnoreCase("VALUE_COLOR_RENDER_DEFAULT")) {
screenColorRendering = RenderingHints.VALUE_COLOR_RENDER_DEFAULT;
} else if (property.equalsIgnoreCase("VALUE_COLOR_RENDER_QUALITY")) {
screenColorRendering = RenderingHints.VALUE_COLOR_RENDER_QUALITY;
} else if (property.equalsIgnoreCase("VALUE_COLOR_RENDER_SPEED")) {
screenColorRendering = RenderingHints.VALUE_COLOR_RENDER_SPEED;
}
}
property = Defs.sysProperty("org.icepdf.core.screen.dither");
if (property != null) {
if (property.equalsIgnoreCase("VALUE_DITHER_DEFAULT")) {
screenDithering = RenderingHints.VALUE_DITHER_DEFAULT;
} else if (property.equalsIgnoreCase("VALUE_DITHER_DISABLE")) {
screenDithering = RenderingHints.VALUE_DITHER_DISABLE;
} else if (property.equalsIgnoreCase("VALUE_DITHER_ENABLE")) {
screenDithering = RenderingHints.VALUE_DITHER_ENABLE;
}
}
property = Defs.sysProperty("org.icepdf.core.screen.fractionalmetrics");
if (property != null) {
if (property.equalsIgnoreCase("VALUE_FRACTIONALMETRICS_DEFAULT")) {
screenFractionalMetrics = RenderingHints.VALUE_FRACTIONALMETRICS_DEFAULT;
} else if (property.equalsIgnoreCase("VALUE_FRACTIONALMETRICS_ON")) {
screenFractionalMetrics = RenderingHints.VALUE_FRACTIONALMETRICS_ON;
} else if (property.equalsIgnoreCase("VALUE_FRACTIONALMETRICS_OFF")) {
screenFractionalMetrics = RenderingHints.VALUE_FRACTIONALMETRICS_OFF;
}
}
property = Defs.sysProperty("org.icepdf.core.screen.interpolation");
if (property != null) {
if (property.equalsIgnoreCase("VALUE_INTERPOLATION_BICUBIC")) {
screenInterPolation = RenderingHints.VALUE_INTERPOLATION_BICUBIC;
} else if (property.equalsIgnoreCase("VALUE_INTERPOLATION_BILINEAR")) {
screenInterPolation = RenderingHints.VALUE_INTERPOLATION_BILINEAR;
} else if (property.equalsIgnoreCase("VALUE_INTERPOLATION_NEAREST_NEIGHBOR")) {
screenInterPolation = RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR;
}
}
property = Defs.sysProperty("org.icepdf.core.screen.render");
if (property != null) {
if (property.equalsIgnoreCase("VALUE_RENDER_DEFAULT")) {
screenRendering = RenderingHints.VALUE_RENDER_DEFAULT;
} else if (property.equalsIgnoreCase("VALUE_RENDER_QUALITY")) {
screenRendering = RenderingHints.VALUE_RENDER_QUALITY;
} else if (property.equalsIgnoreCase("VALUE_RENDER_SPEED")) {
screenRendering = RenderingHints.VALUE_RENDER_SPEED;
}
}
property = Defs.sysProperty("org.icepdf.core.screen.stroke");
if (property != null) {
if (property.equalsIgnoreCase("VALUE_STROKE_DEFAULT")) {
screenStrokeControl = RenderingHints.VALUE_STROKE_DEFAULT;
} else if (property.equalsIgnoreCase("VALUE_STROKE_NORMALIZE")) {
screenStrokeControl = RenderingHints.VALUE_STROKE_NORMALIZE;
} else if (property.equalsIgnoreCase("VALUE_STROKE_PURE")) {
screenStrokeControl = RenderingHints.VALUE_STROKE_PURE;
}
}
property = Defs.sysProperty("org.icepdf.core.screen.background");
if (property != null) {
if (property.equalsIgnoreCase("VALUE_DRAW_WHITE_BACKGROUND")) {
screenBackground = Color.white;
} else if (property.equalsIgnoreCase("VALUE_DRAW_NO_BACKGROUND")) {
screenBackground = null;
}
}
screenHints = new RenderingHints(
RenderingHints.KEY_ALPHA_INTERPOLATION, screenAlphaInterpolocation);
screenHints.put(RenderingHints.KEY_ANTIALIASING, screenAntiAliasing);
screenHints.put(RenderingHints.KEY_TEXT_ANTIALIASING, screenTextAntiAliasing);
screenHints.put(RenderingHints.KEY_COLOR_RENDERING, screenColorRendering);
screenHints.put(RenderingHints.KEY_DITHERING, screenDithering);
screenHints.put(RenderingHints.KEY_FRACTIONALMETRICS, screenFractionalMetrics);
screenHints.put(RenderingHints.KEY_INTERPOLATION, screenInterPolation);
screenHints.put(RenderingHints.KEY_RENDERING, screenRendering);
screenHints.put(RenderingHints.KEY_STROKE_CONTROL, screenStrokeControl);
// grab System properties for print rendering attributes
property = Defs.sysProperty("org.icepdf.core.print.alphaInterpolation");
if (property != null) {
if (property.equalsIgnoreCase("VALUE_ALPHA_INTERPOLATION_QUALITY")) {
printAlphaInterpolocation = RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY;
} else if (property.equalsIgnoreCase("VALUE_ALPHA_INTERPOLATION_DEFAULT")) {
printAlphaInterpolocation = RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT;
} else if (property.equalsIgnoreCase("VALUE_ALPHA_INTERPOLATION_SPEED")) {
printAlphaInterpolocation = RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED;
}
}
property = Defs.sysProperty("org.icepdf.core.print.antiAliasing");
if (property != null) {
if (property.equalsIgnoreCase("VALUE_ANTIALIAS_DEFAULT")) {
printAntiAliasing = RenderingHints.VALUE_ANTIALIAS_DEFAULT;
} else if (property.equalsIgnoreCase("VALUE_ANTIALIAS_ON")) {
printAntiAliasing = RenderingHints.VALUE_ANTIALIAS_ON;
} else if (property.equalsIgnoreCase("VALUE_ANTIALIAS_OFF")) {
printAntiAliasing = RenderingHints.VALUE_ANTIALIAS_OFF;
}
}
property = Defs.sysProperty("org.icepdf.core.print.textAntiAliasing");
if (property != null) {
if (property.equalsIgnoreCase("VALUE_TEXT_ANTIALIAS_DEFAULT")) {
printTextAntiAliasing = RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT;
} else if (property.equalsIgnoreCase("VALUE_TEXT_ANTIALIAS_ON")) {
printTextAntiAliasing = RenderingHints.VALUE_TEXT_ANTIALIAS_ON;
} else if (property.equalsIgnoreCase("VALUE_TEXT_ANTIALIAS_OFF")) {
printTextAntiAliasing = RenderingHints.VALUE_TEXT_ANTIALIAS_OFF;
}
}
property = Defs.sysProperty("org.icepdf.core.print.colorRender");
if (property != null) {
if (property.equalsIgnoreCase("VALUE_COLOR_RENDER_DEFAULT")) {
printColorRendering = RenderingHints.VALUE_COLOR_RENDER_DEFAULT;
} else if (property.equalsIgnoreCase("VALUE_COLOR_RENDER_QUALITY")) {
printColorRendering = RenderingHints.VALUE_COLOR_RENDER_QUALITY;
} else if (property.equalsIgnoreCase("VALUE_COLOR_RENDER_SPEED")) {
printColorRendering = RenderingHints.VALUE_COLOR_RENDER_SPEED;
}
}
property = Defs.sysProperty("org.icepdf.core.print.dither");
if (property != null) {
if (property.equalsIgnoreCase("VALUE_DITHER_DEFAULT")) {
printDithering = RenderingHints.VALUE_DITHER_DEFAULT;
} else if (property.equalsIgnoreCase("VALUE_DITHER_DISABLE")) {
printDithering = RenderingHints.VALUE_DITHER_DISABLE;
} else if (property.equalsIgnoreCase("VALUE_DITHER_ENABLE")) {
printDithering = RenderingHints.VALUE_DITHER_ENABLE;
}
}
property = Defs.sysProperty("org.icepdf.core.print.fractionalmetrics");
if (property != null) {
if (property.equalsIgnoreCase("VALUE_FRACTIONALMETRICS_DEFAULT")) {
printFractionalMetrics = RenderingHints.VALUE_FRACTIONALMETRICS_DEFAULT;
} else if (property.equalsIgnoreCase("VALUE_FRACTIONALMETRICS_ON")) {
printFractionalMetrics = RenderingHints.VALUE_FRACTIONALMETRICS_ON;
} else if (property.equalsIgnoreCase("VALUE_FRACTIONALMETRICS_OFF")) {
printFractionalMetrics = RenderingHints.VALUE_FRACTIONALMETRICS_OFF;
}
}
property = Defs.sysProperty("org.icepdf.core.print.interpolation");
if (property != null) {
if (property.equalsIgnoreCase("VALUE_INTERPOLATION_BICUBIC")) {
printInterPolation = RenderingHints.VALUE_INTERPOLATION_BICUBIC;
} else if (property.equalsIgnoreCase("VALUE_INTERPOLATION_BILINEAR")) {
printInterPolation = RenderingHints.VALUE_INTERPOLATION_BILINEAR;
} else if (property.equalsIgnoreCase("VALUE_INTERPOLATION_NEAREST_NEIGHBOR")) {
printInterPolation = RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR;
}
}
property = Defs.sysProperty("org.icepdf.core.print.render");
if (property != null) {
if (property.equalsIgnoreCase("VALUE_RENDER_DEFAULT")) {
printRendering = RenderingHints.VALUE_RENDER_DEFAULT;
} else if (property.equalsIgnoreCase("VALUE_RENDER_QUALITY")) {
printRendering = RenderingHints.VALUE_RENDER_QUALITY;
} else if (property.equalsIgnoreCase("VALUE_RENDER_SPEED")) {
printRendering = RenderingHints.VALUE_RENDER_SPEED;
}
}
property = Defs.sysProperty("org.icepdf.core.print.stroke");
if (property != null) {
if (property.equalsIgnoreCase("VALUE_STROKE_DEFAULT")) {
printStrokeControl = RenderingHints.VALUE_STROKE_DEFAULT;
} else if (property.equalsIgnoreCase("VALUE_STROKE_NORMALIZE")) {
printStrokeControl = RenderingHints.VALUE_STROKE_NORMALIZE;
} else if (property.equalsIgnoreCase("VALUE_STROKE_PURE")) {
printStrokeControl = RenderingHints.VALUE_STROKE_PURE;
}
}
property = Defs.sysProperty("org.icepdf.core.print.background");
if (property != null) {
if (property.equalsIgnoreCase("VALUE_DRAW_WHITE_BACKGROUND")) {
printBackground = Color.white;
} else if (property.equalsIgnoreCase("VALUE_DRAW_NO_BACKGROUND")) {
printBackground = null;
}
}
printHints = new RenderingHints(
RenderingHints.KEY_ALPHA_INTERPOLATION, printAlphaInterpolocation);
printHints.put(RenderingHints.KEY_ANTIALIASING, printAntiAliasing);
printHints.put(RenderingHints.KEY_TEXT_ANTIALIASING, printTextAntiAliasing);
printHints.put(RenderingHints.KEY_COLOR_RENDERING, printColorRendering);
printHints.put(RenderingHints.KEY_DITHERING, printDithering);
printHints.put(RenderingHints.KEY_FRACTIONALMETRICS, printFractionalMetrics);
printHints.put(RenderingHints.KEY_INTERPOLATION, printInterPolation);
printHints.put(RenderingHints.KEY_RENDERING, printRendering);
printHints.put(RenderingHints.KEY_STROKE_CONTROL, printStrokeControl);
}
/**
* This hint controls how partially-transparent
* drawing operations are composited. The default value is
* VALUE_ALPHA_INTERPOLATION_QUALITY
*/
Object printAlphaInterpolocation = RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY;
/**
* This hint controls if text and images will be drawn using anitialiasing.
* The default value is VALUE_ANTIALIAS_ON
*/
Object printAntiAliasing = RenderingHints.VALUE_ANTIALIAS_ON;
/**
* This hint controls if text will be drawn using anitialiasing. This property
* can not set to ON unless printAntiAliasing is set to ON
* The default value is VALUE_ANTIALIAS_ON
*/
Object printTextAntiAliasing = RenderingHints.VALUE_TEXT_ANTIALIAS_ON;
/**
* This hint controls colour rendering quality.
* The default value is VALUE_COLOR_RENDER_QUALITY
*/
Object printColorRendering = RenderingHints.VALUE_COLOR_RENDER_QUALITY;
/**
* This hint controls dithering of an image.
* The default value is VALUE_DITHER_ENABLE
*/
Object printDithering = RenderingHints.VALUE_DITHER_ENABLE;
/**
* This hint controls fractional Metrics calculations for drawing text.
* The default value is VALUE_FRACTIONALMETRICS_ON
*/
Object printFractionalMetrics = RenderingHints.VALUE_FRACTIONALMETRICS_ON;
/**
* This hint controls image interpolation.
* The default value is VALUE_INTERPOLATION_BILINEAR
*/
Object printInterPolation = RenderingHints.VALUE_INTERPOLATION_BILINEAR;
/**
* This hint controls rendering quality.
* The default value is VALUE_RENDER_QUALITY
*/
Object printRendering = RenderingHints.VALUE_RENDER_QUALITY;
/**
* This hint controls stroke quality.
* The default value is VALUE_STROKE_NORMALIZE
*/
Object printStrokeControl = RenderingHints.VALUE_STROKE_NORMALIZE;
/**
* This hints controls if the Page will paint a white background before drawing itself.
* The default value is Color.white
*/
Color printBackground = Color.white;
// take care of Screen mode default values. The general ideal is to lower
// qality where possible to encresase drawing speed.
/**
* This hint controls how partially-transparent drawing operations are
* composited. The default value is
* VALUE_ALPHA_INTERPOLATION_SPEED
*/
Object screenAlphaInterpolocation = RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED;
/**
* This hint controls if text and images will be drawn using anitialiasing.
* The default value is VALUE_ANTIALIAS_ON
*/
Object screenAntiAliasing = RenderingHints.VALUE_ANTIALIAS_ON;
/**
* This hint controls if text will be drawn using anitialiasing. This property
* can not set to ON unless printAntiAliasing is set to ON
* The default value is VALUE_ANTIALIAS_ON
*/
Object screenTextAntiAliasing = RenderingHints.VALUE_TEXT_ANTIALIAS_ON;
/**
* This hint controls colour rendering quality.
* The default value is VALUE_COLOR_RENDER_SPEED
*/
Object screenColorRendering = RenderingHints.VALUE_COLOR_RENDER_SPEED;
/**
* This hint controls dithering of an image.
* The default value is VALUE_DITHER_ENABLE
*/
Object screenDithering = RenderingHints.VALUE_DITHER_DEFAULT;
/**
* This hint controls fractional Metrics calculations for drawing text.
* The default value is VALUE_FRACTIONALMETRICS_ON
*/
Object screenFractionalMetrics = RenderingHints.VALUE_FRACTIONALMETRICS_ON;
/**
* This hint controls image interpolation.
* The default value is VALUE_INTERPOLATION_BICUBIC
*/
Object screenInterPolation = RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR;
/**
* This hint controls rendering quality.
* The default value is VALUE_RENDER_QUALITY
*/
Object screenRendering = RenderingHints.VALUE_RENDER_SPEED;
/**
* This hint controls stroke quality.
* The default value is VALUE_STROKE_NORMALIZE
*/
Object screenStrokeControl = RenderingHints.VALUE_STROKE_PURE;
/**
* This hints controls if the Page will paint a white background before drawing itself.
* The default value is Color.white
*/
Color screenBackground = Color.white;
private RenderingHints screenHints;
private RenderingHints printHints;
}