| #pragma once |
| |
| #ifndef TTIO_TZL_INCLUDED |
| #define TTIO_TZL_INCLUDED |
| |
| #include "tlevel_io.h" |
| #include <set> |
| |
| class TImageWriterTzl; |
| class TImageReaderTzl; |
| |
| |
| |
| |
| |
| |
| |
| 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 final : public TLevelWriter { |
| |
| 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; |
| TDimension |
| m_iconSize; |
| TDimension m_currentIconSize; |
| |
| TRasterCodecLZO *m_codec; |
| |
| bool m_overwritePaletteFlag; |
| |
| public: |
| TLevelWriterTzl(const TFilePath &path, TPropertyGroup *winfo); |
| ~TLevelWriterTzl(); |
| |
| void setPalette(TPalette *palette) override; |
| |
| void setOverwritePaletteFlag(bool overwrite) override { |
| m_overwritePaletteFlag = overwrite; |
| } |
| |
| void renumberFids(const std::map<TFrameId, TFrameId> &renumberTable) override; |
| |
| |
| |
| |
| |
| void setIconSize(TDimension iconSize) override; |
| TDimension getIconSize() const override { return m_iconSize; } |
| |
| TImageWriterP getFrameWriter(TFrameId fid) override; |
| |
| |
| |
| void save(const TImageP &img); |
| void save(const TImageP &img, const TFrameId &fid); |
| |
| void saveIcon(const TImageP &img, const TFrameId &fid); |
| |
| |
| bool checkIconSize(const TDimension &newSize); |
| |
| bool resizeIcons(const TDimension &newSize); |
| void remove(const TFrameId &fid); |
| |
| |
| |
| |
| |
| |
| float getFreeSpace(); |
| |
| |
| |
| |
| |
| 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); |
| |
| 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); |
| |
| TLevelWriterTzl(const TLevelWriterTzl &); |
| TLevelWriterTzl &operator=(const TLevelWriterTzl &); |
| }; |
| |
| |
| |
| |
| |
| |
| class TLevelReaderTzl final : public TLevelReader { |
| public: |
| TLevelReaderTzl(const TFilePath &path); |
| ~TLevelReaderTzl(); |
| void doReadPalette(bool doReadIt) override; |
| |
| |
| |
| TLevelP loadInfo() override; |
| |
| |
| |
| |
| TImageReaderP getFrameReader(TFrameId fid) override; |
| |
| QString getCreator() override; |
| friend class TImageReaderTzl; |
| |
| |
| |
| |
| int getVersion() { return m_version; } |
| |
| |
| |
| |
| bool getIconSize(TDimension &iconSize); |
| |
| private: |
| FILE *m_chan; |
| TLevelP m_level; |
| TDimension m_res; |
| double m_xDpi, m_yDpi; |
| |
| |
| 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(); |
| |
| TLevelReaderTzl(const TLevelReaderTzl &); |
| TLevelReaderTzl &operator=(const TLevelReaderTzl &); |
| }; |
| |
| #endif |