SXSCDecompressor.hpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. /* Copyright (C) Teemu Suutari */
  2. #ifndef SXSCDECOMPRESSOR_HPP
  3. #define SXSCDECOMPRESSOR_HPP
  4. #include <cstdint>
  5. #include "XPKDecompressor.hpp"
  6. #include "InputStream.hpp"
  7. #include "RangeDecoder.hpp"
  8. namespace ancient::internal
  9. {
  10. class SXSCDecompressor : public XPKDecompressor
  11. {
  12. public:
  13. SXSCDecompressor(uint32_t hdr,uint32_t recursionLevel,const Buffer &packedData,std::shared_ptr<XPKDecompressor::State> &state,bool verify);
  14. virtual ~SXSCDecompressor();
  15. virtual const std::string &getSubName() const noexcept override final;
  16. virtual void decompressImpl(Buffer &rawData,const Buffer &previousData,bool verify) override final;
  17. static bool detectHeaderXPK(uint32_t hdr) noexcept;
  18. static std::shared_ptr<XPKDecompressor> create(uint32_t hdr,uint32_t recursionLevel,const Buffer &packedData,std::shared_ptr<XPKDecompressor::State> &state,bool verify);
  19. private:
  20. class SXSCReader : public RangeDecoder::BitReader
  21. {
  22. public:
  23. SXSCReader(ForwardInputStream &stream);
  24. virtual ~SXSCReader();
  25. virtual uint32_t readBit() override final;
  26. private:
  27. MSBBitReader<ForwardInputStream> _reader;
  28. };
  29. void decompressASC(Buffer &rawData,ForwardInputStream &inputStream);
  30. void decompressHSC(Buffer &rawData,ForwardInputStream &inputStream);
  31. const Buffer &_packedData;
  32. bool _isHSC;
  33. };
  34. }
  35. #endif