00001 // $Id: matrix.h 1285 2006-06-09 11:10:27Z alex $ 00002 /* @@tag:xara-cn@@ DO NOT MODIFY THIS LINE 00003 ================================XARAHEADERSTART=========================== 00004 00005 Xara LX, a vector drawing and manipulation program. 00006 Copyright (C) 1993-2006 Xara Group Ltd. 00007 Copyright on certain contributions may be held in joint with their 00008 respective authors. See AUTHORS file for details. 00009 00010 LICENSE TO USE AND MODIFY SOFTWARE 00011 ---------------------------------- 00012 00013 This file is part of Xara LX. 00014 00015 Xara LX is free software; you can redistribute it and/or modify it 00016 under the terms of the GNU General Public License version 2 as published 00017 by the Free Software Foundation. 00018 00019 Xara LX and its component source files are distributed in the hope 00020 that it will be useful, but WITHOUT ANY WARRANTY; without even the 00021 implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 00022 See the GNU General Public License for more details. 00023 00024 You should have received a copy of the GNU General Public License along 00025 with Xara LX (see the file GPL in the root directory of the 00026 distribution); if not, write to the Free Software Foundation, Inc., 51 00027 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 00028 00029 00030 ADDITIONAL RIGHTS 00031 ----------------- 00032 00033 Conditional upon your continuing compliance with the GNU General Public 00034 License described above, Xara Group Ltd grants to you certain additional 00035 rights. 00036 00037 The additional rights are to use, modify, and distribute the software 00038 together with the wxWidgets library, the wxXtra library, and the "CDraw" 00039 library and any other such library that any version of Xara LX relased 00040 by Xara Group Ltd requires in order to compile and execute, including 00041 the static linking of that library to XaraLX. In the case of the 00042 "CDraw" library, you may satisfy obligation under the GNU General Public 00043 License to provide source code by providing a binary copy of the library 00044 concerned and a copy of the license accompanying it. 00045 00046 Nothing in this section restricts any of the rights you have under 00047 the GNU General Public License. 00048 00049 00050 SCOPE OF LICENSE 00051 ---------------- 00052 00053 This license applies to this program (XaraLX) and its constituent source 00054 files only, and does not necessarily apply to other Xara products which may 00055 in part share the same code base, and are subject to their own licensing 00056 terms. 00057 00058 This license does not apply to files in the wxXtra directory, which 00059 are built into a separate library, and are subject to the wxWindows 00060 license contained within that directory in the file "WXXTRA-LICENSE". 00061 00062 This license does not apply to the binary libraries (if any) within 00063 the "libs" directory, which are subject to a separate license contained 00064 within that directory in the file "LIBS-LICENSE". 00065 00066 00067 ARRANGEMENTS FOR CONTRIBUTION OF MODIFICATIONS 00068 ---------------------------------------------- 00069 00070 Subject to the terms of the GNU Public License (see above), you are 00071 free to do whatever you like with your modifications. However, you may 00072 (at your option) wish contribute them to Xara's source tree. You can 00073 find details of how to do this at: 00074 http://www.xaraxtreme.org/developers/ 00075 00076 Prior to contributing your modifications, you will need to complete our 00077 contributor agreement. This can be found at: 00078 http://www.xaraxtreme.org/developers/contribute/ 00079 00080 Please note that Xara will not accept modifications which modify any of 00081 the text between the start and end of this header (marked 00082 XARAHEADERSTART and XARAHEADEREND). 00083 00084 00085 MARKS 00086 ----- 00087 00088 Xara, Xara LX, Xara X, Xara X/Xtreme, Xara Xtreme, the Xtreme and Xara 00089 designs are registered or unregistered trademarks, design-marks, and/or 00090 service marks of Xara Group Ltd. All rights in these marks are reserved. 00091 00092 00093 Xara Group Ltd, Gaddesden Place, Hemel Hempstead, HP2 6EX, UK. 00094 http://www.xara.com/ 00095 00096 =================================XARAHEADEREND============================ 00097 */ 00098 00099 /* 00100 * */ 00101 00102 00103 #ifndef INC_MATRIX 00104 #define INC_MATRIX 00105 00106 #include "ccmaths.h" 00107 #include "coord.h" 00108 #include "ccobject.h" 00109 00110 class DocRect; 00111 class DocCoord; 00112 00113 /******************************************************************************************** 00114 00115 < TransformType; enum 00116 00117 Author: Rik_Heywood (Xara Group Ltd) <camelotdev@xara.com> 00118 Created: 19/10/93 00119 Comment: This enum is used to determine what type of matrix we have. It can be one of 00120 the following values :- MonoOn 00121 TRANS_IDENTITY // An Identity Matrix 00122 TRANS_TRANSLATION // A Translation Matrix 00123 TRANS_ROTATION // A Rotation Matrix 00124 TRANS_SCALE // A Scale Matrix 00125 TRANS_SHEAR // A Shear Matrix 00126 TRANS_COMPLEX // A Matrix that is a combination of the above 00127 MonoOff 00128 00129 ********************************************************************************************/ 00130 00131 typedef enum 00132 { 00133 TRANS_IDENTITY, 00134 TRANS_TRANSLATION, 00135 TRANS_ROTATION, 00136 TRANS_SCALE, 00137 TRANS_SHEAR, 00138 TRANS_COMPLEX 00139 } TransformType; 00140 00141 00142 /*********************************************************************************************** 00143 00144 > class Matrix : public SimpleCCObject 00145 00146 Author: Mario_Shamtani (Xara Group Ltd) <camelotdev@xara.com> (extended by Rik) 00147 Created: 13/5/1993 (extended 19/10/93) 00148 Purpose: Represents a mathematical transformation matrix. Transformation matrices can 00149 transform the coordinate pairs of one coordinate space into another coordinate 00150 space. 00151 Matrices are used in Camelot for the rendering process in various ways. These 00152 include coordinate conversion, scaling, rotation and translation. 00153 00154 Depending on the constructor applied it is possible to specify any of the above 00155 types of matrix. MonoOn 00156 eg. Matrix(); //creates the identity matrix 00157 Matrix(ANGLE(90)); //creates a rotation matrix by 90 deg 00158 Matrix(ScaleX, ScaleY); //creates a scaling matrix 00159 Matrix(xOffset, yOffset); //creates a translation matrix 00160 MonoOff 00161 The Matrix also contains a couple of Public vars that may or may not be 00162 of any use to anyone. These are as follows :- MonoOn 00163 TransformType Type; // The type of transformation this matrix represents 00164 ANGLE Angle; // The angle of rotation for a rotation matrix 00165 MonoOff 00166 SeeAlso: TransformType 00167 00168 ***********************************************************************************************/ 00169 00170 class CCAPI Matrix : public SimpleCCObject 00171 { 00172 friend class OSRenderRegion; 00173 friend class XMatrix; 00174 00175 private: 00176 FIXED16 a; 00177 FIXED16 b; 00178 FIXED16 c; 00179 FIXED16 d; 00180 INT32 e; 00181 INT32 f; 00182 00183 public: 00184 TransformType Type; // The type of transform this matrix represents 00185 ANGLE Angle; // If it is a rotation, this holds the angle of rotation 00186 00187 public: 00188 // Constructors et all 00189 Matrix(); 00190 Matrix(const FIXED16&, const FIXED16&); 00191 Matrix(const ANGLE& theta); 00192 Matrix(const Coord&); 00193 Matrix(const Coord&, const ANGLE&); 00194 Matrix(const INT32, const INT32); 00195 Matrix(const FIXED16&, const FIXED16&, const FIXED16&, const FIXED16&, const INT32, const INT32); 00196 Matrix(const DocRect&, const DocRect&); 00197 00198 // Transformations using the matrix 00199 void transform(Coord*) const; 00200 void transform(Coord[], UINT32 count) const; 00201 void transform(Coord[], const Coord[], UINT32) const; 00202 00203 void translate(const INT32 TransX, const INT32 TransY); 00204 00205 BOOL TransformBounds(DocRect* pRect) const; 00206 BOOL Decompose(FIXED16* pScale=NULL, FIXED16* pAspect=NULL, 00207 ANGLE* pRotation=NULL, ANGLE* pShear=NULL, 00208 Coord* pTranslate=NULL, FIXED16* pScaleY=NULL); 00209 BOOL Compose(FIXED16 Scale=1.0, FIXED16 Aspect=1.0, 00210 ANGLE Rotation=0, ANGLE Shear=0, Coord Translation=Coord(0,0)); 00211 00212 BOOL IsRotation(const double epsilon = 0.0) const; 00213 BOOL IsReflection(const double epsilon = 0.0) const; 00214 BOOL IsTranslation(const double epsilon = 0.0) const; 00215 BOOL IsIdentity(/*DOUBLEPARAM epsilon*/) const; 00216 00217 // Matrix copy and multiplication stuff 00218 Matrix& operator=(const Matrix&); 00219 BOOL operator==(const Matrix&) const; 00220 friend Matrix operator*(const Matrix&, const Matrix&); 00221 Matrix& operator*=(const Matrix&); 00222 00223 // Matrix Inversion 00224 Matrix Inverse() const; 00225 00226 // obtain matrix compnents 00227 void GetComponents( FIXED16 *, INT32 * ) const; 00228 void GetTranslation(DocCoord&) const; 00229 void GetTranslation(INT32&,INT32&) const; 00230 void SetTranslation(const DocCoord&); 00231 void SetTranslation(const INT32&, const INT32&); 00232 00233 // Karim 23/07/2000 00234 // ok, here are some factory methods so you don't have to trawl 00235 // through the codebase every time you want a certain type of matrix. 00236 static Matrix CreateTransMatrix(const Coord& dcTrans); 00237 static Matrix CreateScaleMatrix(const double& xScale, const double& yScale); 00238 static Matrix CreateScaleMatrix(const double& ScaleFactor); 00239 static Matrix CreateShearMatrix(const double& ShearAngle); 00240 static Matrix CreateRotateMatrix(const double& RotateAngle); 00241 00242 // Karim 04/09/2000 00243 // two methods to obtain the trace and determinant of a matrix. 00244 double Trace() const; 00245 double Det() const; 00246 00247 // Karim 09/2001 00248 // A set of matrix fns useful for geometric tweening. 00249 void RatioMatrix (const double ratio); 00250 Matrix Interpolate(const Matrix& op, const double ratio) const; 00251 Matrix PostRotate(DocCoord dcCentre, const ANGLE& Angle) const; 00252 00253 #ifdef _DEBUG 00254 void Dump() const; 00255 #endif 00256 }; 00257 00258 #endif