text: #pragma once
  
  #ifndef TCODEC_INCLUDED
  #define TCODEC_INCLUDED
  
  #include "traster.h"
  
  #undef DVAPI
  #undef DVVAR
  #ifdef TRASTERIMAGE_EXPORTS
  #define DVAPI DV_EXPORT_API
  #define DVVAR DV_EXPORT_VAR
  #else
  #define DVAPI DV_IMPORT_API
  #define DVVAR DV_IMPORT_VAR
  #endif
  
  //------------------------------------------------------------------------------
  
  class DVAPI TRasterCodec {
  public:
    TRasterCodec(const std::string &name) : m_name(name) {}
    virtual ~TRasterCodec() {}
  
    // virtual int getMaxCompressionSize(int size) = 0;
    // virtual void compress  (const TRasterP &inRas, int allocUnit, UCHAR**
    // outData, TINT32 &outDataSize) = 0;
    // virtual void decompress(const UCHAR* inData, TINT32 inDataSize, TRasterP
    // &outRas) = 0;
  
    // virtual int getHeaderSize() = 0;
    // virtual UCHAR *removeHeader(const UCHAR* inData, TINT32 inDataSize, TINT32
    // &outDataSize, int &lx, int &ly) = 0;
  
    static TRasterCodec *create(const std::string &name);
  
  private:
    std::string m_name;
  };
  
  //------------------------------------------------------------------------------
  
  class DVAPI TRasterCodecDummy final : public TRasterCodec {
  public:
    TRasterCodecDummy(const std::string &name) : TRasterCodec(name) {}
    ~TRasterCodecDummy() {}
  
    // int getMaxCompressionSize(int size);
    // void compress(const TRasterP &inRas, int allocUnit, UCHAR** outData, TINT32
    // &outDataSize);
    // void decompress(const UCHAR* inData, TINT32 inDataSize, TRasterP &outRas);
  
    // int getHeaderSize();
  
    // UCHAR *removeHeader(const UCHAR* inData, TINT32 inDataSize, TINT32
    // &outDataSize, int &lx, int &ly);
  
    // static TRasterCodec *create(const std::string &name);
  };
  
  //------------------------------------------------------------------------------
  
  class DVAPI TRasterCodecQTL final : public TRasterCodec {
  public:
    TRasterCodecQTL(const std::string &name) : TRasterCodec(name) {}
    ~TRasterCodecQTL() {}
  
    // int getMaxCompressionSize(int size);
    // void compress  (const TRasterP &inRas, int allocUnit, UCHAR** outData,
    // TINT32 &outDataSize);
    // void decompress(const UCHAR* inData, TINT32 inDataSize, TRasterP &outRas);
  
    // UCHAR *removeHeader(const UCHAR* inData, TINT32 inDataSize, TINT32
    // &outDataSize, int &lx, int &ly);
  
    // int getHeaderSize();
  
    // static TRasterCodec *create(const std::string &name);
  };
  
  //------------------------------------------------------------------------------
  
  /*class DVAPI TRasterCodecSnappy final : public TRasterCodec
  {
  public:
  
    TRasterCodecSnappy(const std::string &name, bool useCache);
    ~TRasterCodecSnappy();
  
    TRasterP compress(const TRasterP &inRas, int allocUnit, TINT32 &outDataSize);
    bool decompress(const UCHAR* inData, TINT32 inDataSize, TRasterP &outRas, bool
  safeMode);
    void decompress(const TRasterP & compressedRas, TRasterP &outRas);
  
    void reset() { if (m_useCache) return; m_raster=TRasterGR8P(); }
  
  private:
  
    TRasterGR8P m_raster;
    string m_cacheId;
    bool m_useCache;
  
  private:
  
    UINT doCompress(const TRasterP &inRas, int allocUnit, TRasterGR8P& outRas);
  };*/
  
  //------------------------------------------------------------------------------
  
  class DVAPI TRasterCodecLz4 : public TRasterCodec {
  public:
    TRasterCodecLz4(const std::string &name, bool useCache);
    ~TRasterCodecLz4();
  
    TRasterP compress(const TRasterP &inRas, int allocUnit, TINT32 &outDataSize);
    bool decompress(const UCHAR *inData, TINT32 inDataSize, TRasterP &outRas,
                    bool safeMode);
    void decompress(const TRasterP &compressedRas, TRasterP &outRas);
  
    void reset() {
      if (m_useCache) return;
      m_raster = TRasterGR8P();
    }
  
  private:
    TRasterGR8P m_raster;
    std::string m_cacheId;
    bool m_useCache;
  
  private:
    UINT doCompress(const TRasterP &inRas, int allocUnit, TRasterGR8P &outRas);
  };
  
  //------------------------------------------------------------------------------
  
  class DVAPI TRasterCodecLZO final : public TRasterCodec {
  public:
    TRasterCodecLZO(const std::string &name, bool useCache);
    ~TRasterCodecLZO();
  
    TRasterP compress(const TRasterP &inRas, int allocUnit, TINT32 &outDataSize);
    bool decompress(const UCHAR *inData, TINT32 inDataSize, TRasterP &outRas,
                    bool safeMode);
    void decompress(const TRasterP &compressedRas, TRasterP &outRas);
  
    void reset() {
      if (m_useCache) return;
      m_raster = TRasterGR8P();
    }
  
  private:
    TRasterGR8P m_raster;
    std::string m_cacheId;
    bool m_useCache;
  
  private:
    UINT doCompress(const TRasterP &inRas, int allocUnit, TRasterGR8P &outRas);
  };
  
  #endif
  