Index: modules/awt/src/main/java/unix/org/apache/harmony/awt/wtk/linux/LinuxCursorFactory.java =================================================================== --- modules/awt/src/main/java/unix/org/apache/harmony/awt/wtk/linux/LinuxCursorFactory.java (revision 590933) +++ modules/awt/src/main/java/unix/org/apache/harmony/awt/wtk/linux/LinuxCursorFactory.java (working copy) @@ -100,18 +100,42 @@ BufferedImage bmpMask = getMask(bufImg); //get pixel data from bufImg & create X11 pixmap byte[] bmpSrcData = ((DataBufferByte) bmpSrc.getData().getDataBuffer()).getData(); + byte[] rSrcData = new byte[bmpSrcData.length]; byte[] bmpMaskData = ((DataBufferByte) bmpMask.getData().getDataBuffer()).getData(); + byte[] rMaskData = new byte[bmpMaskData.length]; + // Conver Bitmap bits to LSBFirst + for(int i = 0; i < bmpSrcData.length; i++){ + int pix = bmpSrcData[i] & 0xff; + int rpix = pix & 0x1; + for( int j = 1; j < 8; j++){ + pix >>= 1; + rpix <<= 1; + rpix |= (pix & 0x1) ; + } + rSrcData[i] = (byte)rpix; + } + for(int i = 0; i < bmpMaskData.length; i++){ + int pix = bmpMaskData[i] & 0xff; + int rpix = pix & 0x1; + for( int j = 1; j < 8; j++){ + pix >>= 1; + rpix <<= 1; + rpix |= (pix & 0x1) ; + } + rMaskData[i] = (byte)rpix; + } + ArrayAccessor arrayAccess = AccessorFactory.getArrayAccessor(); long wnd = factory.getRootWindow(); - LockedArray larr = arrayAccess.lockArrayShort(bmpSrcData); + LockedArray larr = arrayAccess.lockArrayShort(rSrcData); long dataPtr = larr.getAddress(); long pixmap = x11.XCreateBitmapFromData(display, wnd, dataPtr, width, height); //System.out.println("source pixmap=" + pixmap); larr.release(); - larr = arrayAccess.lockArrayShort(bmpMaskData); + larr = arrayAccess.lockArrayShort(rMaskData); dataPtr = larr.getAddress(); long pixmapMask = x11.XCreateBitmapFromData(display, wnd, dataPtr, width, height); Index: modules/awt/src/main/java/common/java/awt/image/Raster.java =================================================================== --- modules/awt/src/main/java/common/java/awt/image/Raster.java (revision 590933) +++ modules/awt/src/main/java/common/java/awt/image/Raster.java (working copy) @@ -602,18 +602,8 @@ throw new RasterFormatException(Messages.getString("awt.284")); //$NON-NLS-1$ } - if (sampleModel instanceof ComponentSampleModel) { - validateDataBuffer(dataBuffer, aRegion.width, aRegion.height, - ((ComponentSampleModel) sampleModel).getScanlineStride()); - } else if (sampleModel instanceof MultiPixelPackedSampleModel) { - validateDataBuffer(dataBuffer, aRegion.width, aRegion.height, - ((MultiPixelPackedSampleModel) sampleModel) - .getScanlineStride()); - } else if (sampleModel instanceof SinglePixelPackedSampleModel) { - validateDataBuffer(dataBuffer, aRegion.width, aRegion.height, - ((SinglePixelPackedSampleModel) sampleModel) - .getScanlineStride()); - } + validateDataBuffer(dataBuffer, aRegion.width, aRegion.height, + sampleModel); this.sampleModel = sampleModel; this.dataBuffer = dataBuffer; @@ -853,8 +843,54 @@ } private static void validateDataBuffer(final DataBuffer dataBuffer, final int w, - final int h, final int scanlineStride) { - if (dataBuffer.getSize() < (scanlineStride * (h - 1) + w - 1)) { + final int h, final SampleModel sampleModel) { + + int size = 0; + + if (sampleModel instanceof ComponentSampleModel) { + ComponentSampleModel csm = (ComponentSampleModel) sampleModel; + int offsets[] = csm.getBandOffsets(); + int maxOffset = offsets[0]; + for (int i = 1; i < offsets.length; i++) { + if (offsets[i] > maxOffset) { + maxOffset = offsets[i]; + } + } + int scanlineStride = csm.getScanlineStride(); + int pixelStride = csm.getPixelStride(); + + size = (h - 1) * scanlineStride + + (w - 1) * pixelStride + maxOffset + 1; + + } else if (sampleModel instanceof MultiPixelPackedSampleModel) { + MultiPixelPackedSampleModel mppsm = + (MultiPixelPackedSampleModel) sampleModel; + + int scanlineStride = mppsm.getScanlineStride(); + int dataBitOffset = mppsm.getDataBitOffset(); + int dataType = dataBuffer.getDataType(); + + size = scanlineStride * h; + + switch (dataType) { + case DataBuffer.TYPE_BYTE: + size += (dataBitOffset + 7) / 8; + break; + case DataBuffer.TYPE_USHORT: + size += (dataBitOffset + 15) / 16; + break; + case DataBuffer.TYPE_INT: + size += (dataBitOffset + 31) / 32; + break; + } + } else if (sampleModel instanceof SinglePixelPackedSampleModel) { + SinglePixelPackedSampleModel sppsm = + (SinglePixelPackedSampleModel) sampleModel; + + int scanlineStride = sppsm.getScanlineStride(); + size = (h - 1) * scanlineStride + w; + } + if (dataBuffer.getSize() < size) { // awt.298=dataBuffer is too small throw new RasterFormatException(Messages.getString("awt.298")); //$NON-NLS-1$ } Index: modules/awt/src/main/native/gl/shared/SurfaceDataStructure.cpp =================================================================== --- modules/awt/src/main/native/gl/shared/SurfaceDataStructure.cpp (revision 590933) +++ modules/awt/src/main/native/gl/shared/SurfaceDataStructure.cpp (working copy) @@ -461,10 +461,10 @@ src = (unsigned char *)srcDataPtr + src_offset; dst = (unsigned int *)bmpDataPtr + dst_offset; - for(int _y = h; _y > 0; _y--, src += src_stride, dst += dst_stride){ + for(int y = h; y > 0; y--, src += src_stride, dst += dst_stride){ d = dst; - for(int _x = 0; _x < w; _x++){ + for(int x = 0; x < w; x++){ bitnum = x * pixelBits; s = src + bitnum / 8; elem = *s;