kolibrios/data/common/media/grafx2/scripts/samples_2.4/picture/Tiler.lua
Kirill Lipatov (Leency) e401a92cbf upload and add to iso m2view, grafx2, fix fNav
git-svn-id: svn://kolibrios.org@6581 a494cfbc-eb01-0410-851d-a64ba20cac60
2016-10-07 15:11:52 +00:00

113 lines
2.6 KiB
Lua

--Picture Tiler by Adrien Destugues
--Extract unique tiles from the spare page
--to the main one. Main page is erased.
--
-- Copyright 2011 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 = 16;
ygrid = 16;
-- picture size
w, h = getpicturesize();
-- We may need less if there are duplicates
setsparepicturesize(xgrid, w*h/xgrid);
tileid = 0;
-- blit part of the spare to picture
function blitpicturetospare(srcx, srcy, dstx, dsty, width, height)
local x,y;
for y = 0, height - 1, 1 do
for x = 0, width - 1, 1 do
putsparepicturepixel(dstx+x, dsty+y, getpicturepixel(srcx + x, srcy + y));
end
end
end
function comparesparewithpicture(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 + getpicturepixel(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
-- 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 comparesparewithpicture(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;
blitpicturetospare(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;
blitpicturetospare(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
end
end
setsparepicturesize(xgrid, (tileid-1)*ygrid)
--updatescreen();