commit-classpath
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[commit-cp] classpath ChangeLog gnu/java/awt/peer/gtk/Cairo...


From: Mark Wielaard
Subject: [commit-cp] classpath ChangeLog gnu/java/awt/peer/gtk/Cairo...
Date: Tue, 13 Jun 2006 12:59:22 +0000

CVSROOT:        /cvsroot/classpath
Module name:    classpath
Changes by:     Mark Wielaard <mark>    06/06/13 12:59:22

Modified files:
        .              : ChangeLog 
        gnu/java/awt/peer/gtk: CairoGraphics2D.java 
                               ComponentGraphics.java 

Log message:
               * gnu/java/awt/peer/gtk/CairoGraphics2D.java (drawImage): Don't
               allocate unused AffineTransform. Add comment about conversion to
               BufferedImage.
               * gnu/java/awt/peer/gtk/ComponentGraphics.java (drawImage):
               Recognize identity transform as "easy". Always convert to
               BufferedImage before calling super.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/classpath/ChangeLog?cvsroot=classpath&r1=1.7794&r2=1.7795
http://cvs.savannah.gnu.org/viewcvs/classpath/gnu/java/awt/peer/gtk/CairoGraphics2D.java?cvsroot=classpath&r1=1.21&r2=1.22
http://cvs.savannah.gnu.org/viewcvs/classpath/gnu/java/awt/peer/gtk/ComponentGraphics.java?cvsroot=classpath&r1=1.15&r2=1.16

Patches:
Index: ChangeLog
===================================================================
RCS file: /cvsroot/classpath/classpath/ChangeLog,v
retrieving revision 1.7794
retrieving revision 1.7795
diff -u -b -r1.7794 -r1.7795
--- ChangeLog   13 Jun 2006 12:37:54 -0000      1.7794
+++ ChangeLog   13 Jun 2006 12:59:19 -0000      1.7795
@@ -1,3 +1,12 @@
+2006-06-13  Mark Wielaard  <address@hidden>
+
+       * gnu/java/awt/peer/gtk/CairoGraphics2D.java (drawImage): Don't
+       allocate unused AffineTransform. Add comment about conversion to
+       BufferedImage.
+       * gnu/java/awt/peer/gtk/ComponentGraphics.java (drawImage):
+       Recognize identity transform as "easy". Always convert to
+       BufferedImage before calling super.
+
 2006-06-13  Roman Kennke  <address@hidden>
 
        * java/awt/Component.java

Index: gnu/java/awt/peer/gtk/CairoGraphics2D.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/CairoGraphics2D.java,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -b -r1.21 -r1.22
--- gnu/java/awt/peer/gtk/CairoGraphics2D.java  12 Jun 2006 21:10:11 -0000      
1.21
+++ gnu/java/awt/peer/gtk/CairoGraphics2D.java  13 Jun 2006 12:59:22 -0000      
1.22
@@ -1144,7 +1144,7 @@
     // 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();
+    AffineTransform invertedXform;
 
     try
       {
@@ -1157,6 +1157,9 @@
       }
 
     // Unrecognized image - convert to a BufferedImage
