Package net.sf.jasperreports.engine.export.draw

Source Code of net.sf.jasperreports.engine.export.draw.ImageDrawer

/*
* 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);
    }
  }

}
TOP

Related Classes of net.sf.jasperreports.engine.export.draw.ImageDrawer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.