oodle_installed.cpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #include <cstddef>
  2. #include "runtime.h"
  3. namespace sunrise::middleware::compression::oodle {
  4. namespace {
  5. /** The game loads this Oodle runtime before Sunrise generates compressed queuez objects. */
  6. constexpr wchar_t kInstalledModuleName[] = L"oo2core_3_win64.dll";
  7. /** Oodle only accepts a destination size that is a multiple of this step. */
  8. constexpr std::size_t kDecodeStep = 0x4000;
  9. } // namespace
  10. /** Compresses through the already-loaded installed Oodle module. */
  11. bool compress_installed(std::span<const std::byte> input,
  12. std::span<std::byte> output,
  13. std::size_t& written) noexcept {
  14. const HMODULE module = GetModuleHandleW(kInstalledModuleName);
  15. return module != nullptr && compress(module, input, output, written);
  16. }
  17. /** Decompresses one package block, whose real size is not recorded. */
  18. bool decompress_installed_block(std::span<const std::byte> input,
  19. std::span<std::byte> output,
  20. std::size_t& written) noexcept {
  21. written = 0;
  22. const HMODULE module = GetModuleHandleW(kInstalledModuleName);
  23. if (module == nullptr) {
  24. return false;
  25. }
  26. for (std::size_t size = (output.size() / kDecodeStep) * kDecodeStep; size >= kDecodeStep;
  27. size -= kDecodeStep) {
  28. if (decompress(module, input, output.first(size))) {
  29. written = size;
  30. return true;
  31. }
  32. }
  33. return false;
  34. }
  35. } // namespace sunrise::middleware::compression::oodle