diff --git a/README.md b/README.md index 555cefd59..1ad978a22 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,7 @@ These images contain a palette, followed by pixel data. * `A1R5G5B5` (8bpp RGB) * `B8G8R8` (8bpp RGB) +* `B8G8R8A8` (8bpp RGBA) ### True-Color Images (Type 2) @@ -82,6 +83,5 @@ These images contain compressed RGB(A) pixel data. ## TODO -* Support Type 1 `B8G8R8A8` output (color-mapped 8bpp RGBA) * Actually support `R8G8B8A8` input for `A1R5G5B5` output * Add both zoomable and explorable maps to `mcl_maps`. diff --git a/examples.lua b/examples.lua index 9ac530cbf..7642281aa 100644 --- a/examples.lua +++ b/examples.lua @@ -128,3 +128,23 @@ local pixels = { tga_encoder.image(pixels):save("colormapped_B8G8R8.tga", {colormap=colormap}) -- encoding as A1R5G5B5 saves 1 byte per palette entry → 103 bytes 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}) diff --git a/init.lua b/init.lua index f77b93a07..ed387eec0 100644 --- a/init.lua +++ b/init.lua @@ -68,7 +68,8 @@ function image:encode_colormap(properties) local color_format = properties.color_format assert ( "A1R5G5B5" == color_format or - "B8G8R8" == color_format + "B8G8R8" == color_format or + "B8G8R8A8" == color_format ) local colors = {} if "A1R5G5B5" == color_format then @@ -98,6 +99,17 @@ function image:encode_colormap(properties) ) colors[#colors + 1] = color_bytes 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 assert( 0 ~= #colors ) self.data = self.data .. table.concat(colors) @@ -182,10 +194,18 @@ function image:encode_data(properties) end end elseif "B8G8R8A8" == color_format then - if "RAW" == compression then - self:encode_data_R8G8B8A8_as_B8G8R8A8_raw() - elseif "RLE" == compression then - self:encode_data_R8G8B8A8_as_B8G8R8A8_rle() + if 0 ~= #colormap then + if "RAW" == compression then + if 8 == self.pixel_depth then + 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 local data_length_after = #self.data