xpm.lua

1
-- Lua XPM generating library
2
-- (C) 2009 Matthew Wild <mwild1@gmail.com>
3
-- Released under the MIT/X11 license
4
 
5
module("xpm", package.seeall);
6
_M.__index = _M;
7
 
8
function new(width, height, name)
9
	return setmetatable({
10
			name = name,
11
			width = width,
12
			height = height,
13
			colours = { [false] = true }, ncolours = 1;
14
		}, _M);
15
end
16
 
17
function setpixel(xpm, x, y, colour)
18
	if not xpm[y] then
19
		xpm[y] = { [x] = colour };
20
	else
21
		xpm[y][x] = colour;
22
	end
23
	if colour and not xpm.colours[colour] then
24
		xpm.colours[colour] = true;
25
		xpm.ncolours = xpm.ncolours + 1;
26
	end
27
end
28
 
29
function render(xpm, f)
30
	local err;
31
	if type(f) == "string" then
32
		f = io.open(f, "w+");
33
	end
34
	if io.type(f) ~= "file" then
35
		error("No valid output file", 2);
36
	end
37
	
38
	f:write("/* XPM */\n");
39
	f:write("static char * ", name or "xpm", "[] = {\n");
40
	f:write(string.format([["%d %d %d %d",]], xpm.width, xpm.height, xpm.ncolours, 1), "\n");
41
 
42
	local colourmap = new_colourmap(xpm.colours);
43
 
44
	for colour in pairs(xpm.colours) do
45
		f:write('"', colourmap[colour], "      c ", colour or "None", '",\n');
46
	end
47
 
48
	for y=1,xpm.height do
49
		if xpm[y] then
50
			f:write('"');
51
			for x=1,xpm.width do
52
				local pixel = xpm[y][x];
53
				if pixel then
54
					f:write(colourmap[pixel]);
55
				else
56
					f:write(" ");
57
				end
58
			end
59
			f:write('"', y == xpm.height and "" or ",",'\n');
60
		else
61
			f:write('"', string.rep(" ", xpm.width), '"', y == xpm.height and "" or ",", '\n');
62
		end
63
	end
64
	f:write("};\n");
65
end
66
 
67
function new_colourmap(colours)
68
	return setmetatable({ [false] = " ", curr = 35 }, { __index = 
69
		function (cm, colour)
70
			cm.curr = cm.curr + 1;
71
			cm[colour] = string.char(cm.curr);
72
			return rawget(cm, colour);
73
		end; });
74
end
75
 
76
return _M;