svgtopt/gfx2d/inc/GfxAffineTransform.h
changeset 0 d46562c3d99d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/svgtopt/gfx2d/inc/GfxAffineTransform.h	Thu Jan 07 16:19:02 2010 +0200
@@ -0,0 +1,473 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Graphics Extension Library header file
+*
+*/
+
+
+#ifndef GFXAFFINETRANSFORM_H
+#define GFXAFFINETRANSFORM_H
+
+
+#include <e32std.h>
+#include <e32base.h>
+
+#include "GfxFloatFixPt.h"
+
+
+// These constants are used because enumeration cannot
+// accept bit operation
+const TInt32 KTransformIdentity = 0;
+const TInt32 KTransformTranslate = 1;
+const TInt32 KTransformScale = 2;
+const TInt32 KTransformShear = 4;
+
+typedef TFloatFixPt TMatrixElType;
+typedef TUint32     TGfxTransformType;
+
+class TGfxAffineTransform;
+class CGfxShape;
+class TGfxPoint2D;
+
+
+/**
+ * This class implements operations of a 2D transform matrix.
+ *
+ *  @lib Gfx2D.lib
+ *  @since 1.0
+ */
+class TGfxAffineTransform
+    {
+    public:
+
+        /**
+         * Construct an identity matrix.
+         *
+         * @since 1.0
+         * @param
+         * @return
+         */
+                                    TGfxAffineTransform();
+
+        /**
+         * Constructor.
+         *
+         * @since 1.0
+         * @param aM00 : row 0, column 0 value of matrix.
+         * @param aM10 : row 1, column 0 value of matrix.
+         * @param aM01 : row 0, column 1 value of matrix.
+         * @param aM11 : row 1, column 1 value of matrix.
+         * @param aM02 : row 0, column 2 value of matrix.
+         * @param aM12 : row 1, column 2 value of matrix.
+         * @return
+         */
+                                    TGfxAffineTransform( TReal32 aM00,
+                                                                 TReal32 aM10,
+                                                                 TReal32 aM01,
+                                                                 TReal32 aM11,
+                                                                 TReal32 aM02,
+                                                                 TReal32 aM12 );
+
+
+        /**
+         * Return a TGfxAffineTransform object with the rotation info
+         * of the given angle applied.
+         *
+         * @since 1.0
+         * @param aTheta : angle to create a rotation affine transform.
+         * @return
+         */
+         static TGfxAffineTransform GetRotateInstance( TReal32 aTheta );
+
+        /**
+         * Return a TGfxAffineTransform object with the rotation info
+         * of the given angle, rotated at the given point.
+         *
+         * @since 1.0
+         * @param aTheta : angle to create a rotation affine transform.
+         * @param aX : x value of rotation center.
+         * @param aY : x value of rotation center.
+         * @return
+         */
+         static TGfxAffineTransform GetRotateInstance( TReal32 aTheta,
+                                                               const TFloatFixPt& aX,
+                                                               const TFloatFixPt& aY );
+
+/**
+         * Return a TGfxAffineTransform object with the zoom info
+         * of the given scalefactor, scaled at the given point.
+         *
+         * @since 1.0
+         * @param aScaleFactor : scaling factor
+         * @param aX : x value of scaling center.
+         * @param aY : x value of scaling center.
+         * @return
+         */
+         static TGfxAffineTransform GetZoomInstance( TReal32 aScaleFactor,
+                                                               const TFloatFixPt& aX,
+                                                               const TFloatFixPt& aY );
+       
+        /**
+         * Return a TGfxAffineTransform object with the scaling info
+         * applied.
+         *
+         * @since 1.0
+         * @param aSx : scaling factor in the x axis.
+         * @param aSy : scaling factor in the y axis.
+         * @return
+         */
+         static TGfxAffineTransform GetScaleInstance( TReal32 aSx,
+                                                              TReal32 aSy );
+
+        /**
+         * Return a TGfxAffineTransform object with the shearing info
+         * applied.
+         *
+         * @since 1.0
+         * @param aShx : shearing factor in the x axis.
+         * @param aShy : shearing factor in the y axis.
+         * @return
+         */
+         static TGfxAffineTransform GetShearInstance( TReal32 aShx,
+                                                              TReal32 aShy );
+
+        /**
+         * Return a TGfxAffineTransform object with the translation info
+         * applied.
+         *
+         * @since 1.0
+         * @param aTx : translation value in the x axis.
+         * @param aTy : translation value in the y axis.
+         * @return
+         */
+         static TGfxAffineTransform GetTranslateInstance( const TFloatFixPt& aTx,
+                                                                  const TFloatFixPt& aTy );
+
+        /**
+         * Return the determinate value of this matrix.
+         *
+         * @since 1.0
+         * @return the determinate value
+         */
+         TReal32                    Determinant() const;
+
+        /**
+         * Return wether this matrix is an indentity matrix.
+         *
+         * @since 1.0
+         * @return true if this matrix is an identity matrix.
+         */
+         TBool                      IsIdentity() const;
+
+        /**
+         * Return the scaling factor in the x axis.
+         *
+         * @since 1.0
+         * @return scaling factor in the x axis.
+         */
+         TReal32                    ScaleX() const;
+
+        /**
+         * Return the scaling factor in the y axis.
+         *
+         * @since 1.0
+         * @return scaling factor in the y axis.
+         */
+         TReal32                    ScaleY() const;
+
+        /**
+         * Return the shearing factor in the x axis.
+         *
+         * @since 1.0
+         * @return shearing factor in the x axis.
+         */
+         TReal32                    ShearX() const;
+
+        /**
+         * Return the shearing factor in the y axis.
+         *
+         * @since 1.0
+         * @return shearing factor in the y axis.
+         */
+         TReal32                    ShearY() const;
+
+        /**
+         * Return the translation value in the x axis.
+         *
+         * @since 1.0
+         * @return translation value in the x axis.
+         */
+         TReal32                    TranslateX() const;
+
+        /**
+         * Return the translation value in the y axis.
+         *
+         * @since 1.0
+         * @return translation value in the y axis.
+         */
+         TReal32                    TranslateY() const;
+
+        /**
+         * Create the inverse tranformation matrix of this matrix.
+         *
+         * @since 1.0
+         * @return inverse matrix.
+         */
+         TGfxAffineTransform        CreateInverse();
+
+
+        /**
+         * Muliply this given matrix with this matrix.
+         *
+         * @since 1.0
+         * @return
+         */
+         void                       Concatenate( const TGfxAffineTransform& aTransform );
+
+
+        /**
+         * Appends this transform with the existing transform
+         * Multiply in reverse order
+         * For Ex:  In cases of zoom, rotate and pan of already transformed content.
+         * If T is the existing transform and zoom operation has to be applied to it
+         * the resultant transform would be Z*T.
+         * @since 1.0
+         * @return
+         */
+         void                       AppendTransform( const TGfxAffineTransform& aTransform );
+        
+        /**
+         * Apply the given rotation angle to this matrix.
+         *
+         * @since 1.0
+         * @param aTheta : angle of rotation
+         * @return
+         */
+         void                       Rotate( TReal32 aTheta );
+
+        /**
+         * Apply the given rotation angle about this given point to this matrix.
+         *
+         * @since 1.0
+         * @param aTheta : angle of rotation
+         * @param aX : x coordinate for center of rotation.
+         * @param aY : y coordinate for center of rotation.
+         * @return
+         */
+         void                       Rotate( TReal32 aTheta,
+                                                    const TFloatFixPt& aX,
+                                                    const TFloatFixPt& aY );
+
+        /**
+         * Apply the given rotation angle about this given point to this matrix.
+         *
+         * @since 1.0
+         * @param aTheta : angle of rotation
+         * @param aX : x coordinate for center of rotation.
+         * @param aY : y coordinate for center of rotation.
+         * @return
+         */
+
+         void                       UserRotate( TReal32 aTheta,
+                                                    const TFloatFixPt& aX,
+                                                    const TFloatFixPt& aY );
+
+        /*
+         * Apply the given scaling factor for this given point to this matrix.
+         *
+         *
+         * @since 1.0
+         * @param aScaleFactor : scaling factor
+         * @param aX : x value of scaling center.
+         * @param aY : x value of scaling center.
+         * @return
+         */
+       
+         void                       UserZoom( TReal32 aScaleFactor,
+                                                    const TFloatFixPt& aX,
+                                                    const TFloatFixPt& aY );
+
+        /**
+         * Apply the given scale factors to this matrix.
+         *
+         * @since 1.0
+         * @param aSx : scaling factor in the x axis.
+         * @param aSy : scaling factor in the y axis.
+         * @return
+         */
+         void                       Scale( TReal32 aSx, TReal32 aSy );
+
+        /**
+         * Apply the given translation values to this matrix.
+         *
+         * @since 1.0
+         * @param aTx : translation value in the x axis.
+         * @param aTy : translation value in the y axis.
+         * @return
+         */
+         void                       Translate( const TFloatFixPt& aTx,
+                                                       const TFloatFixPt& aTy );
+
+        /**
+         * Apply the given translation values to this matrix.
+         *
+         * @since 1.0
+         * @param aTx : translation value in the x axis.
+         * @param aTy : translation value in the y axis.
+         * @return
+         */
+         void                       UserPan( const TFloatFixPt& aTx,
+                                                       const TFloatFixPt& aTy );
+
+        /**
+         * Apply the given shearing values to this matrix.
+         *
+         * @since 1.0
+         * @param aTx : shearing value in the x axis.
+         * @param aTy : shearing value in the y axis.
+         * @return
+         */
+         void                       Shear( TReal32 aShX, TReal32 aShY );
+
+        /**
+         * Set the transformation info of this matrix to the given values.
+         *
+         * @since 1.0
+         * @param aM00 : row 0, column 0 value of matrix.
+         * @param aM10 : row 1, column 0 value of matrix.
+         * @param aM01 : row 0, column 1 value of matrix.
+         * @param aM11 : row 1, column 1 value of matrix.
+         * @param aM02 : row 0, column 2 value of matrix.
+         * @param aM12 : row 1, column 2 value of matrix.
+         * @return
+         */
+         void                       SetTransform( TReal32 aM00,
+                                                          TReal32 aM10,
+                                                          TReal32 aM01,
+                                                          TReal32 aM11,
+                                                          TReal32 aM02,
+                                                          TReal32 aM12 );
+
+        /**
+         * Apply the transformation described by this matrix to the
+         * array of TGfxPoint2D.
+         *
+         * @since 1.0
+         * @param aSrcPts : array of TGfxPoint2D values to transform.
+         * @param aDstPts : array to store transformed points.
+         * @param aNumPts : number of points to transform.
+         * @return
+         */
+         void                       Transform( TGfxPoint2D* aSrcPts,
+                                                       TGfxPoint2D* aDstPts,
+                                                       TInt32 aNumPts ) const;
+
+        /**
+         * Apply the transformation described by this matrix to the
+         * array of TFloatFixPt.
+         *
+         * @since 1.0
+         * @param aSrcPts : array of TFloatFixPt values to transform.
+         * @param aDstPts : array to store transformed points.
+         * @param aNumPts : number of points to transform.
+         * @return
+         */
+         void                       Transform( TFloatFixPt* aSrcPts,
+                                                       TFloatFixPt* aDstPts,
+                                                       TInt32 aNumPts ) const;
+
+        /**
+         * Apply the transformation described by this matrix to the
+         * array of TFloatFixPt.  Old values are replaced.
+         *
+         * @since 1.0
+         * @param aSrcPts : array of TFloatFixPt values to transform.
+         * @param aNumPts : number of points to transform.
+         * @return
+         */
+         void                       Transform( TFloatFixPt* aSrcDstPts,
+                                                       TInt32 aNumPts ) const;
+
+
+        /**
+         * Return the transformation type of this matrix.
+         *
+         * @since 1.0
+         * @return transformation type
+         */
+        TUint32 TransformType();
+
+         void Print();
+
+        /**
+         * Get the scaling factor set in this transform.  This function returns correctly
+         * for a uniform scaling in both directions only.
+         * @since 1.0
+         * @return
+         */
+         TFloatFixPt ScalingFactor() const;
+
+    private:
+
+        /**
+         * Constructor.
+         *
+         * @since 1.0
+         * @param aM00 : row 0, column 0 value of matrix.
+         * @param aM10 : row 1, column 0 value of matrix.
+         * @param aM01 : row 0, column 1 value of matrix.
+         * @param aM11 : row 1, column 1 value of matrix.
+         * @param aM02 : row 0, column 2 value of matrix.
+         * @param aM12 : row 1, column 2 value of matrix.
+         * @param aType : transform type.
+         * @return
+         */
+                            TGfxAffineTransform( TReal32 aM00,
+                                                 TReal32 aM10,
+                                                 TReal32 aM01,
+                                                 TReal32 aM11,
+                                                 TReal32 aM02,
+                                                 TReal32 aM12,
+                                                 TGfxTransformType aType );
+        /**
+         * Update this matrix.
+         *
+         * @since 1.0
+         * @return
+         */
+        void                UpdateState();
+
+        /**
+         * The the the rotation info to the give angle.
+         *
+         * @since 1.0
+         * @return
+         */
+        void                SetToRotate( TReal32 aTheta );
+
+	public:
+
+        TFloatFixPt       iM00;
+        TFloatFixPt        iM10;
+        TFloatFixPt        iM01;
+        TFloatFixPt        iM11;
+        TFloatFixPt        iM02;
+        TFloatFixPt        iM12;
+
+        TGfxTransformType   iTransType;
+
+
+    };
+
+#endif      // GFXAFFINETRANSFORM_H