Allow encoding with B8G8R8A8 colormap

This commit is contained in:
Nils Dagsson Moskopp 2022-05-19 18:26:41 +02:00
parent 7446a275b5
commit 685bdcb379
Signed by untrusted user who does not match committer: erle
GPG Key ID: A3BC671C35191080
3 changed files with 46 additions and 6 deletions

View File

@ -59,6 +59,7 @@ These images contain a palette, followed by pixel data.
* `A1R5G5B5` (8bpp RGB) * `A1R5G5B5` (8bpp RGB)
* `B8G8R8` (8bpp RGB) * `B8G8R8` (8bpp RGB)
* `B8G8R8A8` (8bpp RGBA)
### True-Color Images (Type 2) ### True-Color Images (Type 2)
@ -82,6 +83,5 @@ These images contain compressed RGB(A) pixel data.
## TODO ## TODO
* Support Type 1 `B8G8R8A8` output (color-mapped 8bpp RGBA)
* Actually support `R8G8B8A8` input for `A1R5G5B5` output * Actually support `R8G8B8A8` input for `A1R5G5B5` output
* Add both zoomable and explorable maps to `mcl_maps`. * Add both zoomable and explorable maps to `mcl_maps`.

View File

@ -128,3 +128,23 @@ local pixels = {
tga_encoder.image(pixels):save("colormapped_B8G8R8.tga", {colormap=colormap}) tga_encoder.image(pixels):save("colormapped_B8G8R8.tga", {colormap=colormap})
-- encoding as A1R5G5B5 saves 1 byte per palette entry → 103 bytes -- encoding as A1R5G5B5 saves 1 byte per palette entry → 103 bytes
tga_encoder.image(pixels):save("colormapped_A1R5G5B5.tga", {colormap=colormap, color_format="A1R5G5B5"}) tga_encoder.image(pixels):save("colormapped_A1R5G5B5.tga", {colormap=colormap, color_format="A1R5G5B5"})
-- encode a colormapped bitmap with transparency
local _ = { 0 }
local K = { 1 }
local W = { 2 }
local colormap = {
{ 0, 0, 0, 0 },
{ 0, 0, 0, 255 },
{ 255, 255, 255, 255 },
}
local pixels = {
{ _, K, K, K, K, K, _ },
{ _, K, W, W, W, K, _ },
{ K, K, W, W, W, K, K },
{ K, W, W, W, W, W, K },
{ _, K, W, W, W, K, _ },
{ _, _, K, W, K, _, _ },
{ _, _, _, K, _, _, _ },
}
tga_encoder.image(pixels):save("colormapped_B8G8R8A8.tga", {colormap=colormap})

View File

@ -68,7 +68,8 @@ function image:encode_colormap(properties)
local color_format = properties.color_format local color_format = properties.color_format
assert ( assert (
"A1R5G5B5" == color_format or "A1R5G5B5" == color_format or
"B8G8R8" == color_format "B8G8R8" == color_format or
"B8G8R8A8" == color_format
) )
local colors = {} local colors = {}
if "A1R5G5B5" == color_format then if "A1R5G5B5" == color_format then
@ -98,6 +99,17 @@ function image:encode_colormap(properties)
) )
colors[#colors + 1] = color_bytes colors[#colors + 1] = color_bytes
end end
elseif "B8G8R8A8" == color_format then
for i = 1,#colormap,1 do
local color = colormap[i]
local color_bytes = string.char(
color[3], -- B
color[2], -- G
color[1], -- R
color[4] -- A
)
colors[#colors + 1] = color_bytes
end
end end
assert( 0 ~= #colors ) assert( 0 ~= #colors )
self.data = self.data .. table.concat(colors) self.data = self.data .. table.concat(colors)
@ -182,10 +194,18 @@ function image:encode_data(properties)
end end
end end
elseif "B8G8R8A8" == color_format then elseif "B8G8R8A8" == color_format then
if "RAW" == compression then if 0 ~= #colormap then
self:encode_data_R8G8B8A8_as_B8G8R8A8_raw() if "RAW" == compression then
elseif "RLE" == compression then if 8 == self.pixel_depth then
self:encode_data_R8G8B8A8_as_B8G8R8A8_rle() self:encode_data_Y8_as_Y8_raw()
end
end
else
if "RAW" == compression then
self:encode_data_R8G8B8A8_as_B8G8R8A8_raw()
elseif "RLE" == compression then
self:encode_data_R8G8B8A8_as_B8G8R8A8_rle()
end
end end
end end
local data_length_after = #self.data local data_length_after = #self.data