Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "vectorizerpopup.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Tnz6 includes
Toshihiro Shimizu 890ddd
#include "tapp.h"
Toshihiro Shimizu 890ddd
#include "fileselection.h"
Toshihiro Shimizu 890ddd
#include "castselection.h"
Toshihiro Shimizu 890ddd
#include "cellselection.h"
Toshihiro Shimizu 890ddd
#include "overwritepopup.h"
Toshihiro Shimizu 890ddd
#include "vectorizerswatch.h"
Toshihiro Shimizu 890ddd
#include "filebrowserpopup.h"
Toshihiro Shimizu 890ddd
#include "menubarcommandids.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzQt includes
Toshihiro Shimizu 890ddd
#include "toonzqt/menubarcommand.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/intfield.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/colorfield.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/checkbox.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/gutil.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzLib includes
Toshihiro Shimizu 890ddd
#include "toonz/namebuilder.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshsimplelevel.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshleveltypes.h"
Toshihiro Shimizu 890ddd
#include "toonz/txsheet.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshcell.h"
Toshihiro Shimizu 890ddd
#include "toonz/toonzscene.h"
Toshihiro Shimizu 890ddd
#include "toonz/tcenterlinevectorizer.h"
Toshihiro Shimizu 890ddd
#include "toonz/dpiscale.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshchildlevel.h"
Toshihiro Shimizu 890ddd
#include "toonz/levelset.h"
Toshihiro Shimizu 890ddd
#include "toonz/tscenehandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/txsheethandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshlevelhandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/sceneproperties.h"
Toshihiro Shimizu 890ddd
#include "toonz/imagemanager.h"
Toshihiro Shimizu 890ddd
#include "toonz/Naa2TlvConverter.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "tsystem.h"
Toshihiro Shimizu 890ddd
#include "tconvert.h"
Toshihiro Shimizu 890ddd
#include "tpalette.h"
Toshihiro Shimizu 890ddd
#include "trasterimage.h"
Toshihiro Shimizu 890ddd
#include "ttoonzimage.h"
Toshihiro Shimizu 890ddd
#include "tcolorstyles.h"
Toshihiro Shimizu 890ddd
#include "tstroke.h"
Toshihiro Shimizu 890ddd
#include "tpersistset.h"
Martin van Zijl 9cb413
#include "columncommand.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Qt includes
Toshihiro Shimizu 890ddd
#include <qframe></qframe>
Toshihiro Shimizu 890ddd
#include <qcombobox></qcombobox>
Toshihiro Shimizu 890ddd
#include <qcoreapplication></qcoreapplication>
Toshihiro Shimizu 890ddd
#include <qpushbutton></qpushbutton>
Toshihiro Shimizu 890ddd
#include <qhboxlayout></qhboxlayout>
Toshihiro Shimizu 890ddd
#include <qvboxlayout></qvboxlayout>
Toshihiro Shimizu 890ddd
#include <qstring></qstring>
Toshihiro Shimizu 890ddd
#include <qlabel></qlabel>
Toshihiro Shimizu 890ddd
#include <qsplitter></qsplitter>
Toshihiro Shimizu 890ddd
#include <qgridlayout></qgridlayout>
Toshihiro Shimizu 890ddd
#include <qscrollarea></qscrollarea>
Toshihiro Shimizu 890ddd
#include <qaction></qaction>
Toshihiro Shimizu 890ddd
#include <qmainwindow></qmainwindow>
Toshihiro Shimizu 890ddd
#include <qtoolbutton></qtoolbutton>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
using namespace DVGui;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//********************************************************************************
Toshihiro Shimizu 890ddd
//    Local namespace  classes
Toshihiro Shimizu 890ddd
//********************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace {
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
struct Param {
Shinya Kitaoka 120a6e
  QString m_name;
Shinya Kitaoka 120a6e
  int m_bit;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  Param(const QString &name, int bit) : m_name(name), m_bit(bit) {}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
struct ParamGroup {
Shinya Kitaoka 120a6e
  int m_startRow, m_separatorRow;
Shinya Kitaoka 120a6e
  std::vector<param> m_params;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  ParamGroup(int startRow, int separatorRow)
Shinya Kitaoka 120a6e
      : m_startRow(startRow), m_separatorRow(separatorRow) {}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
}  // namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//********************************************************************************
Toshihiro Shimizu 890ddd
//    Local namespace stuff
Toshihiro Shimizu 890ddd
//********************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace {
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
std::vector<paramgroup> l_centerlineParamGroups;</paramgroup>
Toshihiro Shimizu 890ddd
std::vector<paramgroup> l_outlineParamGroups;</paramgroup>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool l_quitLoop = false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
VectorizerParameters *getCurrentVectorizerParameters() {
Shinya Kitaoka 120a6e
  return TApp::instance()
Shinya Kitaoka 120a6e
      ->getCurrentScene()
Shinya Kitaoka 120a6e
      ->getScene()
Shinya Kitaoka 120a6e
      ->getProperties()
Shinya Kitaoka 120a6e
      ->getVectorizerParameters();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
bool getSelectedLevels(std::set<txshlevel *=""> &levels, int &r0, int &c0, int &r1,</txshlevel>
Shinya Kitaoka 120a6e
                       int &c1) {
Shinya Kitaoka 120a6e
  TXsheet *xsheet = TApp::instance()->getCurrentXsheet()->getXsheet();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  CastSelection *castSelection =
Shinya Kitaoka 120a6e
      dynamic_cast<castselection *="">(TSelection::getCurrent());</castselection>
Shinya Kitaoka 120a6e
  TCellSelection *cellSelection =
Shinya Kitaoka 120a6e
      dynamic_cast<tcellselection *="">(TSelection::getCurrent());</tcellselection>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (castSelection) {
Shinya Kitaoka 120a6e
    std::vector<txshlevel *=""> selectedLevels;</txshlevel>
Shinya Kitaoka 120a6e
    castSelection->getSelectedLevels(selectedLevels);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    for (int i = 0; i < (int)selectedLevels.size(); ++i)
Shinya Kitaoka 120a6e
      levels.insert(selectedLevels[i]);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    return false;
Shinya Kitaoka 120a6e
  } else if (cellSelection) {
Shinya Kitaoka 120a6e
    cellSelection->getSelectedCells(r0, c0, r1, c1);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    for (int c = c0; c <= c1; ++c) {
Shinya Kitaoka 120a6e
      for (int r = r0; r <= r1; ++r) {
Shinya Kitaoka 120a6e
        TXshCell cell = xsheet->getCell(r, c);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
        if (TXshLevel *level = cell.isEmpty() ? 0 : cell.getSimpleLevel())
Shinya Kitaoka 120a6e
          levels.insert(level);
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    return true;
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TXshLevel *getSelectedLevel() {
Shinya Kitaoka 120a6e
  std::set<txshlevel *=""> levels;</txshlevel>
Shinya Kitaoka 120a6e
  int r0, c0, r1, c1;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  getSelectedLevels(levels, r0, c0, r1, c1);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  return (levels.size() == 1) ? *levels.begin() : (TXshLevel *)0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TFilePath getSelectedLevelPath() {
Shinya Kitaoka 120a6e
  TXshLevel *level = getSelectedLevel();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  return level
Shinya Kitaoka 120a6e
             ? TApp::instance()->getCurrentScene()->getScene()->decodeFilePath(
Shinya Kitaoka 120a6e
                   level->getPath())
Shinya Kitaoka 120a6e
             : TFilePath();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void getSelectedFids(std::vector<tframeid> &fids, TXshSimpleLevel *level,</tframeid>
Shinya Kitaoka 120a6e
                     int r0, int c0, int r1, int c1) {
Shinya Kitaoka 120a6e
  TXsheet *xsheet = TApp::instance()->getCurrentXsheet()->getXsheet();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  std::set<tframeid> fidsSet;</tframeid>
Shinya Kitaoka 120a6e
  for (int c = c0; c <= c1; ++c) {
Shinya Kitaoka 120a6e
    for (int r = r0; r <= r1; ++r) {
Shinya Kitaoka 120a6e
      TXshCell cell = xsheet->getCell(r, c);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      TXshSimpleLevel *curLevel = cell.isEmpty() ? 0 : cell.getSimpleLevel();
Shinya Kitaoka 120a6e
      if (curLevel != level) continue;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      fidsSet.insert(cell.getFrameId());
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  std::set<tframeid>::iterator fst, fsEnd = fidsSet.end();</tframeid>
Shinya Kitaoka 120a6e
  for (fst = fidsSet.begin(); fst != fsEnd; ++fst) fids.push_back(*fst);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
shun_iwasawa a6d284
// Toonz Raster Level may have palette including MyPaint styles,
shun_iwasawa a6d284
// which cannot be rendered in vector levels.
shun_iwasawa a6d284
// In such case replace MyPaint styles by solid color styles.
shun_iwasawa a6d284
void replaceMyPaintBrushStyles(TPalette *palette) {
shun_iwasawa a6d284
  for (int s = 0; s < palette->getStyleCount(); s++) {
shun_iwasawa a6d284
    TColorStyle *style = palette->getStyle(s);
shun_iwasawa a6d284
    if (style->getTagId() == 4001)  // TMyPaintBrushStyle
shun_iwasawa a6d284
      palette->setStyle(s, style->getMainColor());
shun_iwasawa a6d284
  }
shun_iwasawa a6d284
}
shun_iwasawa a6d284
Shinya Kitaoka 120a6e
}  // namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
//    Vectorizer implementation
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Vectorizer::Vectorizer()
Shinya Kitaoka 120a6e
    : m_dialog(new OverwriteDialog)
Shinya Kitaoka 120a6e
    , m_isCanceled(false)
Shinya Kitaoka 120a6e
    , m_dialogShown(false) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
Vectorizer::~Vectorizer() {
Shinya Kitaoka 120a6e
  // DO NOT REMOVE - DESTRUCTS INCOMPLETE TYPES IN THE HEADER FILE
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TVectorImageP Vectorizer::doVectorize(TImageP img, TPalette *palette,
Shinya Kitaoka 120a6e
                                      const VectorizerConfiguration &conf) {
Shinya Kitaoka 120a6e
  TToonzImageP ti  = img;
Shinya Kitaoka 120a6e
  TRasterImageP ri = img;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (!ti && !ri) return TVectorImageP();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  VectorizerCore vCore;
Shinya Kitaoka 120a6e
  connect(&vCore, SIGNAL(partialDone(int, int)), this,
Shinya Kitaoka 120a6e
          SIGNAL(partialDone(int, int)));
Shinya Kitaoka 120a6e
  connect(this, SIGNAL(transmitCancel()), &vCore, SLOT(onCancel()),
Shinya Kitaoka 120a6e
          Qt::DirectConnection);  // Direct connection *must* be
Shinya Kitaoka 120a6e
                                  // established for child cancels
Shinya Kitaoka 120a6e
  return vCore.vectorize(img, conf, palette);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void Vectorizer::setLevel(const TXshSimpleLevelP &level) {
Shinya Kitaoka 120a6e
  m_level = level;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Creo il livello pli
Shinya Kitaoka 120a6e
  TXshSimpleLevel *sl = m_level.getPointer();
Shinya Kitaoka 120a6e
  if (!sl) return;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  int rowCount = sl->getFrameCount();
Shinya Kitaoka 120a6e
  if (rowCount <= 0 || sl->isEmpty()) return;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TXshLevel *xl;
Shinya Kitaoka 120a6e
  ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Build the new level name
Shinya Kitaoka 120a6e
  std::wstring levelName = sl->getName() + L"v";
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 2a7129
    std::unique_ptr<namebuilder> nameBuilder(</namebuilder>
Shinya Kitaoka 2a7129
        NameBuilder::getBuilder(levelName));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    for (;;) {
Shinya Kitaoka 120a6e
      levelName = nameBuilder->getNext();
Shinya Kitaoka 120a6e
      if (scene->getLevelSet()->getLevel(levelName) == 0) break;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TFilePath dstPath = sl->getPath().withName(levelName).withType("pli");
Shinya Kitaoka 120a6e
  dstPath           = scene->decodeFilePath(dstPath);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  bool overWrite = false;
Shinya Kitaoka 120a6e
  if (TSystem::doesExistFileOrLevel(dstPath)) {
Shinya Kitaoka 120a6e
    m_dialogShown = true;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    std::wstring name = m_dialog->execute(scene, dstPath, true);
Shinya Kitaoka 120a6e
    if (m_dialog->cancelPressed()) return;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    switch (m_dialog->getChoice()) {
Shinya Kitaoka 120a6e
    case OverwriteDialog::KEEP_OLD:
shun-iwasawa 21f942
      xl = scene->getLevelSet()->getLevel(levelName);
Shinya Kitaoka 120a6e
      if (!xl) xl = scene->loadLevel(dstPath);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      m_vLevel = xl->getSimpleLevel();
Shinya Kitaoka 120a6e
      return;
Shinya Kitaoka 120a6e
    case OverwriteDialog::OVERWRITE:
Shinya Kitaoka 120a6e
      overWrite = true;
Shinya Kitaoka 120a6e
      break;
Shinya Kitaoka 120a6e
    default:
Shinya Kitaoka 120a6e
      levelName = name;
Shinya Kitaoka 120a6e
      break;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  xl = scene->createNewLevel(PLI_XSHLEVEL, levelName);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TXshSimpleLevel *vl = xl->getSimpleLevel();
Shinya Kitaoka 120a6e
  assert(vl);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (overWrite) {
Shinya Kitaoka 120a6e
    vl->setPath(scene->codeFilePath(dstPath));
Shinya Kitaoka 120a6e
    vl->setName(levelName);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
shun_iwasawa a6d284
  TPalette *palette = 0;
shun_iwasawa a6d284
  if (sl->getType() == TZP_XSHLEVEL) {
shun_iwasawa a6d284
    palette = sl->getPalette()->clone();
shun_iwasawa a6d284
    replaceMyPaintBrushStyles(palette);
shun_iwasawa a6d284
  } else
shun_iwasawa a6d284
    palette = new TPalette;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  palette->setPaletteName(vl->getName());
Shinya Kitaoka 120a6e
  vl->setPalette(palette);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_vLevel = vl;
Shinya Kitaoka 120a6e
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
int Vectorizer::doVectorize() {
Shinya Kitaoka 120a6e
  struct {
Shinya Kitaoka 120a6e
    Vectorizer *m_this;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    CenterlineConfiguration m_cConf;
Shinya Kitaoka 120a6e
    NewOutlineConfiguration m_oConf;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    void updateConfig(double weight) {
Shinya Kitaoka 120a6e
      if (m_this->m_params.m_isOutline)
Shinya Kitaoka 120a6e
        m_oConf = m_this->m_params.getOutlineConfiguration(weight);
Shinya Kitaoka 120a6e
      else
Shinya Kitaoka 120a6e
        m_cConf = m_this->m_params.getCenterlineConfiguration(weight);
Shinya Kitaoka 120a6e
    }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  } locals = {this};
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  VectorizerConfiguration &configuration =
Shinya Kitaoka 120a6e
      m_params.m_isOutline
Shinya Kitaoka 120a6e
          ? static_cast<vectorizerconfiguration &="">(locals.m_oConf)</vectorizerconfiguration>
Shinya Kitaoka 120a6e
          : static_cast<vectorizerconfiguration &="">(locals.m_cConf);</vectorizerconfiguration>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (!m_vLevel) return 0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (m_dialog->getChoice() == OverwriteDialog::KEEP_OLD && m_dialogShown)
Shinya Kitaoka 120a6e
    return m_fids.size();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TXshSimpleLevel *sl = m_level.getPointer();
Shinya Kitaoka 120a6e
  if (!sl) return 0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  int rowCount = sl->getFrameCount();
Shinya Kitaoka 120a6e
  if (rowCount <= 0 || sl->isEmpty()) return 0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  double frameRange[2] = {static_cast<double>(m_fids.front().getNumber()) - 1,</double>
Shinya Kitaoka 120a6e
                          static_cast<double>(m_fids.back().getNumber()) - 1};</double>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  int count = 0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  std::vector<tframeid>::const_iterator ft, fEnd = m_fids.end();</tframeid>
Shinya Kitaoka 120a6e
  for (ft = m_fids.begin(); ft != fEnd; ++ft) {
Shinya Kitaoka 120a6e
    // Retrieve the image to be vectorized
Shinya Kitaoka 120a6e
    TImageP img;
Shinya Kitaoka 120a6e
    if (sl->getType() == OVL_XSHLEVEL || sl->getType() == TZP_XSHLEVEL ||
Shinya Kitaoka 120a6e
        sl->getType() == TZI_XSHLEVEL)
Shinya Kitaoka 120a6e
      img = sl->getFullsampledFrame(*ft, ImageManager::dontPutInCache);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    if (!img) continue;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    // Build image-toonz coordinate transformation
Shinya Kitaoka 120a6e
    TAffine dpiAff = getDpiAffine(sl, *ft, true);
Shinya Kitaoka 120a6e
    double factor  = norm(dpiAff * TPointD(1, 0));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    TPointD center;
Shinya Kitaoka 120a6e
    if (TToonzImageP ti = img)
Shinya Kitaoka 120a6e
      center = ti->getRaster()->getCenterD();
Shinya Kitaoka 120a6e
    else if (TRasterImageP ri = img)
Shinya Kitaoka 120a6e
      center = ri->getRaster()->getCenterD();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    // Build vectorizer configuration
Shinya Kitaoka 120a6e
    double weight = (ft->getNumber() - 1 - frameRange[0]) /
Shinya Kitaoka 120a6e
                    std::max(frameRange[1] - frameRange[0], 1.0);
Shinya Kitaoka 120a6e
    weight = tcrop(weight, 0.0, 1.0);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    locals.updateConfig(weight);  // TEMPORARY
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    configuration.m_affine     = dpiAff * TTranslation(-center);
Shinya Kitaoka 120a6e
    configuration.m_thickScale = factor;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    // Build vectorization label to be displayed
Shinya Kitaoka 120a6e
    QString labelName = QString::fromStdWString(sl->getShortName());
Shinya Kitaoka 120a6e
    labelName.push_back(' ');
Shinya Kitaoka 120a6e
    labelName.append(QString::fromStdString(ft->expand(TFrameId::NO_PAD)));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    emit frameName(labelName);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    // Perform vectorization
Shinya Kitaoka 120a6e
    if (TVectorImageP vi =
Shinya Kitaoka 120a6e
            doVectorize(img, m_vLevel->getPalette(), configuration)) {
Shinya Kitaoka 120a6e
      TFrameId fid = *ft;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      if (fid.getNumber() < 0) fid = TFrameId(1, ft->getLetter());
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      m_vLevel->setFrame(fid, vi);
Shinya Kitaoka 120a6e
      vi->setPalette(m_vLevel->getPalette());
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      emit frameDone(++count);
Shinya Kitaoka 120a6e
    }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    // Stop if canceled
Shinya Kitaoka 120a6e
    if (m_isCanceled) break;
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_dialogShown = false;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  return count;
Shinya Kitaoka 120a6e
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void Vectorizer::run() { doVectorize(); }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
//*****************************************************************************
luz paz 6454c4
//    VectorizerPopup implementation
Shinya Kitaoka 120a6e
//*****************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
VectorizerPopup::VectorizerPopup(QWidget *parent, Qt::WindowFlags flags)
Shinya Kitaoka 120a6e
    : Dialog(TApp::instance()->getMainWindow(), true, false, "Vectorizer")
Shinya Kitaoka 120a6e
    , m_sceneHandle(TApp::instance()->getCurrentScene()) {
Shinya Kitaoka 120a6e
  struct Locals {
Shinya Kitaoka 120a6e
    int m_bit;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    Locals() : m_bit() {}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    static void addParameterGroup(std::vector<paramgroup> ¶mGroups,</paramgroup>
Shinya Kitaoka 120a6e
                                  int group, int startRow,
Shinya Kitaoka 120a6e
                                  int separatorRow = -1) {
Shinya Kitaoka 120a6e
      assert(group <= paramGroups.size());
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      if (group == paramGroups.size())
Shinya Kitaoka 120a6e
        paramGroups.push_back(ParamGroup(startRow, separatorRow));
Shinya Kitaoka 120a6e
    }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    void addParameter(std::vector<paramgroup> ¶mGroups,</paramgroup>
Shinya Kitaoka 120a6e
                      const QString ¶mName) {
Shinya Kitaoka 120a6e
      paramGroups.back().m_params.push_back(Param(paramName, m_bit++));
Shinya Kitaoka 120a6e
    }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  } locals;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Su MAC i dialog modali non hanno bottoni di chiusura nella titleBar
Shinya Kitaoka 120a6e
  setModal(false);
Shinya Kitaoka 120a6e
  setWindowTitle(tr("Convert-to-Vector Settings"));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  setLabelWidth(125);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  setTopMargin(0);
Shinya Kitaoka 120a6e
  setTopSpacing(0);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Build vertical layout
Shinya Kitaoka 120a6e
  beginVLayout();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  QSplitter *splitter = new QSplitter(Qt::Vertical, this);
Shinya Kitaoka 120a6e
  splitter->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding,
Shinya Kitaoka 120a6e
                                      QSizePolicy::MinimumExpanding));
Shinya Kitaoka 120a6e
  addWidget(splitter);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  QToolBar *leftToolBar = new QToolBar, *rightToolBar = new QToolBar;
shun_iwasawa 4a5f42
  leftToolBar->setObjectName("MediumPaddingToolBar");
shun_iwasawa 4a5f42
  rightToolBar->setObjectName("MediumPaddingToolBar");
shun_iwasawa 4a5f42
  leftToolBar->setIconSize(QSize(17, 17));
shun_iwasawa 4a5f42
  rightToolBar->setIconSize(QSize(17, 17));
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    QWidget *toolbarsContainer = new QWidget(this);
Shinya Kitaoka 120a6e
    toolbarsContainer->setFixedHeight(22);
Shinya Kitaoka 120a6e
    addWidget(toolbarsContainer);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    QHBoxLayout *toolbarsLayout = new QHBoxLayout(toolbarsContainer);
Shinya Kitaoka 120a6e
    toolbarsContainer->setLayout(toolbarsLayout);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    toolbarsLayout->setMargin(0);
Shinya Kitaoka 120a6e
    toolbarsLayout->setSpacing(0);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    QToolBar *spacingToolBar = new QToolBar(
Shinya Kitaoka 120a6e
        toolbarsContainer);  // The spacer object must be a toolbar.
Shinya Kitaoka 120a6e
    spacingToolBar->setFixedHeight(
Shinya Kitaoka 120a6e
        22);  // It's related to qss choices... I know it's stinky
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    toolbarsLayout->addWidget(leftToolBar, 0, Qt::AlignLeft);
Shinya Kitaoka 120a6e
    toolbarsLayout->addWidget(spacingToolBar, 1);
Shinya Kitaoka 120a6e
    toolbarsLayout->addWidget(rightToolBar, 0, Qt::AlignRight);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  endVLayout();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Build parameters area
Shinya Kitaoka 120a6e
  QScrollArea *paramsArea = new QScrollArea(splitter);
Shinya Kitaoka 120a6e
  paramsArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
Shinya Kitaoka 120a6e
  paramsArea->setWidgetResizable(true);
Shinya Kitaoka 120a6e
  splitter->addWidget(paramsArea);
Shinya Kitaoka 120a6e
  splitter->setStretchFactor(0, 1);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_paramsWidget = new QFrame(paramsArea);
Shinya Kitaoka 120a6e
  paramsArea->setWidget(m_paramsWidget);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_paramsLayout = new QGridLayout;
Shinya Kitaoka 120a6e
  m_paramsWidget->setLayout(m_paramsLayout);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  int group = 0, row = 0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  locals.addParameterGroup(::l_centerlineParamGroups, group, row);
Shinya Kitaoka 120a6e
  locals.addParameterGroup(::l_outlineParamGroups, group++, row);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Vectorization mode
Shinya Kitaoka 120a6e
  m_typeMenu = new QComboBox(this);
Shinya Kitaoka 120a6e
  m_typeMenu->setFixedSize(245, WidgetHeight);
Shinya Kitaoka 120a6e
  QStringList formats;
Shinya Kitaoka 120a6e
  formats << tr("Centerline") << tr("Outline");
Shinya Kitaoka 120a6e
  m_typeMenu->addItems(formats);
Shinya Kitaoka 120a6e
  m_typeMenu->setMinimumHeight(WidgetHeight);
Shinya Kitaoka 120a6e
  bool isOutline = m_sceneHandle->getScene()
Shinya Kitaoka 120a6e
                       ->getProperties()
Shinya Kitaoka 120a6e
                       ->getVectorizerParameters()
Shinya Kitaoka 120a6e
                       ->m_isOutline;
Shinya Kitaoka 120a6e
  m_typeMenu->setCurrentIndex(isOutline ? 1 : 0);
Shinya Kitaoka 120a6e
  connect(m_typeMenu, SIGNAL(currentIndexChanged(int)), this,
Shinya Kitaoka 120a6e
          SLOT(onTypeChange(int)));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(new QLabel(tr("Mode")), row, 0, Qt::AlignRight);
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_typeMenu, row++, 1);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  locals.addParameter(l_centerlineParamGroups, tr("Mode"));
Shinya Kitaoka 120a6e
  locals.addParameter(l_outlineParamGroups, tr("Mode"));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  //-------------------- Parameters area - Centerline ------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  locals.addParameterGroup(l_centerlineParamGroups, group++, row);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Threshold
Shinya Kitaoka 120a6e
  m_cThresholdLabel = new QLabel(tr("Threshold"));
Shinya Kitaoka 120a6e
  m_cThreshold      = new IntField(this);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_cThresholdLabel, row, 0, Qt::AlignRight);
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_cThreshold, row++, 1);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  locals.addParameter(l_centerlineParamGroups, tr("Threshold"));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Accuracy
Shinya Kitaoka 120a6e
  m_cAccuracyLabel = new QLabel(tr("Accuracy"));
Shinya Kitaoka 120a6e
  m_cAccuracy      = new IntField(this);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_cAccuracyLabel, row, 0, Qt::AlignRight);
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_cAccuracy, row++, 1);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  locals.addParameter(l_centerlineParamGroups, tr("Accuracy"));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Despeckling
Shinya Kitaoka 120a6e
  m_cDespecklingLabel = new QLabel(tr("Despeckling"));
Shinya Kitaoka 120a6e
  m_cDespeckling      = new IntField(this);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_cDespecklingLabel, row, 0, Qt::AlignRight);
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_cDespeckling, row++, 1);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  locals.addParameter(l_centerlineParamGroups, tr("Despeckling"));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Max Thickness
Shinya Kitaoka 120a6e
  m_cMaxThicknessLabel = new QLabel(tr("Max Thickness"));
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_cMaxThicknessLabel, row, 0, Qt::AlignRight);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_cMaxThickness = new IntField(this);
Shinya Kitaoka 120a6e
  m_cMaxThickness->enableSlider(false);
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_cMaxThickness, row++, 1, Qt::AlignLeft);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  locals.addParameter(l_centerlineParamGroups, tr("Max Thickness"));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Thickness Calibration
Shinya Kitaoka 120a6e
  m_cThicknessRatioLabel = new QLabel(tr("Thickness Calibration"));
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_cThicknessRatioLabel, row, 0, Qt::AlignRight);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  /*m_cThicknessRatio = new IntField(this);
Shinya Kitaoka 120a6e
paramsLayout->addWidget(m_cThicknessRatio, row++, 1);*/
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  QHBoxLayout *cThicknessRatioLayout = new QHBoxLayout;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  cThicknessRatioLayout->addSpacing(20);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_cThicknessRatioFirstLabel = new QLabel(tr("Start:"));
Shinya Kitaoka 120a6e
  cThicknessRatioLayout->addWidget(m_cThicknessRatioFirstLabel);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_cThicknessRatioFirst = new MeasuredDoubleLineEdit(this);
Shinya Kitaoka 120a6e
  m_cThicknessRatioFirst->setMeasure("percentage");
Shinya Kitaoka 120a6e
  cThicknessRatioLayout->addWidget(m_cThicknessRatioFirst);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_cThicknessRatioLastLabel = new QLabel(tr("End:"));
Shinya Kitaoka 120a6e
  cThicknessRatioLayout->addWidget(m_cThicknessRatioLastLabel);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_cThicknessRatioLast = new MeasuredDoubleLineEdit(this);
Shinya Kitaoka 120a6e
  m_cThicknessRatioLast->setMeasure("percentage");
Shinya Kitaoka 120a6e
  cThicknessRatioLayout->addWidget(m_cThicknessRatioLast);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  cThicknessRatioLayout->addStretch(1);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_paramsLayout->addLayout(cThicknessRatioLayout, row++, 1);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  locals.addParameter(l_centerlineParamGroups, tr("Thickness Calibration"));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Checkboxes
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    static const QString name = tr("Preserve Painted Areas");
Shinya Kitaoka 120a6e
    locals.addParameter(l_centerlineParamGroups, name);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    m_cPaintFill = new CheckBox(name, this);
Shinya Kitaoka 120a6e
    m_cPaintFill->setFixedHeight(WidgetHeight);
Shinya Kitaoka 120a6e
    m_paramsLayout->addWidget(m_cPaintFill, row++, 1);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  {
shun-iwasawa 21f942
    static const QString name = tr("Align Boundary Strokes Direction");
shun-iwasawa 21f942
    locals.addParameter(l_centerlineParamGroups, name);
shun-iwasawa 21f942
shun-iwasawa 21f942
    m_cAlignBoundaryStrokesDirection = new CheckBox(name, this);
shun-iwasawa 21f942
    m_cAlignBoundaryStrokesDirection->setFixedHeight(WidgetHeight);
shun-iwasawa 21f942
    m_cAlignBoundaryStrokesDirection->setToolTip(
shun-iwasawa 21f942
        tr("Align boundary strokes direction to be the same.\n(clockwise, i.e. "
shun-iwasawa 21f942
           "left to right as viewed from inside of the shape)"));
shun-iwasawa 21f942
    m_paramsLayout->addWidget(m_cAlignBoundaryStrokesDirection, row++, 1);
shun-iwasawa 21f942
  }
shun-iwasawa 21f942
shun-iwasawa 21f942
  {
Shinya Kitaoka 120a6e
    static const QString name = tr("Add Border");
Shinya Kitaoka 120a6e
    locals.addParameter(l_centerlineParamGroups, name);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    m_cMakeFrame = new CheckBox(name, this);
Shinya Kitaoka 120a6e
    m_cMakeFrame->setFixedHeight(WidgetHeight);
Shinya Kitaoka 120a6e
    m_paramsLayout->addWidget(m_cMakeFrame, row++, 1);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  locals.addParameterGroup(l_centerlineParamGroups, group++, row + 1, row);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_cNaaSourceSeparator = new Separator(tr("Full color non-AA images"));
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_cNaaSourceSeparator, row++, 0, 1, 2);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    static const QString name = tr("Enhanced ink recognition");
Shinya Kitaoka 120a6e
    locals.addParameter(l_centerlineParamGroups, name);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    m_cNaaSource = new CheckBox(name, this);
Shinya Kitaoka 120a6e
    m_cNaaSource->setFixedHeight(WidgetHeight);
Shinya Kitaoka 120a6e
    m_paramsLayout->addWidget(m_cNaaSource, row++, 1);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  //-------------------- Parameters area - Outline ------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  group = 1;
Shinya Kitaoka 120a6e
  locals.addParameterGroup(l_outlineParamGroups, group++, row);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Accuracy
Shinya Kitaoka 120a6e
  m_oAccuracyLabel = new QLabel(tr("Accuracy"));
Shinya Kitaoka 120a6e
  m_oAccuracy      = new IntField(this);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_oAccuracyLabel, row, 0, Qt::AlignRight);
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_oAccuracy, row++, 1);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  locals.addParameter(l_outlineParamGroups, tr("Accuracy"));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Despeckling
Shinya Kitaoka 120a6e
  m_oDespecklingLabel = new QLabel(tr("Despeckling"));
Shinya Kitaoka 120a6e
  m_oDespeckling      = new IntField(this);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_oDespecklingLabel, row, 0, Qt::AlignRight);
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_oDespeckling, row++, 1);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  locals.addParameter(l_outlineParamGroups, tr("Despeckling"));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Paint Fill
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    static const QString name = tr("Preserve Painted Areas");
Shinya Kitaoka 120a6e
    locals.addParameter(l_outlineParamGroups, name);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    m_oPaintFill = new CheckBox(name, this);
Shinya Kitaoka 120a6e
    m_oPaintFill->setFixedHeight(WidgetHeight);
Shinya Kitaoka 120a6e
    m_paramsLayout->addWidget(m_oPaintFill, row++, 1);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
shun-iwasawa 21f942
  {
shun-iwasawa 21f942
    static const QString name = tr("Align Boundary Strokes Direction");
shun-iwasawa 21f942
    locals.addParameter(l_outlineParamGroups, name);
shun-iwasawa 21f942
shun-iwasawa 21f942
    m_oAlignBoundaryStrokesDirection = new CheckBox(name, this);
shun-iwasawa 21f942
    m_oAlignBoundaryStrokesDirection->setFixedHeight(WidgetHeight);
shun-iwasawa 21f942
    m_oAlignBoundaryStrokesDirection->setToolTip(
shun-iwasawa 21f942
        tr("Align boundary strokes direction to be the same.\n(clockwise, i.e. "
shun-iwasawa 21f942
           "left to right as viewed from inside of the shape)"));
shun-iwasawa 21f942
    m_paramsLayout->addWidget(m_oAlignBoundaryStrokesDirection, row++, 1);
shun-iwasawa 21f942
  }
Shinya Kitaoka 120a6e
  locals.addParameterGroup(l_outlineParamGroups, group++, row + 1, row);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_oCornersSeparator = new Separator(tr("Corners"));
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_oCornersSeparator, row++, 0, 1, 2);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Adherence
Shinya Kitaoka 120a6e
  m_oAdherenceLabel = new QLabel(tr("Adherence"));
Shinya Kitaoka 120a6e
  m_oAdherence      = new IntField(this);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_oAdherenceLabel, row, 0, Qt::AlignRight);
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_oAdherence, row++, 1);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  locals.addParameter(l_outlineParamGroups, tr("Adherence"));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Angle
Shinya Kitaoka 120a6e
  m_oAngleLabel = new QLabel(tr("Angle"));
Shinya Kitaoka 120a6e
  m_oAngle      = new IntField(this);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_oAngleLabel, row, 0, Qt::AlignRight);
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_oAngle, row++, 1);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  locals.addParameter(l_outlineParamGroups, tr("Angle"));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Relative
Shinya Kitaoka 120a6e
  m_oRelativeLabel = new QLabel(tr("Curve Radius"));
