00001 // $Id: gclips.h 751 2006-03-31 15:43:49Z 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 // Gavin's path clipping code 00099 00101 // 00102 // GClipS.h 00103 // 00105 00106 const UINT32 CLIPPING_STYLE = 0x0007 ; 00107 const UINT32 CLIPPING_SOURCE_WINDING = 0x0010 ; 00108 const UINT32 CLIPPING_CLIP_WINDING = 0x0020 ; 00109 const UINT32 CLIPPING_IS_STROKED = 0x0040 ; 00110 const UINT32 CLIPPING_IS_CLOSED = 0x0080 ; 00111 00112 const UINT32 EDGE_CLIP = 0x0001 ; 00113 const UINT32 EDGE_REVERSED = 0x0002 ; 00114 const UINT32 EDGE_CURVED = 0x0004 ; 00115 const UINT32 EDGE_STROKED = 0x0008 ; 00116 00118 00119 struct Curve { 00120 POINT P0 ; 00121 POINT P1 ; 00122 POINT P2 ; 00123 POINT P3 ; 00124 } ; 00125 00126 struct Edge { 00127 Edge *LK ; // Link 00128 Edge *RLK ; // Reverse link - only used to initially sort the edges 00129 double DX ; // Slope = (XE-XS)/(YE-YE) 00130 INT32 XS,YS ; // Start point 00131 INT32 XE,YE ; // End point 00132 INT32 XI,YI ; // Intersection point 00133 UINT32 FF ; // Flags 00134 Curve *ID ; // Pointer to curve data - used as curve ID. 00135 UINT32 TS ; // Start t parameter 00136 UINT32 TE ; // End t parameter 00137 } ; 00138 00139 struct LineEdge { 00140 Edge *LK ; 00141 Edge *RLK ; 00142 double DX ; 00143 INT32 XS,YS ; 00144 INT32 XE,YE ; 00145 INT32 XI,YI ; 00146 UINT32 FF ; 00147 } ; 00148 00149 struct CurveEdge { 00150 Edge *LK ; 00151 Edge *RLK ; 00152 double DX ; 00153 INT32 XS,YS ; 00154 INT32 XE,YE ; 00155 INT32 XI,YI ; 00156 UINT32 FF ; 00157 Curve *ID ; 00158 UINT32 TS ; 00159 UINT32 TE ; 00160 } ; 00161 00162 struct Strip { 00163 Strip *FSLK ; // [L]in[K] to next strip, [F]orward sorted by [S]tart value. 00164 Strip *RELK ; // [L]in[K] to next strip, [R]everse sorted by [E]nd value. 00165 INT32 YS,YE ; 00166 union { 00167 struct { 00168 INT32 XSL,XEL ; 00169 union { 00170 double DXL ; 00171 __int64 FGL ; // -infinity if curve, +infinity if strip is invalid 00172 } ; 00173 UINT32 TSL,TEL ; 00174 INT32 XSR,XER ; 00175 union { 00176 double DXR ; 00177 __int64 FGR ; // -infinity if curve 00178 } ; 00179 UINT32 TSR,TER ; 00180 Curve *IDL,*IDR ; 00181 } ; 00182 struct { 00183 Strip *FELK ; // [L]in[K] to next strip, [F]orward sorted by [E]nd value. 00184 Strip *RSLK ; // [L]in[K] to next strip, [R]everse sorted by [S]tart value. 00185 INT32 XS,XE ; 00186 union { 00187 double DX ; 00188 __int64 FG ; 00189 } ; 00190 UINT32 TS,TE ; 00191 Curve *ID ; 00192 } ; 00193 } ; 00194 } ; 00195 00196 struct FilledStrip { 00197 Strip *FSLK ; // [L]in[K] to next strip, [F]orward sorted by [S]tart value. 00198 Strip *RELK ; // [L]in[K] to next strip, [R]everse sorted by [E]nd value. 00199 INT32 YS,YE ; 00200 INT32 XSL,XEL ; 00201 union { 00202 double DXL ; 00203 __int64 FGL ; // -infinity if curve, +infinity if strip is invalid 00204 } ; 00205 UINT32 TSL,TEL ; 00206 INT32 XSR,XER ; 00207 union { 00208 double DXR ; 00209 __int64 FGR ; // -infinity if curve 00210 } ; 00211 UINT32 TSR,TER ; 00212 Curve *IDL,*IDR ; 00213 } ; 00214 00215 struct LineStrip { 00216 Strip *FSLK ; // [L]in[K] to next strip, [F]orward sorted by [S]tart value. 00217 Strip *RELK ; // [L]in[K] to next strip, [R]everse sorted by [E]nd value. 00218 INT32 YS,YE ; 00219 Strip *FELK ; // [L]in[K] to next strip, [F]orward sorted by [E]nd value. 00220 Strip *RSLK ; // [L]in[K] to next strip, [R]everse sorted by [S]tart value. 00221 INT32 XS,XE ; 00222 union { 00223 double DX ; 00224 __int64 FG ; 00225 } ; 00226 UINT32 TS,TE ; 00227 Curve *ID ; 00228 } ; 00229 00231 00232 inline bool IsMove ( CONST BYTE Type ) { return (Type & PT_MOVETO)==PT_MOVETO ; } 00233 inline bool IsLine ( CONST BYTE Type ) { return (Type & PT_MOVETO)==PT_LINETO ; } 00234 inline bool IsCurve( CONST BYTE Type ) { return (Type & PT_MOVETO)==PT_BEZIERTO ; } 00235 00236 inline bool IsntMove ( CONST BYTE Type ) { return (Type & PT_MOVETO)!=PT_MOVETO ; } 00237 inline bool IsntLine ( CONST BYTE Type ) { return (Type & PT_MOVETO)!=PT_LINETO ; } 00238 inline bool IsntCurve( CONST BYTE Type ) { return (Type & PT_MOVETO)!=PT_BEZIERTO ; } 00239 00241 00242 #pragma warning( disable : 4800 ) 00243 00244 inline bool IsSourceWinding( UINT32 Flags ) { return Flags & CLIPPING_SOURCE_WINDING ; } 00245 inline bool IsClipWinding ( UINT32 Flags ) { return Flags & CLIPPING_CLIP_WINDING ; } 00246 inline bool IsPathStroked ( UINT32 Flags ) { return Flags & CLIPPING_IS_STROKED ; } 00247 inline bool IsPathClosed ( UINT32 Flags ) { return Flags & CLIPPING_IS_CLOSED ; } 00248 00249 #pragma warning( default : 4800 ) 00250 00252 00253 inline UINT32 LO( CONST UINT32 l ) { return l & 0x0000ffff ; } 00254 inline UINT32 HI( CONST UINT32 l ) { return l & 0xffff0000 ; } 00255