xpm.lua

Wed, 04 Nov 2009 01:54:45 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Wed, 04 Nov 2009 01:54:45 +0000
changeset 1
8724d7c9318e
parent 0
c75ae749adf5
child 2
475bf0c54822
permissions
-rw-r--r--

Add test

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

mercurial