KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > nightlabs > editor2d > impl > ImageDrawComponentImpl


1 /**
2  * <copyright>
3  * </copyright>
4  *
5  * $Id: ImageDrawComponentImpl.java 1607 2005-08-23 16:04:49Z nozkiller $
6  */

7 package com.nightlabs.editor2d.impl;
8
9 import java.awt.Rectangle JavaDoc;
10 import java.awt.geom.AffineTransform JavaDoc;
11 import java.awt.image.AffineTransformOp JavaDoc;
12 import java.awt.image.BufferedImage JavaDoc;
13 import java.util.logging.Logger JavaDoc;
14
15 import com.nightlabs.editor2d.ImageDrawComponent;
16 import com.nightlabs.editor2d.j2d.GeneralShape;
17 import com.nightlabs.editor2d.j2d.GeneralShapeFactory;
18 import com.nightlabs.editor2d.util.EditorModelUtil;
19
20 public class ImageDrawComponentImpl
21 extends DrawComponentImpl
22 implements ImageDrawComponent
23 {
24 // public static final Logger LOGGER = Logger.getLogger(ImageDrawComponentImpl.class);
25

26     /**
27      * The default value of the '{@link #getImage() <em>Image</em>}' attribute.
28      * <!-- begin-user-doc -->
29    * <!-- end-user-doc -->
30      * @see #getImage()
31      * @generated
32      * @ordered
33      */

34   protected static final BufferedImage JavaDoc IMAGE_EDEFAULT = null;
35
36     /**
37      * The cached value of the '{@link #getImage() <em>Image</em>}' attribute.
38      * <!-- begin-user-doc -->
39    * <!-- end-user-doc -->
40      * @see #getImage()
41      * @generated
42      * @ordered
43      */

44   protected BufferedImage JavaDoc image = IMAGE_EDEFAULT;
45
46     /**
47      * <!-- begin-user-doc -->
48    * <!-- end-user-doc -->
49      *
50      */

51   public ImageDrawComponentImpl() {
52         super();
53     }
54
55     /**
56      * <!-- begin-user-doc -->
57    * <!-- end-user-doc -->
58      * @generated
59      */

60   public BufferedImage JavaDoc getImage() {
61         return image;
62     }
63
64   /**
65    * <!-- begin-user-doc -->
66    * <!-- end-user-doc -->
67    *
68    */

69   public void setImage(BufferedImage JavaDoc newImage)
70   {
71     BufferedImage JavaDoc oldImage = image;
72     primSetImage(newImage);
73     firePropertyChange(PROP_IMAGE, oldImage, image);
74   }
75
76   /**
77    * <!-- begin-user-doc -->
78    * <!-- end-user-doc -->
79    *
80    */

81   public GeneralShape getImageShape() {
82     return imageShape;
83   }
84
85   protected BufferedImage JavaDoc originalImage;
86   protected void primSetImage(BufferedImage JavaDoc newImage)
87   {
88     image = newImage;
89     originalImage = cloneImage(image);
90     bounds = null;
91     imageShape = GeneralShapeFactory.createRectangle(getBounds().x, getBounds().y, getBounds().width, getBounds().height);
92   }
93   
94     /**
95      * <!-- begin-user-doc -->
96    * <!-- end-user-doc -->
97      * @generated
98      */

99   public String JavaDoc toString()
100   {
101         StringBuffer JavaDoc result = new StringBuffer JavaDoc(super.toString());
102         result.append(" (image: ");
103         result.append(image);
104         result.append(')');
105         return result.toString();
106     }
107
108   public Rectangle JavaDoc getBounds()
109   {
110     if (bounds == null)
111     {
112       if (image != null)
113         bounds = new Rectangle JavaDoc(x, y, image.getWidth(), image.getHeight());
114       else
115         return super.getBounds();
116     }
117     return bounds;
118   }
119
120   protected void primSetX(int x)
121   {
122     if (x == getBounds().x)
123       return;
124     
125     bounds = null;
126         
127     if (imageShape != null) {
128       atUtil.setToIdentity();
129       atUtil.translate(x - getBounds().x, 0);
130       imageShape.transform(atUtil);
131 // super.primSetX(x);
132
}
133   }
134   
135   protected void primSetY(int y)
136   {
137     if (y == getBounds().y)
138       return;
139     
140     bounds = null;
141
142     if (imageShape != null) {
143       atUtil.setToIdentity();
144       atUtil.translate(0, y - getBounds().y);
145       imageShape.transform(atUtil);
146 // super.primSetY(y);
147
}
148   }
149     
150   protected void primSetLocation(int newX, int newY, boolean transformRotationCenter)
151   {
152     if (imageShape != null)
153     {
154       x = newX;
155       y = newY;
156       atUtil.setToIdentity();
157       atUtil.translate((float)newX - (float)getX(), (float)newY - (float)getY());
158       
159       if (transformRotationCenter)
160         transformRotationCenter(atUtil);
161       
162       imageShape.transform(atUtil);
163     }
164     bounds = null;
165   }
166   
167   public void setLocation(int newX, int newY)
168   {
169     primSetLocation(newX, newY, true);
170   }
171   
172   protected void setSize(int newWidth, int newHeight)
173   {
174     atUtil.setToIdentity();
175     float ratioY = (float)newHeight / (float)getHeight();
176     ratioY = EditorModelUtil.checkFactor(ratioY);
177     float ratioX = (float)newWidth / (float)getWidth();
178     ratioX = EditorModelUtil.checkFactor(ratioX);
179     atUtil.scale(ratioX, ratioY);
180     
181     transformRotationCenter(atUtil);
182     transform(atUtil);
183   }
184            
185   protected void primSetRotation(double newRotation)
186   {
187     double oldRotation = rotation;
188 // rotation = newRotation;
189
rotation = EditorModelUtil.getConstrainedValue(newRotation, rotationLimit);
190     
191     if (oldRotation == newRotation)
192       return;
193               
194     double degreesToRotate = EditorModelUtil.calcDiffRotation(rotation, oldRotation);
195     double degreesToRotateInRadians = Math.toRadians(degreesToRotate);
196         
197     if (degreesToRotate != 0)
198     {
199       Rectangle JavaDoc imageShapeBounds = imageShape.getBounds();
200       int sx = imageShapeBounds.width;
201       int sy = imageShapeBounds.height;
202       atUtil.setToIdentity();
203       atUtil.rotate(degreesToRotateInRadians, getRotationX(), getRotationY());
204       Rectangle JavaDoc shapeBounds = getTransformedShapeBounds(atUtil);
205       int dx = shapeBounds.width;
206       int dy = shapeBounds.height;
207       // reset the transform.
208
atUtil.setToIdentity();
209       atUtil.setToTranslation(dx / 2, dy / 2);
210       atUtil.rotate(degreesToRotateInRadians);
211       atUtil.translate(-sx / 2, -sy / 2);
212             
213       BufferedImage JavaDoc dest = new BufferedImage JavaDoc(dx, dy, BufferedImage.TYPE_INT_ARGB);
214       affineTransform.preConcatenate(atUtil);
215       AffineTransformOp JavaDoc op = new AffineTransformOp JavaDoc(affineTransform, interpolationType);
216       image = op.filter(originalImage, dest);
217       dest = null;
218       bounds = null;
219       
220 // LOGGER.debug("oldImage width = "+sx);
221
// LOGGER.debug("oldImage height = "+sy);
222
// LOGGER.debug("shapeBounds width = "+shapeBounds.width);
223
// LOGGER.debug("shapeBounds height = "+shapeBounds.height);
224
// LOGGER.debug("newImage width = "+image.getWidth());
225
// LOGGER.debug("newImage height = "+image.getHeight());
226

227       // translate the rotated image to the center of the rotation
228
int diffX = (dx - sx) / 2;
229       int diffY = (dy - sy) / 2;
230       
231 // LOGGER.debug("oldX = "+getX());
232
// LOGGER.debug("oldY = "+getY());
233
// LOGGER.debug("shapeBounds.x = "+shapeBounds.x);
234
// LOGGER.debug("shapeBounds.y = "+shapeBounds.y);
235
// LOGGER.debug("getX()-diffX = "+(getX()-diffX));
236
// LOGGER.debug("getY()-diffY = "+(getY()-diffY));
237

238       primSetLocation(getX()-diffX, getY()-diffY, false);
239       
240 // LOGGER.debug("diffX = "+diffX);
241
// LOGGER.debug("diffY = "+diffY);
242
// LOGGER.debug("newX = "+getX());
243
// LOGGER.debug("newY = "+getY());
244
}
245   }
246   
247   protected AffineTransformOp JavaDoc op;
248   protected int interpolationType = AffineTransformOp.TYPE_BILINEAR;
249   public void transform(AffineTransform JavaDoc newAT)
250   {
251     affineTransform.preConcatenate(newAT);
252 // LOGGER.debug("affineTransform = "+affineTransform);
253
// LOGGER.debug("newAT = "+newAT);
254
// LOGGER.debug("oldBounds = "+getBounds());
255
op = new AffineTransformOp JavaDoc(affineTransform, interpolationType);
256     if (image != null) {
257 // LOGGER.debug("op.Bounds = "+op.getBounds2D(originalImage));
258
Rectangle JavaDoc shapeBounds = getTransformedShapeBounds(newAT);
259 // LOGGER.debug("shapeBounds = "+shapeBounds);
260
BufferedImage JavaDoc bi = createCompatibleImage(affineTransform, shapeBounds.width, shapeBounds.height);
261       image = op.filter(originalImage, bi);
262 // LOGGER.debug("image.width = "+image.getWidth());
263
// LOGGER.debug("image.height = "+image.getHeight());
264
}
265     if (getParent() != null)
266       getParent().notifyChildTransform(this);
267   }
268     
269   protected BufferedImage JavaDoc createCompatibleImage(AffineTransform JavaDoc at)
270   {
271     Rectangle JavaDoc shapeBounds = getTransformedShapeBounds(at);
272     BufferedImage JavaDoc dest = new BufferedImage JavaDoc(shapeBounds.width, shapeBounds.height, BufferedImage.TYPE_INT_ARGB);
273 // LOGGER.debug("shapeBounds = "+shapeBounds);
274
return dest;
275   }
276   
277   protected BufferedImage JavaDoc createCompatibleImage(AffineTransform JavaDoc at, int width, int height)
278   {
279     return new BufferedImage JavaDoc(width, height, BufferedImage.TYPE_INT_ARGB);
280   }
281       
282   protected GeneralShape imageShape;
283   protected Rectangle JavaDoc getTransformedShapeBounds(AffineTransform JavaDoc at)
284   {
285     imageShape.transform(at);
286     return imageShape.getBounds();
287   }
288   
289   protected BufferedImage JavaDoc cloneImage(BufferedImage JavaDoc src) {
290     return src.getSubimage(0, 0, src.getWidth(), src.getHeight());
291   }
292   
293   public Class JavaDoc getRenderModeClass() {
294     return ImageDrawComponent.class;
295   }
296   
297 // public String getTypeName() {
298
// return ModelPlugin.getResourceString("type.image");
299
// }
300
public String JavaDoc getTypeName() {
301     return "Image";
302   }
303   
304 } //ImageDrawComponentImpl
305
Popular Tags