[kaffe] CVS kaffe (dalibor): Resynced with GNU Classpath

Kaffe CVS Kaffe Mailing List <kaffe@kaffe.org>
Wed Feb 25 11:24:15 2004


PatchSet 4462 
Date: 2004/02/25 19:09:58
Author: dalibor
Branch: HEAD
Tag: (none) 
Log:
Resynced with GNU Classpath
~
2004-02-24  Dalibor Topic <robilad@kaffe.org>

        Resynced with GNU Classpath

        2004-02-05  Olga Rodimina <rodimina@redhat.com>

        * java/awt/geom/AffineTransform.java:
        Corrected comments on the field definitions
        for m11 and m10
        (shear): Fixed few errors that caused shear
        transformation to be performed incorrectly.
        (createInverse): Fixed to return correct inverse
        of the given matrix.

Members: 
	ChangeLog:1.2042->1.2043 
	libraries/javalib/java/awt/geom/AffineTransform.java:1.2->1.3 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.2042 kaffe/ChangeLog:1.2043
--- kaffe/ChangeLog:1.2042	Wed Feb 25 19:01:26 2004
+++ kaffe/ChangeLog	Wed Feb 25 19:09:58 2004
@@ -2,6 +2,20 @@
 
         Resynced with GNU Classpath
 
+	2004-02-05  Olga Rodimina <rodimina@redhat.com>
+
+        * java/awt/geom/AffineTransform.java:
+        Corrected comments on the field definitions 
+        for m11 and m10
+        (shear): Fixed few errors that caused shear 
+        transformation to be performed incorrectly.
+        (createInverse): Fixed to return correct inverse
+        of the given matrix.
+
+2004-02-24  Dalibor Topic <robilad@kaffe.org>
+
+        Resynced with GNU Classpath
+
 	2004-02-06  Michael Koch  <konqueror@gmx.de>
 
         * java/awt/datatransfer/DataFlavor.java
Index: kaffe/libraries/javalib/java/awt/geom/AffineTransform.java
diff -u kaffe/libraries/javalib/java/awt/geom/AffineTransform.java:1.2 kaffe/libraries/javalib/java/awt/geom/AffineTransform.java:1.3
--- kaffe/libraries/javalib/java/awt/geom/AffineTransform.java:1.2	Wed Oct 22 10:34:50 2003
+++ kaffe/libraries/javalib/java/awt/geom/AffineTransform.java	Wed Feb 25 19:09:59 2004
@@ -226,7 +226,7 @@
   private double m00;
 
   /**
-   * The Y coordinate scaling element of the transform matrix.
+   * The Y coordinate shearing element of the transform matrix.
    *
    * @serial matrix[1,0]
    */
@@ -240,7 +240,7 @@
   private double m01;
 
   /**
-   * The Y coordinate shearing element of the transform matrix.
+   * The Y coordinate scaling element of the transform matrix.
    *
    * @serial matrix[1,1]
    */
@@ -738,10 +738,10 @@
    */
   public void shear(double shx, double shy)
   {
-    double n00 = m00 + shx * m01;
-    double n01 = shx * m00 + m01;
-    double n10 = m10 * shy + m11;
-    double n11 = shx * m10 + m11;
+    double n00 = m00 + (shy * m01);
+    double n01 = m01 + (shx * m00);
+    double n10 = m10 + (shy * m11);
+    double n11 = m11 + (shx * m10);
     m00 = n00;
     m01 = n01;
     m10 = n10;
@@ -996,6 +996,38 @@
    * map multiple points to the same line or point). A transform exists only
    * if getDeterminant() has a non-zero value.
    *
+   * The inverse is calculated as:
+   * 
+   * <pre>
+   *
+   * Let A be the matrix for which we want to find the inverse:
+   *
+   * A = [ m00 m01 m02 ]
+   *     [ m10 m11 m12 ]
+   *     [ 0   0   1   ] 
+   *
+   *
+   *                 1    
+   * inverse (A) =  ---   x  adjoint(A) 
+   *                det 
+   *
+   *
+   *
+   *             =   1       [  m11  -m01   m01*m12-m02*m11  ]
+   *                ---   x  [ -m10   m00  -m00*m12+m10*m02  ]
+   *                det      [  0     0     m00*m11-m10*m01  ]
+   *
+   *
+   *
+   *             = [  m11/det  -m01/det   m01*m12-m02*m11/det ]
+   *               [ -m10/det   m00/det  -m00*m12+m10*m02/det ]
+   *               [   0           0          1               ]
+   *
+   *
+   * </pre>
+   *
+   *
+   *
    * @return a new inverse transform
    * @throws NoninvertibleTransformException if inversion is not possible
    * @see #getDeterminant()
@@ -1006,8 +1038,15 @@
     double det = getDeterminant();
     if (det == 0)
       throw new NoninvertibleTransformException("can't invert transform");
-    return new AffineTransform(m11 / det, -m10 / det, m01 / det, -m00 / det,
-                               -m02, -m12);
+    
+    double im00 = m11 / det;
+    double im10 = -m10 / det;
+    double im01 = -m01 / det;
+    double im11 = m00 / det;
+    double im02 = (m01 * m12 - m02 * m11) / det;
+    double im12 = (-m00 * m12 + m10 * m02) / det;
+    
+    return new AffineTransform (im00, im10, im01, im11, im02, im12);
   }
 
   /**