Our old code couldn't handle custom DataBuffer implementations. Fixes that (PR27854), and also some bugs in our custom implementation (CairoSurface).
2006-06-01 Sven de Marothy <[EMAIL PROTECTED]> PR 27854 * gnu/java/awt/Buffers.java (getData): Reimplement. * gnu/java/awt/peer/gtk/CairoSurface.java (getElem, setElem): Call native methods.
Index: gnu/java/awt/Buffers.java =================================================================== RCS file: /sources/classpath/classpath/gnu/java/awt/Buffers.java,v retrieving revision 1.5 diff -U3 -r1.5 Buffers.java --- gnu/java/awt/Buffers.java 2 Jul 2005 20:32:10 -0000 1.5 +++ gnu/java/awt/Buffers.java 1 Jun 2006 13:52:14 -0000 @@ -144,25 +144,7 @@ */ public static Object getData(DataBuffer buffer) { - if (buffer instanceof DataBufferByte) - return ((DataBufferByte) buffer).getData(); - - if (buffer instanceof DataBufferShort) - return ((DataBufferShort) buffer).getData(); - - if (buffer instanceof DataBufferUShort) - return ((DataBufferUShort) buffer).getData(); - - if (buffer instanceof DataBufferInt) - return ((DataBufferInt) buffer).getData(); - - if (buffer instanceof DataBufferFloat) - return ((DataBufferFloat) buffer).getData(); - - if (buffer instanceof DataBufferDouble) - return ((DataBufferDouble) buffer).getData(); - - throw new ClassCastException("Unknown data buffer type"); + return getData(buffer, 0, null, 0, buffer.getSize()); } @@ -172,46 +154,46 @@ * given destination array is null. */ public static Object getData(DataBuffer src, int srcOffset, - Object dest, int destOffset, + Object dest, int dstOffset, int length) { Object from; - if (src instanceof DataBufferByte) - { - from = ((DataBufferByte) src).getData(); - if (dest == null) dest = new byte[length+destOffset]; - } - else if (src instanceof DataBufferShort) - { - from = ((DataBufferShort) src).getData(); - if (dest == null) dest = new short[length+destOffset]; - } - else if (src instanceof DataBufferUShort) - { - from = ((DataBufferUShort) src).getData(); - if (dest == null) dest = new short[length+destOffset]; - } - else if (src instanceof DataBufferInt) - { - from = ((DataBufferInt) src).getData(); - if (dest == null) dest = new int[length+destOffset]; - } - else if (src instanceof DataBufferFloat) - { - from = ((DataBufferFloat) src).getData(); - if (dest == null) dest = new float[length+destOffset]; - } - else if (src instanceof DataBufferDouble) - { - from = ((DataBufferDouble) src).getData(); - if (dest == null) dest = new double[length+destOffset]; - } - else + switch(src.getDataType()) { + case DataBuffer.TYPE_BYTE: + if (dest == null) dest = new byte[length+dstOffset]; + for(int i = 0; i < length; i++) + ((byte[])dest)[i + dstOffset] = (byte)src.getElem(i + srcOffset); + break; + + case DataBuffer.TYPE_DOUBLE: + if (dest == null) dest = new double[length+dstOffset]; + for(int i = 0; i < length; i++) + ((double[])dest)[i + dstOffset] = src.getElemDouble(i + srcOffset); + break; + + case DataBuffer.TYPE_FLOAT: + if (dest == null) dest = new float[length+dstOffset]; + for(int i = 0; i < length; i++) + ((float[])dest)[i + dstOffset] = src.getElemFloat(i + srcOffset); + break; + + case DataBuffer.TYPE_INT: + if (dest == null) dest = new int[length+dstOffset]; + for(int i = 0; i < length; i++) + ((int[])dest)[i + dstOffset] = src.getElem(i + srcOffset); + break; + + case DataBuffer.TYPE_SHORT: + case DataBuffer.TYPE_USHORT: + if (dest == null) dest = new short[length+dstOffset]; + for(int i = 0; i < length; i++) + ((short[])dest)[i + dstOffset] = (short)src.getElem(i + srcOffset); + break; + + case DataBuffer.TYPE_UNDEFINED: throw new ClassCastException("Unknown data buffer type"); } - - System.arraycopy(from, srcOffset, dest, destOffset, length); return dest; } Index: gnu/java/awt/peer/gtk/CairoSurface.java =================================================================== RCS file: /sources/classpath/classpath/gnu/java/awt/peer/gtk/CairoSurface.java,v retrieving revision 1.4 diff -U3 -r1.4 CairoSurface.java --- gnu/java/awt/peer/gtk/CairoSurface.java 31 May 2006 00:38:08 -0000 1.4 +++ gnu/java/awt/peer/gtk/CairoSurface.java 1 Jun 2006 13:52:15 -0000 @@ -239,9 +239,9 @@ */ public int getElem(int bank, int i) { - if(bank != 0 || i <= 0 || i >= width*height) - throw new IndexOutOfBoundsException(); - return getElem(i); + if(bank != 0 || i < 0 || i >= width*height) + throw new IndexOutOfBoundsException(i+" size: "+width*height); + return nativeGetElem(i); } /** @@ -249,9 +249,9 @@ */ public void setElem(int bank, int i, int val) { - if(bank != 0 || i <= 0 || i >= width*height) - throw new IndexOutOfBoundsException(); - setElem(i, val); + if(bank != 0 || i < 0 || i >= width*height) + throw new IndexOutOfBoundsException(i+" size: "+width*height); + nativeSetElem(i, val); } /**