tahoma2d/toonz/sources/image/psd/tiio_psd.cpp

209 lines
6.5 KiB
C++
Raw Normal View History

2016-03-19 06:57:51 +13:00
#include "tiio_psd.h"
#include "trasterimage.h"
#include "timageinfo.h"
2016-06-02 22:28:29 +12:00
#if (defined(x64) || defined(__LP64__))
#include "toonz/preferences.h"
#include <QtCore>
2016-06-02 22:28:29 +12:00
#endif
2016-03-19 06:57:51 +13:00
// forward declaration
2016-06-15 18:43:10 +12:00
// class TImageReaderLayerPsd;
2016-03-19 06:57:51 +13:00
// if path = :
2016-04-26 19:39:20 +12:00
// filename.psd to load float image. TLevel frames number is 1
2016-06-15 18:43:10 +12:00
// filename#layerId.psd to load only one psd layer from layerId. TLevel
// frames number is 1
// filename#layerId#frames.psd to load only one psd layer from layerId. TLevel
// frames number is psd layers number
// filename#layerId#group.psd to load only one psd layer from layerId. TLevel
// frames number is psd layers folder number
2016-04-26 19:39:20 +12:00
// where fodler is the folder belongs psd layer.
2016-03-19 06:57:51 +13:00
TLevelReaderPsd::TLevelReaderPsd(const TFilePath &path)
2016-06-15 18:43:10 +12:00
: TLevelReader(path), m_path(path), m_layerId(0) {
m_psdreader = new TPSDReader(m_path);
TPSDHeaderInfo header = m_psdreader->getPSDHeaderInfo();
m_lx = header.cols;
m_ly = header.rows;
m_layersCount = header.layersCount;
// set m_info
m_info = new TImageInfo();
m_info->m_lx = m_lx;
m_info->m_ly = m_ly;
m_info->m_dpix = header.hres;
m_info->m_dpiy = header.vres;
m_info->m_bitsPerSample = header.depth;
m_info->m_samplePerPixel = header.channels;
QString name = m_path.getName().c_str();
QStringList list = name.split("#");
if (list.size() >= 2) {
// There's a layer id, otherwise the level is loaded in FLAT mode
const QString &layerStr = list.at(1);
2016-03-19 06:57:51 +13:00
#ifdef REF_LAYER_BY_NAME
2016-06-15 18:43:10 +12:00
#if (defined(x64) || defined(__LP64__))
if (layerStr != "frames") {
QTextCodec *layerNameCodec = QTextCodec::codecForName(
Preferences::instance()->getLayerNameEncoding().c_str());
TPSDParser psdparser(m_path);
m_layerId = psdparser.getLevelIdByName(
layerNameCodec->fromUnicode(layerStr).toStdString());
} else {
m_layerId = layerStr.toInt();
}
#endif
2016-03-19 06:57:51 +13:00
#else
2016-06-15 18:43:10 +12:00
m_layerId = layerName.toInt();
2016-03-19 06:57:51 +13:00
#endif
2016-06-15 18:43:10 +12:00
}
2016-03-19 06:57:51 +13:00
}
//------------------------------------------------
2016-06-15 18:43:10 +12:00
TLevelReaderPsd::~TLevelReaderPsd() { delete m_psdreader; }
2016-03-19 06:57:51 +13:00
//------------------------------------------------
2016-06-15 18:43:10 +12:00
void TLevelReaderPsd::load(TRasterImageP &rasP, int shrinkX, int shrinkY,
TRect region) {
QMutexLocker sl(&m_mutex);
TRasterImageP img;
m_psdreader->setShrink(shrinkX, shrinkY);
m_psdreader->setRegion(region);
m_psdreader->load(img, m_layerId); // if layerId==0 load Merged
rasP = img;
2016-03-19 06:57:51 +13:00
}
2016-06-15 18:43:10 +12:00
TLevelP TLevelReaderPsd::loadInfo() {
TPSDParser *psdparser = new TPSDParser(m_path);
assert(m_layerId >= 0);
int framesCount = psdparser->getFramesCount(m_layerId);
TLevelP level;
level->setName(psdparser->getLevelName(m_layerId));
m_frameTable.clear();
for (int i = 0; i < framesCount; i++) {
TFrameId frame(i + 1);
m_frameTable.insert(
std::make_pair(frame, psdparser->getFrameId(m_layerId, i)));
level->setFrame(frame, TImageP());
}
return level;
2016-03-19 06:57:51 +13:00
}
//------------------------------------------------
2016-06-15 18:43:10 +12:00
TLevelReader *TLevelReaderPsd::create(const TFilePath &f) {
TLevelReaderPsd *reader = new TLevelReaderPsd(f);
return reader;
2016-03-19 06:57:51 +13:00
}
//-----------------------------------------------------------
// TImageReaderLayerPsd
//-----------------------------------------------------------
2016-06-15 18:43:10 +12:00
class TImageReaderLayerPsd : public TImageReader {
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
TImageReaderLayerPsd(const TFilePath &, int layerId, TLevelReaderPsd *lr,
TImageInfo *info);
~TImageReaderLayerPsd() { m_lr->release(); }
2016-03-19 06:57:51 +13:00
private:
2016-06-15 18:43:10 +12:00
// not implemented
TImageReaderLayerPsd(const TImageReaderLayerPsd &);
TImageReaderLayerPsd &operator=(const TImageReaderLayerPsd &src);
2016-03-19 06:57:51 +13:00
public:
2016-06-19 20:06:29 +12:00
TImageP load() override;
2016-03-19 06:57:51 +13:00
2016-06-19 20:06:29 +12:00
const TImageInfo *getImageInfo() const override { return m_info; }
2016-03-19 06:57:51 +13:00
private:
2016-06-15 18:43:10 +12:00
TPSDReader *m_psdreader;
TLevelReaderPsd *m_lr;
TImageInfo *m_info;
int m_layerId;
2016-03-19 06:57:51 +13:00
};
2016-06-15 18:43:10 +12:00
TImageReaderLayerPsd::TImageReaderLayerPsd(const TFilePath &path, int layerId,
TLevelReaderPsd *lr,
TImageInfo *info)
: TImageReader(path), m_lr(lr), m_layerId(layerId), m_info(info) {
m_lr->setLayerId(layerId);
m_lr->addRef();
2016-03-19 06:57:51 +13:00
}
2016-06-15 18:43:10 +12:00
TImageP TImageReaderLayerPsd::load() {
TRasterImageP rasP;
m_lr->load(rasP, m_shrink, m_shrink, m_region);
return TRasterImageP(rasP);
2016-03-19 06:57:51 +13:00
}
2016-06-15 18:43:10 +12:00
TImageReaderP TLevelReaderPsd::getFrameReader(TFrameId fid) {
int layerId = m_frameTable[fid];
TImageReaderLayerPsd *ir =
new TImageReaderLayerPsd(m_path, layerId, this, m_info);
return TImageReaderP(ir);
2016-03-19 06:57:51 +13:00
}
//------------------------------------------------------------------------------
// TImageWriterPsd
//------------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
class TImageWriterPsd : public TImageWriter {
int m_layerId;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
TImageWriterPsd(const TFilePath &, int frameIndex, TLevelWriterPsd *);
~TImageWriterPsd() { m_lwm->release(); }
2016-03-19 06:57:51 +13:00
private:
2016-06-15 18:43:10 +12:00
// not implemented
TImageWriterPsd(const TImageWriterPsd &);
TImageWriterPsd &operator=(const TImageWriterPsd &src);
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
// not implemented
2016-06-19 20:06:29 +12:00
void save(const TImageP &) override;
2016-03-19 06:57:51 +13:00
private:
2016-06-15 18:43:10 +12:00
TLevelWriterPsd *m_lwm;
2016-03-19 06:57:51 +13:00
};
//-----------------------------------------------------------
//-----------------------------------------------------------
// TImageWriterPsd
//-----------------------------------------------------------
2016-06-15 18:43:10 +12:00
TImageWriterPsd::TImageWriterPsd(const TFilePath &path, int layerId,
TLevelWriterPsd *lwm)
: TImageWriter(path), m_lwm(lwm), m_layerId(layerId) {
m_lwm->addRef();
2016-03-19 06:57:51 +13:00
}
//-----------------------------------------------------------
2016-06-15 18:43:10 +12:00
void TImageWriterPsd::save(const TImageP &img) { m_lwm->save(img, m_layerId); }
2016-03-19 06:57:51 +13:00
//-----------------------------------------------------------
2016-06-15 18:43:10 +12:00
void TLevelWriterPsd::save(const TImageP &img, int frameIndex) {}
2016-03-19 06:57:51 +13:00
//-----------------------------------------------------------
// TLevelWriterPsd
//-----------------------------------------------------------
TLevelWriterPsd::TLevelWriterPsd(const TFilePath &path, TPropertyGroup *winfo)
2016-06-15 18:43:10 +12:00
: TLevelWriter(path, winfo) {}
2016-03-19 06:57:51 +13:00
//-----------------------------------------------------------
2016-06-15 18:43:10 +12:00
TLevelWriterPsd::~TLevelWriterPsd() {}
2016-03-19 06:57:51 +13:00
//-----------------------------------------------------------
2016-06-15 18:43:10 +12:00
TImageWriterP TLevelWriterPsd::getFrameWriter(TFrameId fid) {
int layerId = 0;
TImageWriterPsd *iwm = new TImageWriterPsd(m_path, layerId, this);
return TImageWriterP(iwm);
2016-03-19 06:57:51 +13:00
}