Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "drawingdata.h"
Toshihiro Shimizu 890ddd
#include "filmstripcommand.h"
Toshihiro Shimizu 890ddd
#include "timagecache.h"
Toshihiro Shimizu 890ddd
#include "tpaletteutil.h"
Toshihiro Shimizu 890ddd
#include "ttoonzimage.h"
Toshihiro Shimizu 890ddd
#include "tvectorimage.h"
Toshihiro Shimizu 890ddd
#include "trasterimage.h"
Toshihiro Shimizu 890ddd
#include "trop.h"
Toshihiro Shimizu 890ddd
#include "tstroke.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/icongenerator.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/dvdialog.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshsimplelevel.h"
Toshihiro Shimizu 890ddd
#include "toonz/toonzimageutils.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshleveltypes.h"
Toshihiro Shimizu 890ddd
#include "toonz/stage.h"
Toshihiro Shimizu 890ddd
#include "toonz/tcenterlinevectorizer.h"
Toshihiro Shimizu 890ddd
#include "toonz/toonzscene.h"
Toshihiro Shimizu 890ddd
#include "toonz/sceneproperties.h"
Toshihiro Shimizu 890ddd
#include "vectorizerpopup.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <qapplication></qapplication>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// DrawingData
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Shinya Kitaoka 120a6e
namespace {
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
// aggiorna gli hook: sono stati inseriti shiftRange (>0) drawings a partire da
Shinya Kitaoka 120a6e
// startFrameId
Toshihiro Shimizu 890ddd
// quindi tutti i riferimenti a frameId >= startFrameId devono essere aggiornati
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void shiftHooks(TXshSimpleLevel *sl, const TFrameId &startFrameId,
Shinya Kitaoka 120a6e
                int shiftRange) {
Shinya Kitaoka 120a6e
  int i, startIndex = sl->guessIndex(startFrameId);
Shinya Kitaoka 120a6e
  assert(startIndex >= 0);
Shinya Kitaoka 120a6e
  if (startIndex < 0) return;
Shinya Kitaoka 120a6e
  HookSet *levelHooks = sl->getHookSet();
Shinya Kitaoka 120a6e
  for (i = sl->getFrameCount() - 1; i >= startIndex + shiftRange; i--) {
Shinya Kitaoka 120a6e
    TFrameId fid     = sl->index2fid(i);
Shinya Kitaoka 120a6e
    TFrameId precFid = sl->index2fid(i - shiftRange);
Shinya Kitaoka 120a6e
    assert(precFid >= startFrameId);
Shinya Kitaoka 120a6e
    if (precFid == TFrameId::NO_FRAME) break;
Shinya Kitaoka 120a6e
    int j, hookCount = levelHooks->getHookCount();
Shinya Kitaoka 120a6e
    for (j = 0; j < hookCount; j++) {
Shinya Kitaoka 120a6e
      Hook *hook = levelHooks->getHook(j);
Shinya Kitaoka 120a6e
      if (hook) {
Shinya Kitaoka 120a6e
        hook->setAPos(fid, hook->getAPos(precFid));
Shinya Kitaoka 120a6e
        hook->setBPos(fid, hook->getBPos(precFid));
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
QString makeCacheId(UINT id, const TFrameId &fid) {
Shinya Kitaoka 120a6e
  return "DrawingData" + QString::number(id) + "-" +
Shinya Kitaoka 120a6e
         QString::number(fid.getNumber());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// frames[] is replaced by a sequence of imageSet.size() consecutive TFrameId's
Toshihiro Shimizu 890ddd
// frames[0] is used to determine the 'pastePosition', i.e. the starting frame
Toshihiro Shimizu 890ddd
// of the new sequence
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void getFrameIdToInsert(std::set<tframeid> &frames, TXshSimpleLevel *sl,</tframeid>
Shinya Kitaoka 120a6e
                        const std::map<tframeid, qstring=""> &imageSet) {</tframeid,>
Shinya Kitaoka 120a6e
  assert(!frames.empty());
Shinya Kitaoka 120a6e
  int count              = (int)imageSet.size();
Shinya Kitaoka 120a6e
  TFrameId pastePosition = *frames.begin();
Shinya Kitaoka 120a6e
  // devo inserire prima di pastePosition. ci puo' essere un "buco".
Shinya Kitaoka 120a6e
  // es: frames=[1,3,5] selected=[3]  => devo inserire in 2 (creando un nuovo
Shinya Kitaoka 120a6e
  // frameid).
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  std::vector<tframeid> fids;</tframeid>
Shinya Kitaoka 120a6e
  sl->getFids(fids);
Shinya Kitaoka 120a6e
  // cerca fids[j] <= pastePosition
Shinya Kitaoka 120a6e
  // fids.beginからfids.endまで、frames.begin()に比べFrameIdが同じか大きいところまでjを進める
Shinya Kitaoka 120a6e
  //要するに、ペースト場所を選択フレーム範囲の一番上の部分にする。
Shinya Kitaoka 120a6e
  std::vector<tframeid>::iterator j =</tframeid>
Shinya Kitaoka 120a6e
      std::lower_bound(fids.begin(), fids.end(), pastePosition);
Shinya Kitaoka 120a6e
  if (j != fids.begin()) {
Shinya Kitaoka 120a6e
    // pastePosition is not the first frameid of the level
Shinya Kitaoka 120a6e
    if (j != fids.end() && frames.find(*j) != frames.end()) {
Shinya Kitaoka 120a6e
      // Se il frameId e' gia' presente nel livello lo modifico.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      --j;
Shinya Kitaoka 120a6e
      pastePosition = *j + 1;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    // pastePosition e' il primo frame (o perche' fids[0]==pastePosition
Shinya Kitaoka 120a6e
    // o perche' pastePosition < fids[j], per ogni j
Shinya Kitaoka 120a6e
    if (pastePosition.getNumber() > 1)
Shinya Kitaoka 120a6e
      pastePosition = TFrameId(pastePosition.getNumber() - 1);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // pastePositionからコピーされたフレームの枚数分framesに挿入する。
Shinya Kitaoka 120a6e
  // frames <- i frames da inserire
Shinya Kitaoka 120a6e
  frames.clear();
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < count; i++) frames.insert(pastePosition + i);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void rasterize(TToonzImageP &target, const TVectorImageP &source,
Shinya Kitaoka 120a6e
               const std::map<int, int=""> &styleTable) {</int,>
Shinya Kitaoka 120a6e
  double dpix, dpiy;
Shinya Kitaoka 120a6e
  target->getDpi(dpix, dpiy);
Shinya Kitaoka 120a6e
  assert(dpix != 0 && dpiy != 0);
Shinya Kitaoka 120a6e
  TScale sc(dpix / Stage::inch, dpiy / Stage::inch);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TRectD bbox = sc * source->getBBox();
Shinya Kitaoka 120a6e
  bbox.x0     = tfloor(bbox.x0);
Shinya Kitaoka 120a6e
  bbox.y0     = tfloor(bbox.y0);
Shinya Kitaoka 120a6e
  bbox.x1     = tceil(bbox.x1);
Shinya Kitaoka 120a6e
  bbox.y1     = tceil(bbox.y1);
Shinya Kitaoka 120a6e
  TDimension size(bbox.getLx(), bbox.getLy());
Shinya Kitaoka 120a6e
  TToonzImageP app = ToonzImageUtils::vectorToToonzImage(
Shinya Kitaoka 120a6e
      source, sc, source->getPalette(), bbox.getP00(), size, 0, true);
Shinya Kitaoka 120a6e
  TRect rBbox = ToonzImageUtils::convertWorldToRaster(bbox, target);
Shinya Kitaoka 120a6e
  target->getCMapped()->copy(app->getCMapped(), rBbox.getP00());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ToonzImageUtils::scrambleStyles(target, styleTable);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void vectorize(TVectorImageP &target, const TToonzImageP &source,
Shinya Kitaoka 120a6e
               const std::map<int, int=""> &styleTable,</int,>
Shinya Kitaoka 120a6e
               const VectorizerConfiguration &config) {
Shinya Kitaoka 120a6e
  VectorizerCore vc;
Shinya Kitaoka 120a6e
  TVectorImageP vi =
Shinya Kitaoka 120a6e
      vc.vectorize(source.getPointer(), config, source->getPalette());
Shinya Kitaoka 120a6e
  assert(vi);
Shinya Kitaoka 120a6e
  vi->setPalette(source->getPalette());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  double dpiX, dpiY;
Shinya Kitaoka 120a6e
  source->getDpi(dpiX, dpiY);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TScale sc(dpiX / Stage::inch, dpiY / Stage::inch);
Shinya Kitaoka 120a6e
  TRect rBox   = source->getCMapped()->getBounds();
Shinya Kitaoka 120a6e
  TRectD wBbox = ToonzImageUtils::convertRasterToWorld(rBox, source);
Shinya Kitaoka 120a6e
  TTranslation tr(wBbox.getP00());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < (int)vi->getStrokeCount(); i++) {
Shinya Kitaoka 120a6e
    TStroke *stroke = vi->getStroke(i);
Shinya Kitaoka 120a6e
    stroke->transform(sc.inv() * tr, true);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  target->mergeImage(vi, TAffine(), styleTable);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
}  // namespace
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
DrawingData *DrawingData::clone() const { return new DrawingData(this); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DrawingData::setLevelFrames(TXshSimpleLevel *sl,
Shinya Kitaoka 120a6e
                                 std::set<tframeid> &frames) {</tframeid>
Shinya Kitaoka 120a6e
  if (!sl || frames.empty()) return;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_level = sl;
Shinya Kitaoka 120a6e
  m_imageSet.clear();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  std::set<tframeid>::iterator it;</tframeid>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  HookSet *levelHooks = m_level->getHookSet();
Shinya Kitaoka 120a6e
  int i, hookCount = levelHooks->getHookCount();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  for (it = frames.begin(); it != frames.end(); ++it) {
Shinya Kitaoka 120a6e
    TFrameId frameId = *it;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    // Retrieve the image to be stored in this instance
Shinya Kitaoka 120a6e
    TImageP img =
Shinya Kitaoka 120a6e
        sl->getFullsampledFrame(  // Subsampling is explicitly removed, here.
Shinya Kitaoka 120a6e
            frameId, ImageManager::dontPutInCache);  // Furthermore, will not
Shinya Kitaoka 120a6e
                                                     // force the IM to cache
Shinya Kitaoka 120a6e
                                                     // it.
Shinya Kitaoka 120a6e
    if (!img) continue;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    // Clone the image and store it in the image cache
Shinya Kitaoka 120a6e
    QString id = makeCacheId(
Jeremy Bullock 3f573c
        (uintptr_t) this,
Shinya Kitaoka 120a6e
        it->getNumber());  // Cloning is necessary since the user may
Shinya Kitaoka 120a6e
    TImageCache::instance()->add(
Shinya Kitaoka 120a6e
        id, img->cloneImage());  // modify and save the original AFTER the copy
Shinya Kitaoka 120a6e
    m_imageSet[frameId] = id;    // has been done.
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    for (i = 0; i < hookCount; i++) {
Shinya Kitaoka 120a6e
      Hook *levelHook = levelHooks->getHook(i);
Shinya Kitaoka 120a6e
      if (!levelHook || levelHook->isEmpty()) continue;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      Hook *copiedHook            = m_levelHooks.getHook(i);
Shinya Kitaoka 120a6e
      if (!copiedHook) copiedHook = m_levelHooks.addHook();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
      copiedHook->setAPos(frameId, levelHook->getAPos(frameId));
Shinya Kitaoka 120a6e
      copiedHook->setBPos(frameId, levelHook->getBPos(frameId));
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// sl <= frames
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// setType = INSERT | OVER_FRAMEID | OVER_SELECTION
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
// paste DrawingData to sl.
Toshihiro Shimizu 890ddd
// frames: selected frames
Shinya Kitaoka 120a6e
// setType : INSERT->InsertPaste,  OVER_FRAMEID->Merge,
Shinya Kitaoka 120a6e
// OVER_SELECTION->PasteInto
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool DrawingData::getLevelFrames(TXshSimpleLevel *sl,
Shinya Kitaoka 120a6e
                                 std::set<tframeid> &frames,</tframeid>
Shinya Kitaoka 120a6e
                                 ImageSetType setType, bool cloneImages,
Shinya Kitaoka 120a6e
                                 bool &keepOriginalPalette, bool isRedo) const {
Shinya Kitaoka 120a6e
  int slType = m_level->getType();
Shinya Kitaoka 120a6e
  if (m_imageSet.empty() || !sl ||
Shinya Kitaoka 120a6e
      (frames.empty() &&
Shinya Kitaoka 120a6e
       setType != DrawingData::OVER_FRAMEID) ||  // If setType == OVER_FRAMEID
Shinya Kitaoka 120a6e
                                                 // ignore frames
Shinya Kitaoka 120a6e
      (sl->getType() != slType &&  // Level types must be compatible...
Shinya Kitaoka 120a6e
       (sl->getType() != TZP_XSHLEVEL ||
Shinya Kitaoka 120a6e
        slType != PLI_XSHLEVEL) &&  // ...unless they are of type PLI and TLV
Shinya Kitaoka 120a6e
       (sl->getType() != PLI_XSHLEVEL || slType != TZP_XSHLEVEL)))  //
Shinya Kitaoka 120a6e
    return false;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (m_level.getPointer() == sl || isRedo) {
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  // when pasting the frame to different level
Shinya Kitaoka 120a6e
  else {
Shinya Kitaoka 120a6e
    QString question;
Shinya Kitaoka 120a6e
    question = "Replace palette ?";
Shinya Kitaoka 120a6e
    int ret  = DVGui::MsgBox(
Shinya Kitaoka 120a6e
        question, QObject::tr("Replace with copied palette"),
Shinya Kitaoka 120a6e
        QObject::tr("Keep original palette"), QObject::tr("Cancel"), 0);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (ret == 0 || ret == 3)
Shinya Kitaoka 120a6e
      return false;
Shinya Kitaoka 120a6e
    else if (ret == 1)
Shinya Kitaoka 120a6e
      keepOriginalPalette = false;
Shinya Kitaoka 120a6e
    else
Shinya Kitaoka 120a6e
      keepOriginalPalette = true;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QApplication::setOverrideCursor(Qt::WaitCursor);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // oldFids = old frame ids
Shinya Kitaoka 120a6e
  // renumberTable = old -> new
Shinya Kitaoka 120a6e
  // framesToInsert = new frames
Shinya Kitaoka 120a6e
  std::vector<tframeid> oldFids;</tframeid>
Shinya Kitaoka 120a6e
  sl->getFids(oldFids);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  std::set<tframeid> framesToInsert;</tframeid>
Shinya Kitaoka 120a6e
  if (setType == INSERT) {
Shinya Kitaoka 120a6e
    framesToInsert = frames;
Shinya Kitaoka 120a6e
    getFrameIdToInsert(framesToInsert, sl, m_imageSet);
Shinya Kitaoka 120a6e
    // faccio posto (se serve)
Shinya Kitaoka 120a6e
    makeSpaceForFids(sl, framesToInsert);
Shinya Kitaoka 120a6e
    assert(sl->getFrameCount() == (int)oldFids.size());
Shinya Kitaoka 120a6e
  } else if (setType == OVER_SELECTION)
Shinya Kitaoka 120a6e
    framesToInsert = frames;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  frames.clear();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  std::map<tframeid, qstring=""> usedImageSet;</tframeid,>
Shinya Kitaoka 120a6e
  TPaletteP imgPlt;
Shinya Kitaoka 120a6e
  // selected frames
Shinya Kitaoka 120a6e
  std::set<tframeid>::iterator it = framesToInsert.begin();</tframeid>
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Preprocessing to keep used styles
Shinya Kitaoka 120a6e
  for (auto const &image : m_imageSet) {
Shinya Kitaoka 120a6e
    QString imageId = image.second;
Shinya Kitaoka 120a6e
    // paste destination
Shinya Kitaoka 120a6e
    TFrameId frameId;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // merge
Shinya Kitaoka 120a6e
    if (setType == OVER_FRAMEID)  // If setType == OVER_FRAMEID ignore frames
Shinya Kitaoka 120a6e
      frameId = image.first;
Shinya Kitaoka 120a6e
    else {
Shinya Kitaoka 120a6e
      // if type == OVER_SELECTION, pasting ends at the end of selected range
Shinya Kitaoka 120a6e
      if (it == framesToInsert.end())
Shinya Kitaoka 120a6e
        continue;  // If setType == INSERT this is not possible.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      frameId = *it;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    frames.insert(frameId);
Shinya Kitaoka 120a6e
    usedImageSet[frameId] = imageId;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (!imgPlt.getPointer()) {
Shinya Kitaoka 120a6e
      TImageP img     = TImageCache::instance()->get(imageId, false);
Shinya Kitaoka 120a6e
      if (img) imgPlt = img->getPalette();
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (setType != OVER_FRAMEID) ++it;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Merge Palette :
Shinya Kitaoka 120a6e
  TPalette *slPlt = sl->getPalette();
Shinya Kitaoka 120a6e
  bool styleAdded = mergePalette_Overlap(slPlt, imgPlt, keepOriginalPalette);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  std::map<int, int=""> styleTable;</int,>
justburner 85c12a
  if (slPlt) {
justburner 85c12a
    for (int s = 0; s < slPlt->getStyleCount(); s++) styleTable[s] = s;
justburner 85c12a
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Merge Image
Shinya Kitaoka 120a6e
  for (auto const &image : usedImageSet) {
Shinya Kitaoka 120a6e
    QString imageId = image.second;
Jeremy Bullock 3f573c
    TImageP img     = getImage(imageId, sl, styleTable, m_keepVectorFills);
Shinya Kitaoka 120a6e
    if (!cloneImages) TImageCache::instance()->remove(imageId);
Shinya Kitaoka 120a6e
    sl->setFrame(image.first, cloneImages ? img->cloneImage() : img);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // merge Hooks
Shinya Kitaoka 120a6e
  HookSet *levelHooks = sl->getHookSet();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  int hookCount = m_levelHooks.getHookCount();
Shinya Kitaoka 120a6e
  // shiftHooks(sl,usedImageSet.begin()->first,framesToInsert.size());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  auto frameIt = m_imageSet.begin();
Shinya Kitaoka 120a6e
  for (auto const &image : usedImageSet) {
Shinya Kitaoka 120a6e
    for (int i = 0; i < hookCount; i++) {
Shinya Kitaoka 120a6e
      Hook *levelHook           = levelHooks->getHook(i);
Shinya Kitaoka 120a6e
      if (!levelHook) levelHook = levelHooks->addHook();
Shinya Kitaoka 120a6e
      Hook *copiedHook          = m_levelHooks.getHook(i);
Shinya Kitaoka 120a6e
      assert(copiedHook);
Shinya Kitaoka 120a6e
      levelHook->setAPos(image.first, copiedHook->getAPos((*frameIt).first));
Shinya Kitaoka 120a6e
      levelHook->setBPos(image.first, copiedHook->getBPos((*frameIt).first));
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    ++frameIt;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  sl->setDirtyFlag(true);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // notify if there are any modifications to the palette
Shinya Kitaoka 120a6e
  if (styleAdded && !isRedo) {
Shinya Kitaoka 120a6e
    QString message;
Shinya Kitaoka 120a6e
    if (keepOriginalPalette)
Shinya Kitaoka 120a6e
      message = "NOTICE: Some styles were added from copied palette.";
Shinya Kitaoka 120a6e
    else
Shinya Kitaoka 120a6e
      message = "NOTICE: Some styles were added from original palette.";
Shinya Kitaoka 120a6e
    DVGui::info(message);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QApplication::restoreOverrideCursor();
Shinya Kitaoka 120a6e
  return true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TImageP DrawingData::getImage(QString imageId, TXshSimpleLevel *sl,
Jeremy Bullock 3f573c
                              const std::map<int, int=""> &styleTable,</int,>
Jeremy Bullock 3f573c
                              bool keepVectorFills) const {
Shinya Kitaoka 120a6e
  TImageP img = TImageCache::instance()->get(imageId, false);
Shinya Kitaoka 120a6e
  int slType  = m_level->getType();
Shinya Kitaoka 120a6e
  if (TToonzImageP ti = img) {
Shinya Kitaoka 120a6e
    assert(slType == PLI_XSHLEVEL || slType == TZP_XSHLEVEL);
Shinya Kitaoka 120a6e
    TImageP slImg = sl->createEmptyFrame();
Shinya Kitaoka 120a6e
    slImg->setPalette(sl->getPalette());
Shinya Kitaoka 120a6e
    // raster -> raster
Shinya Kitaoka 120a6e
    if (sl->getType() == TZP_XSHLEVEL) {
Shinya Kitaoka 120a6e
      TToonzImageP slTi = slImg;
Shinya Kitaoka 120a6e
      // Immagine di appoggio per effettuare lo scramble
Shinya Kitaoka 120a6e
      TToonzImageP newImg = ti->clone();
Shinya Kitaoka 120a6e
      ToonzImageUtils::scrambleStyles(newImg, styleTable);
Shinya Kitaoka 120a6e
      TRasterCM32P slRaster  = slTi->getRaster();
Shinya Kitaoka 120a6e
      TRasterCM32P imgRaster = newImg->getRaster();
Shinya Kitaoka 120a6e
      TRop::over(slRaster, imgRaster, TTranslation(slRaster->getCenterD() -
Shinya Kitaoka 120a6e
                                                   imgRaster->getCenterD()));
Shinya Kitaoka 120a6e
      TRect savebox;
Shinya Kitaoka 120a6e
      TRop::computeBBox(slTi->getRaster(), savebox);
Shinya Kitaoka 120a6e
      slTi->setSavebox(savebox);
Shinya Kitaoka 120a6e
      img = slTi;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    // raster -> vector
Shinya Kitaoka 120a6e
    else if (sl->getType() == PLI_XSHLEVEL) {
Shinya Kitaoka 120a6e
      TVectorImageP slVi = slImg;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      ToonzScene *scene = sl->getScene();
Shinya Kitaoka 120a6e
      assert(scene);
Shinya Kitaoka 120a6e
Shinya Kitaoka 2a7129
      std::unique_ptr<vectorizerconfiguration> config(</vectorizerconfiguration>
Shinya Kitaoka 120a6e
          scene->getProperties()
Shinya Kitaoka 120a6e
              ->getVectorizerParameters()
Shinya Kitaoka 120a6e
              ->getCurrentConfiguration(0.0));
Jeremy Bullock 3f573c
      bool leaveUnpainted                           = config->m_leaveUnpainted;
Jeremy Bullock 3f573c
      if (keepVectorFills) config->m_leaveUnpainted = false;
Shinya Kitaoka 120a6e
      vectorize(slVi, ti, styleTable, *config);
Jeremy Bullock 3f573c
      config->m_leaveUnpainted = leaveUnpainted;
Jeremy Bullock 3f573c
      img                      = slVi;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  } else if (TVectorImageP vi = img) {
Shinya Kitaoka 120a6e
    assert(slType == PLI_XSHLEVEL || slType == TZP_XSHLEVEL);
Shinya Kitaoka 120a6e
    TImageP slImg = sl->createEmptyFrame();
Shinya Kitaoka 120a6e
    slImg->setPalette(sl->getPalette());
Shinya Kitaoka 120a6e
    // vector -> vector
Shinya Kitaoka 120a6e
    if (sl->getType() == PLI_XSHLEVEL) {
Shinya Kitaoka 120a6e
      TVectorImageP slVi = slImg;
Shinya Kitaoka 120a6e
      slVi->mergeImage(vi, TAffine(), styleTable);
Shinya Kitaoka 120a6e
      img = slVi;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    // vector -> raster
Shinya Kitaoka 120a6e
    else if (sl->getType() == TZP_XSHLEVEL) {
Shinya Kitaoka 120a6e
      TToonzImageP slTi = slImg;
Shinya Kitaoka 120a6e
      rasterize(slTi, vi, styleTable);
Shinya Kitaoka 120a6e
      TRect savebox;
Shinya Kitaoka 120a6e
      TRop::computeBBox(slTi->getRaster(), savebox);
Shinya Kitaoka 120a6e
      slTi->setSavebox(savebox);
Shinya Kitaoka 120a6e
      img = slTi;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  return img;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DrawingData::setFrames(const std::map<tframeid, qstring=""> &imageSet,</tframeid,>
Shinya Kitaoka 120a6e
                            TXshSimpleLevel *level, const HookSet &levelHooks) {
Shinya Kitaoka 120a6e
  m_levelHooks = levelHooks;
Shinya Kitaoka 120a6e
  m_imageSet.clear();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  assert(!imageSet.empty());
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_imageSet = imageSet;
Shinya Kitaoka 120a6e
  m_level    = level;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DrawingData::getFrames(std::set<tframeid> &frames) const {</tframeid>
Shinya Kitaoka 120a6e
  for (auto const &image : m_imageSet) frames.insert(image.first);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
DrawingData::~DrawingData() {
luz paz 6454c4
  // cannot do that here! if you have cloned this class, the images in the cache
Shinya Kitaoka 120a6e
  // are still used...
Shinya Kitaoka 120a6e
  // int i;
Shinya Kitaoka 120a6e
  // for(i=0; i
Shinya Kitaoka 120a6e
  //  TImageCache::instance()->remove(m_imageSet[i]);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DrawingData::releaseData() {
Shinya Kitaoka 120a6e
  // do it when you're sure you no t need images anymore... (for example in an
luz paz 5d417b
  // undo destructor)
Shinya Kitaoka 120a6e
  // int i;
Shinya Kitaoka 120a6e
  // for(i=0; i
Shinya Kitaoka 120a6e
  //  TImageCache::instance()->remove(m_imageSet[i]);
Toshihiro Shimizu 890ddd
}