001 package com.croftsoft.core.animation.painter;
002
003 import java.awt.Graphics2D;
004 import java.awt.Image;
005 import javax.swing.JComponent;
006
007 import com.croftsoft.core.animation.*;
008
009 /**********************************************************************
010 * Scales the image to fit the entire Component.
011 *
012 * This class differs from StretchPainter in that it scales both width
013 * and height by the same factor to prevent distortion.
014 *
015 * You can override the default scaling by calling setScale().
016 *
017 * @see
018 * StretchPainter
019 *
020 * @version
021 * $Date: 2007/02/25 03:30:11 $
022 * @since
023 * 2006-04-23
024 * @author
025 * <a href="http://www.CroftSoft.com/">David Wallace Croft</a>
026 **********************************************************************/
027
028 public final class ScalePainter
029 implements ComponentPainter
030 ///////////////////////////////////////////////////////////////////////
031 ///////////////////////////////////////////////////////////////////////
032 {
033
034 private Image image;
035
036 private double scale;
037
038 ///////////////////////////////////////////////////////////////////////
039 // constructor methods
040 ///////////////////////////////////////////////////////////////////////
041
042 public ScalePainter ( final Image image )
043 ///////////////////////////////////////////////////////////////////////
044 {
045 this.image = image;
046 }
047
048 public ScalePainter ( )
049 ///////////////////////////////////////////////////////////////////////
050 {
051 // no-arg constructor has empty method body
052 }
053
054 ///////////////////////////////////////////////////////////////////////
055 // accessor/mutator methods
056 ///////////////////////////////////////////////////////////////////////
057
058 public Image getImage ( ) { return image; }
059
060 public void setImage ( final Image image ) { this.image = image; }
061
062 public void setScale ( final double scale ) { this.scale = scale; }
063
064 ///////////////////////////////////////////////////////////////////////
065 // interface ComponentPainter method
066 ///////////////////////////////////////////////////////////////////////
067
068 public void paint (
069 final JComponent component,
070 final Graphics2D graphics )
071 ///////////////////////////////////////////////////////////////////////
072 {
073 if ( image == null )
074 {
075 return;
076 }
077
078 final int imageWidth = image.getWidth ( null );
079
080 final int imageHeight = image.getHeight ( null );
081
082 final int componentWidth = component.getWidth ( );
083
084 final int componentHeight = component.getHeight ( );
085
086 int width, height, x, y;
087
088 if ( scale <= 0.0 )
089 {
090 final double scaleWidth
091 = ( ( double ) componentWidth ) / imageWidth;
092
093 final double scaleHeight
094 = ( ( double ) componentHeight ) / imageHeight;
095
096 if ( scaleWidth < scaleHeight )
097 {
098 width = componentWidth; // = scaleWidth * imageWidth;
099
100 height = ( int ) Math.round ( scaleWidth * imageHeight );
101
102 x = 0;
103
104 y = ( componentHeight - height ) / 2;
105 }
106 else
107 {
108 width = ( int ) Math.round ( scaleHeight * imageWidth );
109
110 height = componentHeight; //= scaleHeight * imageHeight;
111
112 x = ( componentWidth - width ) / 2;
113
114 y = 0;
115 }
116 }
117 else
118 {
119 width = ( int ) Math.round ( scale * imageWidth );
120
121 height = ( int ) Math.round ( scale * imageHeight );
122
123 x = ( componentWidth - width ) / 2;
124
125 y = ( componentHeight - height ) / 2;
126 }
127
128 graphics.drawImage ( image, x, y, width, height, null );
129 }
130
131 ///////////////////////////////////////////////////////////////////////
132 ///////////////////////////////////////////////////////////////////////
133 }