/* * JasperReports - Free Java Reporting Library. * Copyright (C) 2001 - 2009 Jaspersoft Corporation. All rights reserved. * http://www.jaspersoft.com * * Unless you have purchased a commercial license agreement from Jaspersoft, * the following license terms apply: * * This program is part of JasperReports. * * JasperReports is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * JasperReports 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. * * You should have received a copy of the GNU Lesser General Public License * along with JasperReports. If not, see <http://www.gnu.org/licenses/>. */ /* * Contributors: * Eugene D - eugenedruy@users.sourceforge.net * Adrian Jackson - iapetus@users.sourceforge.net * David Taylor - exodussystems@users.sourceforge.net * Lars Kristensen - llk@users.sourceforge.net */ package net.sf.jasperreports.engine.export.draw; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.Shape; import java.awt.geom.Dimension2D; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRImageRenderer; import net.sf.jasperreports.engine.JRPrintElement; import net.sf.jasperreports.engine.JRPrintImage; import net.sf.jasperreports.engine.JRRenderable; import net.sf.jasperreports.engine.type.ModeEnum; /** * @author Teodor Danciu (teodord@users.sourceforge.net) * @version $Id: ImageDrawer.java 3499 2010-03-03 15:35:34Z shertage $ */ public class ImageDrawer extends ElementDrawer { /** * */ public void draw(Graphics2D grx, JRPrintElement element, int offsetX, int offsetY) throws JRException { JRPrintImage printImage = (JRPrintImage)element; if (printImage.getModeValue() == ModeEnum.OPAQUE) { grx.setColor(printImage.getBackcolor()); grx.fillRect( printImage.getX() + offsetX, printImage.getY() + offsetY, printImage.getWidth(), printImage.getHeight() ); } int topPadding = printImage.getLineBox().getTopPadding().intValue(); int leftPadding = printImage.getLineBox().getLeftPadding().intValue(); int bottomPadding = printImage.getLineBox().getBottomPadding().intValue(); int rightPadding = printImage.getLineBox().getRightPadding().intValue(); int availableImageWidth = printImage.getWidth() - leftPadding - rightPadding; availableImageWidth = (availableImageWidth < 0)?0:availableImageWidth; int availableImageHeight = printImage.getHeight() - topPadding - bottomPadding; availableImageHeight = (availableImageHeight < 0)?0:availableImageHeight; JRRenderable renderer = printImage.getRenderer(); if ( renderer != null && availableImageWidth > 0 && availableImageHeight > 0 ) { if (renderer.getType() == JRRenderable.TYPE_IMAGE) { // Image renderers are all asked for their image data and dimension at some point. // Better to test and replace the renderer now, in case of lazy load error. renderer = JRImageRenderer.getOnErrorRendererForImageData(renderer, printImage.getOnErrorTypeValue()); if (renderer != null) { renderer = JRImageRenderer.getOnErrorRendererForDimension(renderer, printImage.getOnErrorTypeValue()); } } } else { renderer = null; } if (renderer != null) { int normalWidth = availableImageWidth; int normalHeight = availableImageHeight; Dimension2D dimension = renderer.getDimension(); if (dimension != null) { normalWidth = (int)dimension.getWidth(); normalHeight = (int)dimension.getHeight(); } float xalignFactor = 0f; switch (printImage.getHorizontalAlignmentValue()) { case RIGHT : { xalignFactor = 1f; break; } case CENTER : { xalignFactor = 0.5f; break; } case LEFT : default : { xalignFactor = 0f; break; } } float yalignFactor = 0f; switch (printImage.getVerticalAlignmentValue()) { case BOTTOM : { yalignFactor = 1f; break; } case MIDDLE : { yalignFactor = 0.5f; break; } case TOP : default : { yalignFactor = 0f; break; } } switch (printImage.getScaleImageValue())// FIXME maybe put this in JRFiller { case CLIP : { int xoffset = (int)(xalignFactor * (availableImageWidth - normalWidth)); int yoffset = (int)(yalignFactor * (availableImageHeight - normalHeight)); Shape oldClipShape = grx.getClip(); grx.clip( new Rectangle( printImage.getX() + leftPadding + offsetX, printImage.getY() + topPadding + offsetY, availableImageWidth, availableImageHeight ) ); try { renderer.render( grx, new Rectangle( printImage.getX() + leftPadding + offsetX + xoffset, printImage.getY() + topPadding + offsetY + yoffset, normalWidth, normalHeight ) ); } finally { grx.setClip(oldClipShape); } break; } case FILL_FRAME : { renderer.render( grx, new Rectangle( printImage.getX() + leftPadding + offsetX, printImage.getY() + topPadding + offsetY, availableImageWidth, availableImageHeight ) ); break; } case RETAIN_SHAPE : default : { if (printImage.getHeight() > 0) { double ratio = (double)normalWidth / (double)normalHeight; if( ratio > (double)availableImageWidth / (double)availableImageHeight ) { normalWidth = availableImageWidth; normalHeight = (int)(availableImageWidth / ratio); } else { normalWidth = (int)(availableImageHeight * ratio); normalHeight = availableImageHeight; } int xoffset = (int)(xalignFactor * (availableImageWidth - normalWidth)); int yoffset = (int)(yalignFactor * (availableImageHeight - normalHeight)); renderer.render( grx, new Rectangle( printImage.getX() + leftPadding + offsetX + xoffset, printImage.getY() + topPadding + offsetY + yoffset, normalWidth, normalHeight ) ); } break; } } } if ( printImage.getLineBox().getTopPen().getLineWidth().floatValue() <= 0f && printImage.getLineBox().getLeftPen().getLineWidth().floatValue() <= 0f && printImage.getLineBox().getBottomPen().getLineWidth().floatValue() <= 0f && printImage.getLineBox().getRightPen().getLineWidth().floatValue() <= 0f ) { if (printImage.getLinePen().getLineWidth().floatValue() != 0) { drawPen( grx, printImage.getLinePen(), printImage, offsetX, offsetY ); } } else { drawBox(grx, printImage.getLineBox(), printImage, offsetX, offsetY); } } }