Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "tsystem.h"
Toshihiro Shimizu 890ddd
#include "timage_io.h"
Toshihiro Shimizu 890ddd
#include "trop.h"
Toshihiro Shimizu 890ddd
#include "tconvert.h"
Toshihiro Shimizu 890ddd
#include "tvectorimage.h"
Toshihiro Shimizu 890ddd
#include "ttoonzimage.h"
Toshihiro Shimizu 890ddd
#include "tproperty.h"
Toshihiro Shimizu 890ddd
#include "trasterimage.h"
Toshihiro Shimizu 890ddd
#include "tiio.h"
Toshihiro Shimizu 890ddd
#include "tfilepath_io.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// boost includes
Toshihiro Shimizu 890ddd
#include <boost range.hpp=""></boost>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// OS-specific includes
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
#pragma warning(disable : 4996)
Toshihiro Shimizu 890ddd
#include <io.h></io.h>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
#ifdef LINUX
Toshihiro Shimizu 890ddd
#include <unistd.h></unistd.h>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// System V includes
Toshihiro Shimizu 890ddd
#include <fcntl.h>	// didn't even know Windows had them  :D</fcntl.h>
Toshihiro Shimizu 890ddd
#include <sys stat.h=""> // btw, why are they here?</sys>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
DEFINE_CLASS_CODE(TImageReader, 5)
Toshihiro Shimizu 890ddd
DEFINE_CLASS_CODE(TImageWriter, 6)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
std::map<qstring, *="" timagereadercreateproc=""> ImageReaderTable;</qstring,>
Toshihiro Shimizu 890ddd
std::map<qstring, *,="" bool="" std::pair<timagewritercreateproc="">> ImageWriterTable;</qstring,>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool TImageReader::m_safeMode = false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TImageReader::TImageReader(const TFilePath &path)
Toshihiro Shimizu 890ddd
	: TSmartObject(m_classCode), m_path(path), m_reader(0), m_vectorReader(0), m_readGreytones(true), m_file(NULL), m_is64BitEnabled(false), m_shrink(1), m_region(TRect())
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TImageReader::doReadGraytones(bool readThem)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_readGreytones = readThem;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TImageReader::~TImageReader()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	close();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool TImageReader::isOpen() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return m_file != NULL;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TImageReader::close()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	delete m_reader;
Toshihiro Shimizu 890ddd
	delete m_vectorReader;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_file != NULL) {
Toshihiro Shimizu 890ddd
		int err = 0;
Toshihiro Shimizu 890ddd
		err = fclose(m_file);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		assert(err == 0); //il file e' stato chiuso senza errori
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_file = NULL;
Toshihiro Shimizu 890ddd
	m_reader = 0;
Toshihiro Shimizu 890ddd
	m_vectorReader = 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  Opens for reading using \b fopen().
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
void TImageReader::getTzpPaletteColorNames(map<int, pair<string,="" string="">> &pltColorNames)</int,>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!m_file)
Toshihiro Shimizu 890ddd
		open();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!m_file)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(m_reader);
Toshihiro Shimizu 890ddd
	m_reader->getTzpPaletteColorNames(pltColorNames);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TImageReader::open()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(m_file == NULL);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	string type = toLower(m_path.getType());
Toshihiro Shimizu 890ddd
	m_file = fopen(m_path, "rb"); //Opens for reading. If the file does not exist or cannot be found, the fopen_s call fails
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_file == NULL) //Non dovrebbe mai andarci!
Toshihiro Shimizu 890ddd
		close();		//close() chiude il file se e' aperto e setta m_file a NULL.
