#ifndef T_CENTERLINE_VECTORIZER
#define T_CENTERLINE_VECTORIZER
#include "toonz/vectorizerparameters.h"
#include "tvectorimage.h"
#include <deque>
#include <list>
#include <QObject>
#undef DVAPI
#undef DVVAR
#ifdef TOONZLIB_EXPORTS
#define DVAPI DV_EXPORT_API
#define DVVAR DV_EXPORT_VAR
#else
#define DVAPI DV_IMPORT_API
#define DVVAR DV_IMPORT_VAR
#endif
//==============================
// Core vectorizer class
//==============================
//!Contains specific vectorization methods and deals with partial progress notifications (using Qt signals).
/*!VectorizerCore class is the lowest layer of a vectorization process, it provides vectorization of a
single input raster image by calling the \b vectorize method.
It can also deal notifications about its progress status, and is receptive to user cancels.
\sa VectorizerPopup, Vectorizer, VectorizerConfiguration classes.*/
class DVAPI VectorizerCore : public QObject
{
Q_OBJECT
int m_currPartial;
int m_totalPartials;
bool m_isCanceled;
public:
VectorizerCore() : m_currPartial(0), m_isCanceled(false) {}
~VectorizerCore() {}
/*!Calls the appropriate technique to convert \b image to vectors depending on \b c.
Also provides post-processing operations such as regions computing and painting (using
colors found in \b palette).
Returns the \b TVectorImageP converted image.*/
TVectorImageP vectorize(const TImageP &image, const VectorizerConfiguration &c, TPalette *palette);
//!Returns true if vectorization was aborted at user's request
bool isCanceled() { return m_isCanceled; }
//!\b (\b Internal \b use \b only) Sets the maximum number of partial notifications.
void setOverallPartials(int total) { m_totalPartials = total; }
//!\b (\b Internal \b use \b only) Emits partial progress signal and updates partial progresses internal count.
void emitPartialDone(void);
private:
/*!Converts \b image to vectors in centerline mode, depending on \b configuration.
Returns image converted.
Note: if true==configuration.m_naaSource then it change the image, transforming it to a ToonzImage */
TVectorImageP centerlineVectorize(TImageP &image, const CenterlineConfiguration &configuration, TPalette *palette);
/*!Converts \b image to vectors in outline mode, depending on \b configuration.
Returns image converted.*/
TVectorImageP outlineVectorize(const TImageP &image, const OutlineConfiguration &configuration, TPalette *palette);
/*!Converts \b image to vectors in outline mode, depending on \b configuration.
Returns image converted.*/
TVectorImageP newOutlineVectorize(const TImageP &image, const NewOutlineConfiguration &configuration, TPalette *palette);
//!Calculates and applies fill colors once regions of \b vi have been computed.
void applyFillColors(TVectorImageP vi, const TImageP &img, TPalette *palette,
const VectorizerConfiguration &c);
void applyFillColors(TRegion *r, const TRasterP &ras, TPalette *palette,
const CenterlineConfiguration &c, int regionCount);
void applyFillColors(TRegion *r, const TRasterP &ras, TPalette *palette,
const OutlineConfiguration &c, int regionCount);
//!Traduces the input VectorizerConfiguration into an edible form.
VectorizerConfiguration traduceConfiguration(const VectorizerConfiguration &configuration);
bool isInkRegionEdge(TStroke *stroke);
bool isInkRegionEdgeReversed(TStroke *stroke);
void clearInkRegionFlags(TVectorImageP vi);
signals:
//!Partial progress \b par1 of overall \b par2 is notified.
void partialDone(int, int);
protected slots:
//!Receives a user cancel signal and attempts an early exit from vectorization process.
void onCancel() { m_isCanceled = true; }
};
#endif //T_CENTERLINE_VECTORIZER