Toshihiro Shimizu 890ddd
#ifndef TSTROKE_H
Toshihiro Shimizu 890ddd
#define TSTROKE_H
Toshihiro Shimizu 890ddd
Shinya Kitaoka 262a92
#include <memory></memory>
Shinya Kitaoka 262a92
Toshihiro Shimizu 890ddd
#include "tsmartpointer.h"
Toshihiro Shimizu 890ddd
#include "tgeometry.h"
Toshihiro Shimizu 890ddd
#include "tthreadmessage.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <qmutex></qmutex>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#undef DVAPI
Toshihiro Shimizu 890ddd
#undef DVVAR
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef TVECTORIMAGE_EXPORTS
Toshihiro Shimizu 890ddd
#define DVAPI DV_EXPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_EXPORT_VAR
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#define DVAPI DV_IMPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_IMPORT_VAR
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Forward declarations
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TStrokeStyle;
Toshihiro Shimizu 890ddd
class TVectorRenderData;
Toshihiro Shimizu 890ddd
class TColorStyle;
Toshihiro Shimizu 890ddd
class TThickQuadratic;
Toshihiro Shimizu 890ddd
class TStrokeProp;
Toshihiro Shimizu 890ddd
class TSegment;
Toshihiro Shimizu 890ddd
class TFlash;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
//    TStroke class
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  This is the new release of TStroke (Version 4).
Toshihiro Shimizu 890ddd
  It's possible to use style to set brush, texture, pattern,
Toshihiro Shimizu 890ddd
  TStroke now are smart pointer.
Toshihiro Shimizu 890ddd
 */
Toshihiro Shimizu 890ddd
class DVAPI TStroke : public TSmartObject
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	DECLARE_CLASS_CODE
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	//! Pimpl of a TStroke
Toshihiro Shimizu 890ddd
	struct Imp;
Shinya Kitaoka 262a92
	std::unique_ptr<imp> m_imp;</imp>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	struct OutlineOptions;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	typedef BYTE TStrokeFlag;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	static const TStrokeFlag c_selected_flag;
Toshihiro Shimizu 890ddd
	static const TStrokeFlag c_changed_region_flag;
Toshihiro Shimizu 890ddd
	static const TStrokeFlag c_dirty_flag;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! to be erased
Toshihiro Shimizu 890ddd
	TStroke(const TStroke &stroke);
Toshihiro Shimizu 890ddd
	//! to be erased
Toshihiro Shimizu 890ddd
	TStroke &operator=(const TStroke &other);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Costructor
Toshihiro Shimizu 890ddd
	TStroke();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Build a stroke from an array of ThickPoint.
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
      TStroke constructor build a stroke from an array of control points.
Toshihiro Shimizu 890ddd
      If chunks are n control points are 2*n+1.
Toshihiro Shimizu 890ddd
      \note Common control points between two chunks are supposed not replicated.      
Toshihiro Shimizu 890ddd
     */
Toshihiro Shimizu 890ddd
	TStroke(const std::vector<tthickpoint> &);</tthickpoint>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Build a stroke from an array of TPointD
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
      TStroke constructor build a stroke from an array of control points.
Toshihiro Shimizu 890ddd
      If chunks are n control points are 2*n+1.
Toshihiro Shimizu 890ddd
      \note Common control points between two chunks are supposed not replicated,
Toshihiro Shimizu 890ddd
            and thickness is equal 0.
Toshihiro Shimizu 890ddd
     */
Toshihiro Shimizu 890ddd
	TStroke(const std::vector<tpointd> &v);</tpointd>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	~TStroke();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! mark invalid the length and the outline. The next computeOutlines() will update them
