diff options
author | Francis Kung <fkung@redhat.com> | 2006-12-05 20:43:49 +0000 |
---|---|---|
committer | Francis Kung <fkung@redhat.com> | 2006-12-05 20:43:49 +0000 |
commit | b79341ec0f84cba3c5eb7cd8435b57b72e3d2c4b (patch) | |
tree | 2cf909428b22088cd284fff72d3d0388c2d54296 | |
parent | b81067659a76ce17bbad030eac96f78601102576 (diff) | |
download | classpath-b79341ec0f84cba3c5eb7cd8435b57b72e3d2c4b.tar.gz |
2006-12-05 Francis Kung <fkung@redhat.com>
* gnu/java/awt/peer/gtk/BufferedImageGraphics.java
(constructor): Handle translated subimages properly, ie, if the image's
0,0 position is not the data buffer's first element.
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | gnu/java/awt/peer/gtk/BufferedImageGraphics.java | 48 |
2 files changed, 39 insertions, 15 deletions
@@ -1,3 +1,9 @@ +2006-12-05 Francis Kung <fkung@redhat.com> + + * gnu/java/awt/peer/gtk/BufferedImageGraphics.java + (constructor): Handle translated subimages properly, ie, if the image's + 0,0 position is not the data buffer's first element. + 2006-12-05 Roman Kennke <kennke@aicas.com> * javax/swing/text/html/ImageView.java diff --git a/gnu/java/awt/peer/gtk/BufferedImageGraphics.java b/gnu/java/awt/peer/gtk/BufferedImageGraphics.java index 37ae498ad..c792645d3 100644 --- a/gnu/java/awt/peer/gtk/BufferedImageGraphics.java +++ b/gnu/java/awt/peer/gtk/BufferedImageGraphics.java @@ -137,27 +137,45 @@ public class BufferedImageGraphics extends CairoGraphics2D cairo_t = surface.newCairoContext(); + // Get pixels out of buffered image and set in cairo surface Raster raster = bi.getRaster(); int[] pixels; - // get pixels - if(raster instanceof CairoSurface) - pixels = ((CairoSurface)raster).getPixels(imageWidth * imageHeight); + if (hasFastCM) + { + SinglePixelPackedSampleModel sm = (SinglePixelPackedSampleModel)image.getSampleModel(); + int minX = image.getRaster().getSampleModelTranslateX(); + int minY = image.getRaster().getSampleModelTranslateY(); + + // Pull pixels directly out of data buffer + if(raster instanceof CairoSurface) + pixels = ((CairoSurface)raster).getPixels(raster.getWidth() * raster.getHeight()); + else + pixels = ((DataBufferInt)raster.getDataBuffer()).getData(); + + // Discard pixels that fall outside of the image's bounds + // (ie, this image is actually a subimage of a different image) + if (!(sm.getScanlineStride() == imageWidth && minX == 0 && minY == 0)) + { + int[] pixels2 = new int[imageWidth * imageHeight]; + int scanline = sm.getScanlineStride(); + + for (int i = 0; i < imageHeight; i++) + System.arraycopy(pixels, (i - minY) * scanline - minX, pixels2, i * imageWidth, imageWidth); + + pixels = pixels2; + } + + // Fill the alpha channel as opaque if image does not have alpha + if( !hasAlpha ) + for(int i = 0; i < pixels.length; i++) + pixels[i] &= 0xFFFFFFFF; + } else { - if( hasFastCM ) - { - pixels = ((DataBufferInt)raster.getDataBuffer()).getData(); - if( !hasAlpha ) - for(int i = 0; i < pixels.length; i++) - pixels[i] &= 0xFFFFFFFF; - } - else - { - pixels = CairoGraphics2D.findSimpleIntegerArray - (image.getColorModel(),image.getData()); - } + pixels = CairoGraphics2D.findSimpleIntegerArray(image.getColorModel(),image.getData()); } + surface.setPixels( pixels ); setup( cairo_t ); |