Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef TTIO_TZL_INCLUDED
Toshihiro Shimizu 890ddd
#define TTIO_TZL_INCLUDED
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tlevel_io.h"
Toshihiro Shimizu 890ddd
#include <set></set>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TImageWriterTzl;
Toshihiro Shimizu 890ddd
class TImageReaderTzl;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===========================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  TLevelWriterTzl:
Toshihiro Shimizu 890ddd
 */
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TzlChunk
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TINT32 m_offs;
Toshihiro Shimizu 890ddd
	TINT32 m_length;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TzlChunk(TINT32 offs, TINT32 length) : m_offs(offs), m_length(length) {}
Toshihiro Shimizu 890ddd
	TzlChunk() : m_offs(0), m_length(0) {}
Toshihiro Shimizu 890ddd
	bool operator<(const TzlChunk &c) const { return m_offs < c.m_offs; }
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
typedef std::map<tframeid, tzlchunk=""> TzlOffsetMap;</tframeid,>
Toshihiro Shimizu 890ddd
class TRasterCodecLZO;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TLevelWriterTzl : public TLevelWriter
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//bool m_paletteWritten;
Toshihiro Shimizu 890ddd
	bool m_headerWritten;
Toshihiro Shimizu 890ddd
	bool m_creatorWritten;
Toshihiro Shimizu 890ddd
	FILE *m_chan;
Toshihiro Shimizu 890ddd
	TLevelP m_level;
Toshihiro Shimizu 890ddd
	TFilePath m_path, m_palettePath;
Toshihiro Shimizu 890ddd
	long m_frameCountPos;
Toshihiro Shimizu 890ddd
	int m_frameCount;
Toshihiro Shimizu 890ddd
	TzlOffsetMap m_frameOffsTable;
Toshihiro Shimizu 890ddd
	TzlOffsetMap m_iconOffsTable;
Toshihiro Shimizu 890ddd
	std::set<tzlchunk> m_freeChunks;</tzlchunk>
Toshihiro Shimizu 890ddd
	bool m_exists;
Toshihiro Shimizu 890ddd
	TPalette *m_palette;
Toshihiro Shimizu 890ddd
	TDimension m_res;
Toshihiro Shimizu 890ddd
	TINT32 m_offsetTablePos;
Toshihiro Shimizu 890ddd
	TINT32 m_iconOffsetTablePos;
Toshihiro Shimizu 890ddd
	std::map<tframeid, tframeid=""> m_renumberTable;</tframeid,>
Toshihiro Shimizu 890ddd
	const char *m_magic;
Toshihiro Shimizu 890ddd
	int m_version;
Toshihiro Shimizu 890ddd
	bool m_updatedIconsSize;
Toshihiro Shimizu 890ddd
	TDimension m_userIconSize;	//IconSize settata dall'utente
Toshihiro Shimizu 890ddd
	TDimension m_iconSize;		  // IconSize in the file according to image aspect ratio.
Toshihiro Shimizu 890ddd
	TDimension m_currentIconSize; // If file exists this is the current IconSize in the file
Toshihiro Shimizu 890ddd
	TRasterCodecLZO *m_codec;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool m_overwritePaletteFlag;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TLevelWriterTzl(const TFilePath &path, TPropertyGroup *winfo);
Toshihiro Shimizu 890ddd
	~TLevelWriterTzl();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setPalette(TPalette *palette);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setOverwritePaletteFlag(bool overwrite)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		m_overwritePaletteFlag = overwrite;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void renumberFids(const std::map<tframeid, tframeid=""> &renumberTable);</tframeid,>
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
			Setta le dimensioni dell'iconcina nel file.
Toshihiro Shimizu 890ddd
			ATTENZIONE: va necessariamente richiamata prima di renumberFids()!
Toshihiro Shimizu 890ddd
		*/
Toshihiro Shimizu 890ddd
	void setIconSize(TDimension iconSize);
