|  | /* | 
|  |  | 
|  | 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. | 
|  |  | 
|  | */ | 
|  | package org.apache.batik.svggen; | 
|  |  | 
|  | import java.awt.RenderingHints; | 
|  |  | 
|  | import org.apache.batik.ext.awt.g2d.GraphicContext; | 
|  |  | 
|  | /** | 
|  | * Utility class that converts a RenderingHints object into | 
|  | * a set of SVG properties. Here is how individual hints | 
|  | * are converted. | 
|  | * + RENDERING -> sets all other hints to | 
|  | *                initial value. | 
|  | * + FRACTIONAL_METRICS -> sets initial values for | 
|  | *                         text-rendering and shape-rendering. | 
|  | * + ALPHA_INTERPOLATION -> Not mapped | 
|  | * + ANTIALIASING -> shape-rendering and text-rendering | 
|  | * + COLOR_RENDERING -> color-rendering | 
|  | * + DITHERING -> not mapped | 
|  | * + INTERPOLATION -> image-rendering | 
|  | * + TEXT_ANTIALIASING -> text-rendering | 
|  | * | 
|  | * @author <a href="mailto:vincent.hardy@eng.sun.com">Vincent Hardy</a> | 
|  | * @version $Id$ | 
|  | */ | 
|  | public class SVGRenderingHints extends AbstractSVGConverter{ | 
|  | /** | 
|  | * @param generatorContext used by converter to handle precision | 
|  | *        or to create elements. | 
|  | */ | 
|  | public SVGRenderingHints(SVGGeneratorContext generatorContext) { | 
|  | super(generatorContext); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Converts part or all of the input GraphicContext into | 
|  | * a set of attribute/value pairs and related definitions | 
|  | * | 
|  | * @param gc GraphicContext to be converted | 
|  | * @return descriptor of the attributes required to represent | 
|  | *         some or all of the GraphicContext state, along | 
|  | *         with the related definitions | 
|  | * @see org.apache.batik.svggen.SVGDescriptor | 
|  | */ | 
|  | public SVGDescriptor toSVG(GraphicContext gc){ | 
|  | return toSVG(gc.getRenderingHints()); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @param hints RenderingHints object which should be converted | 
|  | *              to a set of SVG attributes. | 
|  | * @return map Map of attribute values that describe the hints | 
|  | */ | 
|  | public static SVGHintsDescriptor toSVG(RenderingHints hints){ | 
|  | // no hints should mean default | 
|  | String colorInterpolation = SVG_AUTO_VALUE; | 
|  | String colorRendering = SVG_AUTO_VALUE; | 
|  | String textRendering = SVG_AUTO_VALUE; | 
|  | String shapeRendering = SVG_AUTO_VALUE; | 
|  | String imageRendering = SVG_AUTO_VALUE; | 
|  |  | 
|  | // | 
|  | // RENDERING | 
|  | // | 
|  | if(hints != null){ | 
|  | Object rendering = hints.get(RenderingHints.KEY_RENDERING); | 
|  | if(rendering == RenderingHints.VALUE_RENDER_DEFAULT){ | 
|  | colorInterpolation = SVG_AUTO_VALUE; | 
|  | colorRendering = SVG_AUTO_VALUE; | 
|  | textRendering = SVG_AUTO_VALUE; | 
|  | shapeRendering = SVG_AUTO_VALUE; | 
|  | imageRendering = SVG_AUTO_VALUE; | 
|  | } | 
|  | else if(rendering == RenderingHints.VALUE_RENDER_SPEED){ | 
|  | colorInterpolation = SVG_SRGB_VALUE; | 
|  | colorRendering = SVG_OPTIMIZE_SPEED_VALUE; | 
|  | textRendering = SVG_OPTIMIZE_SPEED_VALUE; | 
|  | shapeRendering = SVG_GEOMETRIC_PRECISION_VALUE; | 
|  | imageRendering = SVG_OPTIMIZE_SPEED_VALUE; | 
|  | } | 
|  | else if(rendering == RenderingHints.VALUE_RENDER_QUALITY){ | 
|  | colorInterpolation = SVG_LINEAR_RGB_VALUE; | 
|  | colorRendering = SVG_OPTIMIZE_QUALITY_VALUE; | 
|  | textRendering = SVG_OPTIMIZE_QUALITY_VALUE; | 
|  | shapeRendering = SVG_GEOMETRIC_PRECISION_VALUE; | 
|  | imageRendering = SVG_OPTIMIZE_QUALITY_VALUE; | 
|  | } | 
|  |  | 
|  | // | 
|  | // Fractional Metrics | 
|  | // | 
|  | Object fractionalMetrics = hints.get(RenderingHints.KEY_FRACTIONALMETRICS); | 
|  | if(fractionalMetrics == RenderingHints.VALUE_FRACTIONALMETRICS_ON){ | 
|  | textRendering = SVG_OPTIMIZE_QUALITY_VALUE; | 
|  | shapeRendering = SVG_GEOMETRIC_PRECISION_VALUE; | 
|  | } | 
|  | else if(fractionalMetrics == RenderingHints.VALUE_FRACTIONALMETRICS_OFF){ | 
|  | textRendering = SVG_OPTIMIZE_SPEED_VALUE; | 
|  | shapeRendering = SVG_OPTIMIZE_SPEED_VALUE; | 
|  | } | 
|  | else if(fractionalMetrics == RenderingHints.VALUE_FRACTIONALMETRICS_DEFAULT){ | 
|  | textRendering = SVG_AUTO_VALUE; | 
|  | shapeRendering = SVG_AUTO_VALUE; | 
|  | } | 
|  |  | 
|  | // | 
|  | // Antialiasing | 
|  | // | 
|  | Object antialiasing = hints.get(RenderingHints.KEY_ANTIALIASING); | 
|  | if(antialiasing == RenderingHints.VALUE_ANTIALIAS_ON){ | 
|  | textRendering = SVG_OPTIMIZE_LEGIBILITY_VALUE; | 
|  | shapeRendering = SVG_AUTO_VALUE; | 
|  | } | 
|  | else if(antialiasing == RenderingHints.VALUE_ANTIALIAS_OFF){ | 
|  | textRendering = SVG_GEOMETRIC_PRECISION_VALUE; | 
|  | shapeRendering = SVG_CRISP_EDGES_VALUE; | 
|  | } | 
|  | else if(antialiasing == RenderingHints.VALUE_ANTIALIAS_DEFAULT){ | 
|  | textRendering = SVG_AUTO_VALUE; | 
|  | shapeRendering = SVG_AUTO_VALUE; | 
|  | } | 
|  |  | 
|  | // | 
|  | // Text Antialiasing | 
|  | // | 
|  | Object textAntialiasing = hints.get(RenderingHints.KEY_TEXT_ANTIALIASING); | 
|  | if(textAntialiasing == RenderingHints.VALUE_TEXT_ANTIALIAS_ON) | 
|  | textRendering = SVG_GEOMETRIC_PRECISION_VALUE; | 
|  | else if(textAntialiasing == RenderingHints.VALUE_TEXT_ANTIALIAS_OFF) | 
|  | textRendering = SVG_OPTIMIZE_SPEED_VALUE; | 
|  | else if(textAntialiasing == RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT) | 
|  | textRendering = SVG_AUTO_VALUE; | 
|  |  | 
|  | // | 
|  | // Color Rendering | 
|  | // | 
|  | Object colorRenderingHint = hints.get(RenderingHints.KEY_COLOR_RENDERING); | 
|  | if(colorRenderingHint == RenderingHints.VALUE_COLOR_RENDER_DEFAULT) | 
|  | colorRendering = SVG_AUTO_VALUE; | 
|  | else if(colorRenderingHint == RenderingHints.VALUE_COLOR_RENDER_QUALITY) | 
|  | colorRendering = SVG_OPTIMIZE_QUALITY_VALUE; | 
|  | else if(colorRenderingHint == RenderingHints.VALUE_COLOR_RENDER_SPEED) | 
|  | colorRendering = SVG_OPTIMIZE_SPEED_VALUE; | 
|  |  | 
|  | // | 
|  | // Interpolation | 
|  | // | 
|  | Object interpolation = hints.get(RenderingHints.KEY_INTERPOLATION); | 
|  | if(interpolation == RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR) | 
|  | imageRendering = SVG_OPTIMIZE_SPEED_VALUE; | 
|  | else if(interpolation == RenderingHints.VALUE_INTERPOLATION_BICUBIC | 
|  | || | 
|  | interpolation == RenderingHints.VALUE_INTERPOLATION_BILINEAR) | 
|  | imageRendering = SVG_OPTIMIZE_QUALITY_VALUE; | 
|  | } // if(hints != null) | 
|  |  | 
|  | return new SVGHintsDescriptor(colorInterpolation, | 
|  | colorRendering, | 
|  | textRendering, | 
|  | shapeRendering, | 
|  | imageRendering); | 
|  | } | 
|  | } |