Shinya Kitaoka 79e39b
#include <memory></memory>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tmachine.h"
Toshihiro Shimizu 890ddd
#include "pli_io.h"
Toshihiro Shimizu 890ddd
#include "tcommon.h"
Toshihiro Shimizu 890ddd
#include "timage_io.h"
Toshihiro Shimizu 890ddd
#include "tvectorimage.h"
Toshihiro Shimizu 890ddd
//#include "tstrokeoutline.h"
Toshihiro Shimizu 890ddd
#include "tsimplecolorstyles.h"
Toshihiro Shimizu 890ddd
#include "tcontenthistory.h"
Toshihiro Shimizu 890ddd
#include "tfilepath_io.h"
Toshihiro Shimizu 890ddd
//#include <fstream.h></fstream.h>
Toshihiro Shimizu 890ddd
#include "../compatibility/tfile_io.h"
Toshihiro Shimizu 890ddd
#include "tenv.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#if defined(MACOSX)
Toshihiro Shimizu 890ddd
#include <architecture i386="" io.h=""></architecture>
Shinya Kitaoka 9f5a1b
#elif defined(_WIN32)
Toshihiro Shimizu 890ddd
#include <io.h></io.h>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
using namespace std;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
typedef TVectorImage::IntersectionBranch IntersectionBranch;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#if !defined(TNZ_LITTLE_ENDIAN)
Toshihiro Shimizu 890ddd
TNZ_LITTLE_ENDIAN undefined !!
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	static const int c_majorVersionNumber = 71;
Toshihiro Shimizu 890ddd
static const int c_minorVersionNumber = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline void ulongFromDouble1(double x, TUINT32 &hi, TUINT32 &lo)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(x < 1.0);
Toshihiro Shimizu 890ddd
	//x+=1.0;
Toshihiro Shimizu 890ddd
	TUINT32 *l = (TUINT32 *)&x;
Toshihiro Shimizu 890ddd
#if TNZ_LITTLE_ENDIAN
Toshihiro Shimizu 890ddd
	hi = l[1], lo = l[0];
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	hi = l[0], lo = l[1];
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//return (hi&0XFFFFF)<<12 | ((lo&0xFFE00000)>>20);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline double doubleFromUlong1(TUINT32 hi, TUINT32 lo)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//assert((lo&0X00000001)==0);
Toshihiro Shimizu 890ddd
	TUINT32 l[2];
Toshihiro Shimizu 890ddd
#if TNZ_LITTLE_ENDIAN
Toshihiro Shimizu 890ddd
	l[1] = hi;
Toshihiro Shimizu 890ddd
	l[0] = lo;
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	l[0] = hi;
Toshihiro Shimizu 890ddd
	l[1] = lo;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return *(double *)l; // - 1;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TThickPoint operator*(const TAffine &aff, const TThickPoint &p)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPointD p1(p.x, p.y);
Toshihiro Shimizu 890ddd
	return TThickPoint(aff * p1, p.thick);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class MyOfstream : public Tofstream
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	MyOfstream(const TFilePath &path) : Tofstream(path) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	MyOfstream &operator<<(TUINT32 n)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TUINT32 app;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#if TNZ_LITTLE_ENDIAN
Toshihiro Shimizu 890ddd
		app = n;
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
		UCHAR *uc = (UCHAR *)&n;
Toshihiro Shimizu 890ddd
		app = *(uc) | (*(uc + 1)) << 8 | (*(uc + 2)) << 16 | (*(uc + 3)) << 24;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
		write((char *)&app, sizeof(TUINT32));
Toshihiro Shimizu 890ddd
		return *this;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	MyOfstream &operator<<(USHORT n)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		USHORT app;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#if TNZ_LITTLE_ENDIAN
Toshihiro Shimizu 890ddd
		app = n;
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
		UCHAR *uc = (UCHAR *)&n;
Toshihiro Shimizu 890ddd
		app = *(uc) | (*(uc + 1)) << 8;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		write((char *)&app, sizeof(USHORT));
Toshihiro Shimizu 890ddd
		return *this;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	MyOfstream &operator<<(UCHAR un)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		write((char *)&un, sizeof(UCHAR));
Toshihiro Shimizu 890ddd
		return *this;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	MyOfstream &operator<<(char un)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		write((char *)&un, sizeof(char));
Toshihiro Shimizu 890ddd
		return *this;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	MyOfstream &operator<<(const TRaster32P &r);
Shinya Kitaoka 3bfa54
	MyOfstream &operator<<(const std::string &r);
Toshihiro Shimizu 890ddd
	MyOfstream &writeBuf(void *un, UINT s)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		write((char *)un, s);
Toshihiro Shimizu 890ddd
		return *this;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
MyOfstream &MyOfstream::operator<<(const TRaster32P &r)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(r->getLx() == r->getWrap());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	(*this) << (USHORT)r->getLx();
Toshihiro Shimizu 890ddd
	(*this) << (USHORT)r->getLy();
Toshihiro Shimizu 890ddd
	r->lock();
Toshihiro Shimizu 890ddd
	MyOfstream &ret = writeBuf(r->getRawData(), r->getLx() * r->getLy() * r->getPixelSize());
Toshihiro Shimizu 890ddd
	r->unlock();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return ret;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
MyOfstream &MyOfstream::operator<<(const std::string &s)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	(*this) << (USHORT)s.size();
Toshihiro Shimizu 890ddd
	for (UINT i = 0; i < s.size(); i++)
Toshihiro Shimizu 890ddd
		(*this) << (UCHAR)(s[i]);
Toshihiro Shimizu 890ddd
	return *this;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class MyIfstream //The input is done without stl; it was crashing in release version loading textures!!
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	bool m_isIrixEndian;
Toshihiro Shimizu 890ddd
	FILE *m_fp;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	MyIfstream() : m_isIrixEndian(false) { m_fp = 0; }
Toshihiro Shimizu 890ddd
	~MyIfstream()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (m_fp)
Toshihiro Shimizu 890ddd
			fclose(m_fp);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	void setEndianess(bool isIrixEndian) { m_isIrixEndian = isIrixEndian; }
Toshihiro Shimizu 890ddd
	MyIfstream &operator>>(TUINT32 &un);
Toshihiro Shimizu 890ddd
	MyIfstream &operator>>(string &un);
Toshihiro Shimizu 890ddd
	MyIfstream &operator>>(USHORT &un);
Toshihiro Shimizu 890ddd
	MyIfstream &operator>>(UCHAR &un);
Toshihiro Shimizu 890ddd
	MyIfstream &operator>>(char &un);
Toshihiro Shimizu 890ddd
	void open(const TFilePath &filename);
Toshihiro Shimizu 890ddd
	void close()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (m_fp)
Toshihiro Shimizu 890ddd
			fclose(m_fp);
Toshihiro Shimizu 890ddd
		m_fp = 0;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	TUINT32 tellg() { return (TUINT32)ftell(m_fp); }
Toshihiro Shimizu 890ddd
	//void seekg(TUINT32 pos, ios_base::seek_dir type);
Toshihiro Shimizu 890ddd
	void seekg(TUINT32 pos, int type);
