Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6581 leency 1
--Picture Tiler by Adrien Destugues
2
--Extract unique tiles from the spare page
3
--to the main one. Main page is erased.
4
--
5
-- Copyright 2011 Adrien Destugues 
6
--
7
-- This program is free software; you can redistribute it and/or
8
-- modify it under the terms of the GNU General Public License
9
-- as published by the Free Software Foundation; version 2
10
-- of the License. See 
11
 
12
-- Copy palette from spare to main
13
-- TODO
14
 
15
-- Grid size
16
-- TODO : get it from GrafX2
17
xgrid = 16;
18
ygrid = 16;
19
 
20
-- picture size
21
w, h = getpicturesize();
22
 
23
-- We may need less if there are duplicates
24
setsparepicturesize(xgrid, w*h/xgrid);
25
 
26
tileid = 0;
27
 
28
-- blit part of the spare to picture
29
function blitpicturetospare(srcx, srcy, dstx, dsty, width, height)
30
	local x,y;
31
	for y = 0, height - 1, 1 do
32
		for x = 0, width - 1, 1 do
33
			putsparepicturepixel(dstx+x, dsty+y, getpicturepixel(srcx + x, srcy + y));
34
		end
35
	end
36
end
37
 
38
function comparesparewithpicture(srcx, srcy, dstx, dsty, width, height)
39
	local x,y,color
40
	for y = 0, height - 1, 1 do
41
		for x = 0, width - 1, 1 do
42
			color = getsparepicturepixel(srcx + x, srcy + y);
43
			if color ~= getpicturepixel(dstx+x, dsty+y) then
44
				-- they are different
45
				return false;
46
			end
47
		end
48
	end
49
	-- they are identical
50
	return true;
51
end
52
 
53
-- compute checksum of a picture area
54
-- it may not be unique, we use it as a key for an hashmap
55
function checksum(srcx, srcy, width, height)
56
	local sum,x,y
57
	sum = 0;
58
	for y = 0, height - 1, 1 do
59
		for x = 0, width - 1, 1 do
60
			sum = sum + getpicturepixel(srcx+x, srcy+y);
61
		end
62
	end
63
 
64
	return sum;
65
end
66
 
67
tilemap = {}
68
 
69
-- foreach tile
70
for y = 0, h-1, ygrid do
71
	for x = 0, w - 1, xgrid do
72
		-- existing one ?
73
		csum = checksum(x,y,xgrid,ygrid);
74
		if tilemap[csum] ~= nil then
75
			-- potential match
76
			-- Find matching tileid
77
			found = false;
78
			for id in pairs(tilemap[csum]) do
79
				-- is it a match ?
80
				if comparesparewithpicture(x,y,0,id*ygrid, xgrid, ygrid) then
81
					-- found it !
82
					tilemap[csum][id] = tilemap[csum][id] + 1;
83
					found = true;
84
					break;
85
				end
86
			end
87
			-- Add tile anyway if needed
88
			if not found then
89
				desty = tileid * ygrid;
90
				blitpicturetospare(x, y, 0, desty, xgrid, ygrid);
91
 
92
				-- add it to the tilemap
93
				tilemap[csum][tileid] = 1;
94
				-- give it a tile id
95
				tileid = tileid + 1;
96
			end
97
		else
98
			-- Copy to spare
99
			desty = tileid * ygrid;
100
			blitpicturetospare(x, y, 0, desty, xgrid, ygrid);
101
 
102
			-- add it to the tilemap
103
			tilemap[csum] = {}
104
			tilemap[csum][tileid] = 1;
105
			-- give it a tile id
106
			tileid = tileid + 1;
107
		end
108
	end
109
end
110
 
111
setsparepicturesize(xgrid, (tileid-1)*ygrid)
112
--updatescreen();