Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reduce CLX header size from 10 to 6 #7478

Merged
merged 3 commits into from
Oct 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 12 additions & 15 deletions Source/engine/clx_sprite.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,20 @@
* @brief CLX format sprites.
*
* CLX is a format used for DevilutionX graphics at runtime.
* CLX encodes pixel in the same way CL2 but encodes metadata differently.
*
* It is identical to CL2, except we use the frame header to store the frame's width and height.
* Unlike CL2:
*
* CLX frame header (10 bytes, same as CL2):
* 1. CLX frame header stores frame width and height.
* 2. CLX frame header does not store 32-pixel block offsets.
*
* Bytes | Type | Value
* :-----:|:--------:|------------------------------------
* 0..2 | uint16_t | offset to data start (same as CL2)
* 2..4 | uint16_t | width
* 4..6 | uint16_t | height
* 6..10 | - | unused
* CLX frame header is 6 bytes:
*
* The CLX format is otherwise identical to CL2.
*
* Since the header is identical to CL2, CL2 can be converted to CLX without reallocation.
* Bytes | Type | Value
* :-----:|:--------:|-------------
* 0..2 | uint16_t | header size
* 2..4 | uint16_t | width
* 4..6 | uint16_t | height
*
* CL2 reference: https://github.com/savagesteel/d1-file-formats/blob/master/PC-Mac/CL2.md#2-file-structure
*/
Expand All @@ -42,12 +41,10 @@ class OptionalClxSprite;
* @brief A single CLX sprite.
*/
class ClxSprite {
static constexpr uint32_t HeaderSize = 10;

public:
explicit constexpr ClxSprite(const uint8_t *data, uint32_t dataSize)
: data_(data)
, pixel_data_size_(dataSize - HeaderSize)
, pixel_data_size_(dataSize - LoadLE16(data))
{
assert(data != nullptr);
}
Expand All @@ -69,7 +66,7 @@ class ClxSprite {
*/
[[nodiscard]] constexpr const uint8_t *pixelData() const
{
return &data_[HeaderSize];
return &data_[LoadLE16(data_)];
}

[[nodiscard]] constexpr uint32_t pixelDataSize() const
Expand Down
6 changes: 2 additions & 4 deletions Source/utils/cel_to_clx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,8 @@ OwnedClxSpriteListOrSheet CelToClx(const uint8_t *data, size_t size, PointerOrVa

// CLX frame header.
const size_t frameHeaderPos = cl2Data.size();
constexpr size_t FrameHeaderSize = 10;
cl2Data.resize(cl2Data.size() + FrameHeaderSize);
WriteLE16(&cl2Data[frameHeaderPos], FrameHeaderSize);
cl2Data.resize(cl2Data.size() + ClxFrameHeaderSize);
WriteLE16(&cl2Data[frameHeaderPos], ClxFrameHeaderSize);
WriteLE16(&cl2Data[frameHeaderPos + 2], frameWidth);

unsigned transparentRunWidth = 0;
Expand All @@ -111,7 +110,6 @@ OwnedClxSpriteListOrSheet CelToClx(const uint8_t *data, size_t size, PointerOrVa
++frameHeight;
}
WriteLE16(&cl2Data[frameHeaderPos + 4], static_cast<uint16_t>(frameHeight));
memset(&cl2Data[frameHeaderPos + 6], 0, 4);
AppendClxTransparentRun(transparentRunWidth, cl2Data);
}

Expand Down
6 changes: 2 additions & 4 deletions Source/utils/cl2_to_clx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,8 @@ uint16_t Cl2ToClx(const uint8_t *data, size_t size,
const uint16_t frameWidth = widthOrWidths.HoldsPointer() ? widthOrWidths.AsPointer()[frame - 1] : widthOrWidths.AsValue();

const size_t frameHeaderPos = clxData.size();
constexpr size_t FrameHeaderSize = 10;
clxData.resize(clxData.size() + FrameHeaderSize);
WriteLE16(&clxData[frameHeaderPos], FrameHeaderSize);
clxData.resize(clxData.size() + ClxFrameHeaderSize);
WriteLE16(&clxData[frameHeaderPos], ClxFrameHeaderSize);
WriteLE16(&clxData[frameHeaderPos + 2], frameWidth);

unsigned transparentRunWidth = 0;
Expand Down Expand Up @@ -104,7 +103,6 @@ uint16_t Cl2ToClx(const uint8_t *data, size_t size,
AppendClxTransparentRun(transparentRunWidth, clxData);

WriteLE16(&clxData[frameHeaderPos + 4], static_cast<uint16_t>(frameHeight));
memset(&clxData[frameHeaderPos + 6], 0, 4);
}

WriteLE32(&clxData[clxDataOffset + 4 * (1 + static_cast<size_t>(numFrames))], static_cast<uint32_t>(clxData.size() - clxDataOffset));
Expand Down
11 changes: 11 additions & 0 deletions Source/utils/clx_encode.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,17 @@

namespace devilution {

/**
* CLX frame header is 6 bytes:
*
* Bytes | Type | Value
* :-----:|:--------:|-------------
* 0..2 | uint16_t | header size
* 2..4 | uint16_t | width
* 4..6 | uint16_t | height
*/
constexpr size_t ClxFrameHeaderSize = 6;

inline void AppendClxTransparentRun(unsigned width, std::vector<uint8_t> &out)
{
while (width >= 0x7F) {
Expand Down
11 changes: 2 additions & 9 deletions Source/utils/pcx_to_clx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,20 +98,13 @@ OptionalOwnedClxSpriteList PcxToClx(AssetHandle &handle, size_t fileSize, int nu
for (unsigned frame = 1; frame <= numFrames; ++frame) {
WriteLE32(&cl2Data[4 * static_cast<size_t>(frame)], static_cast<uint32_t>(cl2Data.size()));

// Frame header: 5 16-bit values:
// 1. Offset to start of the pixel data.
// 2. Width
// 3. Height
// 4..5. Unused (0)
const size_t frameHeaderPos = cl2Data.size();
constexpr size_t FrameHeaderSize = 10;
cl2Data.resize(cl2Data.size() + FrameHeaderSize);
cl2Data.resize(cl2Data.size() + ClxFrameHeaderSize);

// Frame header:
WriteLE16(&cl2Data[frameHeaderPos], FrameHeaderSize);
WriteLE16(&cl2Data[frameHeaderPos], ClxFrameHeaderSize);
WriteLE16(&cl2Data[frameHeaderPos + 2], static_cast<uint16_t>(width));
WriteLE16(&cl2Data[frameHeaderPos + 4], static_cast<uint16_t>(frameHeight));
memset(&cl2Data[frameHeaderPos + 6], 0, 4);

for (unsigned j = 0; j < frameHeight; ++j) {
uint8_t *buffer = &frameBuffer[static_cast<size_t>(j) * width];
Expand Down
11 changes: 2 additions & 9 deletions Source/utils/surface_to_clx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,20 +31,13 @@ OwnedClxSpriteList SurfaceToClx(const Surface &surface, unsigned numFrames,
for (unsigned frame = 1; frame <= numFrames; ++frame) {
WriteLE32(&clxData[4 * static_cast<size_t>(frame)], static_cast<uint32_t>(clxData.size()));

// Frame header: 5 16-bit values:
// 1. Offset to start of the pixel data.
// 2. Width
// 3. Height
// 4..5. Unused (0)
const size_t frameHeaderPos = clxData.size();
constexpr size_t FrameHeaderSize = 10;
clxData.resize(clxData.size() + FrameHeaderSize);
clxData.resize(clxData.size() + ClxFrameHeaderSize);

// Frame header:
WriteLE16(&clxData[frameHeaderPos], FrameHeaderSize);
WriteLE16(&clxData[frameHeaderPos], ClxFrameHeaderSize);
WriteLE16(&clxData[frameHeaderPos + 2], static_cast<uint16_t>(width));
WriteLE16(&clxData[frameHeaderPos + 4], static_cast<uint16_t>(frameHeight));
memset(&clxData[frameHeaderPos + 6], 0, 4);

unsigned transparentRunWidth = 0;
size_t line = 0;
Expand Down
Binary file modified assets/data/boxleftend.clx
Binary file not shown.
Binary file modified assets/data/boxmiddle.clx
Binary file not shown.
Binary file modified assets/data/boxrightend.clx
Binary file not shown.
Binary file modified assets/data/charbg.clx
Binary file not shown.
Binary file modified assets/data/dirtybuc.clx
Binary file not shown.
Binary file modified assets/data/dirtybucp.clx
Binary file not shown.
Binary file modified assets/data/health.clx
Binary file not shown.
Binary file modified assets/data/healthbox.clx
Binary file not shown.
Binary file modified assets/data/hintbox.clx
Binary file not shown.
Binary file modified assets/data/hintboxbackground.clx
Binary file not shown.
Binary file modified assets/data/hinticons.clx
Binary file not shown.
Binary file modified assets/data/monstertags.clx
Binary file not shown.
Binary file modified assets/data/panel8buc.clx
Binary file not shown.
Binary file modified assets/data/panel8bucp.clx
Binary file not shown.
Binary file modified assets/data/resistance.clx
Binary file not shown.
Binary file modified assets/data/stash.clx
Binary file not shown.
Binary file modified assets/data/stashnavbtns.clx
Binary file not shown.
Binary file modified assets/data/talkbutton.clx
Binary file not shown.
Binary file modified assets/data/xpbar.clx
Binary file not shown.
Binary file modified assets/fonts/12-00.clx
Binary file not shown.
Binary file modified assets/fonts/12-01.clx
Binary file not shown.
Binary file modified assets/fonts/12-02.clx
Binary file not shown.
Binary file modified assets/fonts/12-03.clx
Binary file not shown.
Binary file modified assets/fonts/12-04.clx
Binary file not shown.
Binary file modified assets/fonts/12-1f1.clx
Binary file not shown.
Binary file modified assets/fonts/12-1f3.clx
Binary file not shown.
Binary file modified assets/fonts/12-1f4.clx
Binary file not shown.
Binary file modified assets/fonts/12-1f5.clx
Binary file not shown.
Binary file modified assets/fonts/12-1f6.clx
Binary file not shown.
Binary file modified assets/fonts/12-1f9.clx
Binary file not shown.
Binary file modified assets/fonts/12-20.clx
Binary file not shown.
Binary file modified assets/fonts/12-26.clx
Binary file not shown.
Binary file modified assets/fonts/12-e0.clx
Binary file not shown.
Binary file modified assets/fonts/22-00.clx
Binary file not shown.
Binary file modified assets/fonts/22-01.clx
Binary file not shown.
Binary file modified assets/fonts/22-02.clx
Binary file not shown.
Binary file modified assets/fonts/22-03.clx
Binary file not shown.
Binary file modified assets/fonts/22-04.clx
Binary file not shown.
Binary file modified assets/fonts/22-05.clx
Binary file not shown.
Binary file modified assets/fonts/22-20.clx
Binary file not shown.
Binary file modified assets/fonts/24-00.clx
Binary file not shown.
Binary file modified assets/fonts/24-01.clx
Binary file not shown.
Binary file modified assets/fonts/24-02.clx
Binary file not shown.
Binary file modified assets/fonts/24-03.clx
Binary file not shown.
Binary file modified assets/fonts/24-04.clx
Binary file not shown.
Binary file modified assets/fonts/24-1f1.clx
Binary file not shown.
Binary file modified assets/fonts/24-1f3.clx
Binary file not shown.
Binary file modified assets/fonts/24-1f4.clx
Binary file not shown.
Binary file modified assets/fonts/24-1f5.clx
Binary file not shown.
Binary file modified assets/fonts/24-1f6.clx
Binary file not shown.
Binary file modified assets/fonts/24-1f9.clx
Binary file not shown.
Binary file modified assets/fonts/24-20.clx
Binary file not shown.
Binary file modified assets/fonts/24-26.clx
Binary file not shown.
Binary file modified assets/fonts/24-e0.clx
Binary file not shown.
Binary file modified assets/fonts/30-00.clx
Binary file not shown.
Binary file modified assets/fonts/30-01.clx
Binary file not shown.
Binary file modified assets/fonts/30-02.clx
Binary file not shown.
Binary file modified assets/fonts/30-03.clx
Binary file not shown.
Binary file modified assets/fonts/30-04.clx
Binary file not shown.
Binary file modified assets/fonts/30-20.clx
Binary file not shown.
Binary file modified assets/fonts/42-00.clx
Binary file not shown.
Binary file modified assets/fonts/42-01.clx
Binary file not shown.
Binary file modified assets/fonts/42-02.clx
Binary file not shown.
Binary file modified assets/fonts/42-03.clx
Binary file not shown.
Binary file modified assets/fonts/42-04.clx
Binary file not shown.
Binary file modified assets/fonts/42-20.clx
Binary file not shown.
Binary file modified assets/fonts/46-00.clx
Binary file not shown.
Binary file modified assets/fonts/46-01.clx
Binary file not shown.
Binary file modified assets/fonts/46-02.clx
Binary file not shown.
Binary file modified assets/fonts/46-03.clx
Binary file not shown.
Binary file modified assets/fonts/46-04.clx
Binary file not shown.
Binary file modified assets/fonts/46-20.clx
Binary file not shown.
Binary file modified assets/fonts/tr/12-00.clx
Binary file not shown.
Binary file modified assets/fonts/tr/24-00.clx
Binary file not shown.
Binary file modified assets/fonts/tr/30-00.clx
Binary file not shown.
Binary file modified assets/fonts/tr/42-00.clx
Binary file not shown.
Binary file modified assets/fonts/tr/46-00.clx
Binary file not shown.
Binary file modified assets/gendata/cut2w.clx
Binary file not shown.
Binary file modified assets/gendata/cut3w.clx
Binary file not shown.
Binary file modified assets/gendata/cut4w.clx
Binary file not shown.
Binary file modified assets/gendata/cutgatew.clx
Binary file not shown.
Binary file modified assets/gendata/cutl1dw.clx
Binary file not shown.
Binary file modified assets/gendata/cutportlw.clx
Binary file not shown.
Binary file modified assets/gendata/cutportrw.clx
Binary file not shown.
Binary file modified assets/gendata/cutstartw.clx
Binary file not shown.
Binary file modified assets/gendata/cutttw.clx
Binary file not shown.
Binary file modified assets/ui_art/creditsw.clx
Binary file not shown.
Binary file modified assets/ui_art/dvl_but_sml.clx
Binary file not shown.
Binary file modified assets/ui_art/dvl_lrpopup.clx
Binary file not shown.
Binary file modified assets/ui_art/hf_titlew.clx
Binary file not shown.
Binary file modified assets/ui_art/mainmenuw.clx
Binary file not shown.
Binary file modified assets/ui_art/supportw.clx
Binary file not shown.
Loading