|
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 :
|
|
|
849960 |
bool styleAdded = false;
|
|
Shinya Kitaoka |
120a6e |
std::map<int, int=""> styleTable;</int,>
|
|
|
849960 |
if (TPalette *slPlt = sl->getPalette()) {
|
|
|
849960 |
styleAdded = mergePalette_Overlap(slPlt, imgPlt, keepOriginalPalette);
|
|
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 |
}
|