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 <[EMAIL PROTECTED]> + + * 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 <[EMAIL PROTECTED]> * 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); } }