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);
   }
 
   /**

Reply via email to