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