You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ap...@apache.org on 2007/01/30 17:54:22 UTC
svn commit: r501467 - in /harmony/enhanced/classlib/trunk/modules/awt/src:
main/java/common/java/awt/geom/AffineTransform.java
test/api/java/common/java/awt/geom/AffineTransformTest.java
test/api/java/common/java/awt/geom/GeomTestCase.java
Author: apetrenko
Date: Tue Jan 30 08:54:20 2007
New Revision: 501467
URL: http://svn.apache.org/viewvc?view=rev&rev=501467
Log:
Patch for HARMONY-1603 "[classlib][awt] AffineTransform.transform(float[], int, float[], int, int) result deffers from RI if src and dst are the same array"
Modified:
harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/geom/AffineTransform.java
harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/geom/AffineTransformTest.java
harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/geom/GeomTestCase.java
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/geom/AffineTransform.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/geom/AffineTransform.java?view=diff&rev=501467&r1=501466&r2=501467
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/geom/AffineTransform.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/main/java/common/java/awt/geom/AffineTransform.java Tue Jan 30 08:54:20 2007
@@ -439,24 +439,40 @@
}
}
- public void transform(double[] src, int srcOff, double[] dst, int dstOff, int length) {
+ public void transform(double[] src, int srcOff, double[] dst, int dstOff, int length) {
+ int step = 2;
+ if (src == dst && srcOff < dstOff && dstOff < srcOff + length * 2) {
+ srcOff = srcOff + length * 2 - 2;
+ dstOff = dstOff + length * 2 - 2;
+ step = -2;
+ }
while (--length >= 0) {
- double x = src[srcOff++];
- double y = src[srcOff++];
- dst[dstOff++] = x * m00 + y * m01 + m02;
- dst[dstOff++] = x * m10 + y * m11 + m12;
+ double x = src[srcOff + 0];
+ double y = src[srcOff + 1];
+ dst[dstOff + 0] = x * m00 + y * m01 + m02;
+ dst[dstOff + 1] = x * m10 + y * m11 + m12;
+ srcOff += step;
+ dstOff += step;
}
}
public void transform(float[] src, int srcOff, float[] dst, int dstOff, int length) {
+ int step = 2;
+ if (src == dst && srcOff < dstOff && dstOff < srcOff + length * 2) {
+ srcOff = srcOff + length * 2 - 2;
+ dstOff = dstOff + length * 2 - 2;
+ step = -2;
+ }
while (--length >= 0) {
- float x = src[srcOff++];
- float y = src[srcOff++];
- dst[dstOff++] = (float)(x * m00 + y * m01 + m02);
- dst[dstOff++] = (float)(x * m10 + y * m11 + m12);
+ float x = src[srcOff + 0];
+ float y = src[srcOff + 1];
+ dst[dstOff + 0] = (float)(x * m00 + y * m01 + m02);
+ dst[dstOff + 1] = (float)(x * m10 + y * m11 + m12);
+ srcOff += step;
+ dstOff += step;
}
}
-
+
public void transform(float[] src, int srcOff, double[] dst, int dstOff, int length) {
while (--length >= 0) {
float x = src[srcOff++];
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/geom/AffineTransformTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/geom/AffineTransformTest.java?view=diff&rev=501467&r1=501466&r2=501467
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/geom/AffineTransformTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/geom/AffineTransformTest.java Tue Jan 30 08:54:20 2007
@@ -615,7 +615,7 @@
}
}
- public void testTransform1() {
+ public void testTransformPoint() {
for (float[][] element : points) {
AffineTransform at = new AffineTransform(element[0]);
for(int j = 1; j < element.length; j++) {
@@ -684,7 +684,7 @@
}
}
- public void testTransform3() {
+ public void testTransformArray2() {
AffineTransform at = new AffineTransform(0, 1, -2, 0, 3, 4);
double[] src = new double[]{0, 0, 0, 0, 0, 0, 1, 1, 0, 0};
double[] dst = new double[6];
@@ -692,8 +692,8 @@
at.transform(src, 4, dst, 2, 2);
assertEquals(expected, dst, 6, 0.0);
}
-
- public void testTransform4() {
+
+ public void testTransformArray3() {
AffineTransform at = new AffineTransform(0, 1, -2, 0, 3, 4);
float[] src = new float[]{0, 0, 0, 0, 0, 0, 1, 1, 0, 0};
float[] dst = new float[6];
@@ -702,7 +702,7 @@
assertEquals(expected, dst, 6, 0.0f);
}
- public void testTransform5() {
+ public void testTransformArray4() {
AffineTransform at = new AffineTransform(0, 1, -2, 0, 3, 4);
float[] src = new float[]{0, 0, 0, 0, 0, 0, 1, 1, 0, 0};
double[] dst = new double[6];
@@ -711,13 +711,31 @@
assertEquals(expected, dst, 6, 0.0);
}
- public void testTransform6() {
+ public void testTransformArray5() {
AffineTransform at = new AffineTransform(0, 1, -2, 0, 3, 4);
double[] src = new double[]{0, 0, 0, 0, 0, 0, 1, 1, 0, 0};
float[] dst = new float[6];
float[] expected = new float[]{0, 0, 3, 4, 1, 5};
at.transform(src, 4, dst, 2, 2);
assertEquals(expected, dst, 6, 0.0f);
+ }
+
+ public void testTransformArrayOverlap1() {
+ // Regresion test HARMONY-1603
+ AffineTransform at = AffineTransform.getTranslateInstance(2, 3);
+ float[] src = new float[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
+ float[] expected = new float[]{1, 2, 3, 4, 3, 5, 5, 7, 7, 9, 9, 11, 13, 14};
+ at.transform(src, 0, src, 4, 4);
+ assertEquals(expected, src, src.length, 0);
+ }
+
+ public void testTransformArrayOverlap2() {
+ // Regresion test HARMONY-1603
+ AffineTransform at = AffineTransform.getTranslateInstance(2, 3);
+ double[] src = new double[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
+ double[] expected = new double[]{1, 2, 3, 4, 3, 5, 5, 7, 7, 9, 9, 11, 13, 14};
+ at.transform(src, 0, src, 4, 4);
+ assertEquals(expected, src, src.length, 0);
}
public void testDeltaTransform1() {
Modified: harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/geom/GeomTestCase.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/geom/GeomTestCase.java?view=diff&rev=501467&r1=501466&r2=501467
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/geom/GeomTestCase.java (original)
+++ harmony/enhanced/classlib/trunk/modules/awt/src/test/api/java/common/java/awt/geom/GeomTestCase.java Tue Jan 30 08:54:20 2007
@@ -22,6 +22,7 @@
import java.awt.SerializeTestCase;
import java.awt.Tools;
+import java.util.Arrays;
public class GeomTestCase extends SerializeTestCase {
@@ -142,7 +143,9 @@
fail(concat(msg, "Wrong array length " + a2.length + ", needed at least " + length));
}
for(int i = 0; i < length; i++) {
- assertEquals(concat(msg, "Element " + i), a1[i], a2[i], delta);
+ if (a1[i] != a2[i]) {
+ fail(msg, Arrays.toString(a1), Arrays.toString(a2));
+ }
}
}
@@ -158,7 +161,9 @@
fail(concat(msg, "Wrong array length " + a2.length + ", needed at least " + length));
}
for(int i = 0; i < length; i++) {
- assertEquals(concat(msg, "Element " + i), a1[i], a2[i], delta);
+ if (a1[i] != a2[i]) {
+ fail(msg, Arrays.toString(a1), Arrays.toString(a2));
+ }
}
}
@@ -174,7 +179,9 @@
fail(concat(msg, "Wrong array length " + a2.length + ", needed at least " + length));
}
for(int i = 0; i < length; i++) {
- assertEquals(concat(msg, "Element " + i), a1[i], a2[i]);
+ if (a1[i] != a2[i]) {
+ fail(msg, Arrays.toString(a1), Arrays.toString(a2));
+ }
}
}