// M0 T2 —— section 解压分派。见 docs/reference/steps/M0-gr2-reader.md #include "internal.h" #include "oodle1.h" #include namespace gr2 { // src 指向文件里该 section 的压缩字节(长度 s.data_size)。 // 本函数会做一份可写的、尾部留 32B 零的副本(Oodle1 解码器会写它、读过界)。 bool File::Impl::decompress_section(const detail::GrnSection& s, const uint8_t* src, detail::Section& out, LoadError* err) { out.info = {s.compression, s.data_size, s.expanded_data_size, s.pointer_fixup_count, 0}; if (s.expanded_data_size == 0) { // 空 section out.data.clear(); return true; } switch (s.compression) { case 0: { // NoCompression out.data.assign(src, src + s.data_size); out.data.resize(s.expanded_data_size); return true; } case 1: // Oodle0 —— 同一族解码器的变体,暂未实现(T2 后续;样本里极少) out.info.decompress_status = 1; if (err) *err = {"section", "Oodle0 not implemented (M0 T2)"}; return false; case 2: { // Oodle1 // 4 字节对齐的可写副本 + 32B 零尾 std::vector buf; buf.reserve(s.data_size + 32); buf.assign(src, src + s.data_size); buf.resize(s.data_size + 32, 0); out.data.assign(s.expanded_data_size, 0); int rc = gr2_oodle1_decompress(/*byte_reversed=*/0, s.data_size, buf.data(), s.first16bit, s.first8bit, s.expanded_data_size, out.data.data()); out.info.decompress_status = rc; if (rc != 0) { if (err) *err = {"section", "Oodle1 decompress failed"}; return false; } return true; } case 4: // BitKnit —— 无公开实现(全样本 0 个) out.info.decompress_status = 4; if (err) *err = {"section", "BitKnit unsupported (M0 T2)"}; return false; default: out.info.decompress_status = -1; if (err) *err = {"section", "unknown compression format"}; return false; } } } // namespace gr2