summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancis Kung <fkung@redhat.com>2006-12-05 20:43:49 +0000
committerFrancis Kung <fkung@redhat.com>2006-12-05 20:43:49 +0000
commitb79341ec0f84cba3c5eb7cd8435b57b72e3d2c4b (patch)
tree2cf909428b22088cd284fff72d3d0388c2d54296
parentb81067659a76ce17bbad030eac96f78601102576 (diff)
downloadclasspath-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--ChangeLog6
-rw-r--r--gnu/java/awt/peer/gtk/BufferedImageGraphics.java48
2 files changed, 39 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index e18720a02..bcf7201f2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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 );