Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonz/scriptbinding_outline_vectorizer.h"
Toshihiro Shimizu 890ddd
#include "toonz/scriptbinding_level.h"
Toshihiro Shimizu 890ddd
#include "toonz/tcenterlinevectorizer.h"
Toshihiro Shimizu 890ddd
#include "toonz/stage.h"
Toshihiro Shimizu 890ddd
#include "ttoonzimage.h"
Toshihiro Shimizu 890ddd
#include "tpalette.h"
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace TScriptBinding {
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
OutlineVectorizer::OutlineVectorizer() {
Shinya Kitaoka 120a6e
  m_parameters = new NewOutlineConfiguration();
Shinya Kitaoka 120a6e
}
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
OutlineVectorizer::~OutlineVectorizer() { delete m_parameters; }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
QScriptValue OutlineVectorizer::toString() { return "Outline Vectorizer"; }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
QScriptValue OutlineVectorizer::ctor(QScriptContext *context,
Shinya Kitaoka 120a6e
                                     QScriptEngine *engine) {
Shinya Kitaoka 120a6e
  return create(engine, new OutlineVectorizer());
Shinya Kitaoka 120a6e
}
Shinya Kitaoka 120a6e
shun-iwasawa 27b0cf
static QScriptValue vectorizeImage(QScriptContext *context,
shun-iwasawa 27b0cf
                                   QScriptEngine *engine, const TImageP &src,
shun-iwasawa 27b0cf
                                   TPalette *palette,
Campbell Barton b3bd84
                                   NewOutlineConfiguration *parameters) {
Shinya Kitaoka 120a6e
  VectorizerCore vc;
Shinya Kitaoka 120a6e
  TAffine dpiAff;
Shinya Kitaoka 120a6e
  double factor = Stage::inch;
Shinya Kitaoka 120a6e
  double dpix = factor / 72, dpiy = factor / 72;
Shinya Kitaoka 120a6e
  TPointD center;
Shinya Kitaoka 120a6e
  if (TRasterImageP ri = src) {
Shinya Kitaoka 120a6e
    ri->getDpi(dpix, dpiy);
Shinya Kitaoka 120a6e
    center = ri->getRaster()->getCenterD();
Shinya Kitaoka 120a6e
  } else if (TToonzImageP ti = src) {
Shinya Kitaoka 120a6e
    ti->getDpi(dpix, dpiy);
Shinya Kitaoka 120a6e
    center = ti->getRaster()->getCenterD();
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    return context->throwError(QObject::tr("Vectorization failed"));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (dpix != 0.0 && dpiy != 0.0) dpiAff = TScale(factor / dpix, factor / dpiy);
Shinya Kitaoka 120a6e
  factor                                 = norm(dpiAff * TPointD(1, 0));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  parameters->m_affine     = dpiAff * TTranslation(-center);
Shinya Kitaoka 120a6e
  parameters->m_thickScale = factor;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TVectorImageP vi = vc.vectorize(src, *parameters, palette);
Shinya Kitaoka 120a6e
  vi->setPalette(palette);
Shinya Kitaoka 120a6e
  return engine->newQObject(new Image(vi), QScriptEngine::AutoOwnership);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
QScriptValue OutlineVectorizer::vectorize(QScriptValue arg) {
Shinya Kitaoka 120a6e
  Level *level = qscriptvalue_cast<level *="">(arg);</level>
Shinya Kitaoka 120a6e
  Image *img   = qscriptvalue_cast(arg);
Shinya Kitaoka 120a6e
  QString type;
Shinya Kitaoka 120a6e
  TPalette *palette = 0;
Shinya Kitaoka 120a6e
  if (level) {
Shinya Kitaoka 120a6e
    type = level->getType();
Shinya Kitaoka 120a6e
    if (type != "Raster" && type != "ToonzRaster")
Shinya Kitaoka 120a6e
      return context()->throwError(tr("Can't vectorize a %1 level").arg(type));
Shinya Kitaoka 120a6e
    if (level->getFrameCount() <= 0)
Shinya Kitaoka 120a6e
      return context()->throwError(
Shinya Kitaoka 120a6e
          tr("Can't vectorize a level with no frames"));
Shinya Kitaoka 120a6e
    palette = level->getSimpleLevel()->getPalette();
Shinya Kitaoka 120a6e
  } else if (img) {
Shinya Kitaoka 120a6e
    type = img->getType();
Shinya Kitaoka 120a6e
    if (type != "Raster" && type != "ToonzRaster")
Shinya Kitaoka 120a6e
      return context()->throwError(tr("Can't vectorize a %1 image").arg(type));
Shinya Kitaoka 120a6e
    if (TToonzImageP ti = img->getImg()) {
Shinya Kitaoka 120a6e
      palette = ti->getPalette();
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    return context()->throwError(
Shinya Kitaoka 120a6e
        tr("Bad argument (%1): should be an Image or a Level")
Shinya Kitaoka 120a6e
            .arg(arg.toString()));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (palette == 0) palette = new TPalette();
Shinya Kitaoka 120a6e
  if (img) {
Shinya Kitaoka 120a6e
    return vectorizeImage(context(), engine(), img->getImg(), palette,
Shinya Kitaoka 120a6e
                          m_parameters);
Shinya Kitaoka 120a6e
  } else if (level) {
Shinya Kitaoka 120a6e
    QScriptValue newLevel = create(engine(), new Level());
Shinya Kitaoka 120a6e
    QList<tframeid> fids;</tframeid>
Shinya Kitaoka 120a6e
    level->getFrameIds(fids);
otakuto dfe1cf
    for (const TFrameId &fid : fids) {
Shinya Kitaoka 120a6e
      TImageP srcImg = level->getImg(fid);
Shinya Kitaoka 120a6e
      if (srcImg && (srcImg->getType() == TImage::RASTER ||
Shinya Kitaoka 120a6e
                     srcImg->getType() == TImage::TOONZ_RASTER)) {
Shinya Kitaoka 120a6e
        QScriptValue newFrame =
Shinya Kitaoka 120a6e
            vectorizeImage(context(), engine(), srcImg, palette, m_parameters);
Shinya Kitaoka 120a6e
        if (newFrame.isError()) {
Shinya Kitaoka 120a6e
          return newFrame;
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
        QScriptValueList args;
Shinya Kitaoka 120a6e
        args << QString::fromStdString(fid.expand()) << newFrame;
Shinya Kitaoka 120a6e
        newLevel.property("setFrame").call(newLevel, args);
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    return newLevel;
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    // should never happen
Shinya Kitaoka 120a6e
    return QScriptValue();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
int OutlineVectorizer::getAccuracy() const {
Shinya Kitaoka 120a6e
  return (5.0 - m_parameters->m_mergeTol) * 2.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void OutlineVectorizer::setAccuracy(int v) {
Shinya Kitaoka 120a6e
  m_parameters->m_mergeTol = 5.0 - v * 0.5;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
int OutlineVectorizer::getDespeckling() const {
Shinya Kitaoka 120a6e
  return m_parameters->m_despeckling;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void OutlineVectorizer::setDespeckling(int v) {
Shinya Kitaoka 120a6e
  m_parameters->m_despeckling = v;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
bool OutlineVectorizer::getPreservePaintedAreas() const {
Shinya Kitaoka 120a6e
  return !m_parameters->m_leaveUnpainted;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void OutlineVectorizer::setPreservePaintedAreas(bool v) {
Shinya Kitaoka 120a6e
  m_parameters->m_leaveUnpainted = !v;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
double OutlineVectorizer::getCornerAdherence() const {
Shinya Kitaoka 120a6e
  return m_parameters->m_adherenceTol * 100.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void OutlineVectorizer::setCornerAdherence(double v) {
Shinya Kitaoka 120a6e
  m_parameters->m_adherenceTol = 0.01 * v;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
double OutlineVectorizer::getCornerAngle() const {
Shinya Kitaoka 120a6e
  return m_parameters->m_angleTol * 180.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void OutlineVectorizer::setCornerAngle(double v) {
Shinya Kitaoka 120a6e
  m_parameters->m_angleTol = v / 180.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
double OutlineVectorizer::getCornerCurveRadius() const {
Shinya Kitaoka 120a6e
  return m_parameters->m_relativeTol * 100;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void OutlineVectorizer::setCornerCurveRadius(double v) {
Shinya Kitaoka 120a6e
  m_parameters->m_relativeTol = 0.01 * v;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
int OutlineVectorizer::getMaxColors() const {
Shinya Kitaoka 120a6e
  return m_parameters->m_maxColors;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void OutlineVectorizer::setMaxColors(int v) { m_parameters->m_maxColors = v; }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
QString OutlineVectorizer::getTransparentColor() const {
Shinya Kitaoka 120a6e
  TPixel32 c = m_parameters->m_transparentColor;
Shinya Kitaoka 120a6e
  QColor color(c.r, c.g, c.b, c.m);
Shinya Kitaoka 120a6e
  return color.name();
Shinya Kitaoka 120a6e
}
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
void OutlineVectorizer::setTransparentColor(const QString &colorName) {
Shinya Kitaoka 120a6e
  QColor color;
Shinya Kitaoka 120a6e
  color.setNamedColor(colorName);
Shinya Kitaoka 120a6e
  if (color.isValid()) {
Shinya Kitaoka 120a6e
    m_parameters->m_transparentColor =
Shinya Kitaoka 120a6e
        TPixel32(color.red(), color.green(), color.blue(), color.alpha());
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    context()->throwError(tr("Invalid color : ").arg(colorName));
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
int OutlineVectorizer::getToneThreshold() const {
Shinya Kitaoka 120a6e
  return m_parameters->m_toneTol;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void OutlineVectorizer::setToneThreshold(int v) { m_parameters->m_toneTol = v; }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
}  // namespace TScriptBinding