#pragma once #ifndef TSTROKE_UTIL_H #define TSTROKE_UTIL_H // TnzCore includes #include "traster.h" #undef DVAPI #undef DVVAR #ifdef TVRENDER_EXPORTS #define DVAPI DV_EXPORT_API #define DVVAR DV_EXPORT_VAR #else #define DVAPI DV_IMPORT_API #define DVVAR DV_IMPORT_VAR #endif //================================================= // Forward declarations class TStroke; class TStrokeDeformation; class TVectorRenderData; //================================================= //******************************************************************************* // Utility stroke functions //******************************************************************************* /*! \brief Inserts control points in a stroke according to the input deformer. \details This function inserts redundant control points to use in the specified deformation. \par Unverified documentation The "increaser" studies the gradient (getDelta) of the input deformer object, and insert control points if there is increment.\n In "extremes" there are the first point of not zero potential and the last.\n\n Special case (plane at same potential) */ DVAPI bool increaseControlPoints( TStroke &stroke, //!< Stroke to be deformed. const TStrokeDeformation &deformer, //!< Deformer to be applied. double pixelSize = 1.0 //!< Resolution modifier. ); //----------------------------------------------------------------------------- DVAPI void modifyControlPoints(TStroke &stroke, const TStrokeDeformation &deformer); DVAPI void modifyControlPoints(TStroke &stroke, const TStrokeDeformation &deformer, std::vector &controlPointLen); DVAPI void modifyThickness(TStroke &stroke, const TStrokeDeformation &deformer, std::vector &controlPointLen, bool exponentially = false); //----------------------------------------------------------------------------- /*! \brief Transforms a stroke's thickness by a given polynomial function. */ DVAPI void transform_thickness( TStroke &stroke, //!< Stroke whose thickness will be transformed. const double poly[], //!< Polynomial coefficients, by increasing degree. int deg //!< Polynomial degree. ); //----------------------------------------------------------------------------- /*! \brief This function translates an input polyline to the control points of a sequence of quadratics. \details The conversion is actually a 2 step process. First, segment midpoints are added to the sequence to be used as quadratic endpoints. Each "midpoint-vertex-midpoint" triplet is converted independently to quadratics, thus ensuring that tangent vectors at midpoints are preserved. The triplets conversion step allows the following control parameters: Once this first approximating sequence has been produced, an optimal quadratics merging step is employed to simplify the overall sequence. The \a mergeTol parameter specifies the allowed merging error that can be employed in this step (\p 0 meaning no simplification). \note The output cps are thick points with 0 thickness. In other words, thickness is not considered, but supplied in output as TStrokes require them for construction. \sa The tcg::polyline_ops::toQuadratics template function. */ DVAPI void polylineToQuadratics( const std::vector &polyline, //!< Polyline to be translated to quadratics. std::vector &cps, //!< Control points of the output quadratics sequence. double adherenceTol = 1.0, //!< Maximum distance from quadratic to polyline corner. double angleTol = 0.0, //!< Inner product threshold for polyline angles. double relativeTol = 0.25, double relativeDistTol = 0.25, double mergeTol = 1.0); //----------------------------------------------------------------------------- /*! \brief Draws a stroke on a raster, under the specified rendering parameters. */ DVAPI void renderStroke( const TVectorRenderData &rd, //!< Render parameters (clipping rect, affine transform, etc). const TRaster32P &output, //!< Destination raster. TStroke *stroke //!< Stroke to render. ); //----------------------------------------------------------------------------- namespace Toonz { /*! \brief Merge an array of stroke in a single stroke. \remark If two consecutive strokes don't touch at the endpoints, an additional joining segment is added between them. */ DVAPI TStroke *merge(const std::vector &strokes); } // namespace Toonz #endif // TSTROKE_UTIL_H