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
//---------------------------------------------------------