|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "scanlist.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tapp.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/txsheet.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/txshcell.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/txshsimplelevel.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/txshleveltypes.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/levelproperties.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/toonzscene.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/fullcolorpalette.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/palettecontroller.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tpalettehandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "cellselection.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/observer.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "trasterimage.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tsystem.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tlevel_io.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tiio.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tconvert.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "timagecache.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tscenehandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonzqt/icongenerator.h"
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
ScanListFrame::ScanListFrame() : m_xl(0) {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
ScanListFrame::ScanListFrame(TXshSimpleLevel *xl, const TFrameId &fid)
|
|
Shinya Kitaoka |
120a6e |
: m_xl(xl), m_fid(fid) {
|
|
Shinya Kitaoka |
120a6e |
if (m_xl) m_xl->addRef();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
ScanListFrame::~ScanListFrame() {
|
|
Shinya Kitaoka |
120a6e |
if (m_xl) m_xl->release();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
ScanListFrame::ScanListFrame(const ScanListFrame &src)
|
|
Shinya Kitaoka |
120a6e |
: m_xl(src.m_xl), m_fid(src.m_fid) {
|
|
Shinya Kitaoka |
120a6e |
if (m_xl) m_xl->addRef();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
ScanListFrame &ScanListFrame::operator=(const ScanListFrame &src) {
|
|
Shinya Kitaoka |
120a6e |
ScanListFrame tmp(*this);
|
|
otakuto |
ed7dcd |
std::swap(m_xl, tmp.m_xl);
|
|
otakuto |
ed7dcd |
std::swap(m_fid, tmp.m_fid);
|
|
Shinya Kitaoka |
120a6e |
return *this;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
std::wstring ScanListFrame::getName() const {
|
|
Shinya Kitaoka |
120a6e |
if (!m_xl) return L"";
|
|
Shinya Kitaoka |
120a6e |
TFilePath fp = TFilePath(getLevelName()).withFrame(m_fid);
|
|
Shinya Kitaoka |
120a6e |
return fp.getWideString();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
std::wstring ScanListFrame::getLevelName() const {
|
|
Shinya Kitaoka |
120a6e |
return m_xl ? m_xl->getName() : L"";
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TFrameId ScanListFrame::getFrameId() const { return m_fid; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void ScanListFrame::setRasterImage(const TRasterImageP &ras, bool isBW) const {
|
|
Shinya Kitaoka |
120a6e |
if (!m_xl) return;
|
|
Shinya Kitaoka |
120a6e |
LevelProperties *lprop = m_xl->getProperties();
|
|
Shinya Kitaoka |
120a6e |
if (lprop->getImageDpi() == TPointD()) {
|
|
Shinya Kitaoka |
120a6e |
double dpix = 0, dpiy = 0;
|
|
Shinya Kitaoka |
120a6e |
ras->getDpi(dpix, dpiy);
|
|
Shinya Kitaoka |
120a6e |
lprop->setImageDpi(TPointD(dpix, dpiy));
|
|
Shinya Kitaoka |
120a6e |
lprop->setImageRes(ras->getRaster()->getSize());
|
|
Shinya Kitaoka |
120a6e |
lprop->setDpiPolicy(LevelProperties::DP_ImageDpi);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
lprop->setBpp(isBW ? 1 : 8 * ras->getRaster()->getPixelSize());
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene();
|
|
Shinya Kitaoka |
120a6e |
TFilePath path = m_xl->getPath();
|
|
Shinya Kitaoka |
120a6e |
if (m_xl->getScannedPath() != TFilePath()) path = m_xl->getScannedPath();
|
|
Shinya Kitaoka |
120a6e |
path = scene->decodeFilePath(path);
|
|
Shinya Kitaoka |
120a6e |
TSystem::touchParentDir(path);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TLevelWriterP lw(path);
|
|
Shinya Kitaoka |
120a6e |
TImageWriterP iw = lw->getFrameWriter(m_fid);
|
|
Shinya Kitaoka |
120a6e |
TPropertyGroup *pg = Tiio::makeWriterProperties(path.getType());
|
|
Shinya Kitaoka |
120a6e |
TEnumProperty *prop = (TEnumProperty *)(pg->getProperty("Bits Per Pixel"));
|
|
Shinya Kitaoka |
120a6e |
if (prop) {
|
|
Shinya Kitaoka |
120a6e |
std::wstring pixelSizeW = prop->getValue().substr(0, 2);
|
|
Shinya Kitaoka |
120a6e |
int ps = ras->getRaster()->getPixelSize();
|
|
Shinya Kitaoka |
120a6e |
const std::vector<std::wstring> &range = prop->getRange();</std::wstring>
|
|
Shinya Kitaoka |
120a6e |
if (isBW)
|
|
Shinya Kitaoka |
120a6e |
prop->setValue(range[2]);
|
|
Shinya Kitaoka |
120a6e |
else {
|
|
Shinya Kitaoka |
120a6e |
for (int i = 0; i < (int)range.size(); i++) {
|
|
Shinya Kitaoka |
120a6e |
int bpp = std::stoi(::to_string(range[i]).substr(0, 2));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#ifdef LINETEST
|
|
Shinya Kitaoka |
120a6e |
if (bpp == ps * 8)
|
|
Toshihiro Shimizu |
890ddd |
#else
|
|
Shinya Kitaoka |
120a6e |
if ((bpp == 24 && ps == 4) || (bpp == ps * 8))
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Shinya Kitaoka |
120a6e |
{
|
|
Shinya Kitaoka |
120a6e |
prop->setValue(range[i]);
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
iw->setProperties(pg);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
iw->save(ras.getPointer());
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (m_xl->getScannedPath() != TFilePath())
|
|
Shinya Kitaoka |
120a6e |
m_xl->setFrameStatus(m_fid, TXshSimpleLevel::Scanned);
|
|
Shinya Kitaoka |
120a6e |
std::string imageId = m_xl->getImageId(m_fid);
|
|
Shinya Kitaoka |
120a6e |
TImageCache::instance()->remove(imageId);
|
|
Shinya Kitaoka |
120a6e |
m_xl->setFrame(m_fid, ras.getPointer());
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (!m_xl->getPalette()) {
|
|
Shinya Kitaoka |
120a6e |
TPalette *p = FullColorPalette::instance()->getPalette(scene);
|
|
Shinya Kitaoka |
120a6e |
m_xl->setPalette(p);
|
|
Shinya Kitaoka |
120a6e |
TApp::instance()
|
|
Shinya Kitaoka |
120a6e |
->getPaletteController()
|
|
Shinya Kitaoka |
120a6e |
->getCurrentLevelPalette()
|
|
Shinya Kitaoka |
120a6e |
->setPalette(p);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TXshSimpleLevel *sl = m_xl->getSimpleLevel();
|
|
Shinya Kitaoka |
120a6e |
if (sl) {
|
|
Shinya Kitaoka |
120a6e |
IconGenerator::instance()->invalidate(sl, m_fid);
|
|
Shinya Kitaoka |
120a6e |
IconGenerator::instance()->invalidateSceneIcon();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TNotifier::instance()->notify(TXsheetChange());
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// TDrawingView::notify(level->frame(fid));
|
|
Shinya Kitaoka |
120a6e |
TNotifier::instance()->notify(TDrawingChange(m_xl, m_fid));
|
|
Shinya Kitaoka |
120a6e |
TNotifier::instance()->notify(TColumnHeadChange());
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=========================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
ScanList::ScanList() {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void ScanList::addFrame(const ScanListFrame &frame) {
|
|
Shinya Kitaoka |
120a6e |
m_frames.push_back(frame);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int ScanList::getFrameCount() const { return m_frames.size(); }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
const ScanListFrame &ScanList::getFrame(int index) const {
|
|
Shinya Kitaoka |
120a6e |
assert(0 <= index && index < getFrameCount());
|
|
Shinya Kitaoka |
120a6e |
return m_frames[index];
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=========================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
namespace {
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
typedef std::set<std::pair<txshsimplelevel *,="" tframeid="">> Cells;</std::pair<txshsimplelevel>
|
|
Toshihiro Shimizu |
890ddd |
typedef std::vector<txshsimplelevel *=""> Levels;</txshsimplelevel>
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void getCells(Cells &cells, Levels &levels, bool includeScannedFrames) {
|
|
Shinya Kitaoka |
120a6e |
TApp *app = TApp::instance();
|
|
Shinya Kitaoka |
120a6e |
ToonzScene *scene = app->getCurrentScene()->getScene();
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = scene->getXsheet();
|
|
Shinya Kitaoka |
120a6e |
TCellSelection *selection =
|
|
Shinya Kitaoka |
120a6e |
dynamic_cast<tcellselection *="">(TSelection::getCurrent());</tcellselection>
|
|
Shinya Kitaoka |
120a6e |
if (!selection) return;
|
|
Shinya Kitaoka |
120a6e |
int r0, c0, r1, c1;
|
|
Shinya Kitaoka |
120a6e |
selection->getSelectedCells(r0, c0, r1, c1);
|
|
Shinya Kitaoka |
120a6e |
TRect rect = TRect(c0, r0, c1, r1); // selRect = selection->getRect();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
std::set<txshsimplelevel *=""> visitedlevel;</txshsimplelevel>
|
|
Shinya Kitaoka |
120a6e |
for (int c = rect.x0; c <= rect.x1; c++)
|
|
Shinya Kitaoka |
120a6e |
for (int r = rect.y0; r <= rect.y1; r++) {
|
|
Shinya Kitaoka |
120a6e |
TXshCell cell = xsh->getCell(r, c);
|
|
Shinya Kitaoka |
120a6e |
TXshSimpleLevel *xl = cell.getSimpleLevel();
|
|
Shinya Kitaoka |
120a6e |
if (xl) {
|
|
Shinya Kitaoka |
120a6e |
if (xl->getType() != TZI_XSHLEVEL && xl->getType() != OVL_XSHLEVEL &&
|
|
Shinya Kitaoka |
120a6e |
xl->getType() != TZP_XSHLEVEL)
|
|
Shinya Kitaoka |
120a6e |
continue;
|
|
Shinya Kitaoka |
120a6e |
if (!visitedlevel.count(xl)) {
|
|
Shinya Kitaoka |
120a6e |
visitedlevel.insert(xl);
|
|
Shinya Kitaoka |
120a6e |
levels.push_back(xl);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
TFrameId fid = cell.m_frameId;
|
|
Shinya Kitaoka |
120a6e |
if (includeScannedFrames || !xl->getFrame(fid, false)) {
|
|
Shinya Kitaoka |
120a6e |
cells.insert(std::make_pair(xl, fid));
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//---------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
} // namespace
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//---------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
bool ScanList::areScannedFramesSelected() {
|
|
Shinya Kitaoka |
120a6e |
Cells cells;
|
|
Shinya Kitaoka |
120a6e |
Levels levels;
|
|
Shinya Kitaoka |
120a6e |
getCells(cells, levels, true);
|
|
Shinya Kitaoka |
120a6e |
Cells::iterator it;
|
|
Shinya Kitaoka |
120a6e |
for (it = cells.begin(); it != cells.end(); ++it) {
|
|
Shinya Kitaoka |
120a6e |
assert(it->first);
|
|
Shinya Kitaoka |
120a6e |
if (it->first->getFrame(it->second, false)) return true;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
return false;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//---------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void ScanList::update(bool includeScannedFrames) {
|
|
Shinya Kitaoka |
120a6e |
m_frames.clear();
|
|
Shinya Kitaoka |
120a6e |
Cells cells;
|
|
Shinya Kitaoka |
120a6e |
Levels levels;
|
|
Shinya Kitaoka |
120a6e |
getCells(cells, levels, includeScannedFrames);
|
|
Shinya Kitaoka |
120a6e |
if (cells.empty()) return;
|
|
Shinya Kitaoka |
120a6e |
Levels::iterator lit;
|
|
Shinya Kitaoka |
120a6e |
for (lit = levels.begin(); lit != levels.end(); ++lit) {
|
|
Shinya Kitaoka |
120a6e |
Cells::iterator it;
|
|
Shinya Kitaoka |
120a6e |
for (it = cells.begin(); it != cells.end(); ++it)
|
|
Shinya Kitaoka |
120a6e |
if (*lit == it->first)
|
|
Shinya Kitaoka |
120a6e |
m_frames.push_back(ScanListFrame(it->first, it->second));
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------
|