Shinya Kitaoka 120a6e
  m_oRelative      = new IntField(this);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_oRelativeLabel, row, 0, Qt::AlignRight);
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_oRelative, row++, 1);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  locals.addParameter(l_outlineParamGroups, tr("Curve Radius"));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  locals.addParameterGroup(l_outlineParamGroups, group++, row + 1, row);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_oFullColorSeparator = new Separator(tr("Raster Levels"));
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_oFullColorSeparator, row++, 0, 1, 2);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Max Colors
Shinya Kitaoka 120a6e
  m_oMaxColorsLabel = new QLabel(tr("Max Colors"));
Shinya Kitaoka 120a6e
  m_oMaxColors      = new IntField(this);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_oMaxColorsLabel, row, 0, Qt::AlignRight);
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_oMaxColors, row++, 1);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  locals.addParameter(l_outlineParamGroups, tr("Max Colors"));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Transparent Color
Shinya Kitaoka 120a6e
  m_oTransparentColorLabel = new QLabel(tr("Transparent Color"), this);
Shinya Kitaoka 120a6e
  m_oTransparentColor = new ColorField(this, true, TPixel32::Transparent, 48);
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_oTransparentColorLabel, row, 0, Qt::AlignRight);
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_oTransparentColor, row++, 1);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  locals.addParameter(l_outlineParamGroups, tr("Transparent Color"));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  locals.addParameterGroup(l_outlineParamGroups, group++, row + 1, row);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_oTlvSeparator = new Separator(tr("TLV Levels"));
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_oTlvSeparator, row++, 0, 1, 2);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Tone Threshold
Shinya Kitaoka 120a6e
  m_oToneThresholdLabel = new QLabel(tr("Tone Threshold"));
