TGCBlob.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // Copyright 2016 Dolphin Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <memory>
  5. #include <utility>
  6. #include <vector>
  7. #include "Common/CommonTypes.h"
  8. #include "Common/IOFile.h"
  9. #include "DiscIO/Blob.h"
  10. namespace DiscIO
  11. {
  12. static constexpr u32 TGC_MAGIC = 0xA2380FAE;
  13. struct TGCHeader
  14. {
  15. u32 magic;
  16. u32 unknown_1;
  17. u32 tgc_header_size;
  18. u32 disc_header_area_size;
  19. u32 fst_real_offset;
  20. u32 fst_size;
  21. u32 fst_max_size;
  22. u32 dol_real_offset;
  23. u32 dol_size;
  24. u32 file_area_real_offset;
  25. u32 unknown_2;
  26. u32 unknown_3;
  27. u32 unknown_4;
  28. u32 file_area_virtual_offset;
  29. };
  30. class TGCFileReader final : public BlobReader
  31. {
  32. public:
  33. static std::unique_ptr<TGCFileReader> Create(File::IOFile file);
  34. BlobType GetBlobType() const override { return BlobType::TGC; }
  35. std::unique_ptr<BlobReader> CopyReader() const override;
  36. u64 GetRawSize() const override { return m_size; }
  37. u64 GetDataSize() const override;
  38. DataSizeType GetDataSizeType() const override { return DataSizeType::Accurate; }
  39. u64 GetBlockSize() const override { return 0; }
  40. bool HasFastRandomAccessInBlock() const override { return true; }
  41. std::string GetCompressionMethod() const override { return {}; }
  42. std::optional<int> GetCompressionLevel() const override { return std::nullopt; }
  43. bool Read(u64 offset, u64 nbytes, u8* out_ptr) override;
  44. private:
  45. TGCFileReader(File::IOFile file);
  46. File::IOFile m_file;
  47. u64 m_size;
  48. std::vector<u8> m_fst;
  49. // Stored as big endian in memory, regardless of the host endianness
  50. TGCHeader m_header = {};
  51. };
  52. } // namespace DiscIO