From c401c9395c950baf84259199a290472623fb8263 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Fri, 1 Dec 2023 19:30:31 +0100 Subject: [PATCH] Initial import --- init.lua | 265 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ mod.conf | 3 + 2 files changed, 268 insertions(+) create mode 100644 init.lua create mode 100644 mod.conf diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..6a2ec7b --- /dev/null +++ b/init.lua @@ -0,0 +1,265 @@ +--[[ + +tga_testnodes – Minetest mod that adds nodes with TGA test images. +Copyright © 2023 Nils Dagsson Moskopp (erle) + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +Dieses Programm hat das Ziel, die Medienkompetenz der Leser zu +steigern. Gelegentlich packe ich sogar einen handfesten Buffer +Overflow oder eine Format String Vulnerability zwischen die anderen +Codezeilen und schreibe das auch nicht dran. + +]]-- + +assert( + tga_encoder.features, + "No features table found. Install a newer version of tga_encoder!" +) + +local modname = minetest.get_current_modname() + +local S = minetest.get_translator( modname ) + +local textures_path = minetest.get_modpath( modname ) .. "/textures/" + +local register_node = function(filename) + local prefix = filename:gmatch( "[^.]+" )():gsub( "-", "_" ) + local nodename = modname .. ":" .. prefix + minetest.register_node(nodename, { + description = S( + "TGA Test Node " .. + prefix + ), + drawtype = "glasslike", + groups = { dig_immediate = 2 }, + paramtype = "light", + sunlight_propagates = true, + tiles = { filename }, + use_texture_alpha = "blend", + }) +end + +local _ = { 0 } +local R = { 1 } +local G = { 2 } +local B = { 3 } + +local pixels_colormapped_bt = { + { _, _, _, _, _, B, _, B, }, + { _, _, _, _, _, B, B, B, }, + { _, _, G, G, G, B, _, B, }, + { _, _, G, _, G, B, B, B, }, + { _, R, G, _, _, _, _, _, }, + { _, R, G, G, G, _, _, _, }, + { _, R, _, _, _, _, _, _, }, + { R, R, R, _, _, _, _, _, }, +} + +local pixels_colormapped_tb = { + { R, R, R, _, _, _, _, _, }, + { _, R, _, _, _, _, _, _, }, + { _, R, G, G, G, _, _, _, }, + { _, R, G, _, _, _, _, _, }, + { _, _, G, _, G, B, B, B, }, + { _, _, G, G, G, B, _, B, }, + { _, _, _, _, _, B, B, B, }, + { _, _, _, _, _, B, _, B, }, +} + +local pixels_colormapped_by_scanline_order = { + ["bottom_top"] = pixels_colormapped_bt, + ["top_bottom"] = pixels_colormapped_tb, +} + +local colormap_32bpp = { + { 0, 0, 0, 127 }, + { 255, 0, 0, 255 }, + { 0, 255, 0, 255 }, + { 0, 0, 255, 255 }, +} + +local colormap_24bpp = { + { 0, 0, 0 }, + { 255, 0, 0 }, + { 0, 255, 0 }, + { 0, 0, 255 }, +} + +local colormap_16bpp = { + { 0, 0, 0, 0 }, + { 255, 0, 0, 255 }, + { 0, 255, 0, 255 }, + { 0, 0, 255, 255 }, +} + +local colormap_by_color_format = { + ["A1R5G5B5"] = colormap_16bpp, + ["B8G8R8"] = colormap_24bpp, + ["B8G8R8A8"] = colormap_32bpp, +} + +for color_format, _ in pairs( + tga_encoder.features.color_format +) do + if ("Y8" ~= color_format) then + for scanline_order, _ in pairs( + tga_encoder.features.scanline_order + ) do + local filename + local pixels + filename = "type1" .. + '-' .. color_format .. + '-' .. scanline_order .. + '.tga' + pixels = pixels_colormapped_by_scanline_order[ + scanline_order + ] + local colormap = colormap_by_color_format[ + color_format + ] + local properties = { + colormap = colormap, + color_format = color_format, + scanline_order = scanline_order, + } + print(filename) + local image = tga_encoder.image(pixels) + image:save( + textures_path .. filename, + properties + ) + register_node(filename) + end + end +end + +local _ = { 0, 0, 0, 127 } +local R = { 255, 0, 0, 255 } +local G = { 0, 255, 0, 255 } +local B = { 0, 0, 255, 255 } + +local pixels_rgba_bt = { + { _, _, _, _, _, B, _, B, }, + { _, _, _, _, _, B, B, B, }, + { _, _, G, G, G, B, _, B, }, + { _, _, G, _, G, B, B, B, }, + { _, R, G, _, _, _, _, _, }, + { _, R, G, G, G, _, _, _, }, + { _, R, _, _, _, _, _, _, }, + { R, R, R, _, _, _, _, _, }, +} + +local pixels_rgba_tb = { + { R, R, R, _, _, _, _, _, }, + { _, R, _, _, _, _, _, _, }, + { _, R, G, G, G, _, _, _, }, + { _, R, G, _, _, _, _, _, }, + { _, _, G, _, G, B, B, B, }, + { _, _, G, G, G, B, _, B, }, + { _, _, _, _, _, B, B, B, }, + { _, _, _, _, _, B, _, B, }, +} + +local pixels_rgba_by_scanline_order = { + ["bottom_top"] = pixels_rgba_bt, + ["top_bottom"] = pixels_rgba_tb, +} + +local _ = { 0, 0, 0 } +local R = { 255, 0, 0 } +local G = { 0, 255, 0 } +local B = { 0, 0, 255 } + +local pixels_rgb_bt = { + { _, _, _, _, _, B, _, B, }, + { _, _, _, _, _, B, B, B, }, + { _, _, G, G, G, B, _, B, }, + { _, _, G, _, G, B, B, B, }, + { _, R, G, _, _, _, _, _, }, + { _, R, G, G, G, _, _, _, }, + { _, R, _, _, _, _, _, _, }, + { R, R, R, _, _, _, _, _, }, +} + +local pixels_rgb_tb = { + { R, R, R, _, _, _, _, _, }, + { _, R, _, _, _, _, _, _, }, + { _, R, G, G, G, _, _, _, }, + { _, R, G, _, _, _, _, _, }, + { _, _, G, _, G, B, B, B, }, + { _, _, G, G, G, B, _, B, }, + { _, _, _, _, _, B, B, B, }, + { _, _, _, _, _, B, _, B, }, +} + +local pixels_rgb_by_scanline_order = { + ["bottom_top"] = pixels_rgb_bt, + ["top_bottom"] = pixels_rgb_tb, +} + +local tga_type_by_compression = { + ["RAW"] = "2", + ["RLE"] = "10", +} + +local pixels_by_scanline_order_by_color_format = { + ["A1R5G5B5"] = pixels_rgba_by_scanline_order, + ["B8G8R8"] = pixels_rgb_by_scanline_order, + ["B8G8R8A8"] = pixels_rgba_by_scanline_order, + ["Y8"] = pixels_rgb_by_scanline_order, +} + +for color_format, _ in pairs( + tga_encoder.features.color_format +) do + local pixels_by_scanline_order = pixels_by_scanline_order_by_color_format[ + color_format + ] + for compression, _ in pairs( + tga_encoder.features.compression + ) do + local tga_type + if ( + "Y8" == color_format and + "RAW" == compression + ) then + tga_type = "3" + else + tga_type = tga_type_by_compression[ + compression + ] + end + -- tga_encoder can not encode grayscale RLE (type 11) + if not( + "Y8" == color_format and + "RLE" == compression + ) then + for scanline_order, _ in pairs( + tga_encoder.features.scanline_order + ) do + local filename = "type" .. tga_type .. + '-' .. color_format .. + '-' .. scanline_order .. + '.tga' + local pixels = pixels_by_scanline_order[ + scanline_order + ] + local properties = { + color_format = color_format, + compression = compression, + scanline_order = scanline_order, + } + local image = tga_encoder.image(pixels) + image:save( + textures_path .. filename, + properties + ) + register_node(filename) + end + end + end +end diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..fc0dae2 --- /dev/null +++ b/mod.conf @@ -0,0 +1,3 @@ +depends = tga_encoder +description = Adds TGA image format test nodes. +name = tga_testnodes