tahoma2d/toonz/sources/toonzlib/scriptbinding_centerline_vectorizer.cpp

174 lines
5.2 KiB
C++
Raw Normal View History

2016-03-19 06:57:51 +13:00
#include "toonz/scriptbinding_centerline_vectorizer.h"
#include "toonz/scriptbinding_level.h"
#include <QScriptEngine>
#include "toonz/tcenterlinevectorizer.h"
#include "toonz/stage.h"
#include "toonz/Naa2TlvConverter.h"
#include "tpalette.h"
#include "ttoonzimage.h"
2016-06-15 18:43:10 +12:00
namespace TScriptBinding {
CenterlineVectorizer::CenterlineVectorizer() {
m_parameters = new CenterlineConfiguration();
}
CenterlineVectorizer::~CenterlineVectorizer() { delete m_parameters; }
QScriptValue CenterlineVectorizer::toString() {
return "Centerline Vectorizer";
}
QScriptValue CenterlineVectorizer::ctor(QScriptContext *context,
QScriptEngine *engine) {
return create(engine, new CenterlineVectorizer());
}
QScriptValue CenterlineVectorizer::vectorizeImage(const TImageP &src,
TPalette *palette) {
VectorizerCore vc;
TAffine dpiAff;
double factor = Stage::inch;
double dpix = factor / 72, dpiy = factor / 72;
TPointD center;
if (TRasterImageP ri = src) {
ri->getDpi(dpix, dpiy);
center = ri->getRaster()->getCenterD();
} else if (TToonzImageP ti = src) {
ti->getDpi(dpix, dpiy);
center = ti->getRaster()->getCenterD();
} else {
return context()->throwError(QObject::tr("Vectorization failed"));
}
if (dpix != 0.0 && dpiy != 0.0) dpiAff = TScale(factor / dpix, factor / dpiy);
factor = norm(dpiAff * TPointD(1, 0));
m_parameters->m_affine = dpiAff * TTranslation(-center);
m_parameters->m_thickScale = factor;
palette->addRef(); // if there are no other references the vectorize() method
// below can destroy the palette
// BEFORE assigning it to the vector image
TVectorImageP vi = vc.vectorize(src, *m_parameters, palette);
vi->setPalette(palette);
palette->release();
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
return engine()->newQObject(new Image(vi), QScriptEngine::AutoOwnership);
2016-03-19 06:57:51 +13:00
}
2016-06-15 18:43:10 +12:00
QScriptValue CenterlineVectorizer::vectorize(QScriptValue arg) {
Level *level = qscriptvalue_cast<Level *>(arg);
Image *img = qscriptvalue_cast<Image *>(arg);
QString type;
TPalette *palette = 0;
if (level) {
type = level->getType();
if (type != "Raster" && type != "ToonzRaster")
return context()->throwError(tr("Can't vectorize a %1 level").arg(type));
if (level->getFrameCount() <= 0)
return context()->throwError(
tr("Can't vectorize a level with no frames"));
palette = level->getSimpleLevel()->getPalette();
} else if (img) {
type = img->getType();
if (type != "Raster" && type != "ToonzRaster")
return context()->throwError(tr("Can't vectorize a %1 image").arg(type));
if (TToonzImageP ti = img->getImg()) {
palette = ti->getPalette();
}
} else {
return context()->throwError(
tr("Bad argument (%1): should be an Image or a Level")
.arg(arg.toString()));
}
if (palette == 0) palette = new TPalette();
if (img) {
return vectorizeImage(img->getImg(), palette);
} else if (level) {
QScriptValue newLevel = create(engine(), new Level());
QList<TFrameId> fids;
level->getFrameIds(fids);
foreach (TFrameId fid, fids) {
TImageP srcImg = level->getImg(fid);
if (srcImg && (srcImg->getType() == TImage::RASTER ||
srcImg->getType() == TImage::TOONZ_RASTER)) {
QScriptValue newFrame = vectorizeImage(srcImg, palette);
if (newFrame.isError()) {
return newFrame;
}
QScriptValueList args;
args << QString::fromStdString(fid.expand()) << newFrame;
newLevel.property("setFrame").call(newLevel, args);
}
}
return newLevel;
} else {
// should never happen
return QScriptValue();
}
2016-03-19 06:57:51 +13:00
}
2016-06-15 18:43:10 +12:00
int CenterlineVectorizer::getThreshold() const {
return m_parameters->m_threshold / 25;
2016-03-19 06:57:51 +13:00
}
2016-06-15 18:43:10 +12:00
void CenterlineVectorizer::setThreshold(int v) {
m_parameters->m_threshold = v * 25;
2016-03-19 06:57:51 +13:00
}
2016-06-15 18:43:10 +12:00
int CenterlineVectorizer::getAccuracy() const {
return 10 - m_parameters->m_penalty;
2016-03-19 06:57:51 +13:00
}
2016-06-15 18:43:10 +12:00
void CenterlineVectorizer::setAccuracy(int v) {
m_parameters->m_penalty = 10 - v;
2016-03-19 06:57:51 +13:00
}
2016-06-15 18:43:10 +12:00
int CenterlineVectorizer::getDespeckling() const {
return m_parameters->m_despeckling / 2;
2016-03-19 06:57:51 +13:00
}
2016-06-15 18:43:10 +12:00
void CenterlineVectorizer::setDespeckling(int v) {
m_parameters->m_despeckling = v * 2;
2016-03-19 06:57:51 +13:00
}
2016-06-15 18:43:10 +12:00
double CenterlineVectorizer::getMaxThickness() const {
return m_parameters->m_maxThickness * 2.0;
2016-03-19 06:57:51 +13:00
}
2016-06-15 18:43:10 +12:00
void CenterlineVectorizer::setMaxThickness(double v) {
m_parameters->m_maxThickness = v / 2.0;
2016-03-19 06:57:51 +13:00
}
2016-06-15 18:43:10 +12:00
double CenterlineVectorizer::getThicknessCalibration() const {
return m_parameters->m_thicknessRatio;
2016-03-19 06:57:51 +13:00
}
2016-06-15 18:43:10 +12:00
void CenterlineVectorizer::setThicknessCalibration(double v) {
m_parameters->m_thicknessRatio = v;
2016-03-19 06:57:51 +13:00
}
2016-06-15 18:43:10 +12:00
bool CenterlineVectorizer::getPreservePaintedAreas() const {
return !m_parameters->m_leaveUnpainted;
2016-03-19 06:57:51 +13:00
}
2016-06-15 18:43:10 +12:00
void CenterlineVectorizer::setPreservePaintedAreas(bool v) {
m_parameters->m_leaveUnpainted = !v;
2016-03-19 06:57:51 +13:00
}
2016-06-15 18:43:10 +12:00
bool CenterlineVectorizer::getAddBorder() const {
return m_parameters->m_makeFrame;
2016-03-19 06:57:51 +13:00
}
2016-06-15 18:43:10 +12:00
void CenterlineVectorizer::setAddBorder(bool v) {
m_parameters->m_makeFrame = v;
2016-03-19 06:57:51 +13:00
}
2016-06-15 18:43:10 +12:00
bool CenterlineVectorizer::getEir() const { return m_parameters->m_naaSource; }
void CenterlineVectorizer::setEir(bool v) { m_parameters->m_naaSource = v; }
} // namespace TScriptBinding