Add Tiler, a factory script that extracts (unique) tiles from spare to main page.
git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@1823 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
parent
66ff11b4f2
commit
51c1a6de09
119
share/grafx2/scripts/samples_2.4/picture/Tiler.lua
Normal file
119
share/grafx2/scripts/samples_2.4/picture/Tiler.lua
Normal file
@ -0,0 +1,119 @@
|
||||
--PICTURE: Tiler
|
||||
--By Adrien Destugues
|
||||
--
|
||||
--Extract unique tiles from the spare page to the main one
|
||||
--Main page is erased.
|
||||
--
|
||||
-- Copyright 2010 Adrien Destugues <pulkomandy@pulkomandy.ath.cx>
|
||||
--
|
||||
-- This program is free software; you can redistribute it and/or
|
||||
-- modify it under the terms of the GNU General Public License
|
||||
-- as published by the Free Software Foundation; version 2
|
||||
-- of the License. See <http://www.gnu.org/licenses/>
|
||||
|
||||
-- Copy palette from spare to main
|
||||
-- TODO
|
||||
|
||||
-- Grid size
|
||||
-- TODO : get it from GrafX2
|
||||
xgrid = 8
|
||||
ygrid = 16
|
||||
|
||||
-- picture size
|
||||
w, h = getsparepicturesize()
|
||||
|
||||
-- We may need less if there are duplicates
|
||||
setpicturesize(xgrid, w*h/xgrid)
|
||||
|
||||
tileid = 0
|
||||
|
||||
-- blit part of the spare to picture
|
||||
function blitsparetopicture(srcx, srcy, dstx, dsty, width, height)
|
||||
local x,y,color
|
||||
for y = 0, height - 1, 1 do
|
||||
for x = 0, width - 1, 1 do
|
||||
color = getsparepicturepixel(srcx + x, srcy + y);
|
||||
putpicturepixel(dstx+x, dsty+y, color);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function comparesparetopicture(srcx, srcy, dstx, dsty, width, height)
|
||||
local x,y,color
|
||||
for y = 0, height - 1, 1 do
|
||||
for x = 0, width - 1, 1 do
|
||||
color = getsparepicturepixel(srcx + x, srcy + y);
|
||||
if color ~= getpicturepixel(dstx+x, dsty+y) then
|
||||
-- they are different
|
||||
return false;
|
||||
end
|
||||
end
|
||||
end
|
||||
-- they are identical
|
||||
return true;
|
||||
end
|
||||
|
||||
-- compute checksum of a picture area
|
||||
-- it may not be unique, we use it as a key for an hashmap
|
||||
function checksum(srcx, srcy, width, height)
|
||||
local sum,x,y
|
||||
sum = 0;
|
||||
for y = 0, height - 1, 1 do
|
||||
for x = 0, width - 1, 1 do
|
||||
sum = sum + getsparepicturepixel(srcx+x, srcy+y);
|
||||
end
|
||||
end
|
||||
|
||||
return sum;
|
||||
end
|
||||
|
||||
tilemap = {}
|
||||
|
||||
-- foreach tile
|
||||
for y = 0, h-1, ygrid do
|
||||
for x = 0, w - 1, xgrid do
|
||||
--TODO - existing one ?
|
||||
csum = checksum(x,y,xgrid,ygrid);
|
||||
if tilemap[csum] ~= nil then
|
||||
-- potential match
|
||||
-- Find matching tileid
|
||||
found = false;
|
||||
for id in pairs(tilemap[csum]) do
|
||||
-- is it a match ?
|
||||
if comparesparetopicture(x,y,0,id*ygrid, xgrid, ygrid) then
|
||||
-- found it !
|
||||
tilemap[csum][id] = tilemap[csum][id] + 1;
|
||||
found = true;
|
||||
break;
|
||||
end
|
||||
end
|
||||
-- Add tile anyway if needed
|
||||
if not found then
|
||||
desty = tileid * ygrid;
|
||||
blitsparetopicture(x, y, 0, desty, xgrid, ygrid);
|
||||
|
||||
-- add it to the tilemap
|
||||
tilemap[csum][tileid] = 1;
|
||||
-- give it a tile id
|
||||
tileid = tileid + 1;
|
||||
end
|
||||
else
|
||||
-- Copy to spare
|
||||
desty = tileid * ygrid;
|
||||
blitsparetopicture(x, y, 0, desty, xgrid, ygrid);
|
||||
|
||||
-- add it to the tilemap
|
||||
tilemap[csum] = {}
|
||||
tilemap[csum][tileid] = 1;
|
||||
-- give it a tile id
|
||||
tileid = tileid + 1;
|
||||
end
|
||||
--statusmessage("processed " .. tileid .. " tiles");
|
||||
--updatescreen();
|
||||
end
|
||||
end
|
||||
|
||||
setpicturesize(xgrid, (tileid-1)*ygrid)
|
||||
|
||||
finalizepicture()
|
||||
updatescreen()
|
||||
Loading…
x
Reference in New Issue
Block a user