1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove 25*b1cdbd2cSJim Jagielski #include "precompiled_basegfx.hxx" 26*b1cdbd2cSJim Jagielski #include <osl/diagnose.h> 27*b1cdbd2cSJim Jagielski 28*b1cdbd2cSJim Jagielski #include <basegfx/curve/b2dcubicbezier.hxx> 29*b1cdbd2cSJim Jagielski 30*b1cdbd2cSJim Jagielski #include <basegfx/tools/debugplotter.hxx> 31*b1cdbd2cSJim Jagielski #include <boost/bind.hpp> 32*b1cdbd2cSJim Jagielski 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielski namespace basegfx 35*b1cdbd2cSJim Jagielski { 36*b1cdbd2cSJim Jagielski namespace 37*b1cdbd2cSJim Jagielski { outputHeader(const::rtl::OString & rTitle,::std::ostream * pStm)38*b1cdbd2cSJim Jagielski void outputHeader( const ::rtl::OString& rTitle, 39*b1cdbd2cSJim Jagielski ::std::ostream* pStm ) 40*b1cdbd2cSJim Jagielski { 41*b1cdbd2cSJim Jagielski // output gnuplot setup 42*b1cdbd2cSJim Jagielski if( pStm ) 43*b1cdbd2cSJim Jagielski { 44*b1cdbd2cSJim Jagielski *pStm << "#!/usr/bin/gnuplot -persist" << ::std::endl << 45*b1cdbd2cSJim Jagielski "#" << ::std::endl << 46*b1cdbd2cSJim Jagielski "# automatically generated by basegfx, don't change!" << ::std::endl << 47*b1cdbd2cSJim Jagielski "#" << ::std::endl << 48*b1cdbd2cSJim Jagielski "# --- " << rTitle.getStr() << " ---" << ::std::endl << 49*b1cdbd2cSJim Jagielski "#" << ::std::endl << 50*b1cdbd2cSJim Jagielski "set parametric" << ::std::endl << 51*b1cdbd2cSJim Jagielski "# set terminal postscript eps enhanced color " << ::std::endl << 52*b1cdbd2cSJim Jagielski "# set output \"plot.eps\"" << ::std::endl << 53*b1cdbd2cSJim Jagielski // This function plots a cubic bezier curve. P,q,r,s 54*b1cdbd2cSJim Jagielski // are the control point elements of the corresponding 55*b1cdbd2cSJim Jagielski // output coordinate component (i.e. x components for 56*b1cdbd2cSJim Jagielski // the x plot, and y components for the y plot) 57*b1cdbd2cSJim Jagielski "cubicBezier(p,q,r,s,t) = p*(1-t)**3+q*3*(1-t)**2*t+r*3*(1-t)*t**2+s*t**3" << ::std::endl << 58*b1cdbd2cSJim Jagielski // This function plots the derivative of a cubic 59*b1cdbd2cSJim Jagielski // bezier curve. P,q,r,s are the control point 60*b1cdbd2cSJim Jagielski // components of the _original_ curve 61*b1cdbd2cSJim Jagielski "cubicBezDerivative(p,q,r,s,t) = 3*(q-p)*(1-t)**2+6*(r-q)*(1-t)*t+3*(s-r)*t**2" << ::std::endl << 62*b1cdbd2cSJim Jagielski // Plot a line's component of a line between a and b 63*b1cdbd2cSJim Jagielski // (where a and b should be the corresponding 64*b1cdbd2cSJim Jagielski // components of the line's start and end point, 65*b1cdbd2cSJim Jagielski // respectively) 66*b1cdbd2cSJim Jagielski "line(p,q,r) = p*(1-t)+q*t" << ::std::endl << 67*b1cdbd2cSJim Jagielski // Plot a line's x component of a line in implicit 68*b1cdbd2cSJim Jagielski // form ax + by + c = 0 69*b1cdbd2cSJim Jagielski "implicitLineX(a,b,c,t) = a*-c + t*-b" << ::std::endl << 70*b1cdbd2cSJim Jagielski // Plot a line's y component of a line in implicit 71*b1cdbd2cSJim Jagielski // form ax + by + c = 0 72*b1cdbd2cSJim Jagielski "implicitLineY(a,b,c,t) = b*-c + t*a" << ::std::endl << 73*b1cdbd2cSJim Jagielski "pointmarkx(c,t) = c-0.03*t" << ::std::endl << // hack for displaying single points in parametric form 74*b1cdbd2cSJim Jagielski "pointmarky(c,t) = c+0.03*t" << ::std::endl << // hack for displaying single points in parametric form 75*b1cdbd2cSJim Jagielski "# end of setup" << ::std::endl; 76*b1cdbd2cSJim Jagielski } 77*b1cdbd2cSJim Jagielski else 78*b1cdbd2cSJim Jagielski { 79*b1cdbd2cSJim Jagielski OSL_TRACE( "#!/usr/bin/gnuplot -persist\n", 80*b1cdbd2cSJim Jagielski "#\n", 81*b1cdbd2cSJim Jagielski "# automatically generated by basegfx, don't change!\n", 82*b1cdbd2cSJim Jagielski "#\n", 83*b1cdbd2cSJim Jagielski "# --- %s ---\n", 84*b1cdbd2cSJim Jagielski "#\n", 85*b1cdbd2cSJim Jagielski "set parametric\n", 86*b1cdbd2cSJim Jagielski // This function plots a cubic bezier curve. P,q,r,s 87*b1cdbd2cSJim Jagielski // are the control point elements of the corresponding 88*b1cdbd2cSJim Jagielski // output coordinate component (i.e. x components for 89*b1cdbd2cSJim Jagielski // the x plot, and y components for the y plot) 90*b1cdbd2cSJim Jagielski "cubicBezier(p,q,r,s,t) = p*(1-t)**3+q*3*(1-t)**2*t+r*3*(1-t)*t**2+s*t**3\n", 91*b1cdbd2cSJim Jagielski // This function plots the derivative of a cubic 92*b1cdbd2cSJim Jagielski // bezier curve. P,q,r,s are the control point 93*b1cdbd2cSJim Jagielski // components of the _original_ curve 94*b1cdbd2cSJim Jagielski "cubicBezDerivative(p,q,r,s,t) = 3*(q-p)*(1-t)**2+6*(r-q)*(1-t)*t+3*(s-r)*t**2\n", 95*b1cdbd2cSJim Jagielski // Plot a line's component of a line between a and b 96*b1cdbd2cSJim Jagielski // (where a and b should be the corresponding 97*b1cdbd2cSJim Jagielski // components of the line's start and end point, 98*b1cdbd2cSJim Jagielski // respectively) 99*b1cdbd2cSJim Jagielski "line(p,q,r) = p*(1-t)+q*t\n", 100*b1cdbd2cSJim Jagielski // Plot a line's x component of a line in implicit 101*b1cdbd2cSJim Jagielski // form ax + by + c = 0 102*b1cdbd2cSJim Jagielski "implicitLineX(a,b,c,t) = a*-c + t*-b\n", 103*b1cdbd2cSJim Jagielski // Plot a line's y component of a line in implicit 104*b1cdbd2cSJim Jagielski // form ax + by + c = 0 105*b1cdbd2cSJim Jagielski "implicitLineY(a,b,c,t) = b*-c + t*a\n", 106*b1cdbd2cSJim Jagielski "pointmarkx(c,t) = c-0.03*t\n", // hack for displaying single points in parametric form 107*b1cdbd2cSJim Jagielski "pointmarky(c,t) = c+0.03*t\n", // hack for displaying single points in parametric form 108*b1cdbd2cSJim Jagielski "# end of setup\n", 109*b1cdbd2cSJim Jagielski rTitle.getStr() ); 110*b1cdbd2cSJim Jagielski } 111*b1cdbd2cSJim Jagielski } 112*b1cdbd2cSJim Jagielski 113*b1cdbd2cSJim Jagielski class Writer 114*b1cdbd2cSJim Jagielski { 115*b1cdbd2cSJim Jagielski public: Writer(::std::ostream * pStm)116*b1cdbd2cSJim Jagielski Writer( ::std::ostream* pStm ) : 117*b1cdbd2cSJim Jagielski mpStream( pStm ) 118*b1cdbd2cSJim Jagielski { 119*b1cdbd2cSJim Jagielski } 120*b1cdbd2cSJim Jagielski outputPoint(const::std::pair<B2DPoint,::rtl::OString> & rElem)121*b1cdbd2cSJim Jagielski void outputPoint( const ::std::pair< B2DPoint, ::rtl::OString >& rElem ) 122*b1cdbd2cSJim Jagielski { 123*b1cdbd2cSJim Jagielski if( mpStream ) 124*b1cdbd2cSJim Jagielski *mpStream << " " << rElem.first.getX() << "\t" << rElem.first.getY() << ::std::endl; 125*b1cdbd2cSJim Jagielski else 126*b1cdbd2cSJim Jagielski OSL_TRACE( " %f\t%f\n", rElem.first.getX(), rElem.first.getY() ); 127*b1cdbd2cSJim Jagielski } 128*b1cdbd2cSJim Jagielski outputVector(const::std::pair<B2DVector,::rtl::OString> & rElem)129*b1cdbd2cSJim Jagielski void outputVector( const ::std::pair< B2DVector, ::rtl::OString >& rElem ) 130*b1cdbd2cSJim Jagielski { 131*b1cdbd2cSJim Jagielski if( mpStream ) 132*b1cdbd2cSJim Jagielski *mpStream << " " << rElem.first.getX() << "\t" << rElem.first.getY() << ::std::endl << ::std::endl; 133*b1cdbd2cSJim Jagielski else 134*b1cdbd2cSJim Jagielski OSL_TRACE( " %f\t%f\n\n", rElem.first.getX(), rElem.first.getY() ); 135*b1cdbd2cSJim Jagielski } 136*b1cdbd2cSJim Jagielski outputRect(const::std::pair<B2DRange,::rtl::OString> & rElem)137*b1cdbd2cSJim Jagielski void outputRect( const ::std::pair< B2DRange, ::rtl::OString >& rElem ) 138*b1cdbd2cSJim Jagielski { 139*b1cdbd2cSJim Jagielski const double nX0( rElem.first.getMinX() ); 140*b1cdbd2cSJim Jagielski const double nY0( rElem.first.getMinY() ); 141*b1cdbd2cSJim Jagielski const double nX1( rElem.first.getMaxX() ); 142*b1cdbd2cSJim Jagielski const double nY1( rElem.first.getMaxY() ); 143*b1cdbd2cSJim Jagielski 144*b1cdbd2cSJim Jagielski if( mpStream ) 145*b1cdbd2cSJim Jagielski *mpStream << " " 146*b1cdbd2cSJim Jagielski << nX0 << "\t" << nY0 << "\t" 147*b1cdbd2cSJim Jagielski << nX1 << "\t" << nY0 << "\t" 148*b1cdbd2cSJim Jagielski << nX1 << "\t" << nY1 << "\t" 149*b1cdbd2cSJim Jagielski << nX0 << "\t" << nY1 << "\t" 150*b1cdbd2cSJim Jagielski << nX0 << "\t" << nY0 << ::std::endl << ::std::endl; 151*b1cdbd2cSJim Jagielski 152*b1cdbd2cSJim Jagielski else 153*b1cdbd2cSJim Jagielski OSL_TRACE( " %f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\n\n", 154*b1cdbd2cSJim Jagielski nX0, nY0, 155*b1cdbd2cSJim Jagielski nX1, nY0, 156*b1cdbd2cSJim Jagielski nX1, nY1, 157*b1cdbd2cSJim Jagielski nX0, nY1, 158*b1cdbd2cSJim Jagielski nX0, nY0 ); 159*b1cdbd2cSJim Jagielski } 160*b1cdbd2cSJim Jagielski 161*b1cdbd2cSJim Jagielski private: 162*b1cdbd2cSJim Jagielski ::std::ostream* mpStream; 163*b1cdbd2cSJim Jagielski }; 164*b1cdbd2cSJim Jagielski } 165*b1cdbd2cSJim Jagielski DebugPlotter(const sal_Char * pTitle)166*b1cdbd2cSJim Jagielski DebugPlotter::DebugPlotter( const sal_Char* pTitle ) : 167*b1cdbd2cSJim Jagielski maTitle( pTitle ), 168*b1cdbd2cSJim Jagielski maPoints(), 169*b1cdbd2cSJim Jagielski maVectors(), 170*b1cdbd2cSJim Jagielski maRanges(), 171*b1cdbd2cSJim Jagielski maPolygons(), 172*b1cdbd2cSJim Jagielski mpOutputStream(NULL) 173*b1cdbd2cSJim Jagielski { 174*b1cdbd2cSJim Jagielski } 175*b1cdbd2cSJim Jagielski DebugPlotter(const sal_Char * pTitle,::std::ostream & rOutputStream)176*b1cdbd2cSJim Jagielski DebugPlotter::DebugPlotter( const sal_Char* pTitle, 177*b1cdbd2cSJim Jagielski ::std::ostream& rOutputStream ) : 178*b1cdbd2cSJim Jagielski maTitle( pTitle ), 179*b1cdbd2cSJim Jagielski maPoints(), 180*b1cdbd2cSJim Jagielski maVectors(), 181*b1cdbd2cSJim Jagielski maRanges(), 182*b1cdbd2cSJim Jagielski maPolygons(), 183*b1cdbd2cSJim Jagielski mpOutputStream(&rOutputStream) 184*b1cdbd2cSJim Jagielski { 185*b1cdbd2cSJim Jagielski } 186*b1cdbd2cSJim Jagielski ~DebugPlotter()187*b1cdbd2cSJim Jagielski DebugPlotter::~DebugPlotter() 188*b1cdbd2cSJim Jagielski { 189*b1cdbd2cSJim Jagielski const bool bHavePoints( !maPoints.empty() ); 190*b1cdbd2cSJim Jagielski const bool bHaveVectors( !maVectors.empty() ); 191*b1cdbd2cSJim Jagielski const bool bHaveRanges( !maRanges.empty() ); 192*b1cdbd2cSJim Jagielski const bool bHavePolygons( !maPolygons.empty() ); 193*b1cdbd2cSJim Jagielski 194*b1cdbd2cSJim Jagielski if( bHavePoints || 195*b1cdbd2cSJim Jagielski bHaveVectors || 196*b1cdbd2cSJim Jagielski bHaveRanges || 197*b1cdbd2cSJim Jagielski bHavePolygons ) 198*b1cdbd2cSJim Jagielski { 199*b1cdbd2cSJim Jagielski outputHeader( maTitle, mpOutputStream ); 200*b1cdbd2cSJim Jagielski 201*b1cdbd2cSJim Jagielski print( "\n\n# parametric primitive output\n" 202*b1cdbd2cSJim Jagielski "plot [t=0:1] \\\n" ); 203*b1cdbd2cSJim Jagielski 204*b1cdbd2cSJim Jagielski // output plot declarations for used entities 205*b1cdbd2cSJim Jagielski bool bNeedColon( false ); 206*b1cdbd2cSJim Jagielski if( bHavePoints ) 207*b1cdbd2cSJim Jagielski { 208*b1cdbd2cSJim Jagielski print( " '-' using ($1):($2) title \"Points\" with points" ); 209*b1cdbd2cSJim Jagielski bNeedColon = true; 210*b1cdbd2cSJim Jagielski } 211*b1cdbd2cSJim Jagielski if( bHaveVectors ) 212*b1cdbd2cSJim Jagielski { 213*b1cdbd2cSJim Jagielski if( bNeedColon ) 214*b1cdbd2cSJim Jagielski print( ", \\\n" ); 215*b1cdbd2cSJim Jagielski 216*b1cdbd2cSJim Jagielski print( " '-' using ($1):($2) title \"Vectors\" with lp" ); 217*b1cdbd2cSJim Jagielski bNeedColon = true; 218*b1cdbd2cSJim Jagielski } 219*b1cdbd2cSJim Jagielski if( bHaveRanges ) 220*b1cdbd2cSJim Jagielski { 221*b1cdbd2cSJim Jagielski if( bNeedColon ) 222*b1cdbd2cSJim Jagielski print( ", \\\n" ); 223*b1cdbd2cSJim Jagielski 224*b1cdbd2cSJim Jagielski print( " '-' using ($1):($2) title \"Ranges\" with lines" ); 225*b1cdbd2cSJim Jagielski bNeedColon = true; 226*b1cdbd2cSJim Jagielski } 227*b1cdbd2cSJim Jagielski if( bHavePolygons ) 228*b1cdbd2cSJim Jagielski { 229*b1cdbd2cSJim Jagielski const ::std::size_t nSize( maPolygons.size() ); 230*b1cdbd2cSJim Jagielski for( ::std::size_t i=0; i<nSize; ++i ) 231*b1cdbd2cSJim Jagielski { 232*b1cdbd2cSJim Jagielski if( maPolygons.at(i).first.areControlPointsUsed() ) 233*b1cdbd2cSJim Jagielski { 234*b1cdbd2cSJim Jagielski const B2DPolygon& rCurrPoly( maPolygons.at(i).first ); 235*b1cdbd2cSJim Jagielski 236*b1cdbd2cSJim Jagielski const sal_uInt32 nCount( rCurrPoly.count() ); 237*b1cdbd2cSJim Jagielski for( sal_uInt32 k=0; k<nCount; ++k ) 238*b1cdbd2cSJim Jagielski { 239*b1cdbd2cSJim Jagielski if( bNeedColon ) 240*b1cdbd2cSJim Jagielski print( ", \\\n" ); 241*b1cdbd2cSJim Jagielski 242*b1cdbd2cSJim Jagielski const B2DPoint& rP0( rCurrPoly.getB2DPoint(k) ); 243*b1cdbd2cSJim Jagielski const B2DPoint& rP1( rCurrPoly.getNextControlPoint(k) ); 244*b1cdbd2cSJim Jagielski const B2DPoint& rP2( rCurrPoly.getPrevControlPoint((k + 1) % nCount) ); 245*b1cdbd2cSJim Jagielski const B2DPoint& rP3( k+1<nCount ? rCurrPoly.getB2DPoint(k+1) : rCurrPoly.getB2DPoint(k) ); 246*b1cdbd2cSJim Jagielski 247*b1cdbd2cSJim Jagielski if( mpOutputStream ) 248*b1cdbd2cSJim Jagielski *mpOutputStream << " cubicBezier(" 249*b1cdbd2cSJim Jagielski << rP0.getX() << "," 250*b1cdbd2cSJim Jagielski << rP1.getX() << "," 251*b1cdbd2cSJim Jagielski << rP2.getX() << "," 252*b1cdbd2cSJim Jagielski << rP3.getX() << ",t), \\\n cubicBezier(" 253*b1cdbd2cSJim Jagielski << rP0.getY() << "," 254*b1cdbd2cSJim Jagielski << rP1.getY() << "," 255*b1cdbd2cSJim Jagielski << rP2.getY() << "," 256*b1cdbd2cSJim Jagielski << rP3.getY() << ",t)"; 257*b1cdbd2cSJim Jagielski else 258*b1cdbd2cSJim Jagielski OSL_TRACE( " cubicBezier(%f,%f,%f,%f,t), \\\n" 259*b1cdbd2cSJim Jagielski " cubicBezier(%f,%f,%f,%f,t)", 260*b1cdbd2cSJim Jagielski rP0.getX(), 261*b1cdbd2cSJim Jagielski rP1.getX(), 262*b1cdbd2cSJim Jagielski rP2.getX(), 263*b1cdbd2cSJim Jagielski rP3.getX(), 264*b1cdbd2cSJim Jagielski rP0.getY(), 265*b1cdbd2cSJim Jagielski rP1.getY(), 266*b1cdbd2cSJim Jagielski rP2.getY(), 267*b1cdbd2cSJim Jagielski rP3.getY() ); 268*b1cdbd2cSJim Jagielski 269*b1cdbd2cSJim Jagielski bNeedColon = true; 270*b1cdbd2cSJim Jagielski } 271*b1cdbd2cSJim Jagielski } 272*b1cdbd2cSJim Jagielski else 273*b1cdbd2cSJim Jagielski { 274*b1cdbd2cSJim Jagielski if( bNeedColon ) 275*b1cdbd2cSJim Jagielski print( ", \\\n" ); 276*b1cdbd2cSJim Jagielski 277*b1cdbd2cSJim Jagielski if( mpOutputStream ) 278*b1cdbd2cSJim Jagielski *mpOutputStream << " '-' using ($1):($2) title \"Polygon " 279*b1cdbd2cSJim Jagielski << maPolygons.at(i).second.getStr() << "\" with lp"; 280*b1cdbd2cSJim Jagielski else 281*b1cdbd2cSJim Jagielski OSL_TRACE( " '-' using ($1):($2) title \"Polygon %s\" with lp", 282*b1cdbd2cSJim Jagielski maPolygons.at(i).second.getStr() ); 283*b1cdbd2cSJim Jagielski 284*b1cdbd2cSJim Jagielski bNeedColon = true; 285*b1cdbd2cSJim Jagielski } 286*b1cdbd2cSJim Jagielski } 287*b1cdbd2cSJim Jagielski } 288*b1cdbd2cSJim Jagielski 289*b1cdbd2cSJim Jagielski if( bHavePoints ) 290*b1cdbd2cSJim Jagielski { 291*b1cdbd2cSJim Jagielski Writer aWriter( mpOutputStream ); 292*b1cdbd2cSJim Jagielski 293*b1cdbd2cSJim Jagielski ::std::for_each( maPoints.begin(), 294*b1cdbd2cSJim Jagielski maPoints.end(), 295*b1cdbd2cSJim Jagielski ::boost::bind( &Writer::outputPoint, 296*b1cdbd2cSJim Jagielski ::boost::ref( aWriter ), 297*b1cdbd2cSJim Jagielski _1 ) ); 298*b1cdbd2cSJim Jagielski print( "e\n" ); 299*b1cdbd2cSJim Jagielski } 300*b1cdbd2cSJim Jagielski 301*b1cdbd2cSJim Jagielski if( bHaveVectors ) 302*b1cdbd2cSJim Jagielski { 303*b1cdbd2cSJim Jagielski Writer aWriter( mpOutputStream ); 304*b1cdbd2cSJim Jagielski 305*b1cdbd2cSJim Jagielski ::std::for_each( maVectors.begin(), 306*b1cdbd2cSJim Jagielski maVectors.end(), 307*b1cdbd2cSJim Jagielski ::boost::bind( &Writer::outputVector, 308*b1cdbd2cSJim Jagielski ::boost::ref( aWriter ), 309*b1cdbd2cSJim Jagielski _1 ) ); 310*b1cdbd2cSJim Jagielski print( "e\n" ); 311*b1cdbd2cSJim Jagielski } 312*b1cdbd2cSJim Jagielski 313*b1cdbd2cSJim Jagielski if( bHaveRanges ) 314*b1cdbd2cSJim Jagielski { 315*b1cdbd2cSJim Jagielski Writer aWriter( mpOutputStream ); 316*b1cdbd2cSJim Jagielski 317*b1cdbd2cSJim Jagielski ::std::for_each( maRanges.begin(), 318*b1cdbd2cSJim Jagielski maRanges.end(), 319*b1cdbd2cSJim Jagielski ::boost::bind( &Writer::outputRect, 320*b1cdbd2cSJim Jagielski ::boost::ref( aWriter ), 321*b1cdbd2cSJim Jagielski _1 ) ); 322*b1cdbd2cSJim Jagielski print( "e\n" ); 323*b1cdbd2cSJim Jagielski } 324*b1cdbd2cSJim Jagielski 325*b1cdbd2cSJim Jagielski if( bHavePolygons ) 326*b1cdbd2cSJim Jagielski { 327*b1cdbd2cSJim Jagielski const ::std::size_t nSize( maPolygons.size() ); 328*b1cdbd2cSJim Jagielski for( ::std::size_t i=0; i<nSize; ++i ) 329*b1cdbd2cSJim Jagielski { 330*b1cdbd2cSJim Jagielski if( !maPolygons.at(i).first.areControlPointsUsed() ) 331*b1cdbd2cSJim Jagielski { 332*b1cdbd2cSJim Jagielski const B2DPolygon& rCurrPoly( maPolygons.at(i).first ); 333*b1cdbd2cSJim Jagielski 334*b1cdbd2cSJim Jagielski const sal_uInt32 nCount( rCurrPoly.count() ); 335*b1cdbd2cSJim Jagielski for( sal_uInt32 k=0; k<nCount; ++k ) 336*b1cdbd2cSJim Jagielski { 337*b1cdbd2cSJim Jagielski const B2DPoint& rP( rCurrPoly.getB2DPoint(k) ); 338*b1cdbd2cSJim Jagielski 339*b1cdbd2cSJim Jagielski if( mpOutputStream ) 340*b1cdbd2cSJim Jagielski *mpOutputStream << " " << rP.getX() << "," << rP.getY(); 341*b1cdbd2cSJim Jagielski else 342*b1cdbd2cSJim Jagielski OSL_TRACE( " %f,%f", 343*b1cdbd2cSJim Jagielski rP.getX(), 344*b1cdbd2cSJim Jagielski rP.getX() ); 345*b1cdbd2cSJim Jagielski } 346*b1cdbd2cSJim Jagielski 347*b1cdbd2cSJim Jagielski print( "\ne\n" ); 348*b1cdbd2cSJim Jagielski } 349*b1cdbd2cSJim Jagielski } 350*b1cdbd2cSJim Jagielski } 351*b1cdbd2cSJim Jagielski } 352*b1cdbd2cSJim Jagielski } 353*b1cdbd2cSJim Jagielski plot(const B2DPoint & rPoint,const sal_Char * pTitle)354*b1cdbd2cSJim Jagielski void DebugPlotter::plot( const B2DPoint& rPoint, 355*b1cdbd2cSJim Jagielski const sal_Char* pTitle ) 356*b1cdbd2cSJim Jagielski { 357*b1cdbd2cSJim Jagielski maPoints.push_back( ::std::make_pair( rPoint, 358*b1cdbd2cSJim Jagielski ::rtl::OString( pTitle ) ) ); 359*b1cdbd2cSJim Jagielski } 360*b1cdbd2cSJim Jagielski plot(const B2DVector & rVec,const sal_Char * pTitle)361*b1cdbd2cSJim Jagielski void DebugPlotter::plot( const B2DVector& rVec, 362*b1cdbd2cSJim Jagielski const sal_Char* pTitle ) 363*b1cdbd2cSJim Jagielski { 364*b1cdbd2cSJim Jagielski maVectors.push_back( ::std::make_pair( rVec, 365*b1cdbd2cSJim Jagielski ::rtl::OString( pTitle ) ) ); 366*b1cdbd2cSJim Jagielski } 367*b1cdbd2cSJim Jagielski plot(const B2DCubicBezier & rBezier,const sal_Char * pTitle)368*b1cdbd2cSJim Jagielski void DebugPlotter::plot( const B2DCubicBezier& rBezier, 369*b1cdbd2cSJim Jagielski const sal_Char* pTitle ) 370*b1cdbd2cSJim Jagielski { 371*b1cdbd2cSJim Jagielski B2DPolygon aPoly; 372*b1cdbd2cSJim Jagielski aPoly.append(rBezier.getStartPoint()); 373*b1cdbd2cSJim Jagielski aPoly.appendBezierSegment(rBezier.getControlPointA(), rBezier.getControlPointB(), rBezier.getEndPoint()); 374*b1cdbd2cSJim Jagielski maPolygons.push_back( ::std::make_pair( aPoly, 375*b1cdbd2cSJim Jagielski ::rtl::OString( pTitle ) ) ); 376*b1cdbd2cSJim Jagielski } 377*b1cdbd2cSJim Jagielski plot(const B2DRange & rRange,const sal_Char * pTitle)378*b1cdbd2cSJim Jagielski void DebugPlotter::plot( const B2DRange& rRange, 379*b1cdbd2cSJim Jagielski const sal_Char* pTitle ) 380*b1cdbd2cSJim Jagielski { 381*b1cdbd2cSJim Jagielski maRanges.push_back( ::std::make_pair( rRange, 382*b1cdbd2cSJim Jagielski ::rtl::OString( pTitle ) ) ); 383*b1cdbd2cSJim Jagielski } 384*b1cdbd2cSJim Jagielski plot(const B2DPolygon & rPoly,const sal_Char * pTitle)385*b1cdbd2cSJim Jagielski void DebugPlotter::plot( const B2DPolygon& rPoly, 386*b1cdbd2cSJim Jagielski const sal_Char* pTitle ) 387*b1cdbd2cSJim Jagielski { 388*b1cdbd2cSJim Jagielski maPolygons.push_back( ::std::make_pair( rPoly, 389*b1cdbd2cSJim Jagielski ::rtl::OString( pTitle ) ) ); 390*b1cdbd2cSJim Jagielski } 391*b1cdbd2cSJim Jagielski plot(const B2DPolyPolygon & rPoly,const sal_Char * pTitle)392*b1cdbd2cSJim Jagielski void DebugPlotter::plot( const B2DPolyPolygon& rPoly, 393*b1cdbd2cSJim Jagielski const sal_Char* pTitle ) 394*b1cdbd2cSJim Jagielski { 395*b1cdbd2cSJim Jagielski const ::rtl::OString aTitle( pTitle ); 396*b1cdbd2cSJim Jagielski const sal_uInt32 nCount( rPoly.count() ); 397*b1cdbd2cSJim Jagielski for( sal_uInt32 i=0; i<nCount; ++i ) 398*b1cdbd2cSJim Jagielski maPolygons.push_back( ::std::make_pair( rPoly.getB2DPolygon( i ), 399*b1cdbd2cSJim Jagielski aTitle ) ); 400*b1cdbd2cSJim Jagielski } 401*b1cdbd2cSJim Jagielski print(const sal_Char * pStr)402*b1cdbd2cSJim Jagielski void DebugPlotter::print( const sal_Char* pStr ) 403*b1cdbd2cSJim Jagielski { 404*b1cdbd2cSJim Jagielski if( mpOutputStream ) 405*b1cdbd2cSJim Jagielski *mpOutputStream << pStr; 406*b1cdbd2cSJim Jagielski else 407*b1cdbd2cSJim Jagielski OSL_TRACE( pStr ); 408*b1cdbd2cSJim Jagielski } 409*b1cdbd2cSJim Jagielski } 410