diff -r 000000000000 -r d46562c3d99d svgtopt/gfx2d/inc/GfxAffineTransform.h --- /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 +#include + +#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