/* * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * Copyright (c) 2001 - 2013 Object Refinery Ltd, Pentaho Corporation and Contributors.. All rights reserved. */ package org.pentaho.reporting.engine.classic.core.util; import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; import org.pentaho.reporting.engine.classic.core.ResourceBundleFactory; import org.pentaho.reporting.engine.classic.core.imagemap.ImageMap; import org.pentaho.reporting.engine.classic.core.layout.style.SimpleStyleSheet; import org.pentaho.reporting.engine.classic.core.style.StyleSheet; import org.pentaho.reporting.libraries.base.config.Configuration; import org.pentaho.reporting.libraries.resourceloader.factory.drawable.DrawableWrapper; /** * A drawable implementation that applies scaling to the wrapped up drawable object. * * @author Thomas Morgner */ public class ScalingDrawable extends DrawableWrapper implements ReportDrawable { /** * The horizontal scale factor. */ private float scaleX; /** * The vertical scale factor. */ private float scaleY; /** * The resource-bundle factory used if the drawable is a {@link ReportDrawable}. */ private ResourceBundleFactory resourceBundleFactory; /** * The report configuration used if the drawable is a {@link ReportDrawable}. */ private Configuration configuration; /** * The stylesheet of the element containing the drawable that is used if the drawable is a {@link ReportDrawable}. */ private StyleSheet styleSheet; /** * Default constructor. Initializes the scaling to 1. * * @param drawable * the drawable object */ public ScalingDrawable( final Object drawable ) { super( drawable ); scaleX = 1; scaleY = 1; } /** * Returns the vertical scale factor. * * @return the scale factor. */ public float getScaleY() { return scaleY; } /** * Defines the vertical scale factor. * * @param scaleY * the scale factor. */ public void setScaleY( final float scaleY ) { this.scaleY = scaleY; } /** * Returns the horizontal scale factor. * * @return the scale factor. */ public float getScaleX() { return scaleX; } /** * Defines the horizontal scale factor. * * @param scaleX * the scale factor. */ public void setScaleX( final float scaleX ) { this.scaleX = scaleX; } /** * Draws the object. * * @param g2 * the graphics device. * @param area * the area inside which the object should be drawn. */ public void draw( final Graphics2D g2, final Rectangle2D area ) { final Object drawable = getBackend(); if ( drawable == null ) { return; } if ( drawable instanceof ReportDrawable ) { final ReportDrawable reportDrawable = (ReportDrawable) drawable; reportDrawable.setConfiguration( getConfiguration() ); reportDrawable.setResourceBundleFactory( getResourceBundleFactory() ); reportDrawable.setStyleSheet( getStyleSheet() ); } final Graphics2D derived = (Graphics2D) g2.create(); derived.scale( scaleX, scaleY ); final Rectangle2D scaledArea = (Rectangle2D) area.clone(); scaledArea.setRect( scaledArea.getX() * scaleX, scaledArea.getY() * scaleY, scaledArea.getWidth() * scaleX, scaledArea.getHeight() * scaleY ); super.draw( derived, scaledArea ); derived.dispose(); } public ImageMap getImageMap( final Rectangle2D bounds ) { final Object drawable = getBackend(); if ( drawable == null ) { return null; } if ( drawable instanceof ReportDrawable ) { final ReportDrawable reportDrawable = (ReportDrawable) drawable; final Rectangle2D scaledArea = (Rectangle2D) bounds.clone(); scaledArea.setRect( scaledArea.getX() * scaleX, scaledArea.getY() * scaleY, scaledArea.getWidth() * scaleX, scaledArea.getHeight() * scaleY ); reportDrawable.getImageMap( scaledArea ); } return null; } /** * Returns the stylesheet of the element containing this drawable. * * @return the element's stylesheet. */ public StyleSheet getStyleSheet() { return styleSheet; } /** * Defines the stylesheet of the element containing this drawable. * * @param styleSheet * the element's stylesheet. */ public void setStyleSheet( final StyleSheet styleSheet ) { if ( styleSheet == null ) { this.styleSheet = null; } else { this.styleSheet = new SimpleStyleSheet( styleSheet ); } } /** * Returns the resource-bundle factory used if the drawable is a {@link ReportDrawable}. * * @return the resource-bundle factory. */ public ResourceBundleFactory getResourceBundleFactory() { return resourceBundleFactory; } /** * Defines the resource-bundle factory used if the drawable is a {@link ReportDrawable}. * * @param resourceBundleFactory * the resource-bundle factory. */ public void setResourceBundleFactory( final ResourceBundleFactory resourceBundleFactory ) { this.resourceBundleFactory = resourceBundleFactory; } /** * Returns the report configuration used if the drawable is a {@link ReportDrawable}. * * @return the report's configuration. */ public Configuration getConfiguration() { return configuration; } /** * Defines the report configuration used if the drawable is a {@link ReportDrawable}. * * @param configuration * the report's configuration. */ public void setConfiguration( final Configuration configuration ) { this.configuration = configuration; } }