Toshihiro Shimizu 890ddd
	void invalidate();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! computes outlines (only if it's needed). call it before drawing.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*! 
Toshihiro Shimizu 890ddd
      \return false if the bbox doesn't contain the point
Toshihiro Shimizu 890ddd
      \par p is input point to test
Toshihiro Shimizu 890ddd
      \par outT is parameter of minimum
Toshihiro Shimizu 890ddd
      \par chunkIndex is chunk of stroke where is minimum
Toshihiro Shimizu 890ddd
      \par distance2 is square distance of minimum
Toshihiro Shimizu 890ddd
      \par checkBBox (default true) is a flag to check or not in bounding box
Toshihiro Shimizu 890ddd
     */
Toshihiro Shimizu 890ddd
	bool getNearestChunk(
Toshihiro Shimizu 890ddd
		const TPointD &p,
Toshihiro Shimizu 890ddd
		double &outT,
Toshihiro Shimizu 890ddd
		int &chunkIndex,
Toshihiro Shimizu 890ddd
		double &distance2,
Toshihiro Shimizu 890ddd
		bool checkBBox = true) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool getNearestW(
Toshihiro Shimizu 890ddd
		const TPointD &p,
Toshihiro Shimizu 890ddd
		double &outW,
Toshihiro Shimizu 890ddd
		double &distance2,
Toshihiro Shimizu 890ddd
		bool checkBBox = true) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*! 
Toshihiro Shimizu 890ddd
      \finds all points on stroke which are "enough" close to point p. return the number of such points.
Toshihiro Shimizu 890ddd
     */
Shinya Kitaoka 3bfa54
	int getNearChunks(const TThickPoint &p, std::vector<tthickpoint> &pointsOnStroke, bool checkBBox = true) const;</tthickpoint>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! \return number of chunks in the stroke
Toshihiro Shimizu 890ddd
	int getChunkCount() const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Return number of control points in a stroke
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
      Return number of control points in a stroke
Toshihiro Shimizu 890ddd
      \note the control point in common between adjacent chunks
Toshihiro Shimizu 890ddd
        is counted only once. e.g.: A n-chunk TStroke has n*2+1 CP
Toshihiro Shimizu 890ddd
     */
Toshihiro Shimizu 890ddd
	int getControlPointCount() const;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
	void getControlPoints(std::vector<tthickpoint> &v) const;</tthickpoint>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
       Return the n-th control point 
Toshihiro Shimizu 890ddd
       \note n is clamped to [0,ControlPointCount-1] interval
Toshihiro Shimizu 890ddd
       \par n index of desired control point
Toshihiro Shimizu 890ddd
    */
Toshihiro Shimizu 890ddd
	TThickPoint getControlPoint(int n) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
       Return control point nearest of parameter w.
Toshihiro Shimizu 890ddd
       \note w is clamped to [0,1] interval
Toshihiro Shimizu 890ddd
    */
Toshihiro Shimizu 890ddd
	TThickPoint getControlPointAtParameter(double w) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int getControlPointIndexAfterParameter(double w) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
      Set the position of n-th control point.
Toshihiro Shimizu 890ddd
      If "n" is not a valid position no points are changed
Toshihiro Shimizu 890ddd
      If the CP is shared between two chunks, then both chunks are modified 
Toshihiro Shimizu 890ddd
      The first method doesn't change the point thickness
Toshihiro Shimizu 890ddd
    */
Toshihiro Shimizu 890ddd
	void setControlPoint(int n, const TThickPoint &pos);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
      Set the position of n-th control point.
Toshihiro Shimizu 890ddd
      If "n" is not a valid position no points are changed
Toshihiro Shimizu 890ddd
      If the CP is shared between two chunks, then both chunks are modified 
Toshihiro Shimizu 890ddd
      The first method doesn't change the point thickness
Toshihiro Shimizu 890ddd
    */
Toshihiro Shimizu 890ddd
	void setControlPoint(int n, const TPointD &pos)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		setControlPoint(n, TThickPoint(pos, getControlPoint(n).thick));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Reshape stroke
Toshihiro Shimizu 890ddd
	void reshape(const TThickPoint pos[], int count);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*! 
Toshihiro Shimizu 890ddd
      Return chunk at position index
Toshihiro Shimizu 890ddd
      If index is not valid return NULL
Toshihiro Shimizu 890ddd
      \note it is used mainly for drawing
Toshihiro Shimizu 890ddd
     */
Toshihiro Shimizu 890ddd
	const TThickQuadratic *getChunk(int index) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Return the bbox of the stroke
Toshihiro Shimizu 890ddd
	TRectD getBBox(double w0 = 0.0, double w1 = 1.0) const;
Toshihiro Shimizu 890ddd
	void computeBBox();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Return the bbox of the stroke without thickness.
Toshihiro Shimizu 890ddd
	TRectD getCenterlineBBox() const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Returns the length of the stroke at passed chunk-param.
Toshihiro Shimizu 890ddd
	double getLength(int chunk, double t) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Return length of a stroke
Toshihiro Shimizu 890ddd
	double getLength(double w0, double w1) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Return length of a stroke
Toshihiro Shimizu 890ddd
	double getLength(double w1 = 1.0) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return getLength(0.0, w1);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Return approximate length of a stroke
Toshihiro Shimizu 890ddd
	double getApproximateLength(double w0, double w1, double error) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
      Add a control point (in fact delete one and add three) without changing the 
Toshihiro Shimizu 890ddd
      stroke shape.
Toshihiro Shimizu 890ddd
      s is the position of the new CP along the stroke itself. (0
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
      \note  if a control point already exists near s, then the stroke remains 
Toshihiro Shimizu 890ddd
      unchanged
Toshihiro Shimizu 890ddd
     */
Toshihiro Shimizu 890ddd
	void insertControlPointsAtLength(double s);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
      Add a control point (in fact delete one and add three) without changing the 
Toshihiro Shimizu 890ddd
      stroke shape.
Toshihiro Shimizu 890ddd
      w is the position of the new CP along parameter. (0
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
      \note if a control point already exists near w, then the stroke remains 
Toshihiro Shimizu 890ddd
      unchanged
Toshihiro Shimizu 890ddd
     */
Toshihiro Shimizu 890ddd
	void insertControlPoints(double w); // , minDistance2 = .1
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Reduce the number of control point according to \b maxError parameter
Toshihiro Shimizu 890ddd
	void reduceControlPoints(double maxError);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Reduce the number of control point according to \b maxError parameter.
Toshihiro Shimizu 890ddd
	//! The vector corners contain the corner of the stroke.
Shinya Kitaoka 3bfa54
	void reduceControlPoints(double maxError, std::vector<int> corners);</int>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
      Return a thickpoint at w (parameter (0<=w<=1))
Toshihiro Shimizu 890ddd
      \note w is 0 at begin of the stroke and is 1.0 at the end.
Toshihiro Shimizu 890ddd
          Parameter value for a chunk is stored in the vector
Toshihiro Shimizu 890ddd
          m_parameterValueAtChunk.
Toshihiro Shimizu 890ddd
          Every change (subdivision of a stroke, resample, insertion of a control point)
Toshihiro Shimizu 890ddd
          computes a new value for parameter.
Toshihiro Shimizu 890ddd
     */
Toshihiro Shimizu 890ddd
	TThickPoint getThickPoint(double w) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*! 
Toshihiro Shimizu 890ddd
      same that getThickPoint but return a TPointD
Toshihiro Shimizu 890ddd
     */
Toshihiro Shimizu 890ddd
	inline TPointD getPoint(double w) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return convert(getThickPoint(w));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
      Return a thickpoint at s (length of arc)
Toshihiro Shimizu 890ddd
     */
Toshihiro Shimizu 890ddd
	TThickPoint getThickPointAtLength(double s) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*! 
Toshihiro Shimizu 890ddd
      same that getThickPointAtLength but return a TPointD
Toshihiro Shimizu 890ddd
     */
Toshihiro Shimizu 890ddd
	inline TPointD getPointAtLength(double s) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return convert(getThickPointAtLength(s));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
      Return parameter in (based on arc length)
Toshihiro Shimizu 890ddd
     */
Toshihiro Shimizu 890ddd
	double getParameterAtLength(double s) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
      Return parameter for a control point
Toshihiro Shimizu 890ddd
      \note if control point is not on curve return middle value between
Toshihiro Shimizu 890ddd
            two adjacent control point
Toshihiro Shimizu 890ddd
     */
Toshihiro Shimizu 890ddd
	double getParameterAtControlPoint(int n) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Return the stroke leght at passed control point
Toshihiro Shimizu 890ddd
	double getLengthAtControlPoint(int) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Freeze parameter of a stroke in last valid status
Toshihiro Shimizu 890ddd
	void disableComputeOfCaches();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void enableComputeOfCaches();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Return parameter w at point position
Toshihiro Shimizu 890ddd
	double getW(const TPointD &) const;
Toshihiro Shimizu 890ddd
	double getW(int chunkIndex, double t) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Get speed at parameter w
Toshihiro Shimizu 890ddd
	// \note w is clamped to [0,1] parameter
Toshihiro Shimizu 890ddd
	//if the stroke has a cuspide on w, the tangents are two different;
Toshihiro Shimizu 890ddd
	//outSpeed = false return tangent in w-,
Toshihiro Shimizu 890ddd
	//outspeed = true returns tangent in w+
Toshihiro Shimizu 890ddd
	TPointD getSpeed(double w, bool outSpeed = false) const;
Toshihiro Shimizu 890ddd
	//! Returns true if speed1!=speed0, so it is an edge in w
Toshihiro Shimizu 890ddd
	bool getSpeedTwoValues(double w, TPointD &speed0, TPointD &speed1) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Get speed at length s
Toshihiro Shimizu 890ddd
	// \note s is clamped to [0,getLength] parameter
Toshihiro Shimizu 890ddd
	TPointD getSpeedAtLength(double s) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*! 
Toshihiro Shimizu 890ddd
      Split a stroke at parameter t 
Toshihiro Shimizu 890ddd
      \note Chunk of null length are removed.
Toshihiro Shimizu 890ddd
     */
Toshihiro Shimizu 890ddd
	void split(double w, TStroke &f, TStroke &s) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Swap the contents of two strokes
Toshihiro Shimizu 890ddd
	void swap(TStroke &ref);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//!Swapd the geometrical data of two strokes
Toshihiro Shimizu 890ddd
	void swapGeometry(TStroke &ref);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Transform a stroke using an affine
Toshihiro Shimizu 890ddd
	void transform(const TAffine &aff, bool doChangeThickness = false);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! \return Style
Toshihiro Shimizu 890ddd
	int getStyle() const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
       Set a style 
Toshihiro Shimizu 890ddd
       \note If the same style exists, it is replaced by new
Toshihiro Shimizu 890ddd
       \note TStroke becomes the owner of TStrokeStyle
Toshihiro Shimizu 890ddd
     */
Toshihiro Shimizu 890ddd
	void setStyle(int styleId);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Return a \b TStrokeProp
Toshihiro Shimizu 890ddd
	TStrokeProp *getProp(/*const TVectorPalette *palette*/) const;
Toshihiro Shimizu 890ddd
	//! Set \b TSrokePrope of a stroke
Toshihiro Shimizu 890ddd
	void setProp(TStrokeProp *prop);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// void deleteStyle(int);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Only for debug
Shinya Kitaoka 3bfa54
	void print(std::ostream &os = std::cout) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! change tangent versus in the stroke
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
      change tangent versus in a stroke
Toshihiro Shimizu 890ddd
      \note Change versus of all thickquadratric and change its postion in list            
Toshihiro Shimizu 890ddd
     */
Toshihiro Shimizu 890ddd
	TStroke &changeDirection();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Set \b TStrokeFlag of the stroke
Toshihiro Shimizu 890ddd
	void setFlag(TStrokeFlag flag, bool status);
Toshihiro Shimizu 890ddd
	//! Return \b TStrokeFlag of the stroke
Toshihiro Shimizu 890ddd
	bool getFlag(TStrokeFlag flag) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Gets the chunk and its parameter at stroke parameter \b w; returns true if a chunk was found.
Toshihiro Shimizu 890ddd
	bool getChunkAndT(double w, int &chunk, double &t) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Gets the chunk and its parameter at stroke length \b s; returns true if a chunk was found.
Toshihiro Shimizu 890ddd
	bool getChunkAndTAtLength(double s, int &chunk, double &t) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TThickPoint getCentroid() const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Set a loop stroke
Toshihiro Shimizu 890ddd
	void setSelfLoop(bool loop = true);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Return true if the stroke is looped
Toshihiro Shimizu 890ddd
	bool isSelfLoop() const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Return true if all control points have negative thickness
Toshihiro Shimizu 890ddd
	bool isCenterLine() const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Get a stroke from a \b TThickPoint vector
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
      Create a \b T3DPointD vector froma a \b TThickPoint vector. The \b T3DPointD vector is used to
Toshihiro Shimizu 890ddd
      find a \b TCubicStroke; than find the quadratic stroke.
Toshihiro Shimizu 890ddd
    */
Shinya Kitaoka 3bfa54
	static TStroke *interpolate(const std::vector<tthickpoint> &points, double error, bool findCorners = true);</tthickpoint>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Get a stroke from a \b TThickQuadratic vector
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
      Take from \b curves the control points used to create the stroke
Toshihiro Shimizu 890ddd
    */
Shinya Kitaoka 3bfa54
	static TStroke *create(const std::vector<tthickquadratic *=""> &curves);</tthickquadratic>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int getId() const;
Toshihiro Shimizu 890ddd
	void setId(int id);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Return the average value of stroke thickness
Toshihiro Shimizu 890ddd
	double getAverageThickness() const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double getMaxThickness();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Set the average value of stroke thickness to \b thickness
Toshihiro Shimizu 890ddd
	void setAverageThickness(double thickness);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool operator==(const TStroke &s) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool operator!=(const TStroke &s) const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return !operator==(s);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	OutlineOptions &outlineOptions();
Toshihiro Shimizu 890ddd
	const OutlineOptions &outlineOptions() const;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
typedef TSmartPointerT<tstroke> TStrokeP;</tstroke>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
//    TStrokeProp class
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TStrokeProp
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
protected:
Toshihiro Shimizu 890ddd
	const TStroke *m_stroke;
Toshihiro Shimizu 890ddd
	bool m_strokeChanged;
Toshihiro Shimizu 890ddd
	int m_styleVersionNumber;
Toshihiro Shimizu 890ddd
	TThread::Mutex m_mutex;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TStrokeProp(const TStroke *stroke);
Toshihiro Shimizu 890ddd
	virtual ~TStrokeProp() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	virtual TStrokeProp *clone(const TStroke *stroke) const = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TThread::Mutex *getMutex() { return &m_mutex; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	virtual void draw(const TVectorRenderData &rd) = 0;
Toshihiro Shimizu 890ddd
	virtual void draw(TFlash &flash) = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	virtual const TColorStyle *getColorStyle() const = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	const TStroke *getStroke() const { return m_stroke; }
Toshihiro Shimizu 890ddd
	virtual void notifyStrokeChange() { m_strokeChanged = true; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	// not implemented
Toshihiro Shimizu 890ddd
	TStrokeProp(const TStrokeProp &);
Toshihiro Shimizu 890ddd
	TStrokeProp &operator=(const TStrokeProp &);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	friend class TStroke;
Toshihiro Shimizu 890ddd
	void setStroke(const TStroke *stroke) { m_stroke = stroke; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
//    TStroke::OutlineOptions structure
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  Contains complementary stroke parameters used in the process of transforming
Toshihiro Shimizu 890ddd
  the raw (centerline) stroke data in its drawable (outline) form.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
struct DVAPI TStroke::OutlineOptions {
Toshihiro Shimizu 890ddd
	enum CapStyle { BUTT_CAP = 0,
Toshihiro Shimizu 890ddd
					ROUND_CAP,
Toshihiro Shimizu 890ddd
					PROJECTING_CAP };
Toshihiro Shimizu 890ddd
	enum JoinStyle { MITER_JOIN = 0,
Toshihiro Shimizu 890ddd
					 ROUND_JOIN,
Toshihiro Shimizu 890ddd
					 BEVEL_JOIN };
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	UCHAR m_capStyle;
Toshihiro Shimizu 890ddd
	UCHAR m_joinStyle;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double m_miterLower;
Toshihiro Shimizu 890ddd
	double m_miterUpper;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	OutlineOptions();
Toshihiro Shimizu 890ddd
	OutlineOptions(UCHAR capStyle, UCHAR JoinStyle, double lower, double upper);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
//    Related Non-member functions
Toshihiro Shimizu 890ddd
//***************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//! return the stroke equal to the join of stroke1 and stroke2 (that are not deleted)
Toshihiro Shimizu 890ddd
DVAPI TStroke *joinStrokes(const TStroke *stroke1, const TStroke *stroke2);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*! 
Toshihiro Shimizu 890ddd
  Intersection between stroke and segment.
Toshihiro Shimizu 890ddd
  \par stroke to intersect
Toshihiro Shimizu 890ddd
  \par segment to intersect
Toshihiro Shimizu 890ddd
  \ret a vector of pair of double (first value is stroke parameter second is segment parameter)
Toshihiro Shimizu 890ddd
 */
Toshihiro Shimizu 890ddd
DVAPI int intersect(const TStroke &stroke,
Toshihiro Shimizu 890ddd
					const TSegment &segment,
Toshihiro Shimizu 890ddd
					std::vector<doublepair> &intersections);</doublepair>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
DVAPI int intersect(const TSegment &segment,
Toshihiro Shimizu 890ddd
					const TStroke &stroke,
Toshihiro Shimizu 890ddd
					std::vector<doublepair> &intersections);</doublepair>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*! 
Toshihiro Shimizu 890ddd
  Intersection between stroke.
Toshihiro Shimizu 890ddd
  \par  first stroke
Toshihiro Shimizu 890ddd
  \par  second stroke 
Toshihiro Shimizu 890ddd
  \par  vector for intersection
Toshihiro Shimizu 890ddd
  \par  checkBBox (?) 
Toshihiro Shimizu 890ddd
  \ret number of intersections
Toshihiro Shimizu 890ddd
 */
Toshihiro Shimizu 890ddd
DVAPI int intersect(const TStroke *s1,
Toshihiro Shimizu 890ddd
					const TStroke *s2,
Toshihiro Shimizu 890ddd
					std::vector<doublepair> &intersections,</doublepair>
Toshihiro Shimizu 890ddd
					bool checkBBox = true);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
DVAPI int intersect(const TStroke &stroke,
Toshihiro Shimizu 890ddd
					const TPointD ¢er,
Toshihiro Shimizu 890ddd
					double radius,
Toshihiro Shimizu 890ddd
					std::vector<double> &intersections);</double>
Toshihiro Shimizu 890ddd
//======================================s=======================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
  To be replaced with new split
Toshihiro Shimizu 890ddd
  and a specialyzed function.
Toshihiro Shimizu 890ddd
 */
Toshihiro Shimizu 890ddd
DVAPI void splitStroke(const TStroke &tq,
Shinya Kitaoka 3bfa54
					   const std::vector<double> &pars,</double>
Toshihiro Shimizu 890ddd
					   std::vector<tstroke *=""> &v);</tstroke>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/* !puts in corners the indexes of quadric junctions of the stroke that create angles greater 
Toshihiro Shimizu 890ddd
than minDegree */
Toshihiro Shimizu 890ddd
DVAPI void detectCorners(const TStroke *stroke, double minDegree, std::vector<int> &corners);</int>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//! retrieve stroke parameter from chunk and chunk parameter
Toshihiro Shimizu 890ddd
inline double getWfromChunkAndT(const TStroke *ref, UINT chunkIndex, double t)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(ref);
Toshihiro Shimizu 890ddd
	assert(ref->getChunkCount());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return (chunkIndex + t) / ref->getChunkCount();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
DVAPI void computeQuadraticsFromCubic(const TThickPoint &p0,
Toshihiro Shimizu 890ddd
									  const TThickPoint &p1,
Toshihiro Shimizu 890ddd
									  const TThickPoint &p2,
Toshihiro Shimizu 890ddd
									  const TThickPoint &p3,
Toshihiro Shimizu 890ddd
									  double error,
Shinya Kitaoka 3bfa54
										std::vector<tthickquadratic *=""> &chunkArray);</tthickquadratic>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif // TSTROKE_H