1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_basegfx.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #include <basegfx/matrix/b2dhommatrixtools.hxx> 32*cdf0e10cSrcweir #include <rtl/ustring.hxx> 33*cdf0e10cSrcweir #include <rtl/ustrbuf.hxx> 34*cdf0e10cSrcweir 35*cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////////////// 36*cdf0e10cSrcweir 37*cdf0e10cSrcweir namespace basegfx 38*cdf0e10cSrcweir { 39*cdf0e10cSrcweir ::rtl::OUString exportToSvg( const B2DHomMatrix& rMatrix ) 40*cdf0e10cSrcweir { 41*cdf0e10cSrcweir rtl::OUStringBuffer aStrBuf; 42*cdf0e10cSrcweir aStrBuf.appendAscii("matrix("); 43*cdf0e10cSrcweir 44*cdf0e10cSrcweir aStrBuf.append(rMatrix.get(0,0)); 45*cdf0e10cSrcweir aStrBuf.appendAscii(", "); 46*cdf0e10cSrcweir 47*cdf0e10cSrcweir aStrBuf.append(rMatrix.get(1,0)); 48*cdf0e10cSrcweir aStrBuf.appendAscii(", "); 49*cdf0e10cSrcweir 50*cdf0e10cSrcweir aStrBuf.append(rMatrix.get(0,1)); 51*cdf0e10cSrcweir aStrBuf.appendAscii(", "); 52*cdf0e10cSrcweir 53*cdf0e10cSrcweir aStrBuf.append(rMatrix.get(1,1)); 54*cdf0e10cSrcweir aStrBuf.appendAscii(", "); 55*cdf0e10cSrcweir 56*cdf0e10cSrcweir aStrBuf.append(rMatrix.get(0,2)); 57*cdf0e10cSrcweir aStrBuf.appendAscii(", "); 58*cdf0e10cSrcweir 59*cdf0e10cSrcweir aStrBuf.append(rMatrix.get(1,2)); 60*cdf0e10cSrcweir aStrBuf.appendAscii(")"); 61*cdf0e10cSrcweir 62*cdf0e10cSrcweir return aStrBuf.makeStringAndClear(); 63*cdf0e10cSrcweir } 64*cdf0e10cSrcweir 65*cdf0e10cSrcweir namespace tools 66*cdf0e10cSrcweir { 67*cdf0e10cSrcweir void createSinCosOrthogonal(double& o_rSin, double& o_rCos, double fRadiant) 68*cdf0e10cSrcweir { 69*cdf0e10cSrcweir if( fTools::equalZero( fmod( fRadiant, F_PI2 ) ) ) 70*cdf0e10cSrcweir { 71*cdf0e10cSrcweir // determine quadrant 72*cdf0e10cSrcweir const sal_Int32 nQuad( 73*cdf0e10cSrcweir (4 + fround( 4/F_2PI*fmod( fRadiant, F_2PI ) )) % 4 ); 74*cdf0e10cSrcweir switch( nQuad ) 75*cdf0e10cSrcweir { 76*cdf0e10cSrcweir case 0: // -2pi,0,2pi 77*cdf0e10cSrcweir o_rSin = 0.0; 78*cdf0e10cSrcweir o_rCos = 1.0; 79*cdf0e10cSrcweir break; 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir case 1: // -3/2pi,1/2pi 82*cdf0e10cSrcweir o_rSin = 1.0; 83*cdf0e10cSrcweir o_rCos = 0.0; 84*cdf0e10cSrcweir break; 85*cdf0e10cSrcweir 86*cdf0e10cSrcweir case 2: // -pi,pi 87*cdf0e10cSrcweir o_rSin = 0.0; 88*cdf0e10cSrcweir o_rCos = -1.0; 89*cdf0e10cSrcweir break; 90*cdf0e10cSrcweir 91*cdf0e10cSrcweir case 3: // -1/2pi,3/2pi 92*cdf0e10cSrcweir o_rSin = -1.0; 93*cdf0e10cSrcweir o_rCos = 0.0; 94*cdf0e10cSrcweir break; 95*cdf0e10cSrcweir 96*cdf0e10cSrcweir default: 97*cdf0e10cSrcweir OSL_ENSURE( false, "createSinCos: Impossible case reached" ); 98*cdf0e10cSrcweir } 99*cdf0e10cSrcweir } 100*cdf0e10cSrcweir else 101*cdf0e10cSrcweir { 102*cdf0e10cSrcweir // TODO(P1): Maybe use glibc's sincos here (though 103*cdf0e10cSrcweir // that's kinda non-portable...) 104*cdf0e10cSrcweir o_rSin = sin(fRadiant); 105*cdf0e10cSrcweir o_rCos = cos(fRadiant); 106*cdf0e10cSrcweir } 107*cdf0e10cSrcweir } 108*cdf0e10cSrcweir 109*cdf0e10cSrcweir B2DHomMatrix createScaleB2DHomMatrix(double fScaleX, double fScaleY) 110*cdf0e10cSrcweir { 111*cdf0e10cSrcweir B2DHomMatrix aRetval; 112*cdf0e10cSrcweir const double fOne(1.0); 113*cdf0e10cSrcweir 114*cdf0e10cSrcweir if(!fTools::equal(fScaleX, fOne)) 115*cdf0e10cSrcweir { 116*cdf0e10cSrcweir aRetval.set(0, 0, fScaleX); 117*cdf0e10cSrcweir } 118*cdf0e10cSrcweir 119*cdf0e10cSrcweir if(!fTools::equal(fScaleY, fOne)) 120*cdf0e10cSrcweir { 121*cdf0e10cSrcweir aRetval.set(1, 1, fScaleY); 122*cdf0e10cSrcweir } 123*cdf0e10cSrcweir 124*cdf0e10cSrcweir return aRetval; 125*cdf0e10cSrcweir } 126*cdf0e10cSrcweir 127*cdf0e10cSrcweir B2DHomMatrix createShearXB2DHomMatrix(double fShearX) 128*cdf0e10cSrcweir { 129*cdf0e10cSrcweir B2DHomMatrix aRetval; 130*cdf0e10cSrcweir 131*cdf0e10cSrcweir if(!fTools::equalZero(fShearX)) 132*cdf0e10cSrcweir { 133*cdf0e10cSrcweir aRetval.set(0, 1, fShearX); 134*cdf0e10cSrcweir } 135*cdf0e10cSrcweir 136*cdf0e10cSrcweir return aRetval; 137*cdf0e10cSrcweir } 138*cdf0e10cSrcweir 139*cdf0e10cSrcweir B2DHomMatrix createShearYB2DHomMatrix(double fShearY) 140*cdf0e10cSrcweir { 141*cdf0e10cSrcweir B2DHomMatrix aRetval; 142*cdf0e10cSrcweir 143*cdf0e10cSrcweir if(!fTools::equalZero(fShearY)) 144*cdf0e10cSrcweir { 145*cdf0e10cSrcweir aRetval.set(1, 0, fShearY); 146*cdf0e10cSrcweir } 147*cdf0e10cSrcweir 148*cdf0e10cSrcweir return aRetval; 149*cdf0e10cSrcweir } 150*cdf0e10cSrcweir 151*cdf0e10cSrcweir B2DHomMatrix createRotateB2DHomMatrix(double fRadiant) 152*cdf0e10cSrcweir { 153*cdf0e10cSrcweir B2DHomMatrix aRetval; 154*cdf0e10cSrcweir 155*cdf0e10cSrcweir if(!fTools::equalZero(fRadiant)) 156*cdf0e10cSrcweir { 157*cdf0e10cSrcweir double fSin(0.0); 158*cdf0e10cSrcweir double fCos(1.0); 159*cdf0e10cSrcweir 160*cdf0e10cSrcweir createSinCosOrthogonal(fSin, fCos, fRadiant); 161*cdf0e10cSrcweir aRetval.set(0, 0, fCos); 162*cdf0e10cSrcweir aRetval.set(1, 1, fCos); 163*cdf0e10cSrcweir aRetval.set(1, 0, fSin); 164*cdf0e10cSrcweir aRetval.set(0, 1, -fSin); 165*cdf0e10cSrcweir } 166*cdf0e10cSrcweir 167*cdf0e10cSrcweir return aRetval; 168*cdf0e10cSrcweir } 169*cdf0e10cSrcweir 170*cdf0e10cSrcweir B2DHomMatrix createTranslateB2DHomMatrix(double fTranslateX, double fTranslateY) 171*cdf0e10cSrcweir { 172*cdf0e10cSrcweir B2DHomMatrix aRetval; 173*cdf0e10cSrcweir 174*cdf0e10cSrcweir if(!(fTools::equalZero(fTranslateX) && fTools::equalZero(fTranslateY))) 175*cdf0e10cSrcweir { 176*cdf0e10cSrcweir aRetval.set(0, 2, fTranslateX); 177*cdf0e10cSrcweir aRetval.set(1, 2, fTranslateY); 178*cdf0e10cSrcweir } 179*cdf0e10cSrcweir 180*cdf0e10cSrcweir return aRetval; 181*cdf0e10cSrcweir } 182*cdf0e10cSrcweir 183*cdf0e10cSrcweir B2DHomMatrix createScaleShearXRotateTranslateB2DHomMatrix( 184*cdf0e10cSrcweir double fScaleX, double fScaleY, 185*cdf0e10cSrcweir double fShearX, 186*cdf0e10cSrcweir double fRadiant, 187*cdf0e10cSrcweir double fTranslateX, double fTranslateY) 188*cdf0e10cSrcweir { 189*cdf0e10cSrcweir const double fOne(1.0); 190*cdf0e10cSrcweir 191*cdf0e10cSrcweir if(fTools::equal(fScaleX, fOne) && fTools::equal(fScaleY, fOne)) 192*cdf0e10cSrcweir { 193*cdf0e10cSrcweir /// no scale, take shortcut 194*cdf0e10cSrcweir return createShearXRotateTranslateB2DHomMatrix(fShearX, fRadiant, fTranslateX, fTranslateY); 195*cdf0e10cSrcweir } 196*cdf0e10cSrcweir else 197*cdf0e10cSrcweir { 198*cdf0e10cSrcweir /// scale used 199*cdf0e10cSrcweir if(fTools::equalZero(fShearX)) 200*cdf0e10cSrcweir { 201*cdf0e10cSrcweir /// no shear 202*cdf0e10cSrcweir if(fTools::equalZero(fRadiant)) 203*cdf0e10cSrcweir { 204*cdf0e10cSrcweir /// no rotate, take shortcut 205*cdf0e10cSrcweir return createScaleTranslateB2DHomMatrix(fScaleX, fScaleY, fTranslateX, fTranslateY); 206*cdf0e10cSrcweir } 207*cdf0e10cSrcweir else 208*cdf0e10cSrcweir { 209*cdf0e10cSrcweir /// rotate and scale used, no shear 210*cdf0e10cSrcweir double fSin(0.0); 211*cdf0e10cSrcweir double fCos(1.0); 212*cdf0e10cSrcweir 213*cdf0e10cSrcweir createSinCosOrthogonal(fSin, fCos, fRadiant); 214*cdf0e10cSrcweir 215*cdf0e10cSrcweir B2DHomMatrix aRetval( 216*cdf0e10cSrcweir /* Row 0, Column 0 */ fCos * fScaleX, 217*cdf0e10cSrcweir /* Row 0, Column 1 */ fScaleY * -fSin, 218*cdf0e10cSrcweir /* Row 0, Column 2 */ fTranslateX, 219*cdf0e10cSrcweir /* Row 1, Column 0 */ fSin * fScaleX, 220*cdf0e10cSrcweir /* Row 1, Column 1 */ fScaleY * fCos, 221*cdf0e10cSrcweir /* Row 1, Column 2 */ fTranslateY); 222*cdf0e10cSrcweir 223*cdf0e10cSrcweir return aRetval; 224*cdf0e10cSrcweir } 225*cdf0e10cSrcweir } 226*cdf0e10cSrcweir else 227*cdf0e10cSrcweir { 228*cdf0e10cSrcweir /// scale and shear used 229*cdf0e10cSrcweir if(fTools::equalZero(fRadiant)) 230*cdf0e10cSrcweir { 231*cdf0e10cSrcweir /// scale and shear, but no rotate 232*cdf0e10cSrcweir B2DHomMatrix aRetval( 233*cdf0e10cSrcweir /* Row 0, Column 0 */ fScaleX, 234*cdf0e10cSrcweir /* Row 0, Column 1 */ fScaleY * fShearX, 235*cdf0e10cSrcweir /* Row 0, Column 2 */ fTranslateX, 236*cdf0e10cSrcweir /* Row 1, Column 0 */ 0.0, 237*cdf0e10cSrcweir /* Row 1, Column 1 */ fScaleY, 238*cdf0e10cSrcweir /* Row 1, Column 2 */ fTranslateY); 239*cdf0e10cSrcweir 240*cdf0e10cSrcweir return aRetval; 241*cdf0e10cSrcweir } 242*cdf0e10cSrcweir else 243*cdf0e10cSrcweir { 244*cdf0e10cSrcweir /// scale, shear and rotate used 245*cdf0e10cSrcweir double fSin(0.0); 246*cdf0e10cSrcweir double fCos(1.0); 247*cdf0e10cSrcweir 248*cdf0e10cSrcweir createSinCosOrthogonal(fSin, fCos, fRadiant); 249*cdf0e10cSrcweir 250*cdf0e10cSrcweir B2DHomMatrix aRetval( 251*cdf0e10cSrcweir /* Row 0, Column 0 */ fCos * fScaleX, 252*cdf0e10cSrcweir /* Row 0, Column 1 */ fScaleY * ((fCos * fShearX) - fSin), 253*cdf0e10cSrcweir /* Row 0, Column 2 */ fTranslateX, 254*cdf0e10cSrcweir /* Row 1, Column 0 */ fSin * fScaleX, 255*cdf0e10cSrcweir /* Row 1, Column 1 */ fScaleY * ((fSin * fShearX) + fCos), 256*cdf0e10cSrcweir /* Row 1, Column 2 */ fTranslateY); 257*cdf0e10cSrcweir 258*cdf0e10cSrcweir return aRetval; 259*cdf0e10cSrcweir } 260*cdf0e10cSrcweir } 261*cdf0e10cSrcweir } 262*cdf0e10cSrcweir } 263*cdf0e10cSrcweir 264*cdf0e10cSrcweir B2DHomMatrix createShearXRotateTranslateB2DHomMatrix( 265*cdf0e10cSrcweir double fShearX, 266*cdf0e10cSrcweir double fRadiant, 267*cdf0e10cSrcweir double fTranslateX, double fTranslateY) 268*cdf0e10cSrcweir { 269*cdf0e10cSrcweir if(fTools::equalZero(fShearX)) 270*cdf0e10cSrcweir { 271*cdf0e10cSrcweir /// no shear 272*cdf0e10cSrcweir if(fTools::equalZero(fRadiant)) 273*cdf0e10cSrcweir { 274*cdf0e10cSrcweir /// no shear, no rotate, take shortcut 275*cdf0e10cSrcweir return createTranslateB2DHomMatrix(fTranslateX, fTranslateY); 276*cdf0e10cSrcweir } 277*cdf0e10cSrcweir else 278*cdf0e10cSrcweir { 279*cdf0e10cSrcweir /// no shear, but rotate used 280*cdf0e10cSrcweir double fSin(0.0); 281*cdf0e10cSrcweir double fCos(1.0); 282*cdf0e10cSrcweir 283*cdf0e10cSrcweir createSinCosOrthogonal(fSin, fCos, fRadiant); 284*cdf0e10cSrcweir 285*cdf0e10cSrcweir B2DHomMatrix aRetval( 286*cdf0e10cSrcweir /* Row 0, Column 0 */ fCos, 287*cdf0e10cSrcweir /* Row 0, Column 1 */ -fSin, 288*cdf0e10cSrcweir /* Row 0, Column 2 */ fTranslateX, 289*cdf0e10cSrcweir /* Row 1, Column 0 */ fSin, 290*cdf0e10cSrcweir /* Row 1, Column 1 */ fCos, 291*cdf0e10cSrcweir /* Row 1, Column 2 */ fTranslateY); 292*cdf0e10cSrcweir 293*cdf0e10cSrcweir return aRetval; 294*cdf0e10cSrcweir } 295*cdf0e10cSrcweir } 296*cdf0e10cSrcweir else 297*cdf0e10cSrcweir { 298*cdf0e10cSrcweir /// shear used 299*cdf0e10cSrcweir if(fTools::equalZero(fRadiant)) 300*cdf0e10cSrcweir { 301*cdf0e10cSrcweir /// no rotate, but shear used 302*cdf0e10cSrcweir B2DHomMatrix aRetval( 303*cdf0e10cSrcweir /* Row 0, Column 0 */ 1.0, 304*cdf0e10cSrcweir /* Row 0, Column 1 */ fShearX, 305*cdf0e10cSrcweir /* Row 0, Column 2 */ fTranslateX, 306*cdf0e10cSrcweir /* Row 1, Column 0 */ 0.0, 307*cdf0e10cSrcweir /* Row 1, Column 1 */ 1.0, 308*cdf0e10cSrcweir /* Row 1, Column 2 */ fTranslateY); 309*cdf0e10cSrcweir 310*cdf0e10cSrcweir return aRetval; 311*cdf0e10cSrcweir } 312*cdf0e10cSrcweir else 313*cdf0e10cSrcweir { 314*cdf0e10cSrcweir /// shear and rotate used 315*cdf0e10cSrcweir double fSin(0.0); 316*cdf0e10cSrcweir double fCos(1.0); 317*cdf0e10cSrcweir 318*cdf0e10cSrcweir createSinCosOrthogonal(fSin, fCos, fRadiant); 319*cdf0e10cSrcweir 320*cdf0e10cSrcweir B2DHomMatrix aRetval( 321*cdf0e10cSrcweir /* Row 0, Column 0 */ fCos, 322*cdf0e10cSrcweir /* Row 0, Column 1 */ (fCos * fShearX) - fSin, 323*cdf0e10cSrcweir /* Row 0, Column 2 */ fTranslateX, 324*cdf0e10cSrcweir /* Row 1, Column 0 */ fSin, 325*cdf0e10cSrcweir /* Row 1, Column 1 */ (fSin * fShearX) + fCos, 326*cdf0e10cSrcweir /* Row 1, Column 2 */ fTranslateY); 327*cdf0e10cSrcweir 328*cdf0e10cSrcweir return aRetval; 329*cdf0e10cSrcweir } 330*cdf0e10cSrcweir } 331*cdf0e10cSrcweir } 332*cdf0e10cSrcweir 333*cdf0e10cSrcweir B2DHomMatrix createScaleTranslateB2DHomMatrix( 334*cdf0e10cSrcweir double fScaleX, double fScaleY, 335*cdf0e10cSrcweir double fTranslateX, double fTranslateY) 336*cdf0e10cSrcweir { 337*cdf0e10cSrcweir const double fOne(1.0); 338*cdf0e10cSrcweir 339*cdf0e10cSrcweir if(fTools::equal(fScaleX, fOne) && fTools::equal(fScaleY, fOne)) 340*cdf0e10cSrcweir { 341*cdf0e10cSrcweir /// no scale, take shortcut 342*cdf0e10cSrcweir return createTranslateB2DHomMatrix(fTranslateX, fTranslateY); 343*cdf0e10cSrcweir } 344*cdf0e10cSrcweir else 345*cdf0e10cSrcweir { 346*cdf0e10cSrcweir /// scale used 347*cdf0e10cSrcweir if(fTools::equalZero(fTranslateX) && fTools::equalZero(fTranslateY)) 348*cdf0e10cSrcweir { 349*cdf0e10cSrcweir /// no translate, but scale. 350*cdf0e10cSrcweir B2DHomMatrix aRetval; 351*cdf0e10cSrcweir 352*cdf0e10cSrcweir aRetval.set(0, 0, fScaleX); 353*cdf0e10cSrcweir aRetval.set(1, 1, fScaleY); 354*cdf0e10cSrcweir 355*cdf0e10cSrcweir return aRetval; 356*cdf0e10cSrcweir } 357*cdf0e10cSrcweir else 358*cdf0e10cSrcweir { 359*cdf0e10cSrcweir /// translate and scale 360*cdf0e10cSrcweir B2DHomMatrix aRetval( 361*cdf0e10cSrcweir /* Row 0, Column 0 */ fScaleX, 362*cdf0e10cSrcweir /* Row 0, Column 1 */ 0.0, 363*cdf0e10cSrcweir /* Row 0, Column 2 */ fTranslateX, 364*cdf0e10cSrcweir /* Row 1, Column 0 */ 0.0, 365*cdf0e10cSrcweir /* Row 1, Column 1 */ fScaleY, 366*cdf0e10cSrcweir /* Row 1, Column 2 */ fTranslateY); 367*cdf0e10cSrcweir 368*cdf0e10cSrcweir return aRetval; 369*cdf0e10cSrcweir } 370*cdf0e10cSrcweir } 371*cdf0e10cSrcweir } 372*cdf0e10cSrcweir 373*cdf0e10cSrcweir B2DHomMatrix createRotateAroundPoint( 374*cdf0e10cSrcweir double fPointX, double fPointY, 375*cdf0e10cSrcweir double fRadiant) 376*cdf0e10cSrcweir { 377*cdf0e10cSrcweir B2DHomMatrix aRetval; 378*cdf0e10cSrcweir 379*cdf0e10cSrcweir if(!fTools::equalZero(fRadiant)) 380*cdf0e10cSrcweir { 381*cdf0e10cSrcweir double fSin(0.0); 382*cdf0e10cSrcweir double fCos(1.0); 383*cdf0e10cSrcweir 384*cdf0e10cSrcweir createSinCosOrthogonal(fSin, fCos, fRadiant); 385*cdf0e10cSrcweir 386*cdf0e10cSrcweir aRetval.set3x2( 387*cdf0e10cSrcweir /* Row 0, Column 0 */ fCos, 388*cdf0e10cSrcweir /* Row 0, Column 1 */ -fSin, 389*cdf0e10cSrcweir /* Row 0, Column 2 */ (fPointX * (1.0 - fCos)) + (fSin * fPointY), 390*cdf0e10cSrcweir /* Row 1, Column 0 */ fSin, 391*cdf0e10cSrcweir /* Row 1, Column 1 */ fCos, 392*cdf0e10cSrcweir /* Row 1, Column 2 */ (fPointY * (1.0 - fCos)) - (fSin * fPointX)); 393*cdf0e10cSrcweir } 394*cdf0e10cSrcweir 395*cdf0e10cSrcweir return aRetval; 396*cdf0e10cSrcweir } 397*cdf0e10cSrcweir } // end of namespace tools 398*cdf0e10cSrcweir } // end of namespace basegfx 399*cdf0e10cSrcweir 400*cdf0e10cSrcweir /////////////////////////////////////////////////////////////////////////////// 401*cdf0e10cSrcweir // eof 402