xpm.lua

Wed, 27 Oct 2010 14:12:51 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Wed, 27 Oct 2010 14:12:51 +0100
changeset 5
fa4d448b07d3
parent 3
7f619444bc2a
permissions
-rw-r--r--

test_mandelbrot.lua: Remove some trailing whitespace

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

mercurial