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