// dxt.{h,cpp} — ported verbatim from xrender-poc/engine/dxt.{h,cpp} // (namespace engine -> mtimage). DDS DXT1/3/5 + masked 16/24/32-bit RGB -> RGBA8, level 0. // engine/dxt —— DDS(DXT1/3/5) → RGBA8 软解。见 docs/steps/M1-static-render.md T3 // 自己写 ~150 行绕开 reuse/EterImageLib 的 windows.h 依赖(M1 风险表允许)。 // 对拍时两侧都喂软解 RGBA,不被 GPU S3TC 的 bit 级差异污染。 #pragma once #include #include namespace mtimage { struct Image { uint16_t w = 0, h = 0; std::vector rgba; // w*h*4,level 0 // DXT DDS only: level count 40250 CreateDDSTexture gives the texture (0 = not a DXT // DDS, caller follows the D3DX_DEFAULT full-chain path) and levels 1.. decoded to RGBA8. uint8_t file_mip_levels = 0; std::vector> mips; const char* format = ""; // "DXT1" / "DXT3" / "DXT5" / "BGRA8" / "" bool ok() const { return w && h && rgba.size() == size_t(w) * h * 4; } }; // 读整个 .dds 文件字节,解 level 0 到 RGBA8(DXT 另解文件内 mip 到 mips)。失败返回 !ok()。 Image load_dds(const uint8_t* bytes, size_t len); Image load_dds_path(const char* path); } // namespace mtimage