Hi, I originally posted this message in the SwingX forum and they suggested I 
post that in Java2D as well: 
http://forums.java.net/jive/thread.jspa?threadID=42577&tstart=0. This happens 
on Windows XP 32-bits, nVidia GeForce 7600, JDK 1.5.0_10 and 1.6.0_10 beta.

-----------------------------------------------------------------------------

Hi, I've been experiencing lately with SwingX and made a quick mockup of a 
Vista/Windows Media Player-like button using Painters and JXButtons.


At some point I compose an image containing a gaussian blurred oval using 
BlendComposite.ColorDodge in order to make a halo/higlight at the base of the 
button. However, I've come to an issue when drawImage() is called on a Graphics 
after both setClip() and setComposite(BlendComposite.whatever) have been set. 
This happens with both SwingX 0.9.2 and 0.9.3. 
Here is a small exemple that demonstrate the issue:


[code]
import java.awt.geom.*;
import javax.swing.*;

/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2006</p>
 *
 * <p>Company: </p>
 *
 * @author not attributable
 * @version 1.0
 */
class TestClip extends JPanel {
  private BufferedImage image;
  private int width = 320;
  private int height = 200;

  public TestClip() {
    super();
    setPreferredSize(new Dimension(width, height));
  }

  @Override protected void paintComponent(Graphics g) {
    if (image == null) {
      BufferedImage clipped = 
getGraphicsConfiguration().createCompatibleImage(width, height, 
Transparency.OPAQUE);
      Graphics2D g2d = clipped.createGraphics();
      g2d.setColor(Color.RED);
      g2d.fillRect(0, 0, width, height);
      g2d.dispose();
      //
      image = getGraphicsConfiguration().createCompatibleImage(width, height, 
Transparency.TRANSLUCENT);
      g2d = image.createGraphics();
      g2d.setRenderingHint(RenderingHints.KEY_RENDERING, 
RenderingHints.VALUE_RENDER_QUALITY);
      g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
RenderingHints.VALUE_ANTIALIAS_ON);
      RoundRectangle2D clip = new RoundRectangle2D.Float(10, 10, width -20 - 1, 
height -20 - 1, 10, 10);
      g2d.setClip(clip);
      g2d.setComposite(org.jdesktop.swingx.graphics.BlendComposite.ColorDodge);
      //g2d.setComposite(AlphaComposite.SrcOver);
      g2d.drawImage(clipped, 0, 0, null);
      //g2d.setColor(Color.RED);
      //g2d.fillRect(0, 0, width, height);
      g2d.setComposite(AlphaComposite.SrcOver);
      g2d.setClip(null);
      g2d.setStroke(new BasicStroke(1f));
      g2d.setColor(Color.BLACK);
      g2d.draw(clip);
      g2d.dispose();
    }
    g.drawImage(image, 0, 0, null);
  }

  public static void main(String ...args) {
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        frame.add(new TestClip(), BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
      }
    });
  }
}
[/code]


This code produces the following error:


[code]
Exception in thread "AWT-EventQueue-0" java.awt.image.RasterFormatException: (x 
+ width) is outside
raster
        at sun.awt.image.IntegerInterleavedRaster.createWritableChild(Unknown 
Source)
        at sun.awt.image.IntegerInterleavedRaster.createChild(Unknown Source)
        at sun.java2d.loops.Blit$AnyBlit.Blit(Unknown Source)
        at sun.java2d.pipe.DrawImage.blitSurfaceData(Unknown Source)
        at sun.java2d.pipe.DrawImage.renderImageCopy(Unknown Source)
        at sun.java2d.pipe.DrawImage.copyImage(Unknown Source)
        at sun.java2d.pipe.DrawImage.copyImage(Unknown Source)
        at sun.java2d.pipe.ValidatePipe.copyImage(Unknown Source)
        at sun.java2d.SunGraphics2D.drawImage(Unknown Source)
        at sun.java2d.SunGraphics2D.drawImage(Unknown Source)
        at test.TestClip.paintComponent(TestClip.java:46)
        at javax.swing.JComponent.paint(Unknown Source)
        at javax.swing.JComponent.paintChildren(Unknown Source)
        at javax.swing.JComponent.paint(Unknown Source)
        at javax.swing.JComponent.paintChildren(Unknown Source)
        at javax.swing.JComponent.paint(Unknown Source)
        at javax.swing.JLayeredPane.paint(Unknown Source)
        at javax.swing.JComponent.paintChildren(Unknown Source)
        at javax.swing.JComponent.paintToOffscreen(Unknown Source)
        at javax.swing.BufferStrategyPaintManager.paint(Unknown Source)
        at javax.swing.RepaintManager.paint(Unknown Source)
        at javax.swing.JComponent.paint(Unknown Source)
        at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
        at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
        at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
        at java.awt.Container.paint(Unknown Source)
        at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
        at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
        at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source)
        at 
javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
        at java.awt.event.InvocationEvent.dispatch(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)
[/code]


Line 46 is the drawImage() line.


If I use a standard AlphaComposite no error happens of course, if I stick with 
a BlendComposite, comment drawImage() and uncomment the red rectangle rendering 
instead everything is fine as well.

I find this error quite strange, though I can avoid it in my button scenario by 
clipping directly the 2nd image (the one that contains the oval) itself after 
the blur and clearing its areas that are outside of the button's shape; then 
reseting the clip of the painter to its default value, compositing the image 
onto the painter with BlendComposite.ColorDodge and finally resetting the clip 
of the painter to the working clip.
[Message sent by forum member 'bouye' (bouye)]

http://forums.java.net/jive/thread.jspa?messageID=281507

===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA2D-INTEREST".  For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".

Reply via email to