Shinya Kitaoka 120a6e
  m_oToneThreshold      = new IntField(this);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_oToneThresholdLabel, row, 0, Qt::AlignRight);
Shinya Kitaoka 120a6e
  m_paramsLayout->addWidget(m_oToneThreshold, row++, 1);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  locals.addParameter(l_outlineParamGroups, tr("Tone Threshold"));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_paramsLayout->setRowStretch(row, 1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  //-------------------- Swatch area ------------------------
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_swatchArea = new VectorizerSwatchArea(this);
Shinya Kitaoka 120a6e
  splitter->addWidget(m_swatchArea);
luz paz 6454c4
  m_swatchArea->setEnabled(false);  // Initially not enabled
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  connect(this, SIGNAL(valuesChanged()), m_swatchArea,
Shinya Kitaoka 120a6e
          SLOT(invalidateContents()));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  //---------------------- Toolbar --------------------------
Shinya Kitaoka 120a6e
Kite 521c84
  QAction *swatchAct =
Kite 521c84
      new QAction(createQIcon("preview"), tr("Toggle Swatch Preview"), this);
Shinya Kitaoka 120a6e
  swatchAct->setCheckable(true);
Shinya Kitaoka 120a6e
  leftToolBar->addAction(swatchAct);
Shinya Kitaoka 120a6e
Kite 99f71d
  QAction *centerlineAct = new QAction(createQIcon("centerline"),
shun_iwasawa 4a5f42
                                       tr("Toggle Centerlines Check"), this);
Shinya Kitaoka 120a6e
  centerlineAct->setCheckable(true);
Shinya Kitaoka 120a6e
  leftToolBar->addAction(centerlineAct);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QToolButton *visibilityButton = new QToolButton(this);
Kite 99f71d
  visibilityButton->setIcon(createQIcon("menu"));
Kite 99f71d
  visibilityButton->setText(tr("Options"));
Shinya Kitaoka 120a6e
  visibilityButton->setPopupMode(QToolButton::InstantPopup);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QMenu *visibilityMenu = new QMenu(visibilityButton);
Shinya Kitaoka 120a6e
  visibilityButton->setMenu(visibilityMenu);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  rightToolBar->addWidget(visibilityButton);
Shinya Kitaoka 120a6e
  rightToolBar->addSeparator();
Shinya Kitaoka 120a6e
shun_iwasawa 4a5f42
  QAction *saveAct =
Kite 521c84
      new QAction(createQIcon("save"), tr("Save Settings"), this);
Shinya Kitaoka 120a6e
  rightToolBar->addAction(saveAct);
shun_iwasawa 4a5f42
  QAction *loadAct =
Kite 521c84
      new QAction(createQIcon("load"), tr("Load Settings"), this);
Shinya Kitaoka 120a6e
  rightToolBar->addAction(loadAct);
Shinya Kitaoka 120a6e
  rightToolBar->addSeparator();
Shinya Kitaoka 120a6e
Kite 521c84
  QAction *resetAct =
Kite 99f71d
      new QAction(createQIcon("settings_reset"), tr("Reset Settings"), this);
Shinya Kitaoka 120a6e
  rightToolBar->addAction(resetAct);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  connect(swatchAct, SIGNAL(triggered(bool)), m_swatchArea,
Shinya Kitaoka 120a6e
          SLOT(enablePreview(bool)));
Shinya Kitaoka 120a6e
  connect(centerlineAct, SIGNAL(triggered(bool)), m_swatchArea,
Shinya Kitaoka 120a6e
          SLOT(enableDrawCenterlines(bool)));
Shinya Kitaoka 120a6e
  connect(visibilityMenu, SIGNAL(aboutToShow()), this,
Shinya Kitaoka 120a6e
          SLOT(populateVisibilityMenu()));
Shinya Kitaoka 120a6e
  connect(saveAct, SIGNAL(triggered()), this, SLOT(saveParameters()));
Shinya Kitaoka 120a6e
  connect(loadAct, SIGNAL(triggered()), this, SLOT(loadParameters()));
Shinya Kitaoka 120a6e
  connect(resetAct, SIGNAL(triggered()), this, SLOT(resetParameters()));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  //------------------- Convert Button ----------------------
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Convert Button
Shinya Kitaoka 120a6e
  m_okBtn = new QPushButton(QString(tr("Convert")), this);
Shinya Kitaoka 120a6e
  connect(m_okBtn, SIGNAL(clicked()), this, SLOT(onOk()));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  addButtonBarWidget(m_okBtn);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // All detailed signals convey to the unique valuesChanged() signal. That
Shinya Kitaoka 120a6e
  // makes it easier
Shinya Kitaoka 120a6e
  // to disconnect update notifications whenever we loadConfiguration(..).
Shinya Kitaoka 120a6e
  connect(this, SIGNAL(valuesChanged()), this, SLOT(updateSceneSettings()));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Connect value changes to update the global
Shinya Kitaoka 120a6e
  // VectorizerPopUpSettingsContainer.
Shinya Kitaoka 120a6e
  // connect(m_typeMenu,SIGNAL(currentIndexChanged(const QString
Shinya Kitaoka 120a6e
  // &)),this,SLOT(updateSceneSettings()));
Shinya Kitaoka 120a6e
  connect(m_cThreshold, SIGNAL(valueChanged(bool)), this,
Shinya Kitaoka 120a6e
          SLOT(onValueEdited(bool)));
Shinya Kitaoka 120a6e
  connect(m_cAccuracy, SIGNAL(valueChanged(bool)), this,
Shinya Kitaoka 120a6e
          SLOT(onValueEdited(bool)));
Shinya Kitaoka 120a6e
  connect(m_cDespeckling, SIGNAL(valueChanged(bool)), this,
Shinya Kitaoka 120a6e
          SLOT(onValueEdited(bool)));
Shinya Kitaoka 120a6e
  connect(m_cMaxThickness, SIGNAL(valueChanged(bool)), this,
Shinya Kitaoka 120a6e
          SLOT(onValueEdited(bool)));
Shinya Kitaoka 120a6e
  // connect(m_cThicknessRatio,SIGNAL(valueChanged(bool)),this,SLOT(onValueEdited(bool)));
Shinya Kitaoka 120a6e
  connect(m_cThicknessRatioFirst, SIGNAL(valueChanged()), this,
Shinya Kitaoka 120a6e
          SLOT(onValueEdited()));
Shinya Kitaoka 120a6e
  connect(m_cThicknessRatioLast, SIGNAL(valueChanged()), this,
Shinya Kitaoka 120a6e
          SLOT(onValueEdited()));
Shinya Kitaoka 120a6e
  connect(m_cMakeFrame, SIGNAL(stateChanged(int)), this, SLOT(onValueEdited()));
Shinya Kitaoka 120a6e
  connect(m_cPaintFill, SIGNAL(stateChanged(int)), this, SLOT(onValueEdited()));
shun-iwasawa 21f942
  connect(m_cAlignBoundaryStrokesDirection, SIGNAL(stateChanged(int)), this,
shun-iwasawa 21f942
          SLOT(onValueEdited()));
Shinya Kitaoka 120a6e
  connect(m_cNaaSource, SIGNAL(stateChanged(int)), this, SLOT(onValueEdited()));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  connect(m_oAccuracy, SIGNAL(valueChanged(bool)), this,
Shinya Kitaoka 120a6e
          SLOT(onValueEdited(bool)));
Shinya Kitaoka 120a6e
  connect(m_oDespeckling, SIGNAL(valueChanged(bool)), this,
Shinya Kitaoka 120a6e
          SLOT(onValueEdited(bool)));
Shinya Kitaoka 120a6e
  connect(m_oPaintFill, SIGNAL(stateChanged(int)), this, SLOT(onValueEdited()));
shun-iwasawa 21f942
  connect(m_oAlignBoundaryStrokesDirection, SIGNAL(stateChanged(int)), this,
shun-iwasawa 21f942
          SLOT(onValueEdited()));
Shinya Kitaoka 120a6e
  connect(m_oAdherence, SIGNAL(valueChanged(bool)), this,
Shinya Kitaoka 120a6e
          SLOT(onValueEdited(bool)));
Shinya Kitaoka 120a6e
  connect(m_oAngle, SIGNAL(valueChanged(bool)), this,
Shinya Kitaoka 120a6e
          SLOT(onValueEdited(bool)));
Shinya Kitaoka 120a6e
  connect(m_oRelative, SIGNAL(valueChanged(bool)), this,
Shinya Kitaoka 120a6e
          SLOT(onValueEdited(bool)));
Shinya Kitaoka 120a6e
  connect(m_oDespeckling, SIGNAL(valueChanged(bool)), this,
Shinya Kitaoka 120a6e
          SLOT(onValueEdited(bool)));
Shinya Kitaoka 120a6e
  connect(m_oMaxColors, SIGNAL(valueChanged(bool)), this,
Shinya Kitaoka 120a6e
          SLOT(onValueEdited(bool)));
Shinya Kitaoka 120a6e
  connect(m_oTransparentColor, SIGNAL(colorChanged(const TPixel32 &, bool)),
Shinya Kitaoka 120a6e
          this, SLOT(onValueEdited(const TPixel32 &, bool)));
Shinya Kitaoka 120a6e
  connect(m_oToneThreshold, SIGNAL(valueChanged(bool)), this,
Shinya Kitaoka 120a6e
          SLOT(onValueEdited(bool)));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  refreshPopup();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Non e' corretto: manca la possibilita' di aggiornare la selezione del
Shinya Kitaoka 120a6e
  // livello corrente
Shinya Kitaoka 120a6e
  //  connect(TApp::instance()->getCurrentLevel(), SIGNAL(xshLevelChanged()),
Shinya Kitaoka 120a6e
  //                                         this, SLOT(updateValues()));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
VectorizerParameters *VectorizerPopup::getParameters() const {
Shinya Kitaoka 120a6e
  assert(m_sceneHandle);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  ToonzScene *scene = m_sceneHandle->getScene();
Shinya Kitaoka 120a6e
  assert(scene);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TSceneProperties *sceneProp = scene->getProperties();
Shinya Kitaoka 120a6e
  assert(sceneProp);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  assert(sceneProp->getVectorizerParameters());
Shinya Kitaoka 120a6e
  return sceneProp->getVectorizerParameters();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void VectorizerPopup::onValueEdited(bool isDrag) {
Shinya Kitaoka 120a6e
  if (!isDrag) emit valuesChanged();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
bool VectorizerPopup::isLevelToConvert(TXshSimpleLevel *sl) {
Shinya Kitaoka 120a6e
  return (sl->getPath().getType() != "pli");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
bool VectorizerPopup::apply() {
Shinya Kitaoka 120a6e
  std::set<txshlevel *=""> levels;</txshlevel>
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ToonzScene *scene = m_sceneHandle->getScene();
Shinya Kitaoka 120a6e
  if (!scene) {
Shinya Kitaoka 120a6e
    assert(scene);
Shinya Kitaoka 120a6e
    return false;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TSceneProperties *sceneProp = scene->getProperties();
Shinya Kitaoka 120a6e
  if (!sceneProp) return false;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  VectorizerParameters *vectorizerParameters =
Shinya Kitaoka 120a6e
      sceneProp->getVectorizerParameters();
Shinya Kitaoka 120a6e
  if (!vectorizerParameters) return false;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  int r0               = 0;
Shinya Kitaoka 120a6e
  int c0               = 0;
Shinya Kitaoka 120a6e
  int r1               = 0;
Shinya Kitaoka 120a6e
  int c1               = 0;
Shinya Kitaoka 120a6e
  bool isCellSelection = getSelectedLevels(levels, r0, c0, r1, c1);
shun-iwasawa 21f942
  if (c0 < 0) c0 = 0;
Shinya Kitaoka 120a6e
  if (levels.empty()) {
Shinya Kitaoka 120a6e
    error(tr("The current selection is invalid."));
Shinya Kitaoka 120a6e
    return false;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Initialize Progress bar
Shinya Kitaoka 120a6e
  m_progressDialog = new DVGui::ProgressDialog("", "Cancel", 0, 1);
Shinya Kitaoka 120a6e
  m_progressDialog->setWindowFlags(
Shinya Kitaoka 120a6e
      Qt::Dialog | Qt::WindowTitleHint);  // Don't show ? and X buttons
Shinya Kitaoka 120a6e
  m_progressDialog->setWindowTitle(QString("Convert To Vector..."));
Shinya Kitaoka 120a6e
  m_progressDialog->setAttribute(Qt::WA_DeleteOnClose);
Shinya Kitaoka 120a6e
  m_progressDialog->setWindowModality(
Shinya Kitaoka 120a6e
      Qt::WindowModal);  // No user interaction is allowed during vectorization
Shinya Kitaoka 120a6e
  m_progressDialog->setFixedSize(200, 100);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Initialize vectorizer
Shinya Kitaoka 120a6e
  m_vectorizer = new Vectorizer;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_vectorizer->setParameters(*vectorizerParameters);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  connect(m_vectorizer, SIGNAL(frameName(QString)), this,
Shinya Kitaoka 120a6e
          SLOT(onFrameName(QString)), Qt::QueuedConnection);
Shinya Kitaoka 120a6e
  connect(m_vectorizer, SIGNAL(frameDone(int)), this, SLOT(onFrameDone(int)),
Shinya Kitaoka 120a6e
          Qt::QueuedConnection);
Shinya Kitaoka 120a6e
  connect(m_vectorizer, SIGNAL(partialDone(int, int)), this,
Shinya Kitaoka 120a6e
          SLOT(onPartialDone(int, int)), Qt::QueuedConnection);
Shinya Kitaoka 120a6e
  // We DON'T want the progress bar to be hidden at cancel press - since its
Shinya Kitaoka 120a6e
  // modal
Shinya Kitaoka 120a6e
  // behavior prevents the user to interfere with a possibly still active
Shinya Kitaoka 120a6e
  // vectorization.
Shinya Kitaoka 120a6e
  disconnect(m_progressDialog, SIGNAL(canceled()), m_progressDialog,
Shinya Kitaoka 120a6e
             SLOT(onCancel()));
Shinya Kitaoka 120a6e
  // We first inform the vectorizer of a cancel press;
Shinya Kitaoka 120a6e
  bool ret = connect(m_progressDialog, SIGNAL(canceled()), m_vectorizer,
Shinya Kitaoka 120a6e
                     SLOT(cancel()));
Shinya Kitaoka 120a6e
  // which eventually transmits the command to vectorization core, allowing
Shinya Kitaoka 120a6e
  // full-time cancels
Shinya Kitaoka 120a6e
  ret = ret && connect(m_progressDialog, SIGNAL(canceled()), m_vectorizer,
Shinya Kitaoka 120a6e
                       SIGNAL(transmitCancel()));
Shinya Kitaoka 120a6e
  // Only after the vectorizer has terminated its process - or got cancelled, we
Shinya Kitaoka 120a6e
  // are allowed
Shinya Kitaoka 120a6e
  // to proceed here.
Shinya Kitaoka 120a6e
  ret = ret && connect(m_vectorizer, SIGNAL(finished()), this,
Shinya Kitaoka 120a6e
                       SLOT(onFinished()), Qt::QueuedConnection);
Shinya Kitaoka 120a6e
  assert(ret);
Shinya Kitaoka 120a6e
Martin van Zijl 9cb413
  std::set<int> newColumnIndices;</int>
Shinya Kitaoka 120a6e
  int newIndexColumn = c1 + 1;
Shinya Kitaoka 120a6e
  for (auto const level : levels) {
Shinya Kitaoka 120a6e
    TXshSimpleLevel *sl = dynamic_cast<txshsimplelevel *="">(level);</txshsimplelevel>
Shinya Kitaoka 120a6e
    if (!sl || !sl->getSimpleLevel() || !isLevelToConvert(sl)) {
Shinya Kitaoka 120a6e
      QString levelName = tr(::to_string(sl->getName()).c_str());
Shinya Kitaoka 120a6e
      QString errorMsg =
Shinya Kitaoka 120a6e
          tr("Cannot convert to vector the current selection.") + levelName;
Shinya Kitaoka 120a6e
      error(errorMsg);
Shinya Kitaoka 120a6e
      continue;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    std::vector<tframeid> fids;</tframeid>
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (isCellSelection)
Shinya Kitaoka 120a6e
      getSelectedFids(fids, sl, r0, c0, r1, c1);
Shinya Kitaoka 120a6e
    else
Shinya Kitaoka 120a6e
      sl->getFids(fids);
Shinya Kitaoka 120a6e
    assert(fids.size() > 0);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    close();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // Re-initialize progress Bar
Shinya Kitaoka 120a6e
    m_progressDialog->setMaximum(fids.size() * 100);
Shinya Kitaoka 120a6e
    m_progressDialog->setValue(0);
Shinya Kitaoka 120a6e
    m_currFrame = 0;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // Re-initialize vectorizer
Shinya Kitaoka 120a6e
    m_vectorizer->setLevel(sl);
Shinya Kitaoka 120a6e
    m_vectorizer->setFids(fids);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // Start vectorizing
Shinya Kitaoka 120a6e
    m_vectorizer->start();
Shinya Kitaoka 120a6e
    m_progressDialog->show();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // Wait the vectorizer...
Shinya Kitaoka 120a6e
    while (!l_quitLoop)
Shinya Kitaoka 120a6e
      QCoreApplication::processEvents(QEventLoop::AllEvents |
Shinya Kitaoka 120a6e
                                      QEventLoop::WaitForMoreEvents);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    l_quitLoop = false;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // Assign output X-sheet cells
Shinya Kitaoka 120a6e
    TXshSimpleLevel *vl = m_vectorizer->getVectorizedLevel();
Shinya Kitaoka 120a6e
    if (isCellSelection && vl) {
Shinya Kitaoka 120a6e
      TXsheet *xsheet = TApp::instance()->getCurrentXsheet()->getXsheet();
Shinya Kitaoka 120a6e
      xsheet->insertColumn(newIndexColumn);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      int r, c;
Shinya Kitaoka 120a6e
      for (c = c0; c <= c1; c++) {
Shinya Kitaoka 120a6e
        for (r = r0; r <= r1; r++) {
Shinya Kitaoka 120a6e
          TXshCell cell = xsheet->getCell(r, c);
Shinya Kitaoka 120a6e
          TXshSimpleLevel *level =
Shinya Kitaoka 120a6e
              (!cell.isEmpty()) ? cell.getSimpleLevel() : 0;
Shinya Kitaoka 120a6e
          if (level != sl) continue;
Shinya Kitaoka 120a6e
          TFrameId curFid = cell.getFrameId();
Shinya Kitaoka 120a6e
          std::vector<tframeid> newFids;</tframeid>
Shinya Kitaoka 120a6e
          vl->getFids(newFids);
Shinya Kitaoka 120a6e
          for (auto const &fid : newFids) {
Shinya Kitaoka 120a6e
            if (fid.getNumber() ==
Shinya Kitaoka 120a6e
                    curFid.getNumber() ||  // Hanno stesso numero di frame
Shinya Kitaoka 120a6e
                (fid.getNumber() == 1 &&
Shinya Kitaoka 120a6e
                 curFid.getNumber() ==
Shinya Kitaoka 120a6e
                     -2))  // La vecchia cella non ha numero di frame
Shinya Kitaoka 120a6e
              xsheet->setCell(r, newIndexColumn, TXshCell(vl, fid));
Shinya Kitaoka 120a6e
          }
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
      }
Martin van Zijl 9cb413
      newColumnIndices.insert(newIndexColumn);
Shinya Kitaoka 120a6e
      newIndexColumn += 1;
Shinya Kitaoka 120a6e
    } else if (vl) {
Shinya Kitaoka 120a6e
      std::vector<tframeid> gomi;</tframeid>
Martin van Zijl 9cb413
      newColumnIndices.insert(scene->getXsheet()->getFirstFreeColumnIndex());
Shinya Kitaoka 120a6e
      scene->getXsheet()->exposeLevel(
Shinya Kitaoka 120a6e
          0, scene->getXsheet()->getFirstFreeColumnIndex(), vl, gomi);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (m_vectorizer->isCanceled()) break;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Martin van Zijl 9cb413
  // Add undo object
Martin van Zijl 9cb413
  if (!m_vectorizer->isCanceled())
Martin van Zijl 9cb413
    ColumnCmd::addConvertToVectorUndo(newColumnIndices);
Martin van Zijl 9cb413
Shinya Kitaoka 120a6e
  m_progressDialog->close();
Shinya Kitaoka 120a6e
  delete m_vectorizer;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TApp::instance()->getCurrentScene()->notifyCastChange();
Shinya Kitaoka 120a6e
  TApp::instance()->getCurrentXsheet()->notifyXsheetChanged();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  return true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void VectorizerPopup::onFinished() { l_quitLoop = true; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void VectorizerPopup::onFrameName(QString frameName) {
Shinya Kitaoka 120a6e
  QString label = tr("Conversion in progress: ") + frameName;
Shinya Kitaoka 120a6e
  m_progressDialog->setLabelText(label);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void VectorizerPopup::onFrameDone(int frameCount) {
Shinya Kitaoka 120a6e
  m_progressDialog->setValue(
Shinya Kitaoka 120a6e
      frameCount * 100);  // 100 multiplier stands for partial progresses
Shinya Kitaoka 120a6e
  m_currFrame = frameCount;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void VectorizerPopup::onPartialDone(int partial, int total) {
Shinya Kitaoka 120a6e
  int value = (m_currFrame + partial / (double)total) * 100.0;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // NOTA: Puo' essere che la seguente non sia vera - dipende dall'ordine di
Shinya Kitaoka 120a6e
  // esecuzione dei segnali
Shinya Kitaoka 120a6e
  // onFrameDone e onPartialDone - se i primi si fanno in massa prima... Puo'
Shinya Kitaoka 120a6e
  // generare uno stack overflow...
Shinya Kitaoka 120a6e
  // NOTA: Non va ancora bene. Cosi' si attenua largamente il problema, ma a
Shinya Kitaoka 120a6e
  // volte puo' ancora succedere.
Shinya Kitaoka 120a6e
  if (value > m_progressDialog->value() + 5 &&
Shinya Kitaoka 120a6e
      value < m_progressDialog->maximum()) {
Shinya Kitaoka 120a6e
    // qDebug("Partial %d of %d;  Value %d of %d", partial, total, value,
Shinya Kitaoka 120a6e
    // m_progressDialog->maximum());
Shinya Kitaoka 120a6e
    m_progressDialog->setValue(value);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  /*else
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 120a6e
if(value != m_progressDialog->value())
Shinya Kitaoka 120a6e
qDebug("ERRORE: VALORE PB= %d; Valore: %d",m_progressDialog->value(),value);
Shinya Kitaoka 120a6e
}*/
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void VectorizerPopup::onOk() { apply(); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//! Copies the pop-up settings into scene settings.
Shinya Kitaoka 120a6e
void VectorizerPopup::updateSceneSettings() {
Shinya Kitaoka 120a6e
  VectorizerParameters *vParams = getParameters();
Shinya Kitaoka 120a6e
  assert(vParams);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  bool outline         = (m_typeMenu->currentIndex() == 1);
Shinya Kitaoka 120a6e
  vParams->m_isOutline = outline;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (outline) {
Shinya Kitaoka 120a6e
    vParams->m_oDespeckling      = m_oDespeckling->getValue();
Shinya Kitaoka 120a6e
    vParams->m_oAccuracy         = m_oAccuracy->getValue();
Shinya Kitaoka 120a6e
    vParams->m_oAdherence        = m_oAdherence->getValue();
Shinya Kitaoka 120a6e
    vParams->m_oAngle            = m_oAngle->getValue();
Shinya Kitaoka 120a6e
    vParams->m_oRelative         = m_oRelative->getValue();
Shinya Kitaoka 120a6e
    vParams->m_oMaxColors        = m_oMaxColors->getValue();
Shinya Kitaoka 120a6e
    vParams->m_oToneThreshold    = m_oToneThreshold->getValue();
Shinya Kitaoka 120a6e
    vParams->m_oTransparentColor = m_oTransparentColor->getColor();
Shinya Kitaoka 120a6e
    vParams->m_oPaintFill        = m_oPaintFill->isChecked();
shun-iwasawa 21f942
    vParams->m_oAlignBoundaryStrokesDirection =
shun-iwasawa 21f942
        m_oAlignBoundaryStrokesDirection->isChecked();
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    vParams->m_cThreshold    = m_cThreshold->getValue();
Shinya Kitaoka 120a6e
    vParams->m_cAccuracy     = m_cAccuracy->getValue();
Shinya Kitaoka 120a6e
    vParams->m_cDespeckling  = m_cDespeckling->getValue();
Shinya Kitaoka 120a6e
    vParams->m_cMaxThickness = m_cMaxThickness->getValue();
Shinya Kitaoka 120a6e
    vParams->m_cThicknessRatioFirst =
Shinya Kitaoka 120a6e
        m_cThicknessRatioFirst->getValue() * 100.0;
Shinya Kitaoka 120a6e
    vParams->m_cThicknessRatioLast = m_cThicknessRatioLast->getValue() * 100.0;
Shinya Kitaoka 120a6e
    vParams->m_cMakeFrame          = m_cMakeFrame->isChecked();
Shinya Kitaoka 120a6e
    vParams->m_cPaintFill          = m_cPaintFill->isChecked();
shun-iwasawa 21f942
    vParams->m_cAlignBoundaryStrokesDirection =
shun-iwasawa 21f942
        m_cAlignBoundaryStrokesDirection->isChecked();
shun-iwasawa 21f942
    vParams->m_cNaaSource = m_cNaaSource->isChecked();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void VectorizerPopup::refreshPopup() { setType(getParameters()->m_isOutline); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void VectorizerPopup::updateVisibility() {
Shinya Kitaoka 120a6e
  struct Locals {
Shinya Kitaoka 120a6e
    QGridLayout *const m_paramsLayout;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    void setVisible(QLayoutItem *item, bool visible) {
Shinya Kitaoka 120a6e
      if (item) {
Shinya Kitaoka 120a6e
        if (QWidget *w = item->widget())
Shinya Kitaoka 120a6e
          w->setVisible(visible);
Shinya Kitaoka 120a6e
        else if (QLayout *l = item->layout()) {
Shinya Kitaoka 120a6e
          int i, iCount = l->count();
Shinya Kitaoka 120a6e
          for (i = 0; i != iCount; ++i) setVisible(l->itemAt(i), visible);
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    void setVisible(int row, bool visible) {
Shinya Kitaoka 120a6e
      int c, cCount = m_paramsLayout->columnCount();
Shinya Kitaoka 120a6e
      for (c = 0; c != cCount; ++c)
Shinya Kitaoka 120a6e
        setVisible(m_paramsLayout->itemAtPosition(row, c), visible);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    void setVisible(const std::vector<paramgroup> ¶mGroups,</paramgroup>
Shinya Kitaoka 120a6e
                    int visibilityBits) {
Shinya Kitaoka 120a6e
      // Iterate parameter groups
Shinya Kitaoka 120a6e
      std::vector<paramgroup>::const_iterator pgt, pgEnd = paramGroups.end();</paramgroup>
Shinya Kitaoka 120a6e
      for (pgt = paramGroups.begin(); pgt != pgEnd; ++pgt) {
Shinya Kitaoka 120a6e
        bool groupVisible = false;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        // Iterate parameters
Shinya Kitaoka 120a6e
        int r, rCount = int(pgt->m_params.size());
Shinya Kitaoka 120a6e
        for (r = 0; r != rCount; ++r) {
Shinya Kitaoka 120a6e
          bool visible = (visibilityBits >> pgt->m_params[r].m_bit) & 1;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
          setVisible(pgt->m_startRow + r, visible);
Shinya Kitaoka 120a6e
          groupVisible = visible | groupVisible;
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        // Finally, set group header's visibility
Shinya Kitaoka 120a6e
        if (pgt->m_separatorRow >= 0)
Shinya Kitaoka 120a6e
          setVisible(pgt->m_separatorRow, groupVisible);
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  } locals = {m_paramsLayout};
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  VectorizerParameters *vParams = getParameters();
Shinya Kitaoka 120a6e
  assert(vParams);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  locals.setVisible(
Shinya Kitaoka 120a6e
      vParams->m_isOutline ? l_outlineParamGroups : l_centerlineParamGroups,
Shinya Kitaoka 120a6e
      vParams->m_visibilityBits);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void VectorizerPopup::onTypeChange(int indexType) {
Shinya Kitaoka 120a6e
  ToonzScene *scene = m_sceneHandle->getScene();
Shinya Kitaoka 120a6e
  if (!scene) return;
Shinya Kitaoka 120a6e
  TSceneProperties *sceneProp = scene->getProperties();
Shinya Kitaoka 120a6e
  if (!sceneProp) return;
Shinya Kitaoka 120a6e
  VectorizerParameters *vectorizerParameters =
Shinya Kitaoka 120a6e
      sceneProp->getVectorizerParameters();
Shinya Kitaoka 120a6e
  if (!vectorizerParameters) return;
Shinya Kitaoka 120a6e
  bool isOutline        = vectorizerParameters->m_isOutline;
Shinya Kitaoka 120a6e
  bool isNewTypeOutline = (indexType == 0) ? false : true;
Shinya Kitaoka 120a6e
  if (isNewTypeOutline == isOutline) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  vectorizerParameters->m_isOutline = isNewTypeOutline;
Shinya Kitaoka 120a6e
  setType(isNewTypeOutline);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_swatchArea->invalidateContents();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void VectorizerPopup::setType(bool outline) {
Shinya Kitaoka 120a6e
  disconnect(m_typeMenu, SIGNAL(currentIndexChanged(int)), this,
Shinya Kitaoka 120a6e
             SLOT(onTypeChange(int)));
Shinya Kitaoka 120a6e
luz paz 6454c4
  // Setting child visibility a lot invokes several layout updates - causing
Shinya Kitaoka 120a6e
  // extensive flickering
Shinya Kitaoka 120a6e
  m_paramsWidget->layout()->setEnabled(false);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  bool centerline = !outline;
Shinya Kitaoka 120a6e
  m_typeMenu->setCurrentIndex((int)outline);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_cThresholdLabel->setVisible(centerline);
Shinya Kitaoka 120a6e
  m_cThreshold->setVisible(centerline);
Shinya Kitaoka 120a6e
  m_cAccuracyLabel->setVisible(centerline);
Shinya Kitaoka 120a6e
  m_cAccuracy->setVisible(centerline);
Shinya Kitaoka 120a6e
  m_cDespecklingLabel->setVisible(centerline);
Shinya Kitaoka 120a6e
  m_cDespeckling->setVisible(centerline);
Shinya Kitaoka 120a6e
  m_cMaxThicknessLabel->setVisible(centerline);
Shinya Kitaoka 120a6e
  m_cMaxThickness->setVisible(centerline);
Shinya Kitaoka 120a6e
  // m_cThicknessRatio->setVisible(centerline);
Shinya Kitaoka 120a6e
  m_cThicknessRatioLabel->setVisible(centerline);
Shinya Kitaoka 120a6e
  m_cThicknessRatioFirstLabel->setVisible(centerline);
Shinya Kitaoka 120a6e
  m_cThicknessRatioFirst->setVisible(centerline);
Shinya Kitaoka 120a6e
  m_cThicknessRatioLastLabel->setVisible(centerline);
Shinya Kitaoka 120a6e
  m_cThicknessRatioLast->setVisible(centerline);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_cPaintFill->setVisible(centerline);
shun-iwasawa 21f942
  m_cAlignBoundaryStrokesDirection->setVisible(centerline);
Shinya Kitaoka 120a6e
  m_cMakeFrame->setVisible(centerline);
Shinya Kitaoka 120a6e
  m_cNaaSourceSeparator->setVisible(centerline);
Shinya Kitaoka 120a6e
  m_cNaaSource->setVisible(centerline);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_oAccuracyLabel->setVisible(outline);
Shinya Kitaoka 120a6e
  m_oAccuracy->setVisible(outline);
Shinya Kitaoka 120a6e
  m_oDespecklingLabel->setVisible(outline);
Shinya Kitaoka 120a6e
  m_oDespeckling->setVisible(outline);
Shinya Kitaoka 120a6e
  m_oPaintFill->setVisible(outline);
shun-iwasawa 21f942
  m_oAlignBoundaryStrokesDirection->setVisible(outline);
Shinya Kitaoka 120a6e
  m_oCornersSeparator->setVisible(outline);
Shinya Kitaoka 120a6e
  m_oAngleLabel->setVisible(outline);
Shinya Kitaoka 120a6e
  m_oAngle->setVisible(outline);
Shinya Kitaoka 120a6e
  m_oAdherenceLabel->setVisible(outline);
Shinya Kitaoka 120a6e
  m_oAdherence->setVisible(outline);
Shinya Kitaoka 120a6e
  m_oRelativeLabel->setVisible(outline);
Shinya Kitaoka 120a6e
  m_oRelative->setVisible(outline);
Shinya Kitaoka 120a6e
  m_oFullColorSeparator->setVisible(outline);
Shinya Kitaoka 120a6e
  m_oMaxColorsLabel->setVisible(outline);
Shinya Kitaoka 120a6e
  m_oMaxColors->setVisible(outline);
Shinya Kitaoka 120a6e
  m_oTransparentColorLabel->setVisible(outline);
Shinya Kitaoka 120a6e
  m_oTransparentColor->setVisible(outline);
Shinya Kitaoka 120a6e
  m_oTlvSeparator->setVisible(outline);
Shinya Kitaoka 120a6e
  m_oToneThresholdLabel->setVisible(outline);
Shinya Kitaoka 120a6e
  m_oToneThreshold->setVisible(outline);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_paramsWidget->layout()->setEnabled(true);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  loadConfiguration(outline);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  connect(m_typeMenu, SIGNAL(currentIndexChanged(int)), this,
Shinya Kitaoka 120a6e
          SLOT(onTypeChange(int)));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  updateVisibility();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
// This is essentially the inverse of the previous one.
Shinya Kitaoka 120a6e
void VectorizerPopup::loadConfiguration(bool isOutline) {
Shinya Kitaoka 120a6e
  disconnect(SIGNAL(valuesChanged()));  // Avoid notifications for value changes
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ToonzScene *scene = m_sceneHandle->getScene();
Shinya Kitaoka 120a6e
  assert(scene);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TSceneProperties *sceneProp = scene->getProperties();
Shinya Kitaoka 120a6e
  assert(sceneProp);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  VectorizerParameters *vParams = sceneProp->getVectorizerParameters();
Shinya Kitaoka 120a6e
  assert(vParams);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  loadRanges(isOutline);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (isOutline) {
Shinya Kitaoka 120a6e
    m_oDespeckling->setValue(vParams->m_oDespeckling);
Shinya Kitaoka 120a6e
    m_oAdherence->setValue(vParams->m_oAdherence);
Shinya Kitaoka 120a6e
    m_oAngle->setValue(vParams->m_oAngle);
Shinya Kitaoka 120a6e
    m_oRelative->setValue(vParams->m_oRelative);
Shinya Kitaoka 120a6e
    m_oAccuracy->setValue(vParams->m_oAccuracy);
Shinya Kitaoka 120a6e
    m_oPaintFill->setChecked(vParams->m_oPaintFill);
shun-iwasawa 21f942
    m_oAlignBoundaryStrokesDirection->setChecked(
shun-iwasawa 21f942
        vParams->m_oAlignBoundaryStrokesDirection);
Shinya Kitaoka 120a6e
    m_oMaxColors->setValue(vParams->m_oMaxColors);
Shinya Kitaoka 120a6e
    m_oTransparentColor->setColor(vParams->m_oTransparentColor);
Shinya Kitaoka 120a6e
    m_oToneThreshold->setValue(vParams->m_oToneThreshold);
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    m_cThreshold->setValue(vParams->m_cThreshold);
Shinya Kitaoka 120a6e
    m_cDespeckling->setValue(vParams->m_cDespeckling);
Shinya Kitaoka 120a6e
    m_cPaintFill->setChecked(vParams->m_cPaintFill);
shun-iwasawa 21f942
    m_cAlignBoundaryStrokesDirection->setChecked(
shun-iwasawa 21f942
        vParams->m_cAlignBoundaryStrokesDirection);
Shinya Kitaoka 120a6e
    m_cMakeFrame->setChecked(vParams->m_cMakeFrame);
Shinya Kitaoka 120a6e
    m_cNaaSource->setChecked(vParams->m_cNaaSource);
Shinya Kitaoka 120a6e
    m_cMaxThickness->setValue(vParams->m_cMaxThickness);
Shinya Kitaoka 120a6e
    m_cAccuracy->setValue(vParams->m_cAccuracy);
Shinya Kitaoka 120a6e
    // m_cThicknessRatio->setValue(vParams->m_cThicknessRatio);
Shinya Kitaoka 120a6e
    m_cThicknessRatioFirst->setValue(vParams->m_cThicknessRatioFirst / 100.0);
Shinya Kitaoka 120a6e
    m_cThicknessRatioLast->setValue(vParams->m_cThicknessRatioLast / 100.0);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Reconnect changes update
Shinya Kitaoka 120a6e
  connect(this, SIGNAL(valuesChanged()), this, SLOT(updateSceneSettings()));
Shinya Kitaoka 120a6e
  connect(this, SIGNAL(valuesChanged()), m_swatchArea,
Shinya Kitaoka 120a6e
          SLOT(invalidateContents()));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_swatchArea->updateContents();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void VectorizerPopup::loadRanges(int outline) {
Shinya Kitaoka 120a6e
  if (outline) {
Shinya Kitaoka 120a6e
    m_oAccuracy->setRange(0, 10);
Shinya Kitaoka 120a6e
    m_oDespeckling->setRange(0, 10);
Shinya Kitaoka 120a6e
    m_oAdherence->setRange(0, 100);
Shinya Kitaoka 120a6e
    m_oAngle->setRange(0, 180);
Shinya Kitaoka 120a6e
    m_oRelative->setRange(0, 100);
Shinya Kitaoka 120a6e
    m_oMaxColors->setRange(1, 256);
Shinya Kitaoka 120a6e
    m_oToneThreshold->setRange(0, 255);
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    m_cThreshold->setRange(1, 10);
Shinya Kitaoka 120a6e
    m_cAccuracy->setRange(1, 10);
Shinya Kitaoka 120a6e
    m_cDespeckling->setRange(1, 10);
Shinya Kitaoka 120a6e
    m_cMaxThickness->setRange(0, (std::numeric_limits<int>::max)());</int>
Shinya Kitaoka 120a6e
    // m_cThicknessRatio->setRange(0,100);
Shinya Kitaoka 120a6e
    m_cThicknessRatioFirst->setRange(0, 1.0);
Shinya Kitaoka 120a6e
    m_cThicknessRatioLast->setRange(0, 1.0);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void VectorizerPopup::showEvent(QShowEvent *se) {
Shinya Kitaoka 120a6e
  refreshPopup();
Shinya Kitaoka 120a6e
  connect(m_sceneHandle, SIGNAL(sceneSwitched()), SLOT(refreshPopup()));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void VectorizerPopup::hideEvent(QHideEvent *he) {
Shinya Kitaoka 120a6e
  refreshPopup();
Shinya Kitaoka 120a6e
  disconnect(m_sceneHandle, SIGNAL(sceneSwitched()), this,
Shinya Kitaoka 120a6e
             SLOT(refreshPopup()));
Shinya Kitaoka 120a6e
  Dialog::hideEvent(he);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void VectorizerPopup::populateVisibilityMenu() {
Shinya Kitaoka 120a6e
  struct Locals {
Shinya Kitaoka 120a6e
    VectorizerPopup *m_this;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    void addActions(QMenu *menu, const std::vector<paramgroup> ¶mGroups,</paramgroup>
Shinya Kitaoka 120a6e
                    int visibilityBits) {
Shinya Kitaoka 120a6e
      std::vector<paramgroup>::const_iterator gt, gEnd = paramGroups.end();</paramgroup>
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      for (gt = paramGroups.begin(); gt != gEnd; ++gt) {
Shinya Kitaoka 120a6e
        if (gt->m_separatorRow >= 0) menu->addSeparator();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        std::vector<param>::const_iterator pt, pEnd = gt->m_params.end();
Shinya Kitaoka 120a6e
        for (pt = gt->m_params.begin(); pt != pEnd; ++pt) {
Shinya Kitaoka 120a6e
          QAction *visibleParam = menu->addAction(pt->m_name);
Shinya Kitaoka 120a6e
          visibleParam->setCheckable(true);
Shinya Kitaoka 120a6e
          visibleParam->setChecked(visibilityBits & (1 << pt->m_bit));
Shinya Kitaoka 120a6e
          visibleParam->setData(pt->m_bit);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
          bool ret = connect(visibleParam, SIGNAL(toggled(bool)), m_this,
Shinya Kitaoka 120a6e
                             SLOT(visibilityToggled()));
Shinya Kitaoka 120a6e
          assert(ret);
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  } locals = {this};
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QMenu *menu = qobject_cast<qmenu *="">(sender());</qmenu>
Shinya Kitaoka 120a6e
  menu->clear();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  VectorizerParameters *vParams = getParameters();
shun-iwasawa 21f942
  locals.addActions(
shun-iwasawa 21f942
      menu,
shun-iwasawa 21f942
      vParams->m_isOutline ? l_outlineParamGroups : l_centerlineParamGroups,
shun-iwasawa 21f942
      vParams->m_visibilityBits);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void VectorizerPopup::visibilityToggled() {
Shinya Kitaoka 120a6e
  QAction *action = qobject_cast<qaction *="">(sender());</qaction>
Shinya Kitaoka 120a6e
  assert(action);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  const QVariant &data = action->data();
Shinya Kitaoka 120a6e
  assert(data.canConvert<int>());</int>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  int row = action->data().toInt();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  VectorizerParameters *vParams = getParameters();
Shinya Kitaoka 120a6e
  vParams->m_visibilityBits ^= (1 << row);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  updateVisibility();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void VectorizerPopup::saveParameters() {
Shinya Kitaoka 120a6e
  struct {
Shinya Kitaoka 120a6e
    VectorizerPopup *m_this;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    static bool vectorizerType(TPersist *persist) {
Shinya Kitaoka 120a6e
      return (dynamic_cast<vectorizerparameters *="">(persist) != 0);</vectorizerparameters>
Shinya Kitaoka 120a6e
    }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    void saveParams(const TFilePath &fp)  // May throw due to I/O failure
Shinya Kitaoka 120a6e
    {
Shinya Kitaoka 120a6e
      // Read the complete file first
Shinya Kitaoka 120a6e
      TPersistSet levelSettings;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      if (TSystem::doesExistFileOrLevel(fp)) {
Shinya Kitaoka 120a6e
        TIStream is(fp);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
        if (!is)
Shinya Kitaoka 120a6e
          throw TException(
Shinya Kitaoka 120a6e
              tr("File could not be opened for read").toStdWString());
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
        is >> levelSettings;
Shinya Kitaoka 120a6e
      }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      // Replace data to be saved
Shinya Kitaoka 120a6e
      VectorizerParameters *params = getCurrentVectorizerParameters();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 2a7129
      levelSettings.insert(
Shinya Kitaoka 2a7129
          std::unique_ptr<tpersist>(new VectorizerParameters(*params)));</tpersist>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      // Save the new settings
Shinya Kitaoka 120a6e
      TOStream os(fp);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      if (!os)
Shinya Kitaoka 120a6e
        throw TException(
Shinya Kitaoka 120a6e
            tr("File could not be opened for write").toStdWString());
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      os << levelSettings;
Shinya Kitaoka 120a6e
    }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  } locals = {this};
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Retrieve current level path
Shinya Kitaoka 120a6e
  TFilePath folder, fileName;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  const TFilePath &levelPath = getSelectedLevelPath();
Shinya Kitaoka 120a6e
  if (!levelPath.isEmpty()) {
Shinya Kitaoka 120a6e
    folder   = levelPath.getParentDir();
Shinya Kitaoka 120a6e
    fileName = TFilePath(levelPath.getWideName()).withType("tnzsettings");
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Open save popup with defaulted path
Shinya Kitaoka 120a6e
  static GenericSaveFilePopup *popup =
Shinya Kitaoka 120a6e
      new GenericSaveFilePopup(tr("Save Vectorizer Parameters"));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  popup->setFilterTypes(QStringList("tnzsettings"));
Shinya Kitaoka 120a6e
  popup->setFolder(folder);
Shinya Kitaoka 120a6e
  popup->setFilename(fileName);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  fileName = popup->getPath();
Shinya Kitaoka 120a6e
  if (!fileName.isEmpty()) {
Shinya Kitaoka 120a6e
    try {
Shinya Kitaoka 120a6e
      locals.saveParams(fileName);
Shinya Kitaoka 120a6e
    } catch (const TException &e) {
Shinya Kitaoka 120a6e
      DVGui::error(QString::fromStdWString(e.getMessage()));
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void VectorizerPopup::loadParameters() {
Shinya Kitaoka 120a6e
  struct {
Shinya Kitaoka 120a6e
    VectorizerPopup *m_this;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    void loadParams(const TFilePath &fp)  // May throw due to I/O failure
Shinya Kitaoka 120a6e
    {
Shinya Kitaoka 120a6e
      TIStream is(fp);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      if (!is)
Shinya Kitaoka 120a6e
        throw TException(
Shinya Kitaoka 120a6e
            tr("File could not be opened for read").toStdWString());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      VectorizerParameters *vParams = getCurrentVectorizerParameters();
Shinya Kitaoka 120a6e
      const std::string &vParamsTag = vParams->getStreamTag();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      std::string tagName;
Shinya Kitaoka 120a6e
      while (is.matchTag(tagName)) {
Shinya Kitaoka 120a6e
        if (tagName == vParamsTag)
Shinya Kitaoka 120a6e
          is >> *vParams, is.matchEndTag();
Shinya Kitaoka 120a6e
        else
Shinya Kitaoka 120a6e
          is.skipCurrentTag();
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  } locals = {this};
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Retrieve current level path
Shinya Kitaoka 120a6e
  TFilePath folder, fileName;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  const TFilePath &levelPath = getSelectedLevelPath();
Shinya Kitaoka 120a6e
  if (!levelPath.isEmpty()) {
Shinya Kitaoka 120a6e
    folder   = levelPath.getParentDir();
Shinya Kitaoka 120a6e
    fileName = TFilePath(levelPath.getWideName()).withType("tnzsettings");
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Open load popup with defaulted path
Shinya Kitaoka 120a6e
  static GenericLoadFilePopup *popup =
Shinya Kitaoka 120a6e
      new GenericLoadFilePopup(tr("Load Vectorizer Parameters"));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  popup->setFilterTypes(QStringList("tnzsettings"));
Shinya Kitaoka 120a6e
  popup->setFolder(folder);
Shinya Kitaoka 120a6e
  popup->setFilename(fileName);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  fileName = popup->getPath();
Shinya Kitaoka 120a6e
  if (!fileName.isEmpty()) {
Shinya Kitaoka 120a6e
    try {
Shinya Kitaoka 120a6e
      locals.loadParams(fileName);
Shinya Kitaoka 120a6e
      refreshPopup();  // Update GUI to reflect changes
Shinya Kitaoka 120a6e
    } catch (const TException &e) {
Shinya Kitaoka 120a6e
      DVGui::error(QString::fromStdWString(e.getMessage()));
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void VectorizerPopup::resetParameters() {
Shinya Kitaoka 120a6e
  *getCurrentVectorizerParameters() = VectorizerParameters();
Shinya Kitaoka 120a6e
  refreshPopup();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
//    VectorizerPopupCommand instantiation
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
OpenPopupCommandHandler<vectorizerpopup> openVectorizerPopup(</vectorizerpopup>
Shinya Kitaoka 120a6e
    MI_ConvertToVectors);