This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[PATCH] Implementation of DrawImage(..) and other relevant fixes
- From: Olga Rodimina <rodimina at redhat dot com>
- To: java-patches at gcc dot gnu dot org
- Date: 06 Feb 2004 13:18:26 -0500
- Subject: [PATCH] Implementation of DrawImage(..) and other relevant fixes
- Organization:
Hi,
Attached patch implements various versions of drawImage(..) methods and
makes few other relevant fixes.
--
Olga Rodimina <rodimina@redhat.com>
Index: ChangeLog
===================================================================
RCS file: /cvs/gcc/gcc/libjava/ChangeLog,v
retrieving revision 1.2649
diff -u -r1.2649 ChangeLog
--- ChangeLog 6 Feb 2004 14:05:36 -0000 1.2649
+++ ChangeLog 6 Feb 2004 18:14:53 -0000
@@ -1,3 +1,20 @@
+2004-02-06 Olga Rodimina <rodimina@redhat.com>
+
+ * gnu/java/awt/peer/gtk/GdkGraphics2D.java:
+ (drawImage(img,xform,obs)): Invert xform before
+ passing the xform to cairo.
+ (drawImage(img,x,y,bgcolor,obs)): Implemented.
+ (drawImage (img,x,y,w,h,bgcolor,obs)): Partly
+ implemented.
+ (drawImage (img,x,y,w,h,obs)): Implemented.
+ (drawImage (img,dx1,dy1,dx2,dy2,sx1,sy1,sx2,sy2,
+ bgcolor,obs)): Partly implemented.
+ (drawImage (img,dx1,dy1,dx2,dy2,sx1,sy1,sx2,sy2,obs)):
+ Implemented.
+ * java/awt/image/BufferedImage.java:
+ (copyData): if dest is null, create raster with same
+ dimensions as the current image.
+
2004-02-06 Michael Koch <konqueror@gmx.de>
* java/io/ObjectInputStream.java
Index: gnu/java/awt/peer/gtk/GdkGraphics2D.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GdkGraphics2D.java,v
retrieving revision 1.6
diff -u -r1.6 GdkGraphics2D.java
--- gnu/java/awt/peer/gtk/GdkGraphics2D.java 16 Jan 2004 14:22:23 -0000 1.6
+++ gnu/java/awt/peer/gtk/GdkGraphics2D.java 6 Feb 2004 18:14:53 -0000
@@ -912,18 +912,41 @@
}
else
{
- if (img instanceof BufferedImage)
- {
- // draw an image which has actually been loaded into memory fully
- BufferedImage b = (BufferedImage) img;
- return drawRaster (b.getColorModel (), b.getData (), xform);
- }
- else
- {
- // begin progressive loading in a separate thread
- new PainterThread (this, img, xform);
- return false;
+
+ // In this case, xform is an AffineTransform that transforms bounding
+ // box of the specified image from image space to user space. However
+ // when we pass this transform to cairo, cairo will use this transform
+ // to map "user coordinates" to "pixel" coordinates, which is the
+ // other way around. Therefore to get the "user -> pixel" transform
+ // that cairo wants from "image -> user" transform that we currently
+ // have, we will need to invert the transformation matrix.
+
+ AffineTransform invertedXform = new AffineTransform();
+
+ try
+ {
+ invertedXform = xform.createInverse();
+ if (img instanceof BufferedImage)
+ {
+ // draw an image which has actually been loaded
+ // into memory fully
+ BufferedImage b = (BufferedImage) img;
+ return drawRaster (b.getColorModel (),
+ b.getData (),
+ invertedXform);
+ }
+ else
+ {
+ // begin progressive loading in a separate thread
+ new PainterThread (this, img, invertedXform);
+ return false;
+ }
}
+ catch (NoninvertibleTransformException e)
+ {
+ throw new ImagingOpException("Unable to invert transform "
+ + xform.toString());
+ }
}
}
@@ -1124,33 +1147,89 @@
public boolean drawImage (Image img, int x, int y, Color bgcolor,
ImageObserver observer)
{
- throw new java.lang.UnsupportedOperationException ();
+ return drawImage (img, x, y, img.getWidth (observer),
+ img.getHeight (observer), bgcolor, observer);
}
public boolean drawImage (Image img, int x, int y, int width, int height,
Color bgcolor, ImageObserver observer)
{
- throw new java.lang.UnsupportedOperationException ();
+
+ // FIXME: change all the transparent pixels in the image to
+ // bgcolor.
+
+ return drawImage (img, x, y, width, height, observer);
}
public boolean drawImage (Image img, int x, int y, int width, int height,
ImageObserver observer)
{
- throw new java.lang.UnsupportedOperationException ();
+
+ double scaleX = width / (double) img.getWidth (observer);
+ double scaleY = height / (double) img.getHeight (observer);
+
+ return drawImage (img,
+ new AffineTransform(scaleX, 0f, 0f, scaleY, x, y),
+ observer);
+
}
public boolean drawImage (Image img, int dx1, int dy1, int dx2, int dy2,
int sx1, int sy1, int sx2, int sy2,
Color bgcolor, ImageObserver observer)
{
- throw new java.lang.UnsupportedOperationException ();
+
+ // FIXME: change all transparent pixels in the image to
+ // bgcolor
+
+ return drawImage (img, dx1, dy1, dx2, dy2,
+ sx1, sy1, sx2, sy2, observer);
}
public boolean drawImage (Image img, int dx1, int dy1, int dx2, int dy2,
int sx1, int sy1, int sx2, int sy2,
ImageObserver observer)
{
- throw new java.lang.UnsupportedOperationException ();
+
+ Image subImage;
+
+ int sourceWidth = sx2 - sx1;
+ int sourceHeight = sy2 - sy1;
+
+ int destWidth = dx2 - dx1;
+ int destHeight = dy2 - dy1;
+
+ double scaleX = destWidth / sourceWidth;
+ double scaleY = destHeight / sourceHeight;
+
+ // Get the subimage of the source enclosed in the
+ // rectangle specified by sx1, sy1, sx2, sy2
+
+ if (img instanceof BufferedImage)
+ {
+
+ BufferedImage b = (BufferedImage) img;
+ subImage = b.getSubimage(sx1,sy1,sx2,sy2);
+ }
+ else
+ {
+
+ // FIXME: This code currently doesn't work. Null Pointer
+ // exception is thrown in this case. This happens
+ // because img.getSource() always returns null, since source gets
+ // never initialized when it is created with the help of
+ // createImage(int width, int height).
+
+ CropImageFilter filter = new CropImageFilter(sx1,sx2,sx2,sy2);
+ FilteredImageSource src = new FilteredImageSource(img.getSource(),
+ filter);
+
+ subImage = Toolkit.getDefaultToolkit().createImage(src);
+ }
+
+ return drawImage(subImage, new AffineTransform(scaleX, 0, 0,
+ scaleY, dx1, dy1),
+ observer);
}
public void drawOval(int x, int y, int width, int height)
Index: java/awt/image/BufferedImage.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/image/BufferedImage.java,v
retrieving revision 1.9
diff -u -r1.9 BufferedImage.java
--- java/awt/image/BufferedImage.java 25 Sep 2003 18:35:44 -0000 1.9
+++ java/awt/image/BufferedImage.java 6 Feb 2004 18:14:53 -0000
@@ -255,7 +255,8 @@
public WritableRaster copyData(WritableRaster dest)
{
if (dest == null)
- dest = raster.createCompatibleWritableRaster();
+ dest = raster.createCompatibleWritableRaster(getMinX(), getMinY(),
+ getWidth(),getHeight());
int x = dest.getMinX();
int y = dest.getMinY();