Toshihiro Shimizu 890ddd
	void read(char *m_buf, int length) { fread((void *)m_buf, sizeof(char), length, m_fp); }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void MyIfstream::open(const TFilePath &filename)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	try {
Toshihiro Shimizu 890ddd
		m_fp = fopen(filename, "rb");
Toshihiro Shimizu 890ddd
	} catch (TException &) {
Toshihiro Shimizu 890ddd
		throw TImageException(filename, "File not found");
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void MyIfstream::seekg(TUINT32 pos, int type)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (type == ios_base::beg)
Toshihiro Shimizu 890ddd
		fseek(m_fp, pos, SEEK_SET);
Toshihiro Shimizu 890ddd
	else if (type == ios_base::cur)
Toshihiro Shimizu 890ddd
		fseek(m_fp, pos, SEEK_CUR);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		assert(false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline MyIfstream &MyIfstream::operator>>(UCHAR &un)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int ret = fread((void *)&un, sizeof(UCHAR), 1, m_fp);
Toshihiro Shimizu 890ddd
	if (ret < 1)
Toshihiro Shimizu 890ddd
		throw TException("corrupted pli file: unexpected end of file");
Toshihiro Shimizu 890ddd
	//read((char *)&un, sizeof(UCHAR));
Toshihiro Shimizu 890ddd
	return *this;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline MyIfstream &MyIfstream::operator>>(char &un)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int ret = fread((void *)&un, sizeof(char), 1, m_fp);
Toshihiro Shimizu 890ddd
	if (ret < 1)
Toshihiro Shimizu 890ddd
		throw TException("corrupted pli file: unexpected end of file");
Toshihiro Shimizu 890ddd
	//read((char *)&un, sizeof(char));
Toshihiro Shimizu 890ddd
	return *this;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline MyIfstream &MyIfstream::operator>>(USHORT &un)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int ret = fread((void *)&un, sizeof(USHORT), 1, m_fp);
Toshihiro Shimizu 890ddd
	if (ret < 1)
Toshihiro Shimizu 890ddd
		throw TException("corrupted pli file: unexpected end of file");
Toshihiro Shimizu 890ddd
	//  read((char *)&un, sizeof(USHORT));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_isIrixEndian)
Toshihiro Shimizu 890ddd
		un = ((un & 0xff00) >> 8) | ((un & 0x00ff) << 8);
Toshihiro Shimizu 890ddd
	return *this;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline MyIfstream &MyIfstream::operator>>(TUINT32 &un)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int ret = fread((void *)&un, sizeof(TUINT32), 1, m_fp);
Toshihiro Shimizu 890ddd
	if (ret < 1)
Toshihiro Shimizu 890ddd
		throw TException("corrupted pli file: unexpected end of file");
Toshihiro Shimizu 890ddd
	// read((char *)&un, sizeof(TUINT32));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_isIrixEndian)
Toshihiro Shimizu 890ddd
		un = ((un & 0xff000000) >> 24) | ((un & 0x00ff0000) >> 8) |
Toshihiro Shimizu 890ddd
			 ((un & 0x0000ff00) << 8) | ((un & 0x000000ff) << 24);
Toshihiro Shimizu 890ddd
	return *this;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline MyIfstream &MyIfstream::operator>>(string &un)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	string s = "";
Toshihiro Shimizu 890ddd
	USHORT lenght;
Toshihiro Shimizu 890ddd
	(*this) >> lenght;
Toshihiro Shimizu 890ddd
	for (UINT i = 0; i < lenght; i++) {
Toshihiro Shimizu 890ddd
		UCHAR ch;
Toshihiro Shimizu 890ddd
		(*this) >> ch;
Toshihiro Shimizu 890ddd
		s.append(1, ch);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	un = s;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return *this;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
UINT TStyleParam::getSize()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	switch (m_type) {
Shinya Kitaoka d4642c
	case SP_BYTE  : return 1;
Shinya Kitaoka d4642c
	case SP_INT   : return 4;
Shinya Kitaoka d4642c
	case SP_DOUBLE: return 4;
Shinya Kitaoka d4642c
	case SP_USHORT: return 2;
Shinya Kitaoka d4642c
	case SP_RASTER: return 2 + 2 + m_r->getLx() * m_r->getLy() * m_r->getPixelSize();
Shinya Kitaoka d4642c
	case SP_STRING: return (m_string.size() + sizeof(USHORT));
Shinya Kitaoka d4642c
	default:
Toshihiro Shimizu 890ddd
		assert(false);
Toshihiro Shimizu 890ddd
		return 0;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Shinya Kitaoka 9f5a1b
#ifdef _WIN32
Toshihiro Shimizu 890ddd
#define CHECK_FOR_READ_ERROR(filePath)
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#define CHECK_FOR_READ_ERROR(filePath)                             \
Toshihiro Shimizu 890ddd
	{                                                              \
Toshihiro Shimizu 890ddd
		/*if (m_iChan.flags()&(ios::failbit|ios::eofbit))          \
Toshihiro Shimizu 890ddd
		{                                                          \
Toshihiro Shimizu 890ddd
		m_lastError = PREMATURE_EOF;                               \
Toshihiro Shimizu 890ddd
		throw TImageException( filePath, "Error on reading file"); \
Toshihiro Shimizu 890ddd
		}*/                                                        \
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#define CHECK_FOR_WRITE_ERROR(filePath)                               \
Toshihiro Shimizu 890ddd
	{                                                                 \
Toshihiro Shimizu 890ddd
		if (m_oChan->fail() /*m_oChan.flags()&(ios::failbit)*/) {     \
Toshihiro Shimizu 890ddd
			m_lastError = WRITE_ERROR;                                \
Toshihiro Shimizu 890ddd
			throw TImageException(filePath, "Error on writing file"); \
Toshihiro Shimizu 890ddd
		}                                                             \
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
const TUINT32 c_magicNt = 0x4D494C50;
Toshihiro Shimizu 890ddd
const TUINT32 c_magicIrix = 0x504C494D;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TagElem
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	PliTag *m_tag;
Toshihiro Shimizu 890ddd
	TUINT32 m_offset;
Toshihiro Shimizu 890ddd
	TagElem *m_next;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TagElem(PliTag *tag, TUINT32 offset, TagElem *next = NULL)
Toshihiro Shimizu 890ddd
		: m_tag(tag), m_offset(offset), m_next(next) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TagElem(const TagElem &elem)
Toshihiro Shimizu 890ddd
		: m_tag(elem.m_tag), m_offset(elem.m_offset), m_next(NULL) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	~TagElem()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (m_tag)
Toshihiro Shimizu 890ddd
			delete m_tag;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
class TContentHistory;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class ParsedPliImp
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	UCHAR m_majorVersionNumber;
Toshihiro Shimizu 890ddd
	UCHAR m_minorVersionNumber;
Toshihiro Shimizu 890ddd
	USHORT m_framesNumber;
Toshihiro Shimizu 890ddd
	double m_thickRatio;
Toshihiro Shimizu 890ddd
	double m_maxThickness;
Toshihiro Shimizu 890ddd
	double m_autocloseTolerance;
Toshihiro Shimizu 890ddd
	bool m_isIrixEndian;
Toshihiro Shimizu 890ddd
	TFilePath m_filePath;
Toshihiro Shimizu 890ddd
	UCHAR m_currDinamicTypeBytesNum;
Toshihiro Shimizu 890ddd
	TUINT32 m_tagLength;
Toshihiro Shimizu 890ddd
	TUINT32 m_bufLength;
Shinya Kitaoka 79e39b
	std::unique_ptr<uchar[]> m_buf;</uchar[]>
Toshihiro Shimizu 890ddd
	TAffine m_affine;
Toshihiro Shimizu 890ddd
	int m_precisionScale;
Toshihiro Shimizu 890ddd
	std::map<tframeid, int=""> m_frameOffsInFile;</tframeid,>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	PliTag *readTextTag();
Toshihiro Shimizu 890ddd
	PliTag *readPaletteTag();
Toshihiro Shimizu 890ddd
	PliTag *readPaletteWithAlphaTag();
Toshihiro Shimizu 890ddd
	PliTag *readThickQuadraticChainTag(bool isLoop);
Toshihiro Shimizu 890ddd
	PliTag *readColorTag();
Toshihiro Shimizu 890ddd
	PliTag *readStyleTag();
Toshihiro Shimizu 890ddd
	PliTag *readGroupTag();
Toshihiro Shimizu 890ddd
	PliTag *readImageTag();
Toshihiro Shimizu 890ddd
	PliTag *readGeometricTransformationTag();
Toshihiro Shimizu 890ddd
	PliTag *readDoublePairTag();
Toshihiro Shimizu 890ddd
	PliTag *readBitmapTag();
Toshihiro Shimizu 890ddd
	PliTag *readIntersectionDataTag();
Toshihiro Shimizu 890ddd
	PliTag *readOutlineOptionsTag();
Toshihiro Shimizu 890ddd
	PliTag *readPrecisionScaleTag();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	inline void readDinamicData(TUINT32 &val, TUINT32 &bufOffs);
Toshihiro Shimizu 890ddd
	inline bool readDinamicData(TINT32 &val, TUINT32 &bufOffs);
Toshihiro Shimizu 890ddd
	inline void readFloatData(double &val, TUINT32 &bufOffs);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	inline UINT readRasterData(TRaster32P &r, TUINT32 &bufOffs);
Toshihiro Shimizu 890ddd
	inline void writeFloatData(double val);
Toshihiro Shimizu 890ddd
	inline void readUShortData(USHORT &val, TUINT32 &bufOffs);
Toshihiro Shimizu 890ddd
	inline void readTUINT32Data(TUINT32 &val, TUINT32 &bufOffs);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TUINT32 writeTagHeader(UCHAR type, UINT tagLength);
Toshihiro Shimizu 890ddd
	TUINT32 writeTextTag(TextTag *tag);
Toshihiro Shimizu 890ddd
	TUINT32 writePaletteTag(PaletteTag *tag);
Toshihiro Shimizu 890ddd
	TUINT32 writePaletteWithAlphaTag(PaletteWithAlphaTag *tag);
Toshihiro Shimizu 890ddd
	TUINT32 writeThickQuadraticChainTag(ThickQuadraticChainTag *tag);
Toshihiro Shimizu 890ddd
	TUINT32 writeGroupTag(GroupTag *tag);
Toshihiro Shimizu 890ddd
	TUINT32 writeImageTag(ImageTag *tag);
Toshihiro Shimizu 890ddd
	TUINT32 writeColorTag(ColorTag *tag);
Toshihiro Shimizu 890ddd
	TUINT32 writeStyleTag(StyleTag *tag);
Toshihiro Shimizu 890ddd
	TUINT32 writeGeometricTransformationTag(GeometricTransformationTag *tag);
Toshihiro Shimizu 890ddd
	TUINT32 writeDoublePairTag(DoublePairTag *tag);
Toshihiro Shimizu 890ddd
	TUINT32 writeBitmapTag(BitmapTag *tag);
Toshihiro Shimizu 890ddd
	TUINT32 writeIntersectionDataTag(IntersectionDataTag *tag);
Toshihiro Shimizu 890ddd
	TUINT32 writeOutlineOptionsTag(StrokeOutlineOptionsTag *tag);
Toshihiro Shimizu 890ddd
	TUINT32 writePrecisionScaleTag(PrecisionScaleTag *tag);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	inline void writeDinamicData(TUINT32 val);
Toshihiro Shimizu 890ddd
	inline void writeDinamicData(TINT32 val, bool isNegative);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	inline void setDinamicTypeBytesNum(int minval, int maxval);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	PliTag *findTagFromOffset(UINT tagOffs);
Toshihiro Shimizu 890ddd
	UINT findOffsetFromTag(PliTag *tag);
Toshihiro Shimizu 890ddd
	TagElem *findTag(PliTag *tag);
Toshihiro Shimizu 890ddd
	USHORT readTagHeader();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	enum errorType {
Toshihiro Shimizu 890ddd
		NO__ERROR = 0,
Toshihiro Shimizu 890ddd
		NO_FILE,
Toshihiro Shimizu 890ddd
		BAD_MAGIC,
Toshihiro Shimizu 890ddd
		PREMATURE_EOF,
Toshihiro Shimizu 890ddd
		WRITE_ERROR,
Toshihiro Shimizu 890ddd
		ERRORTYPE_HOW_MANY
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	errorType m_lastError;
Toshihiro Shimizu 890ddd
	string m_creator;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TagElem *m_firstTag;
Toshihiro Shimizu 890ddd
	TagElem *m_lastTag;
Toshihiro Shimizu 890ddd
	TagElem *m_currTag;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	MyIfstream m_iChan;
Toshihiro Shimizu 890ddd
	MyOfstream *m_oChan;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ParsedPliImp();
Toshihiro Shimizu 890ddd
	ParsedPliImp(UCHAR majorVersionNumber,
Toshihiro Shimizu 890ddd
				 UCHAR minorVersionNumber,
Toshihiro Shimizu 890ddd
				 USHORT framesNumber,
Toshihiro Shimizu 890ddd
				 UCHAR precision,
Toshihiro Shimizu 890ddd
				 UCHAR maxThickness,
Toshihiro Shimizu 890ddd
				 double autocloseTolerance);
Toshihiro Shimizu 890ddd
	ParsedPliImp(const TFilePath &filename, bool readInfo);
Toshihiro Shimizu 890ddd
	~ParsedPliImp();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setFrameCount(int frameCount);
Toshihiro Shimizu 890ddd
	int getFrameCount();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void loadInfo(bool readPalette, TPalette *&palette, TContentHistory *&history);
Toshihiro Shimizu 890ddd
	ImageTag *loadFrame(const TFrameId &frameNumber);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TagElem *readTag();
Toshihiro Shimizu 890ddd
	void writeTag(TagElem *tag);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool addTag(PliTag *tag, bool addFront = false);
Toshihiro Shimizu 890ddd
	bool addTag(const TagElem &tag, bool addFront = false);
Toshihiro Shimizu 890ddd
	bool writePli(const TFilePath &filename);
Toshihiro Shimizu 890ddd
	inline void WRITE_UCHAR_FROM_DOUBLE(double dval);
Toshihiro Shimizu 890ddd
	inline void WRITE_SHORT_FROM_DOUBLE(double dval);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
double ParsedPli::getMaxThickness() const { return imp->m_maxThickness; };
Toshihiro Shimizu 890ddd
void ParsedPli::setMaxThickness(double maxThickness)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	imp->m_maxThickness = maxThickness;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
static inline UCHAR complement1(char val, bool isNegative = false)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (val == 0)
Toshihiro Shimizu 890ddd
		return isNegative ? 0x80 : 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return (UCHAR)(abs(val) | (val & 0x80));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
static inline USHORT complement1(short val, bool isNegative = false)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (val == 0)
Toshihiro Shimizu 890ddd
		return isNegative ? 0x8000 : 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return (USHORT)(abs(val) | (val & 0x8000));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
static inline TUINT32 complement1(TINT32 val, bool isNegative = false)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (val == 0)
Toshihiro Shimizu 890ddd
		return isNegative ? 0x80000000 : 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return (TUINT32)(abs(val) | (val & 0x80000000));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
static inline short complement2(USHORT val)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return (val & 0x8000) ? -(val & 0x7fff) : (val & 0x7fff);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ParsedPliImp::ParsedPliImp()
Shinya Kitaoka 79e39b
	: m_majorVersionNumber(0)
Shinya Kitaoka 79e39b
	, m_minorVersionNumber(0)
Shinya Kitaoka 79e39b
	, m_framesNumber(0)
Shinya Kitaoka 79e39b
	, m_thickRatio(1.0)
Shinya Kitaoka 79e39b
	, m_maxThickness(0.0)
Shinya Kitaoka 79e39b
	, m_firstTag(NULL)
Shinya Kitaoka 79e39b
	, m_lastTag(NULL)
Shinya Kitaoka 79e39b
	, m_currTag(NULL)
Shinya Kitaoka 79e39b
	, m_iChan()
Shinya Kitaoka 79e39b
	, m_oChan(0)
Shinya Kitaoka 79e39b
	, m_bufLength(0)
Shinya Kitaoka 79e39b
	, m_affine()
Shinya Kitaoka 79e39b
	, m_precisionScale(REGION_COMPUTING_PRECISION)
Shinya Kitaoka 79e39b
	, m_creator("")
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ParsedPliImp::ParsedPliImp(UCHAR majorVersionNumber,
Toshihiro Shimizu 890ddd
						   UCHAR minorVersionNumber,
Toshihiro Shimizu 890ddd
						   USHORT framesNumber,
Toshihiro Shimizu 890ddd
						   UCHAR precision,
Toshihiro Shimizu 890ddd
						   UCHAR maxThickness,
Toshihiro Shimizu 890ddd
						   double autocloseTolerance)
Shinya Kitaoka 79e39b
	: m_majorVersionNumber(majorVersionNumber)
Shinya Kitaoka 79e39b
	, m_minorVersionNumber(minorVersionNumber)
Shinya Kitaoka 79e39b
	, m_framesNumber(framesNumber)
Shinya Kitaoka 79e39b
	, m_maxThickness(maxThickness)
Shinya Kitaoka 79e39b
	, m_autocloseTolerance(autocloseTolerance)
Shinya Kitaoka 79e39b
	, m_thickRatio(maxThickness / 255.0)
Shinya Kitaoka 79e39b
	, m_firstTag(NULL)
Shinya Kitaoka 79e39b
	, m_lastTag(NULL)
Shinya Kitaoka 79e39b
	, m_currTag(NULL)
Shinya Kitaoka 79e39b
	, m_iChan()
Shinya Kitaoka 79e39b
	, m_oChan(0)
Shinya Kitaoka 79e39b
	, m_bufLength(0)
Shinya Kitaoka 79e39b
	, m_affine(TScale(1.0 / pow(10.0, precision)))
Shinya Kitaoka 79e39b
	, m_precisionScale(REGION_COMPUTING_PRECISION)
Shinya Kitaoka 79e39b
	, m_creator("")
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ParsedPliImp::ParsedPliImp(const TFilePath &filename, bool readInfo)
Toshihiro Shimizu 890ddd
	: m_majorVersionNumber(0), m_minorVersionNumber(0)
Shinya Kitaoka 79e39b
	, m_framesNumber(0)
Shinya Kitaoka 79e39b
	, m_thickRatio(1.0)
Shinya Kitaoka 79e39b
	, m_maxThickness(0)
Shinya Kitaoka 79e39b
	, m_firstTag(NULL)
Shinya Kitaoka 79e39b
	, m_lastTag(NULL)
Shinya Kitaoka 79e39b
	, m_currTag(NULL)
Shinya Kitaoka 79e39b
	, m_iChan()
Shinya Kitaoka 79e39b
	, m_oChan(0)
Shinya Kitaoka 79e39b
	, m_bufLength(0)
Shinya Kitaoka 79e39b
	, m_precisionScale(REGION_COMPUTING_PRECISION)
Shinya Kitaoka 79e39b
	, m_creator("")
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TUINT32 magic;
Toshihiro Shimizu 890ddd
	//  TUINT32 fileLenght;
Toshihiro Shimizu 890ddd
	TagElem *tagElem;
Toshihiro Shimizu 890ddd
	UCHAR maxThickness;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// cerr<
Toshihiro Shimizu 890ddd
Shinya Kitaoka 9f5a1b
	//#ifdef _WIN32
Toshihiro Shimizu 890ddd
	m_iChan.open(filename);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//m_iChan.exceptions( ios::failbit | ios::badbit);
Toshihiro Shimizu 890ddd
	//#else
Toshihiro Shimizu 890ddd
	//  m_iChan.open(filename.c_str(), ios::in);
Toshihiro Shimizu 890ddd
	//#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_iChan >> magic;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	CHECK_FOR_READ_ERROR(filename);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (magic == c_magicNt) {
Toshihiro Shimizu 890ddd
#if TNZ_LITTLE_ENDIAN
Toshihiro Shimizu 890ddd
		m_isIrixEndian = false;
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
		m_isIrixEndian = true;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
		m_iChan.setEndianess(false);
Toshihiro Shimizu 890ddd
	} else if (magic == c_magicIrix) {
Toshihiro Shimizu 890ddd
#if TNZ_LITTLE_ENDIAN
Toshihiro Shimizu 890ddd
		m_isIrixEndian = true;
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
		m_isIrixEndian = false;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
		m_iChan.setEndianess(true);
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		m_lastError = BAD_MAGIC;
Toshihiro Shimizu 890ddd
		throw TImageException(filename, "Error on reading magic number");
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_iChan >> m_majorVersionNumber;
Toshihiro Shimizu 890ddd
	m_iChan >> m_minorVersionNumber;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Loading pli versions AFTER current one is NOT SUPPORTED. This means that an
Toshihiro Shimizu 890ddd
	//exception is directly called at this point.
Toshihiro Shimizu 890ddd
	if (m_majorVersionNumber > c_majorVersionNumber ||
Toshihiro Shimizu 890ddd
		(m_majorVersionNumber == c_majorVersionNumber && m_minorVersionNumber > c_minorVersionNumber))
Toshihiro Shimizu 890ddd
		throw TImageVersionException(filename, m_majorVersionNumber, m_minorVersionNumber);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_majorVersionNumber > 5 || m_majorVersionNumber == 5 && m_minorVersionNumber >= 8)
Toshihiro Shimizu 890ddd
		m_iChan >> m_creator;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_majorVersionNumber < 5) {
Toshihiro Shimizu 890ddd
		TUINT32 fileLenght;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_iChan >> fileLenght;
Toshihiro Shimizu 890ddd
		m_iChan >> m_framesNumber;
Toshihiro Shimizu 890ddd
		m_iChan >> maxThickness;
Toshihiro Shimizu 890ddd
		m_thickRatio = maxThickness / 255.0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (readInfo)
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		CHECK_FOR_READ_ERROR(filename);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_currDinamicTypeBytesNum = 2;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		while ((tagElem = readTag())) {
Toshihiro Shimizu 890ddd
			if (!m_firstTag)
Toshihiro Shimizu 890ddd
				m_firstTag = m_lastTag = tagElem;
Toshihiro Shimizu 890ddd
			else {
Toshihiro Shimizu 890ddd
				m_lastTag->m_next = tagElem;
Toshihiro Shimizu 890ddd
				m_lastTag = m_lastTag->m_next;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		for (tagElem = m_firstTag; tagElem; tagElem = tagElem->m_next)
Toshihiro Shimizu 890ddd
			tagElem->m_offset = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_iChan.close();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
extern TPalette *readPalette(GroupTag *paletteTag, int majorVersion, int minorVersion);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
const TFrameId &ParsedPli::getFrameNumber(int index)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(imp->m_frameOffsInFile.size() == imp->m_framesNumber);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	std::map<tframeid, int="">::iterator it = imp->m_frameOffsInFile.begin();</tframeid,>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	std::advance(it, index);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return it->first;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ParsedPliImp::loadInfo(bool readPlt, TPalette *&palette, TContentHistory *&history)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TUINT32 fileLenght;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_iChan >> fileLenght;
Toshihiro Shimizu 890ddd
	m_iChan >> m_framesNumber;
Toshihiro Shimizu 890ddd
	if (!((m_majorVersionNumber == 5 && m_minorVersionNumber >= 7) || (m_majorVersionNumber > 5))) {
Toshihiro Shimizu 890ddd
		UCHAR maxThickness;
Toshihiro Shimizu 890ddd
		m_iChan >> maxThickness;
Toshihiro Shimizu 890ddd
		m_thickRatio = maxThickness / 255.0;
Toshihiro Shimizu 890ddd
	} else
Toshihiro Shimizu 890ddd
		m_thickRatio = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	UCHAR ii, d, s = 2;
Toshihiro Shimizu 890ddd
	if (m_majorVersionNumber > 6 || (m_majorVersionNumber == 6 && m_minorVersionNumber >= 5))
Toshihiro Shimizu 890ddd
		m_iChan >> s;
Toshihiro Shimizu 890ddd
	m_iChan >> ii;
Toshihiro Shimizu 890ddd
	m_iChan >> d;
Toshihiro Shimizu 890ddd
	m_autocloseTolerance = ((double)(s - 1)) * (ii + 0.01 * d);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_currDinamicTypeBytesNum = 2;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//m_frameOffsInFile = new int[m_framesNumber];
Toshihiro Shimizu 890ddd
	//for (int i=0; i
Toshihiro Shimizu 890ddd
	//  m_frameOffsInFile[i] = -1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TUINT32 pos = m_iChan.tellg();
Toshihiro Shimizu 890ddd
	USHORT type;
Toshihiro Shimizu 890ddd
	while ((type = readTagHeader()) != PliTag::END_CNTRL) {
Toshihiro Shimizu 890ddd
		if (type == PliTag::IMAGE_BEGIN_GOBJ) {
Toshihiro Shimizu 890ddd
			USHORT frame;
Toshihiro Shimizu 890ddd
			m_iChan >> frame;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			char letter = 0;
Toshihiro Shimizu 890ddd
			if (m_majorVersionNumber > 6 || (m_majorVersionNumber == 6 && m_minorVersionNumber >= 6))
Toshihiro Shimizu 890ddd
				m_iChan >> letter;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			m_frameOffsInFile[TFrameId(frame, letter)] = m_iChan.tellg();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			//m_iChan.seekg(m_tagLength, ios::cur);
Toshihiro Shimizu 890ddd
			m_iChan.seekg(m_tagLength - 2, ios::cur);
Toshihiro Shimizu 890ddd
		} else if (type == PliTag::STYLE_NGOBJ) {
Toshihiro Shimizu 890ddd
			m_iChan.seekg(pos, ios::beg);
Toshihiro Shimizu 890ddd
			TagElem *tagElem = readTag();
Toshihiro Shimizu 890ddd
			addTag(*tagElem);
Toshihiro Shimizu 890ddd
			tagElem->m_tag = 0;
Toshihiro Shimizu 890ddd
			delete tagElem;
Toshihiro Shimizu 890ddd
		} else if (type == PliTag::TEXT) {
Toshihiro Shimizu 890ddd
			m_iChan.seekg(pos, ios::beg);
Toshihiro Shimizu 890ddd
			TagElem *tagElem = readTag();
Toshihiro Shimizu 890ddd
			TextTag *textTag = (TextTag *)tagElem->m_tag;
Toshihiro Shimizu 890ddd
			history = new TContentHistory(true);
Toshihiro Shimizu 890ddd
			history->deserialize(QString::fromStdString(textTag->m_text));
Toshihiro Shimizu 890ddd
			delete tagElem;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		else if (type == PliTag::GROUP_GOBJ && readPlt) //la paletta!!!
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			m_iChan.seekg(pos, ios::beg);
Toshihiro Shimizu 890ddd
			TagElem *tagElem = readTag();
Toshihiro Shimizu 890ddd
			GroupTag *grouptag = (GroupTag *)tagElem->m_tag;
Toshihiro Shimizu 890ddd
			if (grouptag->m_type == (UCHAR)GroupTag::PALETTE) {
Toshihiro Shimizu 890ddd
				readPlt = false;
Toshihiro Shimizu 890ddd
				palette = readPalette((GroupTag *)tagElem->m_tag,
Toshihiro Shimizu 890ddd
									  m_majorVersionNumber, m_minorVersionNumber);
Toshihiro Shimizu 890ddd
			} else
Toshihiro Shimizu 890ddd
				assert(grouptag->m_type == (UCHAR)GroupTag::STROKE);
Toshihiro Shimizu 890ddd
			delete tagElem;
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			m_iChan.seekg(m_tagLength, ios::cur);
Toshihiro Shimizu 890ddd
			switch (type) {
Toshihiro Shimizu 890ddd
			case PliTag::SET_DATA_8_CNTRL:
Toshihiro Shimizu 890ddd
				m_currDinamicTypeBytesNum = 1;
Shinya Kitaoka d4642c
				break;
Shinya Kitaoka d4642c
			case PliTag::SET_DATA_16_CNTRL:
Shinya Kitaoka d4642c
				m_currDinamicTypeBytesNum = 2;
Shinya Kitaoka d4642c
				break;
Shinya Kitaoka d4642c
			case PliTag::SET_DATA_32_CNTRL:
Shinya Kitaoka d4642c
				m_currDinamicTypeBytesNum = 4;
Shinya Kitaoka d4642c
				break;
Shinya Kitaoka d4642c
			default:
Shinya Kitaoka d4642c
				break;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		pos = m_iChan.tellg();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(m_frameOffsInFile.size() == m_framesNumber);
Toshihiro Shimizu 890ddd
	//palette = new TPalette();
Toshihiro Shimizu 890ddd
	//for (int i=0; i<256; i++)
Toshihiro Shimizu 890ddd
	//  palette->getPage(0)->addStyle(TPixel::Black);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
USHORT ParsedPliImp::readTagHeader()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	UCHAR ucharTagType, tagLengthId;
Toshihiro Shimizu 890ddd
	USHORT tagType;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// unused variable
Toshihiro Shimizu 890ddd
#if 0
Toshihiro Shimizu 890ddd
  TUINT32 tagOffset = m_iChan.tellg();
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_iChan >> ucharTagType;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (ucharTagType == 0xFF) {
Toshihiro Shimizu 890ddd
		m_iChan >> tagType;
Toshihiro Shimizu 890ddd
		tagLengthId = tagType >> 14;
Toshihiro Shimizu 890ddd
		tagType &= 0x3FFF;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		tagType = ucharTagType;
Toshihiro Shimizu 890ddd
		tagLengthId = tagType >> 6;
Toshihiro Shimizu 890ddd
		tagType &= 0x3F;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_tagLength = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (tagLengthId) {
Toshihiro Shimizu 890ddd
	case 0x0:
Toshihiro Shimizu 890ddd
		m_tagLength = 0;
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case 0x1: {
Shinya Kitaoka d4642c
		UCHAR clength;
Toshihiro Shimizu 890ddd
		m_iChan >> clength;
Toshihiro Shimizu 890ddd
		m_tagLength = clength;
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	}
Shinya Kitaoka d4642c
	case 0x2: {
Shinya Kitaoka d4642c
		USHORT slength;
Toshihiro Shimizu 890ddd
		m_iChan >> slength;
Toshihiro Shimizu 890ddd
		m_tagLength = slength;
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	}
Shinya Kitaoka d4642c
	case 0x3:
Shinya Kitaoka d4642c
		m_iChan >> m_tagLength;
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	default:
Toshihiro Shimizu 890ddd
		assert(false);
Shinya Kitaoka d4642c
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return tagType;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ImageTag *ParsedPliImp::loadFrame(const TFrameId &frameNumber)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_currDinamicTypeBytesNum = 2;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TagElem *tagElem = m_firstTag;
Toshihiro Shimizu 890ddd
	while (tagElem) {
Toshihiro Shimizu 890ddd
		TagElem *auxTag = tagElem;
Toshihiro Shimizu 890ddd
		tagElem = tagElem->m_next;
Toshihiro Shimizu 890ddd
		delete auxTag;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	m_firstTag = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//PliTag *tag;
Toshihiro Shimizu 890ddd
	USHORT type = PliTag::IMAGE_BEGIN_GOBJ;
Toshihiro Shimizu 890ddd
	USHORT frame;
Toshihiro Shimizu 890ddd
	char letter;
Toshihiro Shimizu 890ddd
	TFrameId frameId;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// cerco il frame
Toshihiro Shimizu 890ddd
	std::map<tframeid, int="">::iterator it;</tframeid,>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	it = m_frameOffsInFile.find(frameNumber);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (it != m_frameOffsInFile.end()) {
Toshihiro Shimizu 890ddd
		m_iChan.seekg(it->second, ios::beg);
Toshihiro Shimizu 890ddd
		frameId = it->first;
Toshihiro Shimizu 890ddd
	} else
Toshihiro Shimizu 890ddd
		while ((type = readTagHeader()) != PliTag::END_CNTRL) {
Toshihiro Shimizu 890ddd
			if (type == PliTag::IMAGE_BEGIN_GOBJ) {
Toshihiro Shimizu 890ddd
				m_iChan >> frame;
Toshihiro Shimizu 890ddd
				if (m_majorVersionNumber > 6 || (m_majorVersionNumber == 6 && m_minorVersionNumber >= 6))
Toshihiro Shimizu 890ddd
					m_iChan >> letter;
Toshihiro Shimizu 890ddd
				else
Toshihiro Shimizu 890ddd
					letter = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				frameId = TFrameId(frame, letter);
Toshihiro Shimizu 890ddd
				m_frameOffsInFile[frameId] = m_iChan.tellg();
Toshihiro Shimizu 890ddd
				if (frameId == frameNumber)
Toshihiro Shimizu 890ddd
					break;
Toshihiro Shimizu 890ddd
			} else
Toshihiro Shimizu 890ddd
				m_iChan.seekg(m_tagLength, ios::cur);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (type == PliTag::END_CNTRL) {
Toshihiro Shimizu 890ddd
		throw TImageException(TFilePath(), "Pli: frame not found");
Toshihiro Shimizu 890ddd
		return 0;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//trovato; leggo i suoi tag
Toshihiro Shimizu 890ddd
	while ((tagElem = readTag())) {
Toshihiro Shimizu 890ddd
		if (!m_firstTag)
Toshihiro Shimizu 890ddd
			m_firstTag = m_lastTag = tagElem;
Toshihiro Shimizu 890ddd
		else {
Toshihiro Shimizu 890ddd
			m_lastTag->m_next = tagElem;
Toshihiro Shimizu 890ddd
			m_lastTag = m_lastTag->m_next;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		if (tagElem->m_tag->m_type == PliTag::IMAGE_GOBJ) {
Toshihiro Shimizu 890ddd
			assert(((ImageTag *)(tagElem->m_tag))->m_numFrame == frameId);
Toshihiro Shimizu 890ddd
			return (ImageTag *)tagElem->m_tag;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TagElem *ParsedPliImp::readTag()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	UCHAR ucharTagType, tagLengthId;
Toshihiro Shimizu 890ddd
	USHORT tagType;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TUINT32 tagOffset = m_iChan.tellg();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_iChan >> ucharTagType;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (ucharTagType == 0xFF) {
Toshihiro Shimizu 890ddd
		m_iChan >> tagType;
Toshihiro Shimizu 890ddd
		tagLengthId = tagType >> 14;
Toshihiro Shimizu 890ddd
		tagType &= 0x3FFF;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		tagType = ucharTagType;
Toshihiro Shimizu 890ddd
		tagLengthId = tagType >> 6;
Toshihiro Shimizu 890ddd
		tagType &= 0x3F;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_tagLength = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (tagLengthId) {
Toshihiro Shimizu 890ddd
	case 0x0:
Toshihiro Shimizu 890ddd
		m_tagLength = 0;
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case 0x1: {
Shinya Kitaoka d4642c
		UCHAR clength;
Toshihiro Shimizu 890ddd
		m_iChan >> clength;
Toshihiro Shimizu 890ddd
		m_tagLength = clength;
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	}
Shinya Kitaoka d4642c
	case 0x2: {
Shinya Kitaoka d4642c
		USHORT slength;
Toshihiro Shimizu 890ddd
		m_iChan >> slength;
Toshihiro Shimizu 890ddd
		m_tagLength = slength;
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	}
Shinya Kitaoka d4642c
	case 0x3:
Shinya Kitaoka d4642c
		m_iChan >> m_tagLength;
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	default:
Toshihiro Shimizu 890ddd
		assert(false);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_bufLength < m_tagLength) {
Toshihiro Shimizu 890ddd
		m_bufLength = m_tagLength;
Shinya Kitaoka 79e39b
		m_buf.reset(new UCHAR[m_bufLength]);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_tagLength) {
Shinya Kitaoka 79e39b
		m_iChan.read((char *)m_buf.get(), (int)m_tagLength);
Toshihiro Shimizu 890ddd
		CHECK_FOR_READ_ERROR(m_filePath);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	PliTag *newTag = NULL;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (tagType) {
Toshihiro Shimizu 890ddd
	case PliTag::SET_DATA_8_CNTRL:
Toshihiro Shimizu 890ddd
		m_currDinamicTypeBytesNum = 1;
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::SET_DATA_16_CNTRL:
Shinya Kitaoka d4642c
		m_currDinamicTypeBytesNum = 2;
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::SET_DATA_32_CNTRL:
Shinya Kitaoka d4642c
		m_currDinamicTypeBytesNum = 4;
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::TEXT:
Shinya Kitaoka d4642c
		newTag = readTextTag();
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::PALETTE:
Shinya Kitaoka d4642c
		newTag = readPaletteTag();
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::PALETTE_WITH_ALPHA:
Shinya Kitaoka d4642c
		newTag = readPaletteWithAlphaTag();
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::THICK_QUADRATIC_CHAIN_GOBJ:
Shinya Kitaoka d4642c
	case PliTag::THICK_QUADRATIC_LOOP_GOBJ:
Shinya Kitaoka d4642c
		newTag = readThickQuadraticChainTag(tagType == PliTag::THICK_QUADRATIC_LOOP_GOBJ);
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::GROUP_GOBJ:
Shinya Kitaoka d4642c
		newTag = readGroupTag();
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::IMAGE_GOBJ:
Shinya Kitaoka d4642c
		newTag = readImageTag();
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::COLOR_NGOBJ:
Shinya Kitaoka d4642c
		newTag = readColorTag();
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::STYLE_NGOBJ:
Shinya Kitaoka d4642c
		newTag = readStyleTag();
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::GEOMETRIC_TRANSFORMATION_GOBJ:
Shinya Kitaoka d4642c
		newTag = readGeometricTransformationTag();
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::DOUBLEPAIR_OBJ:
Shinya Kitaoka d4642c
		newTag = readDoublePairTag();
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::BITMAP_GOBJ:
Shinya Kitaoka d4642c
		newTag = readBitmapTag();
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::INTERSECTION_DATA_GOBJ:
Shinya Kitaoka d4642c
		newTag = readIntersectionDataTag();
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::OUTLINE_OPTIONS_GOBJ:
Shinya Kitaoka d4642c
		newTag = readOutlineOptionsTag();
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::PRECISION_SCALE_GOBJ:
Shinya Kitaoka d4642c
		newTag = readPrecisionScaleTag();
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::END_CNTRL:
Shinya Kitaoka d4642c
		return 0;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (newTag)
Toshihiro Shimizu 890ddd
		return new TagElem(newTag, tagOffset);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		return readTag();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
PliTag *ParsedPliImp::findTagFromOffset(UINT tagOffs)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	for (TagElem *elem = m_firstTag; elem; elem = elem->m_next)
Toshihiro Shimizu 890ddd
		if (elem->m_offset == tagOffs)
Toshihiro Shimizu 890ddd
			return elem->m_tag;
Toshihiro Shimizu 890ddd
	return NULL;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
UINT ParsedPliImp::findOffsetFromTag(PliTag *tag)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	for (TagElem *elem = m_firstTag; elem; elem = elem->m_next)
Toshihiro Shimizu 890ddd
		if (elem->m_tag == tag)
Toshihiro Shimizu 890ddd
			return elem->m_offset;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TagElem *ParsedPliImp::findTag(PliTag *tag)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	for (TagElem *elem = m_firstTag; elem; elem = elem->m_next)
Toshihiro Shimizu 890ddd
		if (elem->m_tag == tag)
Toshihiro Shimizu 890ddd
			return elem;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return NULL;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline void ParsedPliImp::readDinamicData(TUINT32 &val, TUINT32 &bufOffs)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	switch (m_currDinamicTypeBytesNum) {
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		val = m_buf[bufOffs++];
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case 2:
Shinya Kitaoka d4642c
		if (m_isIrixEndian)
Shinya Kitaoka d4642c
			val = m_buf[bufOffs + 1] | (m_buf[bufOffs] << 8);
Shinya Kitaoka d4642c
		else
Shinya Kitaoka d4642c
			val = m_buf[bufOffs] | (m_buf[bufOffs + 1] << 8);
Toshihiro Shimizu 890ddd
		bufOffs += 2;
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case 4:
Shinya Kitaoka d4642c
		if (m_isIrixEndian)
Shinya Kitaoka d4642c
			val = m_buf[bufOffs + 3] | (m_buf[bufOffs + 2] << 8) | (m_buf[bufOffs + 1] << 16) | (m_buf[bufOffs] << 24);
Shinya Kitaoka d4642c
		else
Shinya Kitaoka d4642c
			val = m_buf[bufOffs] | (m_buf[bufOffs + 1] << 8) | (m_buf[bufOffs + 2] << 16) | (m_buf[bufOffs + 3] << 24);
Toshihiro Shimizu 890ddd
		bufOffs += 4;
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	default:
Toshihiro Shimizu 890ddd
		assert(false);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline bool ParsedPliImp::readDinamicData(TINT32 &val, TUINT32 &bufOffs)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	bool isNegative = false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (m_currDinamicTypeBytesNum) {
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		val = m_buf[bufOffs] & 0x7f;
Toshihiro Shimizu 890ddd
		if (m_buf[bufOffs] & 0x80) {
Toshihiro Shimizu 890ddd
			val = -val;
Toshihiro Shimizu 890ddd
			isNegative = true;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		bufOffs++;
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case 2:
Shinya Kitaoka d4642c
		if (m_isIrixEndian) {
Toshihiro Shimizu 890ddd
			val = (m_buf[bufOffs + 1] | (m_buf[bufOffs] << 8)) & 0x7fff;
Toshihiro Shimizu 890ddd
			if (m_buf[bufOffs] & 0x80) {
Toshihiro Shimizu 890ddd
				val = -val;
Toshihiro Shimizu 890ddd
				isNegative = true;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Shinya Kitaoka d4642c
		else {
Toshihiro Shimizu 890ddd
			val = (m_buf[bufOffs] | (m_buf[bufOffs + 1] << 8)) & 0x7fff;
Toshihiro Shimizu 890ddd
			if (m_buf[bufOffs + 1] & 0x80) {
Toshihiro Shimizu 890ddd
				val = -val;
Toshihiro Shimizu 890ddd
				isNegative = true;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		bufOffs += 2;
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case 4:
Shinya Kitaoka d4642c
		if (m_isIrixEndian) {
Toshihiro Shimizu 890ddd
			val = m_buf[bufOffs + 3] | (m_buf[bufOffs + 2] << 8) | (m_buf[bufOffs + 1] << 16) | (m_buf[bufOffs] << 24) & 0x7fffffff;
Toshihiro Shimizu 890ddd
			if (m_buf[bufOffs] & 0x80) {
Toshihiro Shimizu 890ddd
				val = -val;
Toshihiro Shimizu 890ddd
				isNegative = true;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Shinya Kitaoka d4642c
		else {
Toshihiro Shimizu 890ddd
			val = m_buf[bufOffs] | (m_buf[bufOffs + 1] << 8) | (m_buf[bufOffs + 2] << 16) | (m_buf[bufOffs + 3] << 24) & 0x7fffffff;
Toshihiro Shimizu 890ddd
			if (m_buf[bufOffs + 3] & 0x80) {
Toshihiro Shimizu 890ddd
				val = -val;
Toshihiro Shimizu 890ddd
				isNegative = true;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		bufOffs += 4;
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	default:
Toshihiro Shimizu 890ddd
		assert(false);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return isNegative;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
PliTag *ParsedPliImp::readTextTag()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_tagLength == 0)
Toshihiro Shimizu 890ddd
		return new TextTag("");
Toshihiro Shimizu 890ddd
Shinya Kitaoka 79e39b
	return new TextTag(string((char *)m_buf.get(), m_tagLength));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
PliTag *ParsedPliImp::readPaletteTag()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPixelRGBM32 *plt;
Toshihiro Shimizu 890ddd
	TUINT32 numColors = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	plt = new TPixelRGBM32[m_tagLength / 3];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (unsigned int i = 0; i < m_tagLength; i += 3, numColors++) {
Toshihiro Shimizu 890ddd
		plt[numColors].r = m_buf[i];
Toshihiro Shimizu 890ddd
		plt[numColors].g = m_buf[i + 1];
Toshihiro Shimizu 890ddd
		plt[numColors].b = m_buf[i + 2];
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	PaletteTag *tag = new PaletteTag(numColors, plt);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	delete plt;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return tag;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
PliTag *ParsedPliImp::readPaletteWithAlphaTag()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TPixelRGBM32 *plt;
Toshihiro Shimizu 890ddd
	TUINT32 numColors = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	plt = new TPixelRGBM32[m_tagLength / 4];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (unsigned int i = 0; i < m_tagLength; i += 4, numColors++) {
Toshihiro Shimizu 890ddd
		plt[numColors].r = m_buf[i];
Toshihiro Shimizu 890ddd
		plt[numColors].g = m_buf[i + 1];
Toshihiro Shimizu 890ddd
		plt[numColors].b = m_buf[i + 2];
Toshihiro Shimizu 890ddd
		plt[numColors].m = m_buf[i + 3];
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	PaletteWithAlphaTag *tag = new PaletteWithAlphaTag(numColors, plt);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	delete plt;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return tag;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
PliTag *ParsedPliImp::readThickQuadraticChainTag(bool isLoop)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TThickPoint p;
Toshihiro Shimizu 890ddd
	TUINT32 bufOffs = 0;
Toshihiro Shimizu 890ddd
	double dx1, dy1, dx2, dy2;
Toshihiro Shimizu 890ddd
	TINT32 d;
Toshihiro Shimizu 890ddd
	TUINT32 numQuadratics = 0;
Toshihiro Shimizu 890ddd
	double scale;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool newThicknessWriteMethod = ((m_majorVersionNumber == 5 && m_minorVersionNumber >= 7) ||
Toshihiro Shimizu 890ddd
									(m_majorVersionNumber > 5));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	scale = 1.0 / (double)m_precisionScale;
Toshihiro Shimizu 890ddd
	int maxThickness;
Toshihiro Shimizu 890ddd
	if (newThicknessWriteMethod)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		maxThickness = m_buf[bufOffs++];
Toshihiro Shimizu 890ddd
		m_thickRatio = maxThickness / 255.0;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		maxThickness = (int)m_maxThickness;
Toshihiro Shimizu 890ddd
		assert(m_thickRatio != 0);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TINT32 val;
Toshihiro Shimizu 890ddd
	readDinamicData(val, bufOffs);
Toshihiro Shimizu 890ddd
	p.x = scale * val;
Toshihiro Shimizu 890ddd
	readDinamicData(val, bufOffs);
Toshihiro Shimizu 890ddd
	p.y = scale * val;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	p.thick = m_buf[bufOffs++] * m_thickRatio;
Toshihiro Shimizu 890ddd
	if (newThicknessWriteMethod)
Toshihiro Shimizu 890ddd
		numQuadratics = (m_tagLength - 2 * m_currDinamicTypeBytesNum - 1 - 1) / (4 * m_currDinamicTypeBytesNum + 2);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		numQuadratics = (m_tagLength - 2 * m_currDinamicTypeBytesNum - 1) / (4 * m_currDinamicTypeBytesNum + 3);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 79e39b
	std::unique_ptr<tthickquadratic[]> quadratic(new TThickQuadratic[numQuadratics]);</tthickquadratic[]>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (unsigned int i = 0; i < numQuadratics; i++) {
Toshihiro Shimizu 890ddd
		quadratic[i].setThickP0(p);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		readDinamicData(d, bufOffs);
Toshihiro Shimizu 890ddd
		dx1 = scale * d;
Toshihiro Shimizu 890ddd
		readDinamicData(d, bufOffs);
Toshihiro Shimizu 890ddd
		dy1 = scale * d;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (newThicknessWriteMethod)
Toshihiro Shimizu 890ddd
			p.thick = m_buf[bufOffs++] * m_thickRatio;
Toshihiro Shimizu 890ddd
		else {
Toshihiro Shimizu 890ddd
			if (m_isIrixEndian)
Toshihiro Shimizu 890ddd
				p.thick = complement2((USHORT)(m_buf[bufOffs + 1] | (m_buf[bufOffs] << 8))) * m_thickRatio;
Toshihiro Shimizu 890ddd
			else
Toshihiro Shimizu 890ddd
				p.thick = complement2((USHORT)(m_buf[bufOffs] | (m_buf[bufOffs + 1] << 8))) * m_thickRatio;
Toshihiro Shimizu 890ddd
			bufOffs += 2;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		readDinamicData(d, bufOffs);
Toshihiro Shimizu 890ddd
		dx2 = scale * d;
Toshihiro Shimizu 890ddd
		readDinamicData(d, bufOffs);
Toshihiro Shimizu 890ddd
		dy2 = scale * d;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (dx1 == 0 && dy1 == 0) //p0==p1, or p1==p2  creates problems (in the increasecontrolpoints for example) I slightly move it...
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			if (dx2 != 0 || dy2 != 0) {
Toshihiro Shimizu 890ddd
				dx1 = 0.001 * dx2;
Toshihiro Shimizu 890ddd
				dx2 = 0.999 * dx2;
Toshihiro Shimizu 890ddd
				dy1 = 0.001 * dy2;
Toshihiro Shimizu 890ddd
				dy2 = 0.999 * dy2;
Toshihiro Shimizu 890ddd
				assert(dx1 != 0 || dy1 != 0);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		} else if (dx2 == 0 && dy2 == 0) {
Toshihiro Shimizu 890ddd
			if (dx1 != 0 || dy1 != 0) {
Toshihiro Shimizu 890ddd
				dx2 = 0.001 * dx1;
Toshihiro Shimizu 890ddd
				dx1 = 0.999 * dx1;
Toshihiro Shimizu 890ddd
				dy2 = 0.001 * dy1;
Toshihiro Shimizu 890ddd
				dy1 = 0.999 * dy1;
Toshihiro Shimizu 890ddd
				assert(dx2 != 0 || dy2 != 0);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		p.x += dx1;
Toshihiro Shimizu 890ddd
		p.y += dy1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		quadratic[i].setThickP1(p);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		p.thick = m_buf[bufOffs++] * m_thickRatio;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		p.x += dx2;
Toshihiro Shimizu 890ddd
		p.y += dy2;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		quadratic[i].setThickP2(p);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ThickQuadraticChainTag *tag = new ThickQuadraticChainTag();
Toshihiro Shimizu 890ddd
	tag->m_numCurves = numQuadratics;
Shinya Kitaoka 79e39b
	tag->m_curve = std::move(quadratic);
Toshihiro Shimizu 890ddd
	tag->m_isLoop = isLoop;
Toshihiro Shimizu 890ddd
	tag->m_maxThickness = maxThickness;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return tag;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
PliTag *ParsedPliImp::readGroupTag()
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 79e39b
	TUINT32 bufOffs = 0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 79e39b
	UCHAR type = m_buf[bufOffs++];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(type < GroupTag::TYPE_HOW_MANY);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 79e39b
	TUINT32 numObjects = (m_tagLength - 1) / m_currDinamicTypeBytesNum;
Shinya Kitaoka 79e39b
	std::unique_ptr<pliobjecttag*[]> object(new PliObjectTag *[numObjects]);</pliobjecttag*[]>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 79e39b
	std::unique_ptr<tuint32[]> tagOffs(new TUINT32[numObjects]);</tuint32[]>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 79e39b
	for (TUINT32 i = 0; i < numObjects; i++) {
Toshihiro Shimizu 890ddd
		readDinamicData(tagOffs[i], bufOffs);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TagElem *elem;
Shinya Kitaoka 79e39b
	for (TUINT32 i = 0; i < numObjects; i++)
Toshihiro Shimizu 890ddd
		while (!(object[i] = (PliObjectTag *)findTagFromOffset(tagOffs[i])))
Toshihiro Shimizu 890ddd
			if ((elem = readTag()))
Toshihiro Shimizu 890ddd
				addTag(*elem);
Toshihiro Shimizu 890ddd
			else
Toshihiro Shimizu 890ddd
				assert(false);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 79e39b
	std::unique_ptr<grouptag> tag(new GroupTag());</grouptag>
Toshihiro Shimizu 890ddd
	tag->m_type = type;
Toshihiro Shimizu 890ddd
	tag->m_numObjects = numObjects;
Shinya Kitaoka 79e39b
	tag->m_object = std::move(object);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 79e39b
	return tag.release();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
PliTag *ParsedPliImp::readColorTag()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	ColorTag::styleType style;
Toshihiro Shimizu 890ddd
	ColorTag::attributeType attribute;
Toshihiro Shimizu 890ddd
	TUINT32 bufOffs = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	style = (ColorTag::styleType)m_buf[bufOffs++];
Toshihiro Shimizu 890ddd
	attribute = (ColorTag::attributeType)m_buf[bufOffs++];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(style < ColorTag::STYLE_HOW_MANY);
Toshihiro Shimizu 890ddd
	assert(attribute < ColorTag::ATTRIBUTE_HOW_MANY);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TUINT32 numColors = (m_tagLength - 2) / m_currDinamicTypeBytesNum;
Shinya Kitaoka 79e39b
	std::unique_ptr<tuint32[]> colorArray(new TUINT32[numColors]);</tuint32[]>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (unsigned int i = 0; i < numColors; i++) {
Toshihiro Shimizu 890ddd
		TUINT32 color;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		readDinamicData(color, bufOffs);
Toshihiro Shimizu 890ddd
		colorArray[i] = color;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 79e39b
	std::unique_ptr<colortag> tag(new ColorTag(style, attribute, numColors, std::move(colorArray)));</colortag>
Shinya Kitaoka 79e39b
	return tag.release();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
PliTag *ParsedPliImp::readStyleTag()
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 3bfa54
	std::vector<tstyleparam> paramArray;</tstyleparam>
Toshihiro Shimizu 890ddd
	TUINT32 bufOffs = 0;
Toshihiro Shimizu 890ddd
	int lenght = m_tagLength;
Toshihiro Shimizu 890ddd
	UINT i;
Toshihiro Shimizu 890ddd
	USHORT id = 0;
Toshihiro Shimizu 890ddd
	USHORT pageIndex = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	UCHAR currDinamicTypeBytesNumSaved = m_currDinamicTypeBytesNum;
Toshihiro Shimizu 890ddd
	m_currDinamicTypeBytesNum = 2;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	readUShortData(id, bufOffs);
Toshihiro Shimizu 890ddd
	lenght -= 2;
Toshihiro Shimizu 890ddd
	if (m_majorVersionNumber > 5 || (m_majorVersionNumber == 5 && m_minorVersionNumber >= 6)) {
Toshihiro Shimizu 890ddd
		readUShortData(pageIndex, bufOffs);
Toshihiro Shimizu 890ddd
		lenght -= 2;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	while (lenght > 0) {
Toshihiro Shimizu 890ddd
		TStyleParam param;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		param.m_type = (enum TStyleParam::Type)m_buf[bufOffs++];
Toshihiro Shimizu 890ddd
		lenght--;
Toshihiro Shimizu 890ddd
		switch (param.m_type) {
Toshihiro Shimizu 890ddd
		case TStyleParam::SP_BYTE:
Toshihiro Shimizu 890ddd
			param.m_numericVal = m_buf[bufOffs++];
Toshihiro Shimizu 890ddd
			lenght--;
Shinya Kitaoka d4642c
			break;
Shinya Kitaoka d4642c
		case TStyleParam::SP_USHORT: {
Shinya Kitaoka d4642c
			USHORT val;
Toshihiro Shimizu 890ddd
			readUShortData(val, bufOffs);
Toshihiro Shimizu 890ddd
			param.m_numericVal = val;
Toshihiro Shimizu 890ddd
			lenght -= 2;
Shinya Kitaoka d4642c
			break;
Shinya Kitaoka d4642c
		}
Shinya Kitaoka d4642c
		case TStyleParam::SP_INT:
Shinya Kitaoka d4642c
		case TStyleParam::SP_DOUBLE:
Shinya Kitaoka d4642c
			readFloatData(param.m_numericVal, bufOffs);
Toshihiro Shimizu 890ddd
			lenght -= 4;
Shinya Kitaoka d4642c
			break;
Shinya Kitaoka d4642c
		case TStyleParam::SP_RASTER:
Shinya Kitaoka d4642c
			lenght -= readRasterData(param.m_r, bufOffs);
Shinya Kitaoka d4642c
			break;
Shinya Kitaoka d4642c
		case TStyleParam::SP_STRING: {
Shinya Kitaoka d4642c
			USHORT strLen;
Toshihiro Shimizu 890ddd
			readUShortData(strLen, bufOffs);
Toshihiro Shimizu 890ddd
			//bufOffs+=2;
Toshihiro Shimizu 890ddd
			param.m_string = "";
Shinya Kitaoka d4642c
			for (i = 0; i < strLen; i++) {
Toshihiro Shimizu 890ddd
				param.m_string.append(1, m_buf[bufOffs++]);
Shinya Kitaoka d4642c
			}
Toshihiro Shimizu 890ddd
			lenght -= strLen + sizeof(USHORT);
Shinya Kitaoka d4642c
			break;
Shinya Kitaoka d4642c
		}
Shinya Kitaoka d4642c
		default:
Toshihiro Shimizu 890ddd
			assert(false);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		paramArray.push_back(param);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int paramArraySize = paramArray.size();
Toshihiro Shimizu 890ddd
	StyleTag *tag = new StyleTag(id, pageIndex, paramArraySize,
Shinya Kitaoka 79e39b
								 (paramArraySize > 0) ? paramArray.data() : nullptr);
Toshihiro Shimizu 890ddd
	m_currDinamicTypeBytesNum = currDinamicTypeBytesNumSaved;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return tag;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
PliTag *ParsedPliImp::readOutlineOptionsTag()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TUINT32 bufOffs = 0;
Toshihiro Shimizu 890ddd
	TINT32 d;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	const double scale = 0.001;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Read OutlineOptions
Toshihiro Shimizu 890ddd
	int capStyle, joinStyle;
Toshihiro Shimizu 890ddd
	double miterLower, miterUpper;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	capStyle = m_buf[bufOffs++];
Toshihiro Shimizu 890ddd
	joinStyle = m_buf[bufOffs++];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	readDinamicData(d, bufOffs);
Toshihiro Shimizu 890ddd
	miterLower = scale * d;
Toshihiro Shimizu 890ddd
	readDinamicData(d, bufOffs);
Toshihiro Shimizu 890ddd
	miterUpper = scale * d;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return new StrokeOutlineOptionsTag(
Toshihiro Shimizu 890ddd
		TStroke::OutlineOptions(capStyle, joinStyle, miterLower, miterUpper));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
PliTag *ParsedPliImp::readPrecisionScaleTag()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TUINT32 bufOffs = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TINT32 d;
Toshihiro Shimizu 890ddd
	readDinamicData(d, bufOffs);
Toshihiro Shimizu 890ddd
	m_precisionScale = d;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return new PrecisionScaleTag(m_precisionScale);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ParsedPliImp::readFloatData(double &val, TUINT32 &bufOffs)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//UCHAR currDinamicTypeBytesNumSaved = m_currDinamicTypeBytesNum;
Toshihiro Shimizu 890ddd
	//m_currDinamicTypeBytesNum = 2;
Toshihiro Shimizu 890ddd
	TINT32 valInt;
Toshihiro Shimizu 890ddd
	TUINT32 valDec;
Toshihiro Shimizu 890ddd
	bool isNegative;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	isNegative = readDinamicData(valInt, bufOffs);
Toshihiro Shimizu 890ddd
	readDinamicData(valDec, bufOffs);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	val = valInt + (double)valDec / 65536.0; //2^16
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (valInt == 0 && isNegative)
Toshihiro Shimizu 890ddd
		val = -val;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//m_currDinamicTypeBytesNum = currDinamicTypeBytesNumSaved;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
UINT ParsedPliImp::readRasterData(TRaster32P &r, TUINT32 &bufOffs)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	USHORT lx, ly;
Toshihiro Shimizu 890ddd
	readUShortData(lx, bufOffs);
Toshihiro Shimizu 890ddd
	readUShortData(ly, bufOffs);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//readUShortData((USHORT&)lx, bufOffs);
Toshihiro Shimizu 890ddd
	//readUShortData((USHORT&)ly, bufOffs);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	r.create((int)lx, (int)ly);
Toshihiro Shimizu 890ddd
	UINT size = lx * ly * 4;
Toshihiro Shimizu 890ddd
	r->lock();
Shinya Kitaoka 79e39b
	memcpy(r->getRawData(), m_buf.get() + bufOffs, size);
Toshihiro Shimizu 890ddd
	r->unlock();
Toshihiro Shimizu 890ddd
	bufOffs += size;
Toshihiro Shimizu 890ddd
	return size + 2 + 2;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline void getLongValFromFloat(double val, TINT32 &intVal, TUINT32 &decVal)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	intVal = (TINT32)val;
Toshihiro Shimizu 890ddd
	if (val < 0)
Toshihiro Shimizu 890ddd
		decVal = (TUINT32)((double)((-val) - (-intVal)) * 65536.0);
Toshihiro Shimizu 890ddd
	/*if (intVal<(0x1<<7))
Toshihiro Shimizu 890ddd
    intVal|=(0x1<<7);
Toshihiro Shimizu 890ddd
    else if (intVal<(0x1<<15))
Toshihiro Shimizu 890ddd
    intVal|=(0x1<<15);
Toshihiro Shimizu 890ddd
    else
Toshihiro Shimizu 890ddd
    {
Toshihiro Shimizu 890ddd
    assert(intVal<(0x1<<31));
Toshihiro Shimizu 890ddd
    intVal|=(0x1<<31);
Toshihiro Shimizu 890ddd
}*/
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		decVal = (TUINT32)((double)(val - intVal) * 65536.0);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ParsedPliImp::writeFloatData(double val)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	UCHAR currDinamicTypeBytesNumSaved = m_currDinamicTypeBytesNum;
Toshihiro Shimizu 890ddd
	m_currDinamicTypeBytesNum = 2;
Toshihiro Shimizu 890ddd
	TINT32 valInt;
Toshihiro Shimizu 890ddd
	TUINT32 valDec;
Toshihiro Shimizu 890ddd
	// bool neg=false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	valInt = (int)val;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (val < 0)
Toshihiro Shimizu 890ddd
		valDec = (int)((double)(-val + valInt) * 65536.0);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		valDec = (int)((double)(val - valInt) * 65536.0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(valInt < (0x1 << 15));
Toshihiro Shimizu 890ddd
	assert(valDec < (0x1 << 16));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	writeDinamicData(valInt, val < 0);
Toshihiro Shimizu 890ddd
	writeDinamicData(valDec);
Toshihiro Shimizu 890ddd
	m_currDinamicTypeBytesNum = currDinamicTypeBytesNumSaved;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
PliTag *ParsedPliImp::readGeometricTransformationTag()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TUINT32 bufOffs = 0;
Toshihiro Shimizu 890ddd
	TAffine affine;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	readFloatData(affine.a11, bufOffs);
Toshihiro Shimizu 890ddd
	readFloatData(affine.a12, bufOffs);
Toshihiro Shimizu 890ddd
	readFloatData(affine.a13, bufOffs);
Toshihiro Shimizu 890ddd
	readFloatData(affine.a21, bufOffs);
Toshihiro Shimizu 890ddd
	readFloatData(affine.a22, bufOffs);
Toshihiro Shimizu 890ddd
	readFloatData(affine.a23, bufOffs);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TUINT32 tagOffs;
Toshihiro Shimizu 890ddd
	readDinamicData(tagOffs, bufOffs);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TagElem *elem;
Toshihiro Shimizu 890ddd
	PliObjectTag *object = NULL;
Toshihiro Shimizu 890ddd
	if (tagOffs != 0)
Toshihiro Shimizu 890ddd
		while (!(object = (PliObjectTag *)findTagFromOffset(tagOffs)))
Toshihiro Shimizu 890ddd
			if ((elem = readTag()))
Toshihiro Shimizu 890ddd
				addTag(*elem);
Toshihiro Shimizu 890ddd
			else
Toshihiro Shimizu 890ddd
				assert(false);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		m_affine = affine;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*int realScale = tround(log10(1.0/m_affine.a11));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
   m_affine = TScale(1.0/pow(10.0, realScale));*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	GeometricTransformationTag *tag = new GeometricTransformationTag(affine, (PliGeometricTag *)object);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return tag;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
PliTag *ParsedPliImp::readDoublePairTag()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TUINT32 bufOffs = 0;
Toshihiro Shimizu 890ddd
	double first, second;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	readFloatData(first, bufOffs);
Toshihiro Shimizu 890ddd
	readFloatData(second, bufOffs);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	DoublePairTag *tag = new DoublePairTag(first, second);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return tag;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ParsedPliImp::readUShortData(USHORT &val, TUINT32 &bufOffs)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_isIrixEndian)
Toshihiro Shimizu 890ddd
		val = m_buf[bufOffs + 1] | (m_buf[bufOffs] << 8);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		val = m_buf[bufOffs] | (m_buf[bufOffs + 1] << 8);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bufOffs += 2;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ParsedPliImp::readTUINT32Data(TUINT32 &val, TUINT32 &bufOffs)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (m_isIrixEndian)
Toshihiro Shimizu 890ddd
		val = m_buf[bufOffs + 3] | (m_buf[bufOffs + 2] << 8) | (m_buf[bufOffs + 1] << 16) | (m_buf[bufOffs] << 24);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		val = m_buf[bufOffs] | (m_buf[bufOffs + 1] << 8) | (m_buf[bufOffs + 2] << 16) | (m_buf[bufOffs + 3] << 24);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bufOffs += 4;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
PliTag *ParsedPliImp::readBitmapTag()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	USHORT lx, ly;
Toshihiro Shimizu 890ddd
	TUINT32 bufOffs = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	readUShortData(lx, bufOffs);
Toshihiro Shimizu 890ddd
	readUShortData(ly, bufOffs);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRaster32P r;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	r.create(lx, ly);
Toshihiro Shimizu 890ddd
	r->lock();
Shinya Kitaoka 79e39b
	memcpy(r->getRawData(), m_buf.get() + bufOffs, lx * ly * 4);
Toshihiro Shimizu 890ddd
	r->unlock();
Toshihiro Shimizu 890ddd
	BitmapTag *tag = new BitmapTag(r);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return tag;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
PliTag *ParsedPliImp::readImageTag()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	USHORT frame;
Shinya Kitaoka 79e39b
	TUINT32 bufOffs = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (m_isIrixEndian)
Toshihiro Shimizu 890ddd
		frame = m_buf[bufOffs + 1] | (m_buf[bufOffs] << 8);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		frame = m_buf[bufOffs] | (m_buf[bufOffs + 1] << 8);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bufOffs += 2;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int headerLength = 2;
Toshihiro Shimizu 890ddd
	char letter = 0;
Toshihiro Shimizu 890ddd
	if (m_majorVersionNumber > 6 || (m_majorVersionNumber == 6 && m_minorVersionNumber >= 6)) {
Toshihiro Shimizu 890ddd
		letter = (char)m_buf[bufOffs++];
Toshihiro Shimizu 890ddd
		++headerLength;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 79e39b
	TUINT32 numObjects = (m_tagLength - headerLength) / m_currDinamicTypeBytesNum;
Shinya Kitaoka 79e39b
	std::unique_ptr<pliobjecttag*[]> object(new PliObjectTag*[numObjects]);</pliobjecttag*[]>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 79e39b
	std::unique_ptr<tuint32[]> tagOffs(new TUINT32[numObjects]);</tuint32[]>
Shinya Kitaoka 79e39b
	for (TUINT32 i = 0; i < numObjects; i++) {
Toshihiro Shimizu 890ddd
		readDinamicData(tagOffs[i], bufOffs);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TagElem *elem;
Shinya Kitaoka 79e39b
	for (TUINT32 i = 0; i < numObjects; i++)
Toshihiro Shimizu 890ddd
		while (!(object[i] = (PliObjectTag *)findTagFromOffset(tagOffs[i])))
Toshihiro Shimizu 890ddd
			if ((elem = readTag()))
Toshihiro Shimizu 890ddd
				addTag(*elem);
Toshihiro Shimizu 890ddd
			else
Toshihiro Shimizu 890ddd
				assert(false);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 79e39b
	std::unique_ptr<imagetag[]> tag(new ImageTag(TFrameId(frame, letter), numObjects, std::move(object)));</imagetag[]>
Shinya Kitaoka 79e39b
	return tag.release();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
const TSolidColorStyle ConstStyle(TPixel32::Red);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline double doubleFromUlong(TUINT32 q)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert((q & 0X00000001) == 0);
Toshihiro Shimizu 890ddd
	TUINT32 l[2];
Toshihiro Shimizu 890ddd
#if TNZ_LITTLE_ENDIAN
Toshihiro Shimizu 890ddd
	l[1] = 0x3FF00000 | (q >> 12);
Toshihiro Shimizu 890ddd
	l[0] = (q & 0xFFE) << 20;
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	l[0] = 0x3FF00000 | (q >> 12);
Toshihiro Shimizu 890ddd
	l[1] = (q & 0xFFE) << 20;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return *(double *)l - 1;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//vedi commento sulla write per chiarimenti!!
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline double truncate(double x)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	x += 1.0;
Toshihiro Shimizu 890ddd
	TUINT32 *l = (TUINT32 *)&x;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#if TNZ_LITTLE_ENDIAN
Toshihiro Shimizu 890ddd
	l[0] &= 0xFFE00000;
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	l[1] &= 0xFFE00000;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return x - 1.0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
PliTag *ParsedPliImp::readIntersectionDataTag()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TUINT32 bufOffs = 0;
Toshihiro Shimizu 890ddd
	TUINT32 branchCount;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	readTUINT32Data(branchCount, bufOffs);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 79e39b
	std::unique_ptr<intersectionbranch[]> branchArray(new IntersectionBranch[branchCount]);</intersectionbranch[]>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	UINT i;
Toshihiro Shimizu 890ddd
	for (i = 0; i < branchCount; i++) {
Toshihiro Shimizu 890ddd
		TINT32 currInter;
Toshihiro Shimizu 890ddd
		readDinamicData((TINT32 &)branchArray[i].m_strokeIndex, bufOffs);
Toshihiro Shimizu 890ddd
		readDinamicData(currInter, bufOffs);
Toshihiro Shimizu 890ddd
		readDinamicData((TUINT32 &)branchArray[i].m_nextBranch, bufOffs);
Toshihiro Shimizu 890ddd
		USHORT style;
Toshihiro Shimizu 890ddd
		readUShortData(style, bufOffs);
Toshihiro Shimizu 890ddd
		branchArray[i].m_style = style;
Toshihiro Shimizu 890ddd
		/*
Toshihiro Shimizu 890ddd
    */
Toshihiro Shimizu 890ddd
		if (m_buf[bufOffs] & 0x80) // in un numero double tra 0 e 1, il bit piu' significativo e' sempre 0
Toshihiro Shimizu 890ddd
								   //sfrutto questo bit; se e' 1, vuol dire che il valore e' 0.0 o 1.0 in un singolo byte
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			branchArray[i].m_w = (m_buf[bufOffs] & 0x1) ? 1.0 : 0.0;
Toshihiro Shimizu 890ddd
			bufOffs++;
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			TUINT32 hi, lo;
Toshihiro Shimizu 890ddd
			hi = m_buf[bufOffs + 3] | (m_buf[bufOffs + 2] << 8) | (m_buf[bufOffs + 1] << 16) | (m_buf[bufOffs] << 24);
Toshihiro Shimizu 890ddd
			bufOffs += 4;
Toshihiro Shimizu 890ddd
			readTUINT32Data(lo, bufOffs);
Toshihiro Shimizu 890ddd
			//readTUINT32Data(hi, bufOffs);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			branchArray[i].m_w = doubleFromUlong1(hi, lo);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (currInter < 0) {
Toshihiro Shimizu 890ddd
			branchArray[i].m_currInter = -currInter - 1;
Toshihiro Shimizu 890ddd
			branchArray[i].m_gettingOut = false;
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			branchArray[i].m_currInter = currInter - 1;
Toshihiro Shimizu 890ddd
			branchArray[i].m_gettingOut = true;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	IntersectionDataTag *tag = new IntersectionDataTag();
Toshihiro Shimizu 890ddd
	tag->m_branchCount = branchCount;
Shinya Kitaoka 79e39b
	tag->m_branchArray = std::move(branchArray);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return tag;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool ParsedPliImp::addTag(PliTag *tagPtr, bool addFront)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TagElem *_tag = new TagElem(tagPtr, 0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(tagPtr->m_type);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!m_firstTag) {
Toshihiro Shimizu 890ddd
		m_firstTag = m_lastTag = _tag;
Toshihiro Shimizu 890ddd
	} else if (addFront) {
Toshihiro Shimizu 890ddd
		_tag->m_next = m_firstTag;
Toshihiro Shimizu 890ddd
		m_firstTag = _tag;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		m_lastTag->m_next = _tag;
Toshihiro Shimizu 890ddd
		m_lastTag = m_lastTag->m_next;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool ParsedPliImp::addTag(const TagElem &elem, bool addFront)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TagElem *_tag = new TagElem(elem);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!m_firstTag) {
Toshihiro Shimizu 890ddd
		m_firstTag = m_lastTag = _tag;
Toshihiro Shimizu 890ddd
	} else if (addFront) {
Toshihiro Shimizu 890ddd
		_tag->m_next = m_firstTag;
Toshihiro Shimizu 890ddd
		m_firstTag = _tag;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		m_lastTag->m_next = _tag;
Toshihiro Shimizu 890ddd
		m_lastTag = m_lastTag->m_next;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ParsedPliImp::writeTag(TagElem *elem)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (elem->m_offset != 0) //already written
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (elem->m_tag->m_type) {
Toshihiro Shimizu 890ddd
	case PliTag::TEXT:
Toshihiro Shimizu 890ddd
		elem->m_offset = writeTextTag((TextTag *)elem->m_tag);
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::PALETTE:
Shinya Kitaoka d4642c
		elem->m_offset = writePaletteTag((PaletteTag *)elem->m_tag);
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::PALETTE_WITH_ALPHA:
Shinya Kitaoka d4642c
		elem->m_offset = writePaletteWithAlphaTag((PaletteWithAlphaTag *)elem->m_tag);
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::THICK_QUADRATIC_CHAIN_GOBJ:
Shinya Kitaoka d4642c
		elem->m_offset = writeThickQuadraticChainTag((ThickQuadraticChainTag *)elem->m_tag);
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::GROUP_GOBJ:
Shinya Kitaoka d4642c
		elem->m_offset = writeGroupTag((GroupTag *)elem->m_tag);
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::IMAGE_GOBJ:
Shinya Kitaoka d4642c
		elem->m_offset = writeImageTag((ImageTag *)elem->m_tag);
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::COLOR_NGOBJ:
Shinya Kitaoka d4642c
		elem->m_offset = writeColorTag((ColorTag *)elem->m_tag);
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::STYLE_NGOBJ:
Shinya Kitaoka d4642c
		elem->m_offset = writeStyleTag((StyleTag *)elem->m_tag);
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::GEOMETRIC_TRANSFORMATION_GOBJ:
Shinya Kitaoka d4642c
		elem->m_offset = writeGeometricTransformationTag((GeometricTransformationTag *)elem->m_tag);
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::DOUBLEPAIR_OBJ:
Shinya Kitaoka d4642c
		elem->m_offset = writeDoublePairTag((DoublePairTag *)elem->m_tag);
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::BITMAP_GOBJ:
Shinya Kitaoka d4642c
		elem->m_offset = writeBitmapTag((BitmapTag *)elem->m_tag);
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::INTERSECTION_DATA_GOBJ:
Shinya Kitaoka d4642c
		elem->m_offset = writeIntersectionDataTag((IntersectionDataTag *)elem->m_tag);
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::OUTLINE_OPTIONS_GOBJ:
Shinya Kitaoka d4642c
		elem->m_offset = writeOutlineOptionsTag((StrokeOutlineOptionsTag *)elem->m_tag);
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case PliTag::PRECISION_SCALE_GOBJ:
Shinya Kitaoka d4642c
		elem->m_offset = writePrecisionScaleTag((PrecisionScaleTag *)elem->m_tag);
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	default:
Toshihiro Shimizu 890ddd
		assert(false);
Toshihiro Shimizu 890ddd
		//m_error = UNKNOWN_TAG;
Toshihiro Shimizu 890ddd
		;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline void ParsedPliImp::setDinamicTypeBytesNum(int minval, int maxval)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(m_oChan);
Toshihiro Shimizu 890ddd
	if (maxval > 32767 || minval < -32767) {
Toshihiro Shimizu 890ddd
		if (m_currDinamicTypeBytesNum != 4) {
Toshihiro Shimizu 890ddd
			m_currDinamicTypeBytesNum = 4;
Toshihiro Shimizu 890ddd
			*m_oChan << (UCHAR)PliTag::SET_DATA_32_CNTRL;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	} else if (maxval > 127 || minval < -127) {
Toshihiro Shimizu 890ddd
		if (m_currDinamicTypeBytesNum != 2) {
Toshihiro Shimizu 890ddd
			m_currDinamicTypeBytesNum = 2;
Toshihiro Shimizu 890ddd
			*m_oChan << (UCHAR)PliTag::SET_DATA_16_CNTRL;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	} else if (m_currDinamicTypeBytesNum != 1) {
Toshihiro Shimizu 890ddd
		m_currDinamicTypeBytesNum = 1;
Toshihiro Shimizu 890ddd
		*m_oChan << (UCHAR)PliTag::SET_DATA_8_CNTRL;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline void ParsedPliImp::writeDinamicData(TUINT32 val)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(m_oChan);
Toshihiro Shimizu 890ddd
	switch (m_currDinamicTypeBytesNum) {
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		*m_oChan << (UCHAR)val;
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case 2:
Shinya Kitaoka d4642c
		*m_oChan << (USHORT)val;
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case 4:
Shinya Kitaoka d4642c
		*m_oChan << (TUINT32)val;
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	default:
Toshihiro Shimizu 890ddd
		assert(false);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline void ParsedPliImp::writeDinamicData(TINT32 val, bool isNegative = false)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(m_oChan);
Toshihiro Shimizu 890ddd
	switch (m_currDinamicTypeBytesNum) {
Toshihiro Shimizu 890ddd
	case 1:
Toshihiro Shimizu 890ddd
		*m_oChan << complement1((char)val, isNegative);
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case 2:
Shinya Kitaoka d4642c
		*m_oChan << complement1((short)val, isNegative);
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	case 4:
Shinya Kitaoka d4642c
		*m_oChan << complement1(val, isNegative);
Shinya Kitaoka d4642c
		break;
Shinya Kitaoka d4642c
	default:
Toshihiro Shimizu 890ddd
		assert(false);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TUINT32 ParsedPliImp::writeTagHeader(UCHAR type, UINT tagLength)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(m_oChan);
Toshihiro Shimizu 890ddd
	TUINT32 offset = m_oChan->tellp();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert((type & 0xc0) == 0x0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (tagLength == 0)
Toshihiro Shimizu 890ddd
		*m_oChan << type;
Toshihiro Shimizu 890ddd
	else if (tagLength < 256) {
Toshihiro Shimizu 890ddd
		*m_oChan << (UCHAR)(type | (0x1 << 6));
Toshihiro Shimizu 890ddd
		*m_oChan << (UCHAR)tagLength;
Toshihiro Shimizu 890ddd
	} else if (tagLength < 65535) {
Toshihiro Shimizu 890ddd
		*m_oChan << (UCHAR)(type | (0x2 << 6));
Toshihiro Shimizu 890ddd
		*m_oChan << (USHORT)tagLength;
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		*m_oChan << (UCHAR)(type | (0x3 << 6));
Toshihiro Shimizu 890ddd
		*m_oChan << (TUINT32)tagLength;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return offset;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TUINT32 ParsedPliImp::writeTextTag(TextTag *tag)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(m_oChan);
Toshihiro Shimizu 890ddd
	int offset, tagLength = tag->m_text.length();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	offset = (int)writeTagHeader((UCHAR)PliTag::TEXT, tagLength);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (int i = 0; i < tagLength; i++)
Toshihiro Shimizu 890ddd
		*m_oChan << tag->m_text[i];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return offset;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TUINT32 ParsedPliImp::writePaletteTag(PaletteTag *tag)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(m_oChan);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int offset, tagLength = (int)(tag->m_numColors * 3);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	offset = (int)writeTagHeader((UCHAR)PliTag::PALETTE, tagLength);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (unsigned int i = 0; i < tag->m_numColors; i++) {
Toshihiro Shimizu 890ddd
		*m_oChan << tag->m_color[i].r;
Toshihiro Shimizu 890ddd
		*m_oChan << tag->m_color[i].g;
Toshihiro Shimizu 890ddd
		*m_oChan << tag->m_color[i].b;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return offset;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TUINT32 ParsedPliImp::writePaletteWithAlphaTag(PaletteWithAlphaTag *tag)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(m_oChan);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int offset, tagLength = (int)(tag->m_numColors * 4);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	offset = (int)writeTagHeader((UCHAR)PliTag::PALETTE_WITH_ALPHA, tagLength);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (unsigned int i = 0; i < tag->m_numColors; i++) {
Toshihiro Shimizu 890ddd
		*m_oChan << tag->m_color[i].r;
Toshihiro Shimizu 890ddd
		*m_oChan << tag->m_color[i].g;
Toshihiro Shimizu 890ddd
		*m_oChan << tag->m_color[i].b;
Toshihiro Shimizu 890ddd
		*m_oChan << tag->m_color[i].m;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return offset;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#define SET_MINMAX         \
Toshihiro Shimizu 890ddd
	if (p.x < minval)      \
Toshihiro Shimizu 890ddd
		minval = (int)p.x; \
Toshihiro Shimizu 890ddd
	if (p.y < minval)      \
Toshihiro Shimizu 890ddd
		minval = (int)p.y; \
Toshihiro Shimizu 890ddd
	if (p.x > maxval)      \
Toshihiro Shimizu 890ddd
		maxval = (int)p.x; \
Toshihiro Shimizu 890ddd
	if (p.y > maxval)      \
Toshihiro Shimizu 890ddd
		maxval = (int)p.y;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline void ParsedPliImp::WRITE_UCHAR_FROM_DOUBLE(double dval)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(m_oChan);
Toshihiro Shimizu 890ddd
	int ival = tround(dval);
Toshihiro Shimizu 890ddd
	if (ival > 255)
Toshihiro Shimizu 890ddd
		ival = 255;
Toshihiro Shimizu 890ddd
	assert(ival >= 0);
Toshihiro Shimizu 890ddd
	*m_oChan << (UCHAR)ival;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline void ParsedPliImp::WRITE_SHORT_FROM_DOUBLE(double dval)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(m_oChan);
Toshihiro Shimizu 890ddd
	int ival = (int)(dval);
Toshihiro Shimizu 890ddd
	assert(ival >= -32768 && ival < 32768);
Toshihiro Shimizu 890ddd
	*m_oChan << complement1((short)ival);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TUINT32 ParsedPliImp::writeThickQuadraticChainTag(ThickQuadraticChainTag *tag)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(m_oChan);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int maxval = -(std::numeric_limits<int>::max)(), minval = (std::numeric_limits<int>::max)();</int></int>
Toshihiro Shimizu 890ddd
	TPointD p;
Toshihiro Shimizu 890ddd
	double scale;
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(m_majorVersionNumber > 5 || (m_majorVersionNumber == 5 && m_minorVersionNumber >= 5));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	scale = m_precisionScale;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*for ( i=0; i<tag->m_numCurves; i++)</tag->
Toshihiro Shimizu 890ddd
      tag->m_curve[i] =  aff*tag->m_curve[i];*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	p = scale * tag->m_curve[0].getP0();
Toshihiro Shimizu 890ddd
	SET_MINMAX
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (i = 0; i < (int)tag->m_numCurves; i++) {
Toshihiro Shimizu 890ddd
		p = scale * (tag->m_curve[i].getP1() - tag->m_curve[i].getP0());
Toshihiro Shimizu 890ddd
		SET_MINMAX
Toshihiro Shimizu 890ddd
		p = scale * (tag->m_curve[i].getP2() - tag->m_curve[i].getP1());
Toshihiro Shimizu 890ddd
		SET_MINMAX
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setDinamicTypeBytesNum(minval, maxval);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int tagLength = (int)(2 * (2 * tag->m_numCurves + 1) * m_currDinamicTypeBytesNum + 1 + 1 + 2 * tag->m_numCurves);
Toshihiro Shimizu 890ddd
	int offset;
Toshihiro Shimizu 890ddd
	if (tag->m_isLoop)
Toshihiro Shimizu 890ddd
		offset = (int)writeTagHeader((UCHAR)PliTag::THICK_QUADRATIC_LOOP_GOBJ, tagLength);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		offset = (int)writeTagHeader((UCHAR)PliTag::THICK_QUADRATIC_CHAIN_GOBJ, tagLength);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//assert(scale*tag->m_curve[0].getThickP0().x == (double)(TINT32)(scale*tag->m_curve[0].getThickP0().x));
Toshihiro Shimizu 890ddd
	//assert(scale*tag->m_curve[0].getThickP0().y == (double)(TINT32)(scale*tag->m_curve[0].getThickP0().y));
Toshihiro Shimizu 890ddd
	double thickRatio = tag->m_maxThickness / 255.0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(tag->m_maxThickness <= 255);
Toshihiro Shimizu 890ddd
	assert(tag->m_maxThickness > 0);
Toshihiro Shimizu 890ddd
	UCHAR maxThickness = (UCHAR)(tceil(tag->m_maxThickness));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	*m_oChan << maxThickness;
Toshihiro Shimizu 890ddd
	thickRatio = maxThickness / 255.0;
Toshihiro Shimizu 890ddd
	writeDinamicData((TINT32)(scale * tag->m_curve[0].getThickP0().x));
Toshihiro Shimizu 890ddd
	writeDinamicData((TINT32)(scale * tag->m_curve[0].getThickP0().y));
Toshihiro Shimizu 890ddd
	double thick = tag->m_curve[0].getThickP0().thick / thickRatio;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	WRITE_UCHAR_FROM_DOUBLE(thick < 0 ? 0 : thick);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (i = 0; i < (int)tag->m_numCurves; i++) {
Toshihiro Shimizu 890ddd
		TPoint dp = convert(scale * (tag->m_curve[i].getP1() - tag->m_curve[i].getP0()));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		assert(dp.x == (double)(TINT32)dp.x);
Toshihiro Shimizu 890ddd
		assert(dp.y == (double)(TINT32)dp.y);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		writeDinamicData((TINT32)dp.x);
Toshihiro Shimizu 890ddd
		writeDinamicData((TINT32)dp.y);
Toshihiro Shimizu 890ddd
		thick = tag->m_curve[i].getThickP1().thick / thickRatio;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		WRITE_UCHAR_FROM_DOUBLE(thick < 0 ? 0 : thick);
Toshihiro Shimizu 890ddd
		dp = convert(scale * (tag->m_curve[i].getP2() - tag->m_curve[i].getP1()));
Toshihiro Shimizu 890ddd
		writeDinamicData((TINT32)dp.x);
Toshihiro Shimizu 890ddd
		writeDinamicData((TINT32)dp.y);
Toshihiro Shimizu 890ddd
		thick = tag->m_curve[i].getThickP2().thick / thickRatio;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		WRITE_UCHAR_FROM_DOUBLE(thick < 0 ? 0 : thick);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return offset;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TUINT32 ParsedPliImp::writeGroupTag(GroupTag *tag)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(m_oChan);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TUINT32 offset, tagLength;
Toshihiro Shimizu 890ddd
	int maxval = 0, minval = 100000;
Shinya Kitaoka 3bfa54
	std::vector<tuint32> objectOffset(tag->m_numObjects);</tuint32>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	unsigned int i;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (i = 0; i < tag->m_numObjects; i++) {
Toshihiro Shimizu 890ddd
		if (!(objectOffset[i] = findOffsetFromTag(tag->m_object[i]))) // the object was not already written before: write it now
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			TagElem elem(tag->m_object[i], 0);
Toshihiro Shimizu 890ddd
			writeTag(&elem);
Toshihiro Shimizu 890ddd
			objectOffset[i] = elem.m_offset;
Toshihiro Shimizu 890ddd
			addTag(elem);
Toshihiro Shimizu 890ddd
			elem.m_tag = 0;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (objectOffset[i] < (unsigned int)minval)
Toshihiro Shimizu 890ddd
			minval = (int)objectOffset[i];
Toshihiro Shimizu 890ddd
		if (objectOffset[i] > (unsigned int)maxval)
Toshihiro Shimizu 890ddd
			maxval = (int)objectOffset[i];
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setDinamicTypeBytesNum(minval, maxval);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	tagLength = tag->m_numObjects * m_currDinamicTypeBytesNum + 1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	offset = writeTagHeader((UCHAR)PliTag::GROUP_GOBJ, tagLength);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	*m_oChan << tag->m_type;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (i = 0; i < tag->m_numObjects; i++)
Toshihiro Shimizu 890ddd
		writeDinamicData(objectOffset[i]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return offset;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TUINT32 ParsedPliImp::writeImageTag(ImageTag *tag)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(m_oChan);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TUINT32 *objectOffset, offset, tagLength;
Toshihiro Shimizu 890ddd
	int maxval = 0, minval = 100000;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	writeTagHeader((UCHAR)PliTag::IMAGE_BEGIN_GOBJ, 3);
Toshihiro Shimizu 890ddd
	*m_oChan << (USHORT)tag->m_numFrame.getNumber();
Toshihiro Shimizu 890ddd
	*m_oChan << tag->m_numFrame.getLetter();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_currDinamicTypeBytesNum = 3;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	objectOffset = new TUINT32[tag->m_numObjects];
Toshihiro Shimizu 890ddd
	unsigned int i;
Toshihiro Shimizu 890ddd
	for (i = 0; i < tag->m_numObjects; i++) {
Toshihiro Shimizu 890ddd
		if (!(objectOffset[i] = findOffsetFromTag(tag->m_object[i]))) // the object was not already written before: write it now
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			TagElem elem(tag->m_object[i], 0);
Toshihiro Shimizu 890ddd
			writeTag(&elem);
Toshihiro Shimizu 890ddd
			objectOffset[i] = elem.m_offset;
Toshihiro Shimizu 890ddd
			addTag(elem);
Toshihiro Shimizu 890ddd
			elem.m_tag = 0;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (objectOffset[i] < (unsigned int)minval)
Toshihiro Shimizu 890ddd
			minval = (int)objectOffset[i];
Toshihiro Shimizu 890ddd
		if (objectOffset[i] > (unsigned int)maxval)
Toshihiro Shimizu 890ddd
			maxval = (int)objectOffset[i];
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setDinamicTypeBytesNum(minval, maxval);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	tagLength = tag->m_numObjects * m_currDinamicTypeBytesNum + 3;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	offset = writeTagHeader((UCHAR)PliTag::IMAGE_GOBJ, tagLength);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	*m_oChan << (USHORT)tag->m_numFrame.getNumber();
Toshihiro Shimizu 890ddd
	*m_oChan << tag->m_numFrame.getLetter();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (i = 0; i < tag->m_numObjects; i++)
Toshihiro Shimizu 890ddd
		writeDinamicData(objectOffset[i]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	delete objectOffset;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return offset;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
/*struct intersectionBranch
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
  int m_strokeIndex;
Toshihiro Shimizu 890ddd
  const TColorStyle* m_style;
Toshihiro Shimizu 890ddd
  double m_w;
Toshihiro Shimizu 890ddd
  UINT currInter;
Toshihiro Shimizu 890ddd
  UINT m_nextBranch;
Toshihiro Shimizu 890ddd
  bool m_gettingOut;
Toshihiro Shimizu 890ddd
  };
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//per scrivere il valore m_w, molto spesso vale 0 oppure 1;
Toshihiro Shimizu 890ddd
//se vale 0, scrivo un bye con valore 0x0;
Toshihiro Shimizu 890ddd
//se vale 1, scrivo un bye con valore 0x1;
Toshihiro Shimizu 890ddd
// altrimenti, 4 byte con val&0x3==0x2;
Toshihiro Shimizu 890ddd
//e gli altri (32-2) bit contenenti iol valore di w.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline TUINT32 ulongFromDouble(double x)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(x < 1.0);
Toshihiro Shimizu 890ddd
	x += 1.0;
Toshihiro Shimizu 890ddd
	TUINT32 *l = (TUINT32 *)&x;
Toshihiro Shimizu 890ddd
#if TNZ_LITTLE_ENDIAN
Toshihiro Shimizu 890ddd
	TUINT32 hi = l[1], lo = l[0];
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	TUINT32 hi = l[0], lo = l[1];
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return (hi & 0XFFFFF) << 12 | ((lo & 0xFFE00000) >> 20);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TUINT32 ParsedPliImp::writeIntersectionDataTag(IntersectionDataTag *tag)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TUINT32 offset, tagLength;
Toshihiro Shimizu 890ddd
	int maxval = -100000, minval = 100000;
Toshihiro Shimizu 890ddd
	//  bool isNew = false;
Toshihiro Shimizu 890ddd
	int floatWCount = 0;
Toshihiro Shimizu 890ddd
	unsigned int i;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(m_oChan);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (-(int)tag->m_branchCount - 1 < minval)
Toshihiro Shimizu 890ddd
		minval = -(int)tag->m_branchCount - 1;
Toshihiro Shimizu 890ddd
	if ((int)tag->m_branchCount + 1 > maxval)
Toshihiro Shimizu 890ddd
		maxval = (int)tag->m_branchCount + 1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (i = 0; i < tag->m_branchCount; i++) {
Toshihiro Shimizu 890ddd
		if (tag->m_branchArray[i].m_w != 0 && tag->m_branchArray[i].m_w != 1)
Toshihiro Shimizu 890ddd
			floatWCount++;
Toshihiro Shimizu 890ddd
		if (tag->m_branchArray[i].m_strokeIndex < minval)
Toshihiro Shimizu 890ddd
			minval = tag->m_branchArray[i].m_strokeIndex;
Toshihiro Shimizu 890ddd
		else if (tag->m_branchArray[i].m_strokeIndex > maxval)
Toshihiro Shimizu 890ddd
			maxval = tag->m_branchArray[i].m_strokeIndex;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	setDinamicTypeBytesNum(minval, maxval);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	tagLength = 4 + tag->m_branchCount * (3 * m_currDinamicTypeBytesNum + 2) + floatWCount * 8 + (tag->m_branchCount - floatWCount) * 1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	offset = writeTagHeader((UCHAR)PliTag::INTERSECTION_DATA_GOBJ, tagLength);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	*m_oChan << (TUINT32)tag->m_branchCount;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (i = 0; i < tag->m_branchCount; i++) {
Toshihiro Shimizu 890ddd
		writeDinamicData((TINT32)tag->m_branchArray[i].m_strokeIndex);
Toshihiro Shimizu 890ddd
		writeDinamicData((tag->m_branchArray[i].m_gettingOut) ? (TINT32)(tag->m_branchArray[i].m_currInter + 1) : -(TINT32)(tag->m_branchArray[i].m_currInter + 1));
Toshihiro Shimizu 890ddd
		writeDinamicData((TUINT32)tag->m_branchArray[i].m_nextBranch);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		assert(tag->m_branchArray[i].m_style >= 0 && tag->m_branchArray[i].m_style < 65536);
Toshihiro Shimizu 890ddd
		*m_oChan << (USHORT)tag->m_branchArray[i].m_style;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		assert(tag->m_branchArray[i].m_w >= 0 && tag->m_branchArray[i].m_w <= 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (tag->m_branchArray[i].m_w == 0)
Toshihiro Shimizu 890ddd
			*m_oChan << ((UCHAR)0x80);
Toshihiro Shimizu 890ddd
		else if (tag->m_branchArray[i].m_w == 1)
Toshihiro Shimizu 890ddd
			*m_oChan << ((UCHAR)0x81);
Toshihiro Shimizu 890ddd
		else {
Toshihiro Shimizu 890ddd
			TUINT32 hi, lo;
Toshihiro Shimizu 890ddd
			ulongFromDouble1(tag->m_branchArray[i].m_w, hi, lo);
Toshihiro Shimizu 890ddd
			assert((hi & 0x80000000) == 0);
Toshihiro Shimizu 890ddd
			*m_oChan << (UCHAR)((hi >> 24) & 0xff);
Toshihiro Shimizu 890ddd
			*m_oChan << (UCHAR)((hi >> 16) & 0xff);
Toshihiro Shimizu 890ddd
			*m_oChan << (UCHAR)((hi >> 8) & 0xff);
Toshihiro Shimizu 890ddd
			*m_oChan << (UCHAR)((hi)&0xff);
Toshihiro Shimizu 890ddd
			//m_oChan<<((TUINT32)hi);
Toshihiro Shimizu 890ddd
			*m_oChan << (TUINT32)(lo);
Toshihiro Shimizu 890ddd
			//m_oChan<<((TUINT32)hi);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return offset;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TUINT32 ParsedPliImp::writeColorTag(ColorTag *tag)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(m_oChan);
Toshihiro Shimizu 890ddd
	TUINT32 tagLength, offset;
Toshihiro Shimizu 890ddd
	int maxval = 0, minval = 100000;
Toshihiro Shimizu 890ddd
	unsigned int i;
Toshihiro Shimizu 890ddd
	for (i = 0; i < tag->m_numColors; i++) {
Toshihiro Shimizu 890ddd
		if (tag->m_color[i] < (unsigned int)minval)
Toshihiro Shimizu 890ddd
			minval = (int)tag->m_color[i];
Toshihiro Shimizu 890ddd
		if (tag->m_color[i] > (unsigned int)maxval)
Toshihiro Shimizu 890ddd
			maxval = (int)tag->m_color[i];
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setDinamicTypeBytesNum(minval, maxval);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	tagLength = tag->m_numColors * m_currDinamicTypeBytesNum + 2;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	offset = writeTagHeader((UCHAR)PliTag::COLOR_NGOBJ, tagLength);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	*m_oChan << (UCHAR)tag->m_style;
Toshihiro Shimizu 890ddd
	*m_oChan << (UCHAR)tag->m_attribute;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (i = 0; i < tag->m_numColors; i++)
Toshihiro Shimizu 890ddd
		writeDinamicData(tag->m_color[i]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return offset;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TUINT32 ParsedPliImp::writeStyleTag(StyleTag *tag)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(m_oChan);
Toshihiro Shimizu 890ddd
	TUINT32 tagLength = 0, offset;
Toshihiro Shimizu 890ddd
	//int maxval=0, minval = 100000;
Toshihiro Shimizu 890ddd
	int i;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	tagLength = 2 + 2;
Toshihiro Shimizu 890ddd
	for (i = 0; i < tag->m_numParams; i++)
Toshihiro Shimizu 890ddd
		tagLength += 1 + tag->m_param[i].getSize();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	offset = writeTagHeader((UCHAR)PliTag::STYLE_NGOBJ, tagLength);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	*m_oChan << tag->m_id;
Toshihiro Shimizu 890ddd
	*m_oChan << tag->m_pageIndex;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (i = 0; i < tag->m_numParams; i++) {
Toshihiro Shimizu 890ddd
		*m_oChan << (UCHAR)tag->m_param[i].m_type;
Toshihiro Shimizu 890ddd
		switch (tag->m_param[i].m_type) {
Toshihiro Shimizu 890ddd
		case TStyleParam::SP_BYTE:
Toshihiro Shimizu 890ddd
			*m_oChan << (UCHAR)tag->m_param[i].m_numericVal;
Shinya Kitaoka d4642c
			break;
Shinya Kitaoka d4642c
		case TStyleParam::SP_USHORT:
Shinya Kitaoka d4642c
			*m_oChan << (USHORT)tag->m_param[i].m_numericVal;
Shinya Kitaoka d4642c
			break;
Shinya Kitaoka d4642c
		case TStyleParam::SP_INT:
Shinya Kitaoka d4642c
		case TStyleParam::SP_DOUBLE:
Shinya Kitaoka d4642c
			writeFloatData((double)tag->m_param[i].m_numericVal);
Shinya Kitaoka d4642c
			break;
Shinya Kitaoka d4642c
		case TStyleParam::SP_RASTER:
Shinya Kitaoka d4642c
			*m_oChan << tag->m_param[i].m_r;
Shinya Kitaoka d4642c
			break;
Shinya Kitaoka d4642c
		case TStyleParam::SP_STRING:
Shinya Kitaoka d4642c
			*m_oChan << tag->m_param[i].m_string;
Shinya Kitaoka d4642c
			break;
Shinya Kitaoka d4642c
		default:
Toshihiro Shimizu 890ddd
			assert(false);
Shinya Kitaoka d4642c
			break;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return offset;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TUINT32 ParsedPliImp::writeOutlineOptionsTag(StrokeOutlineOptionsTag *tag)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(m_oChan);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	const double scale = 1000.0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TINT32 miterLower = scale * tag->m_options.m_miterLower;
Toshihiro Shimizu 890ddd
	TINT32 miterUpper = scale * tag->m_options.m_miterUpper;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setDinamicTypeBytesNum(scale * miterLower, scale * miterUpper);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int tagLength = 2 + 2 * m_currDinamicTypeBytesNum;
Toshihiro Shimizu 890ddd
	int offset = (int)writeTagHeader((UCHAR)PliTag::OUTLINE_OPTIONS_GOBJ, tagLength);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	*m_oChan << (UCHAR)tag->m_options.m_capStyle;
Toshihiro Shimizu 890ddd
	*m_oChan << (UCHAR)tag->m_options.m_joinStyle;
Toshihiro Shimizu 890ddd
	writeDinamicData(miterLower);
Toshihiro Shimizu 890ddd
	writeDinamicData(miterUpper);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return offset;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TUINT32 ParsedPliImp::writePrecisionScaleTag(PrecisionScaleTag *tag)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(m_oChan);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setDinamicTypeBytesNum(0, tag->m_precisionScale);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int tagLength = m_currDinamicTypeBytesNum;
Toshihiro Shimizu 890ddd
	int offset = (int)writeTagHeader((UCHAR)PliTag::PRECISION_SCALE_GOBJ, tagLength);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	writeDinamicData((TINT32)tag->m_precisionScale);
Toshihiro Shimizu 890ddd
	return offset;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TUINT32 ParsedPliImp::writeGeometricTransformationTag(GeometricTransformationTag *tag)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(m_oChan);
Toshihiro Shimizu 890ddd
	TUINT32 offset, tagLength;
Toshihiro Shimizu 890ddd
	int maxval = 0, minval = 100000;
Toshihiro Shimizu 890ddd
	TINT32 intVal[6];
Toshihiro Shimizu 890ddd
	TUINT32 decVal[6];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TUINT32 objectOffset = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (tag->m_object) {
Toshihiro Shimizu 890ddd
		if (!(objectOffset = findOffsetFromTag(tag->m_object))) // the object was not already written before: write it now
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			TagElem elem(tag->m_object, 0);
Toshihiro Shimizu 890ddd
			writeTag(&elem);
Toshihiro Shimizu 890ddd
			objectOffset = elem.m_offset;
Toshihiro Shimizu 890ddd
			addTag(elem);
Toshihiro Shimizu 890ddd
			elem.m_tag = 0;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (objectOffset < (unsigned int)minval)
Toshihiro Shimizu 890ddd
		minval = (int)objectOffset;
Toshihiro Shimizu 890ddd
	if (objectOffset > (unsigned int)maxval)
Toshihiro Shimizu 890ddd
		maxval = (int)objectOffset;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	getLongValFromFloat(tag->m_affine.a11, intVal[0], decVal[0]);
Toshihiro Shimizu 890ddd
	if (intVal[0] < minval)
Toshihiro Shimizu 890ddd
		minval = (int)intVal[0];
Toshihiro Shimizu 890ddd
	if (intVal[0] > maxval)
Toshihiro Shimizu 890ddd
		maxval = (int)intVal[0];
Toshihiro Shimizu 890ddd
	if (decVal[0] > (unsigned int)maxval)
Toshihiro Shimizu 890ddd
		maxval = (int)decVal[0];
Toshihiro Shimizu 890ddd
	getLongValFromFloat(tag->m_affine.a12, intVal[1], decVal[1]);
Toshihiro Shimizu 890ddd
	if (decVal[1] > (unsigned int)maxval)
Toshihiro Shimizu 890ddd
		maxval = (int)decVal[1];
Toshihiro Shimizu 890ddd
	if (intVal[1] < minval)
Toshihiro Shimizu 890ddd
		minval = (int)intVal[1];
Toshihiro Shimizu 890ddd
	if (intVal[1] > maxval)
Toshihiro Shimizu 890ddd
		maxval = (int)intVal[1];
Toshihiro Shimizu 890ddd
	getLongValFromFloat(tag->m_affine.a13, intVal[2], decVal[2]);
Toshihiro Shimizu 890ddd
	if (decVal[2] > (unsigned int)maxval)
Toshihiro Shimizu 890ddd
		maxval = (int)decVal[2];
Toshihiro Shimizu 890ddd
	if (intVal[2] < minval)
Toshihiro Shimizu 890ddd
		minval = (int)intVal[2];
Toshihiro Shimizu 890ddd
	if (intVal[2] > maxval)
Toshihiro Shimizu 890ddd
		maxval = (int)intVal[2];
Toshihiro Shimizu 890ddd
	getLongValFromFloat(tag->m_affine.a21, intVal[3], decVal[3]);
Toshihiro Shimizu 890ddd
	if (decVal[3] > (unsigned int)maxval)
Toshihiro Shimizu 890ddd
		maxval = (int)decVal[3];
Toshihiro Shimizu 890ddd
	if (intVal[3] < minval)
Toshihiro Shimizu 890ddd
		minval = (int)intVal[3];
Toshihiro Shimizu 890ddd
	if (intVal[3] > maxval)
Toshihiro Shimizu 890ddd
		maxval = (int)intVal[3];
Toshihiro Shimizu 890ddd
	getLongValFromFloat(tag->m_affine.a22, intVal[4], decVal[4]);
Toshihiro Shimizu 890ddd
	if (decVal[4] > (unsigned int)maxval)
Toshihiro Shimizu 890ddd
		maxval = (int)decVal[4];
Toshihiro Shimizu 890ddd
	if (intVal[4] < minval)
Toshihiro Shimizu 890ddd
		minval = (int)intVal[4];
Toshihiro Shimizu 890ddd
	if (intVal[4] > maxval)
Toshihiro Shimizu 890ddd
		maxval = (int)intVal[4];
Toshihiro Shimizu 890ddd
	getLongValFromFloat(tag->m_affine.a23, intVal[5], decVal[5]);
Toshihiro Shimizu 890ddd
	if (decVal[5] > (unsigned int)maxval)
Toshihiro Shimizu 890ddd
		maxval = (int)decVal[5];
Toshihiro Shimizu 890ddd
	if (intVal[5] < minval)
Toshihiro Shimizu 890ddd
		minval = (int)intVal[5];
Toshihiro Shimizu 890ddd
	if (intVal[5] > maxval)
Toshihiro Shimizu 890ddd
		maxval = (int)intVal[5];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setDinamicTypeBytesNum(minval, maxval);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	tagLength = (1 + 6 * 2) * m_currDinamicTypeBytesNum;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	offset = writeTagHeader((UCHAR)PliTag::GEOMETRIC_TRANSFORMATION_GOBJ, tagLength);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	writeDinamicData(intVal[0]);
Toshihiro Shimizu 890ddd
	writeDinamicData(decVal[0]);
Toshihiro Shimizu 890ddd
	writeDinamicData(intVal[1]);
Toshihiro Shimizu 890ddd
	writeDinamicData(decVal[1]);
Toshihiro Shimizu 890ddd
	writeDinamicData(intVal[2]);
Toshihiro Shimizu 890ddd
	writeDinamicData(decVal[2]);
Toshihiro Shimizu 890ddd
	writeDinamicData(intVal[3]);
Toshihiro Shimizu 890ddd
	writeDinamicData(decVal[3]);
Toshihiro Shimizu 890ddd
	writeDinamicData(intVal[4]);
Toshihiro Shimizu 890ddd
	writeDinamicData(decVal[4]);
Toshihiro Shimizu 890ddd
	writeDinamicData(intVal[5]);
Toshihiro Shimizu 890ddd
	writeDinamicData(decVal[5]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	writeDinamicData(objectOffset);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return offset;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TUINT32 ParsedPliImp::writeDoublePairTag(DoublePairTag *tag)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TUINT32 offset, tagLength;
Toshihiro Shimizu 890ddd
	TINT32 minval = 100000, maxval = 0;
Toshihiro Shimizu 890ddd
	TINT32 xIntVal, yIntVal;
Toshihiro Shimizu 890ddd
	TUINT32 xDecVal, yDecVal;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	getLongValFromFloat(tag->m_first, xIntVal, xDecVal);
Toshihiro Shimizu 890ddd
	getLongValFromFloat(tag->m_second, yIntVal, yDecVal);
Toshihiro Shimizu 890ddd
	if (xIntVal < minval)
Toshihiro Shimizu 890ddd
		minval = (int)xIntVal;
Toshihiro Shimizu 890ddd
	if (xIntVal > maxval)
Toshihiro Shimizu 890ddd
		maxval = (int)xIntVal;
Toshihiro Shimizu 890ddd
	if ((int)xDecVal > maxval)
Toshihiro Shimizu 890ddd
		maxval = (int)xDecVal;
Toshihiro Shimizu 890ddd
	if (yIntVal < minval)
Toshihiro Shimizu 890ddd
		minval = (int)yIntVal;
Toshihiro Shimizu 890ddd
	if (yIntVal > maxval)
Toshihiro Shimizu 890ddd
		maxval = (int)yIntVal;
Toshihiro Shimizu 890ddd
	if ((int)yDecVal > maxval)
Toshihiro Shimizu 890ddd
		maxval = (int)yDecVal;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setDinamicTypeBytesNum(minval, maxval);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	tagLength = 4 * m_currDinamicTypeBytesNum;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	offset = writeTagHeader((UCHAR)PliTag::DOUBLEPAIR_OBJ, tagLength);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	writeDinamicData(xIntVal);
Toshihiro Shimizu 890ddd
	writeDinamicData(xDecVal);
Toshihiro Shimizu 890ddd
	writeDinamicData(yIntVal);
Toshihiro Shimizu 890ddd
	writeDinamicData(yDecVal);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return offset;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TUINT32 ParsedPliImp::writeBitmapTag(BitmapTag *tag)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(m_oChan);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TUINT32 offset, tagLength;
Toshihiro Shimizu 890ddd
	TRaster32P r = tag->m_r;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	UINT bmpSize = r->getLx() * r->getLy() * r->getPixelSize();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	tagLength = 2 + 2 + bmpSize;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	offset = writeTagHeader((UCHAR)PliTag::BITMAP_GOBJ, tagLength);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	*m_oChan << (USHORT)r->getLx();
Toshihiro Shimizu 890ddd
	*m_oChan << (USHORT)r->getLy();
Toshihiro Shimizu 890ddd
	r->lock();
Toshihiro Shimizu 890ddd
	m_oChan->writeBuf(r->getRawData(), bmpSize);
Toshihiro Shimizu 890ddd
	r->unlock();
Toshihiro Shimizu 890ddd
	return offset;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool ParsedPliImp::writePli(const TFilePath &filename)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	MyOfstream os(filename);
Toshihiro Shimizu 890ddd
	if (!os || os.fail())
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
	m_oChan = &os;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	*m_oChan << c_magicNt;
Toshihiro Shimizu 890ddd
	//m_oChan << c_magicIrix;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	*m_oChan << m_majorVersionNumber;
Toshihiro Shimizu 890ddd
	*m_oChan << m_minorVersionNumber;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	*m_oChan << m_creator;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	*m_oChan << (TUINT32)0; //fileLenght;
Toshihiro Shimizu 890ddd
	*m_oChan << m_framesNumber;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	UCHAR s, i, d;
Toshihiro Shimizu 890ddd
	double absAutoClose = fabs(m_autocloseTolerance);
Toshihiro Shimizu 890ddd
	s = tsign(m_autocloseTolerance) + 1;
Toshihiro Shimizu 890ddd
	i = (UCHAR)((int)absAutoClose);
Toshihiro Shimizu 890ddd
	d = (UCHAR)((int)((absAutoClose - i) * 100));
Toshihiro Shimizu 890ddd
	*m_oChan << s;
Toshihiro Shimizu 890ddd
	*m_oChan << i;
Toshihiro Shimizu 890ddd
	*m_oChan << d;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	CHECK_FOR_WRITE_ERROR(filename);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_currDinamicTypeBytesNum = 2;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (TagElem *elem = m_firstTag; elem; elem = elem->m_next) {
Toshihiro Shimizu 890ddd
		writeTag(elem);
Toshihiro Shimizu 890ddd
		CHECK_FOR_WRITE_ERROR(filename);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	*m_oChan << (UCHAR)PliTag::END_CNTRL;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_oChan->close();
Toshihiro Shimizu 890ddd
	m_oChan = 0;
Toshihiro Shimizu 890ddd
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
ParsedPli::ParsedPli()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	imp = new ParsedPliImp();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ParsedPli::ParsedPli(USHORT framesNumber,
Toshihiro Shimizu 890ddd
					 UCHAR precision,
Toshihiro Shimizu 890ddd
					 UCHAR maxThickness,
Toshihiro Shimizu 890ddd
					 double autocloseTolerance)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	imp = new ParsedPliImp(c_majorVersionNumber,
Toshihiro Shimizu 890ddd
						   c_minorVersionNumber,
Toshihiro Shimizu 890ddd
						   framesNumber,
Toshihiro Shimizu 890ddd
						   precision,
Toshihiro Shimizu 890ddd
						   maxThickness,
Toshihiro Shimizu 890ddd
						   autocloseTolerance);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ParsedPli::~ParsedPli()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	delete imp;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool ParsedPli::addTag(PliTag *tag, bool addFront)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return imp->addTag(tag, addFront);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
PliTag *ParsedPli::getFirstTag()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	imp->m_currTag = imp->m_firstTag;
Toshihiro Shimizu 890ddd
	return imp->m_currTag->m_tag;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
PliTag *ParsedPli::getNextTag()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(imp->m_currTag);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	imp->m_currTag = imp->m_currTag->m_next;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return (imp->m_currTag) ? imp->m_currTag->m_tag : NULL;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ParsedPli::setCreator(const QString &creator)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	imp->m_creator = creator.toStdString();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QString ParsedPli::getCreator() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return QString::fromStdString(imp->m_creator);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ParsedPli::ParsedPli(const TFilePath &filename, bool readInfo)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	imp = new ParsedPliImp(filename, readInfo);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ParsedPli::getVersion(UINT &majorVersionNumber, UINT &minorVersionNumber) const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	majorVersionNumber = imp->m_majorVersionNumber;
Toshihiro Shimizu 890ddd
	minorVersionNumber = imp->m_minorVersionNumber;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool ParsedPli::writePli(const TFilePath &filename)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return imp->writePli(filename);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
  Necessario per fissare un problema di lettura con le vecchie
Toshihiro Shimizu 890ddd
  versioni di PLI ( < 3 ).
Toshihiro Shimizu 890ddd
 */
Toshihiro Shimizu 890ddd
double ParsedPli::getThickRatio() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return imp->m_thickRatio;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ParsedPliImp::~ParsedPliImp()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TagElem *tag = m_firstTag;
Toshihiro Shimizu 890ddd
	while (tag) {
Toshihiro Shimizu 890ddd
		TagElem *auxTag = tag;
Toshihiro Shimizu 890ddd
		tag = tag->m_next;
Toshihiro Shimizu 890ddd
		delete auxTag;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ParsedPli::loadInfo(bool readPalette, TPalette *&palette, TContentHistory *&history)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	imp->loadInfo(readPalette, palette, history);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
ImageTag *ParsedPli::loadFrame(const TFrameId &frameId)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return imp->loadFrame(frameId);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ParsedPli::setFrameCount(int frameCount)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	imp->setFrameCount(frameCount);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void ParsedPliImp::setFrameCount(int frameCount)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_framesNumber = frameCount;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int ParsedPli::getFrameCount() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return imp->getFrameCount();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int ParsedPliImp::getFrameCount()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return m_framesNumber;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double ParsedPli::getAutocloseTolerance() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return imp->m_autocloseTolerance;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*=====================================================================*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int &ParsedPli::precisionScale()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return imp->m_precisionScale;
Toshihiro Shimizu 890ddd
}