182 lines
5.2 KiB
Lua
182 lines
5.2 KiB
Lua
|
dofile("init.lua")
|
|||
|
|
|||
|
-- encode a bitmap
|
|||
|
local _ = { 0, 0, 0 }
|
|||
|
local R = { 255, 127, 127 }
|
|||
|
local pixels = {
|
|||
|
{ _, _, _, _, _, _, _ },
|
|||
|
{ _, _, _, R, _, _, _ },
|
|||
|
{ _, _, R, R, R, _, _ },
|
|||
|
{ _, R, R, R, R, R, _ },
|
|||
|
{ _, R, R, R, R, R, _ },
|
|||
|
{ _, _, R, _, R, _, _ },
|
|||
|
{ _, _, _, _, _, _, _ },
|
|||
|
}
|
|||
|
tga_encoder.image(pixels):save("bitmap_small.tga")
|
|||
|
|
|||
|
-- test that image can be encoded
|
|||
|
local bitmap_small_0 = tga_encoder.image(pixels)
|
|||
|
bitmap_small_0:encode()
|
|||
|
assert(191 == #bitmap_small_0.data)
|
|||
|
|
|||
|
-- test that imbage can be encoded with parameters
|
|||
|
local bitmap_small_1 = tga_encoder.image(pixels)
|
|||
|
bitmap_small_1:encode(
|
|||
|
{
|
|||
|
colormap = {},
|
|||
|
color_format = "B8G8R8",
|
|||
|
compression = "RAW",
|
|||
|
}
|
|||
|
)
|
|||
|
assert(191 == #bitmap_small_1.data)
|
|||
|
|
|||
|
-- change a single pixel, then rescale the bitmap
|
|||
|
local pixels_orig = pixels
|
|||
|
pixels_orig[4][4] = { 255, 255, 255 }
|
|||
|
local pixels = {}
|
|||
|
for x = 1,56,1 do
|
|||
|
local x_orig = math.ceil(x/8)
|
|||
|
for z = 1,56,1 do
|
|||
|
local z_orig = math.ceil(z/8)
|
|||
|
local color = pixels_orig[z_orig][x_orig]
|
|||
|
pixels[z] = pixels[z] or {}
|
|||
|
pixels[z][x] = color
|
|||
|
end
|
|||
|
end
|
|||
|
tga_encoder.image(pixels):save("bitmap_large.tga")
|
|||
|
|
|||
|
-- note that the uncompressed grayscale TGA file written in this
|
|||
|
-- example is 80 bytes – but an optimized PNG file is 81 bytes …
|
|||
|
local pixels = {}
|
|||
|
for x = 1,6,1 do -- left to right
|
|||
|
for z = 1,6,1 do -- bottom to top
|
|||
|
local color = { math.min(x * z * 4 - 1, 255) }
|
|||
|
pixels[z] = pixels[z] or {}
|
|||
|
pixels[z][x] = color
|
|||
|
end
|
|||
|
end
|
|||
|
tga_encoder.image(pixels):save("gradient_8bpp_raw.tga", {color_format="Y8", compression="RAW"})
|
|||
|
|
|||
|
local pixels = {}
|
|||
|
for x = 1,16,1 do -- left to right
|
|||
|
for z = 1,16,1 do -- bottom to top
|
|||
|
local r = math.min(x * 32 - 1, 255)
|
|||
|
local g = math.min(z * 32 - 1, 255)
|
|||
|
local b = 0
|
|||
|
-- blue rectangle in top right corner
|
|||
|
if x > 8 and z > 8 then
|
|||
|
r = 0
|
|||
|
g = 0
|
|||
|
b = math.min(z * 16 - 1, 255)
|
|||
|
end
|
|||
|
local color = { r, g, b }
|
|||
|
pixels[z] = pixels[z] or {}
|
|||
|
pixels[z][x] = color
|
|||
|
end
|
|||
|
end
|
|||
|
local gradients = tga_encoder.image(pixels)
|
|||
|
gradients:save("gradients_8bpp_raw.tga", {color_format="Y8", compression="RAW"})
|
|||
|
gradients:save("gradients_16bpp_raw.tga", {color_format="A1R5G5B5", compression="RAW"})
|
|||
|
gradients:save("gradients_16bpp_rle.tga", {color_format="A1R5G5B5", compression="RLE"})
|
|||
|
gradients:save("gradients_24bpp_raw.tga", {color_format="B8G8R8", compression="RAW"})
|
|||
|
gradients:save("gradients_24bpp_rle.tga", {color_format="B8G8R8", compression="RLE"})
|
|||
|
|
|||
|
for x = 1,16,1 do -- left to right
|
|||
|
for z = 1,16,1 do -- bottom to top
|
|||
|
local color = pixels[z][x]
|
|||
|
color[#color+1] = ((x * x) + (z * z)) % 256
|
|||
|
pixels[z][x] = color
|
|||
|
end
|
|||
|
end
|
|||
|
gradients:save("gradients_32bpp_raw.tga", {color_format="B8G8R8A8", compression="RAW"})
|
|||
|
-- the RLE-compressed file is larger than just dumping pixels because
|
|||
|
-- the gradients in this picture can not be compressed well using RLE
|
|||
|
gradients:save("gradients_32bpp_rle.tga", {color_format="B8G8R8A8", compression="RLE"})
|
|||
|
|
|||
|
local pixels = {}
|
|||
|
for x = 1,512,1 do -- left to right
|
|||
|
for z = 1,512,1 do -- bottom to top
|
|||
|
local oz = (z - 256) / 256 + 0.75
|
|||
|
local ox = (x - 256) / 256
|
|||
|
local px, pz, i = 0, 0, 0
|
|||
|
while (px * px) + (pz * pz) <= 4 and i < 128 do
|
|||
|
px = (px * px) - (pz * pz) + oz
|
|||
|
pz = (2 * px * pz) + ox
|
|||
|
i = i + 1
|
|||
|
end
|
|||
|
local color = {
|
|||
|
math.max(0, math.min(255, math.floor(px * 64))),
|
|||
|
math.max(0, math.min(255, math.floor(pz * 64))),
|
|||
|
math.max(0, math.min(255, math.floor(i))),
|
|||
|
}
|
|||
|
pixels[z] = pixels[z] or {}
|
|||
|
pixels[z][x] = color
|
|||
|
end
|
|||
|
end
|
|||
|
tga_encoder.image(pixels):save("fractal_8bpp.tga", {color_format="Y8"})
|
|||
|
tga_encoder.image(pixels):save("fractal_16bpp.tga", {color_format="A1R5G5B5"})
|
|||
|
tga_encoder.image(pixels):save("fractal_24bpp.tga", {color_format="B8G8R8"})
|
|||
|
|
|||
|
-- encode a colormapped bitmap
|
|||
|
local K = { 0 }
|
|||
|
local B = { 1 }
|
|||
|
local R = { 2 }
|
|||
|
local G = { 3 }
|
|||
|
local W = { 4 }
|
|||
|
local colormap = {
|
|||
|
{ 1, 2, 3 }, -- K
|
|||
|
{ 0, 0, 255 }, -- B
|
|||
|
{ 255, 0, 0 }, -- R
|
|||
|
{ 0, 255, 0 }, -- G
|
|||
|
{ 253, 254, 255 }, -- W
|
|||
|
}
|
|||
|
local pixels = {
|
|||
|
{ W, K, W, K, W, K, W },
|
|||
|
{ R, G, B, R, G, B, K },
|
|||
|
{ K, W, K, W, K, W, K },
|
|||
|
{ G, B, R, G, B, R, W },
|
|||
|
{ W, W, W, K, K, K, W },
|
|||
|
{ B, R, G, B, R, G, K },
|
|||
|
{ B, R, G, B, R, G, W },
|
|||
|
}
|
|||
|
-- note that the uncompressed colormapped TGA file written in this
|
|||
|
-- example is 108 bytes – but an optimized PNG file is 121 bytes …
|
|||
|
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})
|
|||
|
|
|||
|
-- encoding a colormapped image with illegal colormap indexes should error out
|
|||
|
local colormap = {
|
|||
|
{ 0, 0, 0, 0 },
|
|||
|
{ 0, 0, 0, 255 },
|
|||
|
}
|
|||
|
local status, message = pcall(
|
|||
|
function ()
|
|||
|
tga_encoder.image(pixels):encode({colormap=colormap})
|
|||
|
end
|
|||
|
)
|
|||
|
assert(
|
|||
|
false == status and
|
|||
|
"init.lua:36: colormap index 2 not in colormap of size 2" == message
|
|||
|
)
|