2014-04-07 08:08:10 -07:00
|
|
|
-- EFL LuaJIT bindings: Eina (tiler module)
|
|
|
|
-- For use with Elua
|
|
|
|
|
|
|
|
local ffi = require("ffi")
|
|
|
|
local C = ffi.C
|
|
|
|
|
|
|
|
local iterator = require("eina.iterator")
|
|
|
|
require("eina.rectangle")
|
|
|
|
|
|
|
|
ffi.cdef [[
|
|
|
|
typedef struct _Eina_Tiler Eina_Tiler;
|
|
|
|
|
|
|
|
typedef struct _Eina_Tile_Grid_Info {
|
|
|
|
unsigned long col, row;
|
|
|
|
Eina_Rectangle rect;
|
|
|
|
Eina_Bool full;
|
|
|
|
} Eina_Tile_Grid_Info;
|
|
|
|
|
|
|
|
typedef sruct_Eina_Tile_Grid_Slicer {
|
|
|
|
unsigned long col1, col2, row1, row2;
|
|
|
|
int tile_w, tile_h;
|
|
|
|
int x_rel, y_rel;
|
|
|
|
int w1_rel, h1_rel;
|
|
|
|
int w2_rel, h2_rel;
|
|
|
|
Eina_Tile_Grid_Info info;
|
|
|
|
Eina_Bool first;
|
|
|
|
} Eina_Tile_Grid_Slicer;
|
|
|
|
|
|
|
|
typedef unsigned char Eina_Bool;
|
|
|
|
|
|
|
|
Eina_Tiler *eina_tiler_new(int w, int h);
|
|
|
|
void eina_tiler_free(Eina_Tiler *t);
|
|
|
|
void eina_tiler_tile_size_set(Eina_Tiler *t, int w, int h);
|
|
|
|
void eina_tiler_area_size_set(Eina_Tiler *t, int w, int h);
|
|
|
|
void eina_tiler_area_size_get(const Eina_Tiler *t, int *w, int *h);
|
|
|
|
void eina_tiler_strict_set(Eina_Tiler *t, Eina_Bool strict);
|
|
|
|
Eina_Bool eina_tiler_empty(Eina_Tiler *t);
|
|
|
|
Eina_Bool eina_tiler_rect_add(Eina_Tiler *t, const Eina_Rectangle *r);
|
|
|
|
void eina_tiler_rect_del(Eina_Tiler *t, const Eina_Rectangle *r);
|
|
|
|
void eina_tiler_clear(Eina_Tiler *t);
|
|
|
|
Eina_Iterator *eina_tiler_iterator_new(const Eina_Tiler *t);
|
|
|
|
|
|
|
|
Eina_Iterator *eina_tile_grid_slicer_iterator_new(int x, int y, int w, int h, int tile_w, int tile_h);
|
|
|
|
]]
|
|
|
|
|
|
|
|
local cutil = require("cutil")
|
|
|
|
local util = require("util")
|
|
|
|
|
|
|
|
local M = {}
|
|
|
|
|
|
|
|
local eina
|
|
|
|
|
|
|
|
local init = function()
|
|
|
|
eina = util.lib_load("eina")
|
|
|
|
end
|
|
|
|
|
|
|
|
local shutdown = function()
|
|
|
|
util.lib_unload("eina")
|
|
|
|
end
|
|
|
|
|
|
|
|
cutil.init_module(init, shutdown)
|
|
|
|
|
2014-04-14 01:47:24 -07:00
|
|
|
local dgetmt = debug.getmetatable
|
|
|
|
|
2014-04-07 08:08:10 -07:00
|
|
|
local Iterator = iterator.Iterator
|
|
|
|
|
2014-04-14 02:00:48 -07:00
|
|
|
local Tiler_Iterator = Iterator:clone {
|
2014-04-14 01:47:24 -07:00
|
|
|
__ctor = function(self, selfmt, tiler)
|
|
|
|
return Iterator.__ctor(self, selfmt,
|
|
|
|
eina.eina_tiler_iterator_new(tiler))
|
2014-04-07 08:08:10 -07:00
|
|
|
end,
|
|
|
|
|
|
|
|
next = function(self)
|
|
|
|
local v = Iterator.next(self)
|
|
|
|
if not v then return nil end
|
|
|
|
return ffi.cast("Eina_Rectangle*", v)
|
|
|
|
end
|
|
|
|
}
|
|
|
|
|
2014-04-14 02:00:48 -07:00
|
|
|
local Tile_Grid_Slicer_Iterator = Iterator:clone {
|
2014-04-14 01:47:24 -07:00
|
|
|
__ctor = function(self, selfmt, x, y, w, h, tile_w, tile_h)
|
|
|
|
return Iterator.__ctor(self, selfmt,
|
|
|
|
eina.eina_tile_grid_slicer_iterator_new(x, y, w, h, tile_w, tile_h))
|
2014-04-07 08:08:10 -07:00
|
|
|
end,
|
|
|
|
|
|
|
|
next = function(self)
|
|
|
|
local v = Iterator.next(self)
|
|
|
|
if not v then return nil end
|
|
|
|
return ffi.cast("Eina_Tile_Grid_Info*", v)
|
|
|
|
end
|
|
|
|
}
|
|
|
|
|
|
|
|
M.Tiler = ffi.metatype("Eina_Tiler", {
|
|
|
|
__new = function(self, w, h)
|
|
|
|
return ffi.gc(eina.eina_tiler_new(w, h), self.free)
|
|
|
|
end,
|
|
|
|
__index = {
|
|
|
|
free = function(self) eina.eina_tiler_free(ffi.gc(self, nil)) end,
|
|
|
|
|
|
|
|
tile_size_set = function(self, w, h)
|
|
|
|
eina.eina_tiler_tile_size_set(self, w, h)
|
|
|
|
end,
|
|
|
|
|
|
|
|
area_size_set = function(self, w, h)
|
|
|
|
eina.eina_tiler_area_sie_set(self, w, h)
|
|
|
|
end,
|
|
|
|
|
|
|
|
area_size_get = function(self)
|
|
|
|
local w, h = ffi.new("int[1]"), ffi.new("int[2]")
|
|
|
|
eina.eina_tiler_area_size_get(self, w, h)
|
|
|
|
return w[0], h[0]
|
|
|
|
end,
|
|
|
|
|
|
|
|
strict_set = function(self, strict)
|
|
|
|
eina.eina_tiler_strict_set(self, strict)
|
|
|
|
end,
|
|
|
|
|
|
|
|
is_empty = function(self)
|
2014-04-11 02:55:07 -07:00
|
|
|
return eina.eina_tiler_empty(self) ~= 0
|
2014-04-07 08:08:10 -07:00
|
|
|
end,
|
|
|
|
|
|
|
|
rect_add = function(self, r)
|
2014-04-11 02:55:07 -07:00
|
|
|
return eina.eina_tiler_rect_add(self, r) ~= 0
|
2014-04-07 08:08:10 -07:00
|
|
|
end,
|
|
|
|
rect_del = function(self, r)
|
|
|
|
eina.eina_tiler_rect_del(self, r)
|
|
|
|
end,
|
|
|
|
|
|
|
|
clear = function(self) eina.eina_tiler_clear(self) end,
|
|
|
|
|
2014-04-14 02:00:48 -07:00
|
|
|
iterator = function(self)
|
2014-04-07 08:08:10 -07:00
|
|
|
return M.Tiler_Iterator(self)
|
2014-04-14 02:00:48 -07:00
|
|
|
endd
|
2014-04-07 08:08:10 -07:00
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
M.Tile_Grid_Slicer = ffi.metatype("Eina_Tile_Grid_Slicer", {
|
|
|
|
__index = {
|
|
|
|
setup = function(self, x, y, w, h, tile_w, tile_h)
|
|
|
|
return eina.eina_tile_grid_slicer_setup(x, y, w, h,
|
2014-04-11 02:55:07 -07:00
|
|
|
tile_w, tile_h) ~= 0
|
2014-04-07 08:08:10 -07:00
|
|
|
end,
|
|
|
|
|
|
|
|
next = function(self)
|
|
|
|
local info = ffi.new("Eina_Tile_Grid_Info*[1]")
|
|
|
|
if eina.eina_tile_grid_slicer_next(self, info) == 0 then
|
|
|
|
return nil
|
|
|
|
end
|
|
|
|
return info[0]
|
|
|
|
end,
|
|
|
|
|
|
|
|
each = function(self)
|
|
|
|
return function()
|
|
|
|
return self:next()
|
|
|
|
end
|
|
|
|
end,
|
|
|
|
|
2014-04-14 02:00:48 -07:00
|
|
|
Iterator = function(x, y, w, h, tw, th)
|
|
|
|
return Tile_Grid_Slicer_Iterator(x, y, w, h, tw, th)
|
|
|
|
end
|
2014-04-07 08:08:10 -07:00
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
return M
|