This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Implementation of DrawImage(..) and other relevant fixes


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();

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]