/*
* 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.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 3991 2010-10-12 20:10:55Z lucianc $
*/
public class ImageDrawer extends ElementDrawer<JRPrintImage>
{
/**
*
*/
public void draw(Graphics2D grx, JRPrintImage printImage, int offsetX, int offsetY) throws JRException
{
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);
}
}
}