Browse Source
Original Blizzard encoder is slightly less optimal than our encoder. While size in RAM in less of a concern for the non-`UNPACKED_MPQS` build, smaller files are faster to render. Savings for unpacked and minified MPQs: * diabdat.mpq: 918,311 bytes. * hellfire.mpq: 313,882 bytes. Example player graphics (note that only a few are loaded at any given time for single player): * diabdat/plrgfx/warrior/: 366,564 bytes. Example monster graphics savings: * diabdat/monsters/skelbow: 5,391 bytes. Based on the implementation from https://github.com/diasurgical/devilutionx-graphics-tools/pull/6pull/6353/head
10 changed files with 219 additions and 138 deletions
@ -0,0 +1,44 @@
|
||||
#pragma once |
||||
|
||||
#include "engine/render/blit_impl.hpp" |
||||
|
||||
namespace devilution { |
||||
|
||||
[[nodiscard]] constexpr bool IsClxOpaque(uint8_t control) |
||||
{ |
||||
constexpr uint8_t ClxOpaqueMin = 0x80; |
||||
return control >= ClxOpaqueMin; |
||||
} |
||||
|
||||
[[nodiscard]] constexpr uint8_t GetClxOpaquePixelsWidth(uint8_t control) |
||||
{ |
||||
return -static_cast<std::int8_t>(control); |
||||
} |
||||
|
||||
[[nodiscard]] constexpr bool IsClxOpaqueFill(uint8_t control) |
||||
{ |
||||
constexpr uint8_t ClxFillMax = 0xBE; |
||||
return control <= ClxFillMax; |
||||
} |
||||
|
||||
[[nodiscard]] constexpr uint8_t GetClxOpaqueFillWidth(uint8_t control) |
||||
{ |
||||
constexpr uint8_t ClxFillEnd = 0xBF; |
||||
return static_cast<int_fast16_t>(ClxFillEnd - control); |
||||
} |
||||
|
||||
[[nodiscard]] constexpr BlitCommand ClxGetBlitCommand(const uint8_t *src) |
||||
{ |
||||
const uint8_t control = *src++; |
||||
if (!IsClxOpaque(control)) |
||||
return BlitCommand { BlitType::Transparent, src, control, 0 }; |
||||
if (IsClxOpaqueFill(control)) { |
||||
const uint8_t width = GetClxOpaqueFillWidth(control); |
||||
const uint8_t color = *src++; |
||||
return BlitCommand { BlitType::Fill, src, width, color }; |
||||
} |
||||
const uint8_t width = GetClxOpaquePixelsWidth(control); |
||||
return BlitCommand { BlitType::Pixels, src + width, width, 0 }; |
||||
} |
||||
|
||||
} // namespace devilution
|
||||
Loading…
Reference in new issue