Toshihiro Shimizu 890ddd
	TDimension getIconSize() const { return m_iconSize; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TImageWriterP getFrameWriter(TFrameId fid);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// friend class TImageWriterTzl;
Toshihiro Shimizu 890ddd
	// Save Image and icon
Toshihiro Shimizu 890ddd
	void save(const TImageP &img);
Toshihiro Shimizu 890ddd
	void save(const TImageP &img, const TFrameId &fid);
Toshihiro Shimizu 890ddd
	// save only icon
Toshihiro Shimizu 890ddd
	void saveIcon(const TImageP &img, const TFrameId &fid);
Toshihiro Shimizu 890ddd
	// check icon size. Return True if newSize is not equal to currentIconSize	(the iconSize in File)
Toshihiro Shimizu 890ddd
	bool checkIconSize(const TDimension &newSize);
Toshihiro Shimizu 890ddd
	// Update all icons with new size. Return true if success.
Toshihiro Shimizu 890ddd
	bool resizeIcons(const TDimension &newSize);
Toshihiro Shimizu 890ddd
	void remove(const TFrameId &fid);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		 Da informazioni relativamente allo spazio libero presente su file.
Toshihiro Shimizu 890ddd
		 Ritorna un numero compreso tra 0 e 1: 0 nessuno spazio libero, 1 tutto lo spazio รจ libero.
Toshihiro Shimizu 890ddd
	 */
Toshihiro Shimizu 890ddd
	float getFreeSpace();
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
	   Save the file without freeSpace.
Toshihiro Shimizu 890ddd
	   Salva tutti i frame in maniera continua, senza buchi.
Toshihiro Shimizu 890ddd
	   Return TRUE if successfully.
Toshihiro Shimizu 890ddd
	 */
Toshihiro Shimizu 890ddd
	bool optimize();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	static TLevelWriter *create(const TFilePath &f, TPropertyGroup *winfo)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return new TLevelWriterTzl(f, winfo);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	bool m_adjustRatio;
Toshihiro Shimizu 890ddd
	void doSave(const TImageP &img, const TFrameId &fid);
Toshihiro Shimizu 890ddd
	// Save image on disk. If isIcon is true save image as icon.
Toshihiro Shimizu 890ddd
	void saveImage(const TImageP &img, const TFrameId &fid, bool isIcon = false);
Toshihiro Shimizu 890ddd
	void createIcon(const TImageP &imgIn, TImageP &imgOut);
Toshihiro Shimizu 890ddd
	bool convertToLatestVersion();
Toshihiro Shimizu 890ddd
	void writeHeader(const TDimension &size);
Toshihiro Shimizu 890ddd
	void buildFreeChunksTable();
Toshihiro Shimizu 890ddd
	void addFreeChunk(TINT32 offs, TINT32 length);
Toshihiro Shimizu 890ddd
	TINT32 findSavingChunk(const TFrameId &fid, TINT32 length, bool isIcon = false);
Toshihiro Shimizu 890ddd
	//not implemented
Toshihiro Shimizu 890ddd
	TLevelWriterTzl(const TLevelWriterTzl &);
Toshihiro Shimizu 890ddd
	TLevelWriterTzl &operator=(const TLevelWriterTzl &);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===========================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  TLevelReaderTzl:
Toshihiro Shimizu 890ddd
 */
Toshihiro Shimizu 890ddd
class TLevelReaderTzl : public TLevelReader
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TLevelReaderTzl(const TFilePath &path);
Toshihiro Shimizu 890ddd
	~TLevelReaderTzl();
Toshihiro Shimizu 890ddd
	void doReadPalette(bool doReadIt);
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
      Return info about current tzl
Toshihiro Shimizu 890ddd
     */
Toshihiro Shimizu 890ddd
	TLevelP loadInfo();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
      Return an image with Reader information 
Toshihiro Shimizu 890ddd
     */
Toshihiro Shimizu 890ddd
	TImageReaderP getFrameReader(TFrameId fid);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString getCreator();
Toshihiro Shimizu 890ddd
	friend class TImageReaderTzl;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
			Return TLV version
Toshihiro Shimizu 890ddd
		*/
Toshihiro Shimizu 890ddd
	int getVersion() { return m_version; }
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
			Get the iconSize in the file. Return TRUE if icon exists, return FALSE if it not exists.
Toshihiro Shimizu 890ddd
		*/
Toshihiro Shimizu 890ddd
	bool getIconSize(TDimension &iconSize);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	FILE *m_chan;
Toshihiro Shimizu 890ddd
	TLevelP m_level;
Toshihiro Shimizu 890ddd
	TDimension m_res;
Toshihiro Shimizu 890ddd
	double m_xDpi, m_yDpi;
Toshihiro Shimizu 890ddd
	//int m_frameIndex;
Toshihiro Shimizu 890ddd
	//TzlOffsetMap m_frameOffset;//per le vecchie tzl
Toshihiro Shimizu 890ddd
	TzlOffsetMap m_frameOffsTable;
Toshihiro Shimizu 890ddd
	TzlOffsetMap m_iconOffsTable;
Toshihiro Shimizu 890ddd
	int m_version;
Toshihiro Shimizu 890ddd
	QString m_creator;
Toshihiro Shimizu 890ddd
	bool m_readPalette;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	static TLevelReader *create(const TFilePath &f)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return new TLevelReaderTzl(f);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	void readPalette();
Toshihiro Shimizu 890ddd
	// not implemented
Toshihiro Shimizu 890ddd
	TLevelReaderTzl(const TLevelReaderTzl &);
Toshihiro Shimizu 890ddd
	TLevelReaderTzl &operator=(const TLevelReaderTzl &);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif //TTIO_TZL_INCLUDED