+    // Note - this can get us in trouble when the gdk lock is re-acquired.
+    // for example by VolatileImage. See ComponentGraphics for how we work
+    // around this.
     if( !(img instanceof BufferedImage) )
       {
        ImageProducer source = img.getSource();

Index: gnu/java/awt/peer/gtk/ComponentGraphics.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/ComponentGraphics.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- gnu/java/awt/peer/gtk/ComponentGraphics.java        12 Jun 2006 21:10:11 
-0000      1.15
+++ gnu/java/awt/peer/gtk/ComponentGraphics.java        13 Jun 2006 12:59:22 
-0000      1.16
@@ -46,6 +46,7 @@
 import java.awt.Image;
 import java.awt.Rectangle;
 import java.awt.Shape;
+import java.awt.Toolkit;
 import java.awt.Point;
 import java.awt.font.FontRenderContext;
 import java.awt.font.GlyphVector;
@@ -53,6 +54,7 @@
 import java.awt.geom.Rectangle2D;
 import java.awt.image.BufferedImage;
 import java.awt.image.ImageObserver;
+import java.awt.image.ImageProducer;
 import java.awt.image.ImagingOpException;
 import java.awt.image.RenderedImage;
 
@@ -277,33 +279,84 @@
   
   public boolean drawImage(Image img, int x, int y, ImageObserver observer)
   {
-    if (img instanceof GtkVolatileImage
-        && transform.getType() == AffineTransform.TYPE_TRANSLATION)
+    // If it is a GtkVolatileImage with an "easy" transform then
+    // draw directly. Always pass a BufferedImage to super to avoid
+    // deadlock (see Note in CairoGraphics.drawImage()).
+    if (img instanceof GtkVolatileImage)
+      {
+        GtkVolatileImage vimg = (GtkVolatileImage) img;
+       int type = transform.getType();
+       if (type == AffineTransform.TYPE_IDENTITY)
+         {
+           drawVolatile(component, vimg.nativePointer,
+                        x, y, vimg.width, vimg.height);
+           return true;
+         }
+         else if (type == AffineTransform.TYPE_TRANSLATION)
       {
         x += transform.getTranslateX();
         y += transform.getTranslateY();
-        GtkVolatileImage vimg = (GtkVolatileImage) img;
-       drawVolatile( component, vimg.nativePointer,
-                      x, y, vimg.width, vimg.height );
+           drawVolatile(component, vimg.nativePointer,
+                        x, y, vimg.width, vimg.height);
        return true;
       }      
-    return super.drawImage( img, x, y, observer );
+       else
+         return super.drawImage(vimg.getSnapshot(), x, y, observer);
+      }
+
+    BufferedImage bimg;
+    if (img instanceof BufferedImage)
+      bimg = (BufferedImage) img;
+    else
+      {
+       ImageProducer source = img.getSource();
+        if (source == null)
+          return false;
+        bimg = (BufferedImage) Toolkit.getDefaultToolkit().createImage(source);
+      }
+    return super.drawImage(bimg, x, y, observer);
   }
   
   public boolean drawImage(Image img, int x, int y, int width, int height,
                            ImageObserver observer)
   {
-    if( img instanceof GtkVolatileImage
-        && transform.getType() == AffineTransform.TYPE_TRANSLATION)
+    // If it is a GtkVolatileImage with an "easy" transform then
+    // draw directly. Always pass a BufferedImage to super to avoid
+    // deadlock (see Note in CairoGraphics.drawImage()).
+    if (img instanceof GtkVolatileImage)
+      {
+        GtkVolatileImage vimg = (GtkVolatileImage) img;
+       int type = transform.getType();
+       if (type == AffineTransform.TYPE_IDENTITY)
+         {
+           drawVolatile(component, vimg.nativePointer,
+                        x, y, width, height);
+           return true;
+         }
+         else if (type == AffineTransform.TYPE_TRANSLATION)
       {
         x += transform.getTranslateX();
         y += transform.getTranslateY();
-        GtkVolatileImage vimg = (GtkVolatileImage) img;
-       drawVolatile( component, vimg.nativePointer, x, y, 
-                     width, height );
+           drawVolatile(component, vimg.nativePointer,
+                        x, y, width, height);
        return true;
       }      
-    return super.drawImage( img, x, y, width, height, observer );
+       else
+         return super.drawImage(vimg.getSnapshot(), x, y,
+                                width, height, observer);
+      }
+
+    BufferedImage bimg;
+    if (img instanceof BufferedImage)
+      bimg = (BufferedImage) img;
+    else
+      {
+       ImageProducer source = img.getSource();
+        if (source == null)
+          return false;
+        bimg = (BufferedImage) Toolkit.getDefaultToolkit().createImage(source);
+      }
+    return super.drawImage(bimg, x, y, width, height, observer);
   }
 
 }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]