efl/src/bindings/lua/eina/tiler.lua

165 lines
4.7 KiB
Lua

-- 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)
local dgetmt = debug.getmetatable
local Iterator = iterator.Iterator
local Tiler_Iterator = Iterator:clone {
__ctor = function(self, selfmt, tiler)
return Iterator.__ctor(self, selfmt,
eina.eina_tiler_iterator_new(tiler))
end,
next = function(self)
local v = Iterator.next(self)
if not v then return nil end
return ffi.cast("Eina_Rectangle*", v)
end
}
local Tile_Grid_Slicer_Iterator = Iterator:clone {
__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))
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)
return eina.eina_tiler_empty(self) ~= 0
end,
rect_add = function(self, r)
return eina.eina_tiler_rect_add(self, r) ~= 0
end,
rect_del = function(self, r)
eina.eina_tiler_rect_del(self, r)
end,
clear = function(self) eina.eina_tiler_clear(self) end,
iterator = function(self)
return M.Tiler_Iterator(self)
endd
}
})
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,
tile_w, tile_h) ~= 0
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,
Iterator = function(x, y, w, h, tw, th)
return Tile_Grid_Slicer_Iterator(x, y, w, h, tw, th)
end
}
})
return M