Toshihiro Shimizu 890ddd
	else {
Toshihiro Shimizu 890ddd
		try {
Toshihiro Shimizu 890ddd
			m_reader = Tiio::makeReader(type);
Toshihiro Shimizu 890ddd
			if (m_reader)
Toshihiro Shimizu 890ddd
				m_reader->open(m_file);
Toshihiro Shimizu 890ddd
			else {
Toshihiro Shimizu 890ddd
				m_vectorReader = Tiio::makeVectorReader(type);
Toshihiro Shimizu 890ddd
				if (m_vectorReader)
Toshihiro Shimizu 890ddd
					m_vectorReader->open(m_file);
Toshihiro Shimizu 890ddd
				else
Toshihiro Shimizu 890ddd
					throw TImageException(m_path, "Image format not supported");
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		} catch (TException &e) {
Toshihiro Shimizu 890ddd
			close(); //close() chiude il file e setta m_file a NULL.
Toshihiro Shimizu 890ddd
			QString msg = QString::fromStdWString(e.getMessage());
Toshihiro Shimizu 890ddd
			if (msg == QString("Old 4.1 Palette"))
Toshihiro Shimizu 890ddd
				throw e;
Toshihiro Shimizu 890ddd
		} catch (string str) {
Toshihiro Shimizu 890ddd
			if (str == "Tiff file closed")
Toshihiro Shimizu 890ddd
				m_file = NULL;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===========================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TImageReader::setShrink(int shrink)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_shrink = shrink;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TImageReaderP::TImageReaderP(const TFilePath &path)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_pointer = new TImageReader(path);
Toshihiro Shimizu 890ddd
	m_pointer->addRef();
Toshihiro Shimizu 890ddd
	m_pointer->open();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TImageP TImageReader::load()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TImageP image = load0();
Toshihiro Shimizu 890ddd
	if (!image)
Toshihiro Shimizu 890ddd
		return TImageP();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TImageInfo info = m_reader->getImageInfo();
Toshihiro Shimizu 890ddd
	if (info.m_lx <= 0 || info.m_ly <= 0)
Toshihiro Shimizu 890ddd
		return TImageP();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return image;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//============================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename pix=""></typename>
Toshihiro Shimizu 890ddd
struct pixel_traits {
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
struct pixel_traits<tpixel32> {</tpixel32>
Toshihiro Shimizu 890ddd
	typedef TPixel32 rgbm_pixel_type;
Toshihiro Shimizu 890ddd
	typedef char buffer_type;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
struct pixel_traits<tpixel64> {</tpixel64>
Toshihiro Shimizu 890ddd
	typedef TPixel64 rgbm_pixel_type;
Toshihiro Shimizu 890ddd
	typedef short buffer_type;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
struct pixel_traits<tpixelgr8> {</tpixelgr8>
Toshihiro Shimizu 890ddd
	typedef TPixel32 rgbm_pixel_type;
Toshihiro Shimizu 890ddd
	typedef char buffer_type;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
struct pixel_traits<tpixelgr16> {</tpixelgr16>
Toshihiro Shimizu 890ddd
	typedef TPixel64 rgbm_pixel_type;
Toshihiro Shimizu 890ddd
	typedef short buffer_type;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
struct pixel_traits<tpixelcm32> {</tpixelcm32>
Toshihiro Shimizu 890ddd
	typedef TPixel32 rgbm_pixel_type;
Toshihiro Shimizu 890ddd
	typedef char buffer_type;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename pix=""></typename>
Toshihiro Shimizu 890ddd
void copyLine(typename pixel_traits<pix>::rgbm_pixel_type *lineIn, Pix *lineOut, int x0, int length, int shrink)</pix>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	lineIn += x0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (int i = 0; i < length; ++i, lineIn += shrink, ++lineOut)
Toshihiro Shimizu 890ddd
		memcpy(lineOut, lineIn, sizeof(Pix));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
void copyLine<tpixelgr8>(TPixel32 *lineIn, TPixelGR8 *lineOut, int x0, int length, int shrink)</tpixelgr8>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	lineIn += x0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (int i = 0; i < length; ++i, lineIn += shrink, ++lineOut)
Toshihiro Shimizu 890ddd
		lineOut->value = lineIn->r;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
void copyLine<tpixelgr16>(TPixel64 *lineIn, TPixelGR16 *lineOut, int x0, int length, int shrink)</tpixelgr16>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	lineIn += x0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (int i = 0; i < length; ++i, lineIn += shrink, ++lineOut)
Toshihiro Shimizu 890ddd
		lineOut->value = lineIn->r;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename pix=""></typename>
Toshihiro Shimizu 890ddd
void readRaster_copyLines(const TRasterPT<pix> &ras, Tiio::Reader *reader,</pix>
Toshihiro Shimizu 890ddd
						  int x0, int y0, int x1, int y1,
Toshihiro Shimizu 890ddd
						  int inLx, int inLy, int shrink)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	typedef typename pixel_traits<pix>::buffer_type buffer_type;</pix>
Toshihiro Shimizu 890ddd
	typedef typename pixel_traits<pix>::rgbm_pixel_type rgbm_pixel_type;</pix>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int linesToSkip = shrink - 1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	buffer_type *lineBuffer = (buffer_type *)malloc(inLx * sizeof(rgbm_pixel_type));
Toshihiro Shimizu 890ddd
	if (!lineBuffer)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	rgbm_pixel_type *lineIn = (rgbm_pixel_type *)lineBuffer;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (reader->getRowOrder() == Tiio::BOTTOM2TOP) {
Toshihiro Shimizu 890ddd
		int start = reader->skipLines(y0);
Toshihiro Shimizu 890ddd
		int stop = y1 + 1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		for (int y = start; y < stop; ++y) {
Toshihiro Shimizu 890ddd
			reader->readLine(lineBuffer, x0, x1, shrink);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (y >= y0 && y <= y1 && (y - y0) % shrink == 0) {
Toshihiro Shimizu 890ddd
				Pix *line = (Pix *)ras->getRawData(0, (y - y0) / shrink);
Toshihiro Shimizu 890ddd
				copyLine<pix>(lineIn, line, x0, ras->getLx(), shrink);</pix>
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (linesToSkip > 0 && y + linesToSkip < inLy)
Toshihiro Shimizu 890ddd
				y += reader->skipLines(linesToSkip);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	} else // TOP2BOTTOM
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		reader->skipLines(inLy - y1 - 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		for (int y = y1; y >= y0; --y) {
Toshihiro Shimizu 890ddd
			reader->readLine(lineBuffer, x0, x1, shrink);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if ((y - y0) % shrink == 0) {
Toshihiro Shimizu 890ddd
				Pix *line = (Pix *)ras->getRawData(0, (y - y0) / shrink);
Toshihiro Shimizu 890ddd
				copyLine<pix>(lineIn, line, x0, ras->getLx(), shrink);</pix>
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (linesToSkip > 0 && y - linesToSkip > 0)
Toshihiro Shimizu 890ddd
				y -= reader->skipLines(linesToSkip);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	free(lineBuffer);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename pix=""></typename>
Toshihiro Shimizu 890ddd
void readRaster(const TRasterPT<pix> &ras, Tiio::Reader *reader,</pix>
Toshihiro Shimizu 890ddd
				int x0, int y0, int x1, int y1,
Toshihiro Shimizu 890ddd
				int inLx, int inLy, int shrink)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	typedef typename pixel_traits<pix>::buffer_type buffer_type;</pix>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (shrink == 1) {
Toshihiro Shimizu 890ddd
		// Direct read
Toshihiro Shimizu 890ddd
		ras->lock();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		ptrdiff_t linePad = -x0 * ras->getPixelSize();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (reader->getRowOrder() == Tiio::BOTTOM2TOP) {
Toshihiro Shimizu 890ddd
			int start = reader->skipLines(y0);
Toshihiro Shimizu 890ddd
			int stop = y1 + 1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			for (int y = start; y < stop; ++y)
Toshihiro Shimizu 890ddd
				if (y >= y0 && y <= y1) {
Toshihiro Shimizu 890ddd
					buffer_type *line = (buffer_type *)(ras->getRawData(0, y - y0) + linePad);
Toshihiro Shimizu 890ddd
					reader->readLine(line, x0, x1, 1);
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
		} else // TOP2BOTTOM
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			reader->skipLines(inLy - y1 - 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			for (int y = y1; y >= y0; --y) {
Toshihiro Shimizu 890ddd
				buffer_type *line = (buffer_type *)(ras->getRawData(0, y - y0) + linePad);
Toshihiro Shimizu 890ddd
				reader->readLine(line, x0, x1, 1);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		ras->unlock();
Toshihiro Shimizu 890ddd
	} else
Toshihiro Shimizu 890ddd
		readRaster_copyLines(ras, reader, x0, y0, x1, y1, inLx, inLy, shrink);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TImageP TImageReader::load0()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!m_reader && !m_vectorReader)
Toshihiro Shimizu 890ddd
		open();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_reader) {
Toshihiro Shimizu 890ddd
		TImageInfo info = m_reader->getImageInfo();
Toshihiro Shimizu 890ddd
		if (info.m_lx <= 0 || info.m_ly <= 0)
Toshihiro Shimizu 890ddd
			return TImageP();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// Initialize raster info
Toshihiro Shimizu 890ddd
		assert(m_shrink > 0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// Build loading rect
Toshihiro Shimizu 890ddd
		int x0 = 0;
Toshihiro Shimizu 890ddd
		int x1 = info.m_lx - 1;
Toshihiro Shimizu 890ddd
		int y0 = 0;
Toshihiro Shimizu 890ddd
		int y1 = info.m_ly - 1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (!m_region.isEmpty()) {
Toshihiro Shimizu 890ddd
			// Intersect with the externally specified loading region
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			x0 = tmax(x0, m_region.x0);
Toshihiro Shimizu 890ddd
			y0 = tmax(y0, m_region.y0);
Toshihiro Shimizu 890ddd
			x1 = tmin(x1, m_region.x1);
Toshihiro Shimizu 890ddd
			y1 = tmin(y1, m_region.y1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (x0 >= x1 || y0 >= y1)
Toshihiro Shimizu 890ddd
				return TImageP();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (m_shrink > 1) {
Toshihiro Shimizu 890ddd
			// Crop to shrink multiples
Toshihiro Shimizu 890ddd
			x1 -= (x1 - x0) % m_shrink;
Toshihiro Shimizu 890ddd
			y1 -= (y1 - y0) % m_shrink;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		assert(x0 <= x1 && y0 <= y1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TDimension imageDimension = TDimension((x1 - x0) / m_shrink + 1, (y1 - y0) / m_shrink + 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (m_path.getType() == "tzp" || m_path.getType() == "tzu") {
Toshihiro Shimizu 890ddd
			// Colormap case
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			TRasterCM32P ras(imageDimension);
Toshihiro Shimizu 890ddd
			readRaster(ras, m_reader, x0, y0, x1, y1, info.m_lx, info.m_ly, m_shrink);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			// Build the savebox
Toshihiro Shimizu 890ddd
			TRect saveBox(info.m_x0, info.m_y0, info.m_x1, info.m_y1);
Toshihiro Shimizu 890ddd
			if (!m_region.isEmpty()) {
Toshihiro Shimizu 890ddd
				// Intersect with the loading rect
Toshihiro Shimizu 890ddd
				if (m_region.overlaps(saveBox)) {
Toshihiro Shimizu 890ddd
					saveBox *= m_region;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					int sbx0 = saveBox.x0 - m_region.x0;
Toshihiro Shimizu 890ddd
					int sby0 = saveBox.y0 - m_region.y0;
Toshihiro Shimizu 890ddd
					int sbx1 = sbx0 + saveBox.getLx() - 1;
Toshihiro Shimizu 890ddd
					int sby1 = sby0 + saveBox.getLy() - 1;
Toshihiro Shimizu 890ddd
					assert(sbx0 >= 0);
Toshihiro Shimizu 890ddd
					assert(sby0 >= 0);
Toshihiro Shimizu 890ddd
					assert(sbx1 >= 0);
Toshihiro Shimizu 890ddd
					assert(sby1 >= 0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					saveBox = TRect(sbx0, sby0, sbx1, sby1);
Toshihiro Shimizu 890ddd
				} else
Toshihiro Shimizu 890ddd
					saveBox = TRect(0, 0, 1, 1);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (m_shrink > 1) {
Toshihiro Shimizu 890ddd
				saveBox.x0 = saveBox.x0 / m_shrink;
Toshihiro Shimizu 890ddd
				saveBox.y0 = saveBox.y0 / m_shrink;
Toshihiro Shimizu 890ddd
				saveBox.x1 = saveBox.x1 / m_shrink;
Toshihiro Shimizu 890ddd
				saveBox.y1 = saveBox.y1 / m_shrink;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			TToonzImageP ti(ras, ras->getBounds() * saveBox);
Toshihiro Shimizu 890ddd
			ti->setDpi(info.m_dpix, info.m_dpiy);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			return ti;
Toshihiro Shimizu 890ddd
		} else if (info.m_bitsPerSample >= 8) {
Toshihiro Shimizu 890ddd
			// Common byte-based rasters (see below, we have black-and-white bit-based images too)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (info.m_samplePerPixel == 1 && m_readGreytones) {
Toshihiro Shimizu 890ddd
				//  Greymap case
Toshihiro Shimizu 890ddd
				// NOTE: Uses a full 32-bit raster first, and then copies down to the GR8
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				// Observe that GR16 file images get immediately down-cast to GR8...
Toshihiro Shimizu 890ddd
				// Should we implement that too?
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				TRasterGR8P ras(imageDimension);
Toshihiro Shimizu 890ddd
				readRaster_copyLines(ras, m_reader, x0, y0, x1, y1, info.m_lx, info.m_ly, m_shrink);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				TRasterImageP ri(ras);
Toshihiro Shimizu 890ddd
				ri->setDpi(info.m_dpix, info.m_dpiy);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				return ri;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			// assert(info.m_samplePerPixel == 3 || info.m_samplePerPixel == 4);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			TRasterP _ras;
Toshihiro Shimizu 890ddd
			if (info.m_bitsPerSample == 16) {
Toshihiro Shimizu 890ddd
				if (m_is64BitEnabled || m_path.getType() != "tif") {
Toshihiro Shimizu 890ddd
					//  Standard 64-bit case.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					// Also covers down-casting to 32-bit from a 64-bit image file whenever
Toshihiro Shimizu 890ddd
					// not a tif file (see below).
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					TRaster64P ras(imageDimension);
Toshihiro Shimizu 890ddd
					readRaster(ras, m_reader, x0, y0, x1, y1, info.m_lx, info.m_ly, m_shrink);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					_ras = ras;
Toshihiro Shimizu 890ddd
				} else {
Toshihiro Shimizu 890ddd
					// The Tif reader has got an automatically down-casting readLine(char*, ...)
Toshihiro Shimizu 890ddd
					// in case the input file is 64-bit. The advantage is that no intermediate
Toshihiro Shimizu 890ddd
					// 64-bit raster is required in this case.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					TRaster32P ras(imageDimension);
Toshihiro Shimizu 890ddd
					readRaster(ras, m_reader, x0, y0, x1, y1, info.m_lx, info.m_ly, m_shrink);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					_ras = ras;
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			} else if (info.m_bitsPerSample == 8) {
Toshihiro Shimizu 890ddd
				//  Standard 32-bit case
Toshihiro Shimizu 890ddd
				TRaster32P ras(imageDimension);
Toshihiro Shimizu 890ddd
				readRaster(ras, m_reader, x0, y0, x1, y1, info.m_lx, info.m_ly, m_shrink);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				_ras = ras;
Toshihiro Shimizu 890ddd
			} else
Toshihiro Shimizu 890ddd
				throw TImageException(m_path, "Image format not supported");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			// 64-bit to 32-bit conversions if necessary  (64 bit images not allowed)
Toshihiro Shimizu 890ddd
			if (!m_is64BitEnabled && (TRaster64P)_ras) {
Toshihiro Shimizu 890ddd
				TRaster32P raux(_ras->getLx(), _ras->getLy());
Toshihiro Shimizu 890ddd
				TRop::convert(raux, _ras);
Toshihiro Shimizu 890ddd
				_ras = raux;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			// Return the image
Toshihiro Shimizu 890ddd
			TRasterImageP ri(_ras);
Toshihiro Shimizu 890ddd
			ri->setDpi(info.m_dpix, info.m_dpiy);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			return ri;
Toshihiro Shimizu 890ddd
		} else if (info.m_samplePerPixel == 1 && info.m_valid == true) {
Toshihiro Shimizu 890ddd
			//  Previously dubbed as 'Palette cases'. No clue about what is this... :|
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			TRaster32P ras(imageDimension);
Toshihiro Shimizu 890ddd
			readRaster(ras, m_reader, x0, y0, x1, y1, info.m_lx, info.m_ly, m_shrink);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			TRasterImageP ri(ras);
Toshihiro Shimizu 890ddd
			ri->setDpi(info.m_dpix, info.m_dpiy);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			return ri;
Toshihiro Shimizu 890ddd
		} else if (info.m_samplePerPixel == 1 && m_readGreytones) {
Toshihiro Shimizu 890ddd
			//  Black-and-White case, I guess. Standard greymaps were considered above...
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			TRasterGR8P ras(imageDimension);
Toshihiro Shimizu 890ddd
			readRaster_copyLines(ras, m_reader, x0, y0, x1, y1, info.m_lx, info.m_ly, m_shrink);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			TRasterImageP ri(ras);
Toshihiro Shimizu 890ddd
			ri->setDpi(info.m_dpix, info.m_dpiy);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (info.m_bitsPerSample == 1) // I suspect this always evaluates true...
Toshihiro Shimizu 890ddd
				ri->setScanBWFlag(true);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			return ri;
Toshihiro Shimizu 890ddd
		} else
Toshihiro Shimizu 890ddd
			return TImageP();
Toshihiro Shimizu 890ddd
	} else if (m_vectorReader) {
Toshihiro Shimizu 890ddd
		TVectorImage *vi = m_vectorReader->read();
Toshihiro Shimizu 890ddd
		return TVectorImageP(vi);
Toshihiro Shimizu 890ddd
	} else
Toshihiro Shimizu 890ddd
		return TImageP();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TImageWriter::TImageWriter(const TFilePath &path)
Toshihiro Shimizu 890ddd
	: TSmartObject(m_classCode), m_path(path), m_writer(0), m_vectorWriter(0), m_properties(0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TImageWriter::~TImageWriter()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	delete m_writer;
Toshihiro Shimizu 890ddd
	delete m_vectorWriter;
Toshihiro Shimizu 890ddd
	delete m_properties;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TImageWriter::setProperties(const TPropertyGroup *g)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_properties) {
Toshihiro Shimizu 890ddd
		assert(m_properties != g);
Toshihiro Shimizu 890ddd
		delete m_properties;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	m_properties = g ? g->clone() : 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void convertForWriting(TRasterP &ras, const TRasterP &rin, int bpp)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	switch (bpp) {
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		__OR 8:
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			ras = TRasterGR8P(rin->getSize());
Toshihiro Shimizu 890ddd
			TRop::convert(ras, rin);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		CASE 24 : __OR 32:
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			ras = TRaster32P(rin->getSize());
Toshihiro Shimizu 890ddd
			TRop::convert(ras, rin);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		CASE 48 : __OR 64:
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			ras = TRaster64P(rin->getSize());
Toshihiro Shimizu 890ddd
			TRop::convert(ras, rin);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	DEFAULT:
Toshihiro Shimizu 890ddd
		assert(false);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TImageWriter::save(const TImageP &img)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	const std::string &type = toLower(m_path.getType());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	Tiio::Writer *writer = Tiio::makeWriter(type);
Toshihiro Shimizu 890ddd
	if (!writer)
Toshihiro Shimizu 890ddd
		throw TImageException(m_path, "unsupported format for raster images");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	writer->setProperties(m_properties);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	FILE *file = fopen(m_path, "wb");
Toshihiro Shimizu 890ddd
	if (file == NULL)
Toshihiro Shimizu 890ddd
		throw TImageException(m_path, "Can't write file");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (TRasterImageP ri = img) {
Toshihiro Shimizu 890ddd
		TImageInfo info;
Toshihiro Shimizu 890ddd
		TRasterP ras;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TRasterGR8P rasGr = ri->getRaster();
Toshihiro Shimizu 890ddd
		TRaster32P ras32 = ri->getRaster();
Toshihiro Shimizu 890ddd
		TRaster64P ras64 = ri->getRaster();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TEnumProperty *p = m_properties ? (TEnumProperty *)m_properties->getProperty("Bits Per Pixel")
Toshihiro Shimizu 890ddd
										: 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (p && ri->isScanBW()) {
Toshihiro Shimizu 890ddd
			const std::vector<std::wstring> &range = p->getRange();</std::wstring>
Toshihiro Shimizu 890ddd
			p->setValue(range[2]); // Horrible. See tiio_tif.cpp (732 or near)     -.-'
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		int bpp = p ? atoi((toString(p->getValue()).c_str())) : 32;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		//  bpp       1  8  16 24 32 40  48 56  64
Toshihiro Shimizu 890ddd
		int spp[] = {1, 1, 1, 4, 4, 0, 4, 0, 4};	// 0s are for pixel sizes which are normally unsupported
Toshihiro Shimizu 890ddd
		int bps[] = {1, 8, 16, 8, 8, 0, 16, 0, 16}; // by image formats, let alone by Toonz raster ones.
Toshihiro Shimizu 890ddd
													// The 24 and 48 cases get automatically promoted to 32 and 64.
Toshihiro Shimizu 890ddd
		int bypp = bpp / 8;
Toshihiro Shimizu 890ddd
		assert(bypp < boost::size(spp) && spp[bypp] && bps[bypp]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		info.m_samplePerPixel = spp[bypp];
Toshihiro Shimizu 890ddd
		info.m_bitsPerSample = bps[bypp];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (rasGr) {
Toshihiro Shimizu 890ddd
			if (bypp < 2)	// Seems 16 bit greymaps are not handled... why?
Toshihiro Shimizu 890ddd
				ras = rasGr; // we do have a Toonz raster for those...    >:|
Toshihiro Shimizu 890ddd
			else
Toshihiro Shimizu 890ddd
				convertForWriting(ras, rasGr, bpp);
Toshihiro Shimizu 890ddd
		} else if (ras32) {
Toshihiro Shimizu 890ddd
			if (bpp == 32 || bpp == 24)
Toshihiro Shimizu 890ddd
				ras = ras32;
Toshihiro Shimizu 890ddd
			else
Toshihiro Shimizu 890ddd
				convertForWriting(ras, ras32, bpp);
Toshihiro Shimizu 890ddd
		} else if (ras64) {
Toshihiro Shimizu 890ddd
			if (bpp == 64 || bpp == 48)
Toshihiro Shimizu 890ddd
				ras = ras64;
Toshihiro Shimizu 890ddd
			else
Toshihiro Shimizu 890ddd
				convertForWriting(ras, ras64, bpp);
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			fclose(file);
Toshihiro Shimizu 890ddd
			throw TImageException(m_path, "unsupported raster type");
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		info.m_lx = ras->getLx();
Toshihiro Shimizu 890ddd
		info.m_ly = ras->getLy();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		ri->getDpi(info.m_dpix, info.m_dpiy);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (writer->getProperties() && m_properties)
Toshihiro Shimizu 890ddd
			writer->getProperties()->setProperties(m_properties);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		writer->open(file, info);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		ras->lock();
Toshihiro Shimizu 890ddd
		if (writer->getRowOrder() == Tiio::BOTTOM2TOP) {
Toshihiro Shimizu 890ddd
			if (bpp == 1 || bpp == 8 || bpp == 24 || bpp == 32 || bpp == 16)
Toshihiro Shimizu 890ddd
				for (int i = 0; i < ras->getLy(); i++)
Toshihiro Shimizu 890ddd
					writer->writeLine((char *)ras->getRawData(0, i));
Toshihiro Shimizu 890ddd
			else
Toshihiro Shimizu 890ddd
				for (int i = 0; i < ras->getLy(); i++)
Toshihiro Shimizu 890ddd
					writer->writeLine((short *)ras->getRawData(0, i));
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			if (bpp == 1 || bpp == 8 || bpp == 24 || bpp == 32 || bpp == 16)
Toshihiro Shimizu 890ddd
				for (int i = ras->getLy() - 1; i >= 0; i--)
Toshihiro Shimizu 890ddd
					writer->writeLine((char *)ras->getRawData(0, i));
Toshihiro Shimizu 890ddd
			else
Toshihiro Shimizu 890ddd
				for (int i = ras->getLy() - 1; i >= 0; i--)
Toshihiro Shimizu 890ddd
					writer->writeLine((short *)ras->getRawData(0, i));
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		ras->unlock();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		writer->flush();
Toshihiro Shimizu 890ddd
		delete writer;
Toshihiro Shimizu 890ddd
	} else if (TVectorImageP vi = img) {
Toshihiro Shimizu 890ddd
		Tiio::VectorWriter *writer = Tiio::makeVectorWriter(type);
Toshihiro Shimizu 890ddd
		if (!writer) {
Toshihiro Shimizu 890ddd
			fclose(file);
Toshihiro Shimizu 890ddd
			throw TImageException(m_path, "unsupported format for vector images");
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		writer->open(file);
Toshihiro Shimizu 890ddd
		writer->write(vi.getPointer());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		delete writer;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		fclose(file);
Toshihiro Shimizu 890ddd
		throw TImageException(m_path, "Can't write file");
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	fclose(file);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TImageWriterP::TImageWriterP(const TFilePath &path)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_pointer = new TImageWriter(path);
Toshihiro Shimizu 890ddd
	m_pointer->addRef();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//============================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// Helper functions statiche
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//============================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool TImageReader::load(const TFilePath &path, TRasterP &raster)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	raster = TRasterP();
Toshihiro Shimizu 890ddd
	TImageReaderP ir(path);
Toshihiro Shimizu 890ddd
	if (!ir)
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
	TImageP img = ir->load();
Toshihiro Shimizu 890ddd
	if (!img)
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRasterImageP ri(img);
Toshihiro Shimizu 890ddd
	if (!ri)
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	raster = ri->getRaster();
Toshihiro Shimizu 890ddd
	return true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TImageReader::load(const TRasterP &ras, const TPoint &pos, int shrinkX, int shrinkY)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TImageP srcImage = load();
Toshihiro Shimizu 890ddd
	TRasterImageP srcRasImage = srcImage;
Toshihiro Shimizu 890ddd
	TRaster32P srcRaster = srcRasImage->getRaster();
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
TRaster32P clippedRas = srcRaster->extractT
Toshihiro Shimizu 890ddd
        (shrinkX*pos.x, shrinkY*pos.y, 
Toshihiro Shimizu 890ddd
        (pos.x + ras->getLx()) * shrinkX - 1, (pos.y + ras->getLy()) * shrinkY - 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
if (shrinkX != 1 || shrinkY != 1)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
  TRaster32P ras32 = ras;
Toshihiro Shimizu 890ddd
  if (ras32)
Toshihiro Shimizu 890ddd
    ras32->fill(TPixel32::Transparent);
Toshihiro Shimizu 890ddd
  TRop::resample(ras, clippedRas, TScale(1./shrinkX, 1./shrinkY), TRop::ClosestPixel);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
else*/
Toshihiro Shimizu 890ddd
	ras->copy(srcRaster);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool TImageReader::load(const TFilePath &path, TImageP &image)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	image = TImageReaderP(path)->load();
Toshihiro Shimizu 890ddd
	return image;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TImageWriter::save(const TFilePath &path, TRasterP raster)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TRasterImageP rasImage(raster);
Toshihiro Shimizu 890ddd
	TImageWriterP(path)->save(TImageP(rasImage));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TImageWriter::save(const TFilePath &path, const TImageP &image)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TImageWriterP(path)->save(image);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===========================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// funzioni per la registrazione dei formati (chiamate dal Plugin)
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//===========================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TImageReader::define(
Toshihiro Shimizu 890ddd
	QString extension,
Toshihiro Shimizu 890ddd
	TImageReaderCreateProc *proc)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	ImageReaderTable[extension] = proc;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TImageWriter::define(
Toshihiro Shimizu 890ddd
	QString extension,
Toshihiro Shimizu 890ddd
	TImageWriterCreateProc *proc, bool isRenderFormat)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	ImageWriterTable[extension] = std::pair<timagewritercreateproc *,="" bool="">(proc, isRenderFormat);</timagewritercreateproc>
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TImageReader::getSupportedFormats(QStringList &names)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	for (std::map<qstring, *="" timagereadercreateproc="">::iterator it = ImageReaderTable.begin();</qstring,>
Toshihiro Shimizu 890ddd
		 it != ImageReaderTable.end();
Toshihiro Shimizu 890ddd
		 ++it) {
Toshihiro Shimizu 890ddd
		names.push_back(it->first);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TImageWriter::getSupportedFormats(QStringList &names, bool onlyRenderFormat)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	for (std::map<qstring, *,="" bool="" std::pair<timagewritercreateproc="">>::iterator it = ImageWriterTable.begin();</qstring,>
Toshihiro Shimizu 890ddd
		 it != ImageWriterTable.end();
Toshihiro Shimizu 890ddd
		 ++it) {
Toshihiro Shimizu 890ddd
		if (!onlyRenderFormat || it->second.second)
Toshihiro Shimizu 890ddd
			names.push_back(it->first);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
const TImageInfo *TImageReader::getImageInfo() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_reader)
Toshihiro Shimizu 890ddd
		return &(m_reader->getImageInfo());
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===========================================================
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// Eccezioni
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
//===========================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TImageException::TImageException(const TFilePath &fp, const string &msg)
Toshihiro Shimizu 890ddd
	: TException(msg), m_fp(fp)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TString TImageException::getMessage() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return m_fp.getWideString() + L": " + TException::getMessage();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===========================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TImageVersionException::TImageVersionException(const TFilePath &fp, int major, int minor)
Toshihiro Shimizu 890ddd
	: TException(L"The file " + fp.getWideString() +
Toshihiro Shimizu 890ddd
				 L" was generated by a newer version of Toonz and cannot be loaded."),
Toshihiro Shimizu 890ddd
	  m_fp(fp), m_major(major), m_minor(minor)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}