/************************************************************************* * * $RCSfile: debugplotter.cxx,v $ * * $Revision: 1.5 $ * * last change: $Author: obo $ $Date: 2007-07-18 11:07:51 $ * * The Contents of this file are made available subject to * the terms of GNU Lesser General Public License Version 2.1. * * * GNU Lesser General Public License Version 2.1 * ============================================= * Copyright 2005 by Sun Microsystems, Inc. * 901 San Antonio Road, Palo Alto, CA 94303, USA * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_basegfx.hxx" #ifndef _OSL_DIAGNOSE_H_ #include #endif #include #include #include namespace basegfx { namespace { void outputHeader( const ::rtl::OString& rTitle, ::std::ostream* pStm ) { // output gnuplot setup if( pStm ) { *pStm << "#!/usr/bin/gnuplot -persist" << ::std::endl << "#" << ::std::endl << "# automatically generated by basegfx, don't change!" << ::std::endl << "#" << ::std::endl << "# --- " << (const sal_Char*)rTitle << " ---" << ::std::endl << "#" << ::std::endl << "set parametric" << ::std::endl << "# set terminal postscript eps enhanced color " << ::std::endl << "# set output \"plot.eps\"" << ::std::endl << // This function plots a cubic bezier curve. P,q,r,s // are the control point elements of the corresponding // output coordinate component (i.e. x components for // the x plot, and y components for the y plot) "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 << // This function plots the derivative of a cubic // bezier curve. P,q,r,s are the control point // components of the _original_ curve "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 << // Plot a line's component of a line between a and b // (where a and b should be the corresponding // components of the line's start and end point, // respectively) "line(p,q,r) = p*(1-t)+q*t" << ::std::endl << // Plot a line's x component of a line in implicit // form ax + by + c = 0 "implicitLineX(a,b,c,t) = a*-c + t*-b" << ::std::endl << // Plot a line's y component of a line in implicit // form ax + by + c = 0 "implicitLineY(a,b,c,t) = b*-c + t*a" << ::std::endl << "pointmarkx(c,t) = c-0.03*t" << ::std::endl << // hack for displaying single points in parametric form "pointmarky(c,t) = c+0.03*t" << ::std::endl << // hack for displaying single points in parametric form "# end of setup" << ::std::endl; } else { OSL_TRACE( "#!/usr/bin/gnuplot -persist\n", "#\n", "# automatically generated by basegfx, don't change!\n", "#\n", "# --- %s ---\n", "#\n", "set parametric\n", // This function plots a cubic bezier curve. P,q,r,s // are the control point elements of the corresponding // output coordinate component (i.e. x components for // the x plot, and y components for the y plot) "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", // This function plots the derivative of a cubic // bezier curve. P,q,r,s are the control point // components of the _original_ curve "cubicBezDerivative(p,q,r,s,t) = 3*(q-p)*(1-t)**2+6*(r-q)*(1-t)*t+3*(s-r)*t**2\n", // Plot a line's component of a line between a and b // (where a and b should be the corresponding // components of the line's start and end point, // respectively) "line(p,q,r) = p*(1-t)+q*t\n", // Plot a line's x component of a line in implicit // form ax + by + c = 0 "implicitLineX(a,b,c,t) = a*-c + t*-b\n", // Plot a line's y component of a line in implicit // form ax + by + c = 0 "implicitLineY(a,b,c,t) = b*-c + t*a\n", "pointmarkx(c,t) = c-0.03*t\n", // hack for displaying single points in parametric form "pointmarky(c,t) = c+0.03*t\n", // hack for displaying single points in parametric form "# end of setup\n", (const sal_Char*)rTitle ); } } class Writer { public: Writer( ::std::ostream* pStm ) : mpStream( pStm ) { } void outputPoint( const ::std::pair< B2DPoint, ::rtl::OString >& rElem ) { if( mpStream ) *mpStream << " " << rElem.first.getX() << "\t" << rElem.first.getY() << ::std::endl; else OSL_TRACE( " %f\t%f\n", rElem.first.getX(), rElem.first.getY() ); } void outputVector( const ::std::pair< B2DVector, ::rtl::OString >& rElem ) { if( mpStream ) *mpStream << " " << rElem.first.getX() << "\t" << rElem.first.getY() << ::std::endl << ::std::endl; else OSL_TRACE( " %f\t%f\n\n", rElem.first.getX(), rElem.first.getY() ); } void outputRect( const ::std::pair< B2DRange, ::rtl::OString >& rElem ) { const double nX0( rElem.first.getMinX() ); const double nY0( rElem.first.getMinY() ); const double nX1( rElem.first.getMaxX() ); const double nY1( rElem.first.getMaxY() ); if( mpStream ) *mpStream << " " << nX0 << "\t" << nY0 << "\t" << nX1 << "\t" << nY0 << "\t" << nX1 << "\t" << nY1 << "\t" << nX0 << "\t" << nY1 << "\t" << nX0 << "\t" << nY0 << ::std::endl << ::std::endl; else OSL_TRACE( " %f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\n\n", nX0, nY0, nX1, nY0, nX1, nY1, nX0, nY1, nX0, nY0 ); } private: ::std::ostream* mpStream; }; } DebugPlotter::DebugPlotter( const sal_Char* pTitle ) : maTitle( pTitle ), maPoints(), maVectors(), maRanges(), maPolygons(), mpOutputStream(NULL) { } DebugPlotter::DebugPlotter( const sal_Char* pTitle, ::std::ostream& rOutputStream ) : maTitle( pTitle ), maPoints(), maVectors(), maRanges(), maPolygons(), mpOutputStream(&rOutputStream) { } DebugPlotter::~DebugPlotter() { const bool bHavePoints( !maPoints.empty() ); const bool bHaveVectors( !maVectors.empty() ); const bool bHaveRanges( !maRanges.empty() ); const bool bHavePolygons( !maPolygons.empty() ); if( bHavePoints || bHaveVectors || bHaveRanges || bHavePolygons ) { outputHeader( maTitle, mpOutputStream ); print( "\n\n# parametric primitive output\n" "plot [t=0:1] \\\n" ); // output plot declarations for used entities bool bNeedColon( false ); if( bHavePoints ) { print( " '-' using ($1):($2) title \"Points\" with points" ); bNeedColon = true; } if( bHaveVectors ) { if( bNeedColon ) print( ", \\\n" ); print( " '-' using ($1):($2) title \"Vectors\" with lp" ); bNeedColon = true; } if( bHaveRanges ) { if( bNeedColon ) print( ", \\\n" ); print( " '-' using ($1):($2) title \"Ranges\" with lines" ); bNeedColon = true; } if( bHavePolygons ) { const ::std::size_t nSize( maPolygons.size() ); for( ::std::size_t i=0; i