Blob Blame Raw


#ifndef TTIO_TZL_INCLUDED
#define TTIO_TZL_INCLUDED

#include "tlevel_io.h"
#include <set>

class TImageWriterTzl;
class TImageReaderTzl;

//===========================================================================

/*!
  TLevelWriterTzl:
 */

class TzlChunk
{
public:
	TINT32 m_offs;
	TINT32 m_length;

	TzlChunk(TINT32 offs, TINT32 length) : m_offs(offs), m_length(length) {}
	TzlChunk() : m_offs(0), m_length(0) {}
	bool operator<(const TzlChunk &c) const { return m_offs < c.m_offs; }
private:
};

typedef std::map<TFrameId, TzlChunk> TzlOffsetMap;
class TRasterCodecLZO;

class TLevelWriterTzl : public TLevelWriter
{
	//bool m_paletteWritten;
	bool m_headerWritten;
	bool m_creatorWritten;
	FILE *m_chan;
	TLevelP m_level;
	TFilePath m_path, m_palettePath;
	long m_frameCountPos;
	int m_frameCount;
	TzlOffsetMap m_frameOffsTable;
	TzlOffsetMap m_iconOffsTable;
	std::set<TzlChunk> m_freeChunks;
	bool m_exists;
	TPalette *m_palette;
	TDimension m_res;
	TINT32 m_offsetTablePos;
	TINT32 m_iconOffsetTablePos;
	std::map<TFrameId, TFrameId> m_renumberTable;
	const char *m_magic;
	int m_version;
	bool m_updatedIconsSize;
	TDimension m_userIconSize;	//IconSize settata dall'utente
	TDimension m_iconSize;		  // IconSize in the file according to image aspect ratio.
	TDimension m_currentIconSize; // If file exists this is the current IconSize in the file
	TRasterCodecLZO *m_codec;

	bool m_overwritePaletteFlag;

public:
	TLevelWriterTzl(const TFilePath &path, TPropertyGroup *winfo);
	~TLevelWriterTzl();

	void setPalette(TPalette *palette);

	void setOverwritePaletteFlag(bool overwrite)
	{
		m_overwritePaletteFlag = overwrite;
	}

	void renumberFids(const std::map<TFrameId, TFrameId> &renumberTable);
	/*!
			Setta le dimensioni dell'iconcina nel file.
			ATTENZIONE: va necessariamente richiamata prima di renumberFids()!
		*/
	void setIconSize(TDimension iconSize);
	TDimension getIconSize() const { return m_iconSize; }

	TImageWriterP getFrameWriter(TFrameId fid);

	// friend class TImageWriterTzl;
	// Save Image and icon
	void save(const TImageP &img);
	void save(const TImageP &img, const TFrameId &fid);
	// save only icon
	void saveIcon(const TImageP &img, const TFrameId &fid);
	// check icon size. Return True if newSize is not equal to currentIconSize	(the iconSize in File)
	bool checkIconSize(const TDimension &newSize);
	// Update all icons with new size. Return true if success.
	bool resizeIcons(const TDimension &newSize);
	void remove(const TFrameId &fid);

	/*!
		 Da informazioni relativamente allo spazio libero presente su file.
		 Ritorna un numero compreso tra 0 e 1: 0 nessuno spazio libero, 1 tutto lo spazio รจ libero.
	 */
	float getFreeSpace();
	/*!
	   Save the file without freeSpace.
	   Salva tutti i frame in maniera continua, senza buchi.
	   Return TRUE if successfully.
	 */
	bool optimize();

public:
	static TLevelWriter *create(const TFilePath &f, TPropertyGroup *winfo)
	{
		return new TLevelWriterTzl(f, winfo);
	}

private:
	bool m_adjustRatio;
	void doSave(const TImageP &img, const TFrameId &fid);
	// Save image on disk. If isIcon is true save image as icon.
	void saveImage(const TImageP &img, const TFrameId &fid, bool isIcon = false);
	void createIcon(const TImageP &imgIn, TImageP &imgOut);
	bool convertToLatestVersion();
	void writeHeader(const TDimension &size);
	void buildFreeChunksTable();
	void addFreeChunk(TINT32 offs, TINT32 length);
	TINT32 findSavingChunk(const TFrameId &fid, TINT32 length, bool isIcon = false);
	//not implemented
	TLevelWriterTzl(const TLevelWriterTzl &);
	TLevelWriterTzl &operator=(const TLevelWriterTzl &);
};

//===========================================================================

/*!
  TLevelReaderTzl:
 */
class TLevelReaderTzl : public TLevelReader
{
public:
	TLevelReaderTzl(const TFilePath &path);
	~TLevelReaderTzl();
	void doReadPalette(bool doReadIt);
	/*!
      Return info about current tzl
     */
	TLevelP loadInfo();

	/*!
      Return an image with Reader information 
     */
	TImageReaderP getFrameReader(TFrameId fid);

	QString getCreator();
	friend class TImageReaderTzl;

	/*!
			Return TLV version
		*/
	int getVersion() { return m_version; }
	/*!
			Get the iconSize in the file. Return TRUE if icon exists, return FALSE if it not exists.
		*/
	bool getIconSize(TDimension &iconSize);

private:
	FILE *m_chan;
	TLevelP m_level;
	TDimension m_res;
	double m_xDpi, m_yDpi;
	//int m_frameIndex;
	//TzlOffsetMap m_frameOffset;//per le vecchie tzl
	TzlOffsetMap m_frameOffsTable;
	TzlOffsetMap m_iconOffsTable;
	int m_version;
	QString m_creator;
	bool m_readPalette;

public:
	static TLevelReader *create(const TFilePath &f)
	{
		return new TLevelReaderTzl(f);
	}

private:
	void readPalette();
	// not implemented
	TLevelReaderTzl(const TLevelReaderTzl &);
	TLevelReaderTzl &operator=(const TLevelReaderTzl &);
};

#endif //TTIO_TZL_INCLUDED