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