Make lua selection boolean opers create a new selection
... instead of modifying one of the given selections. Also add tests for the operations.
This commit is contained in:
+18
-12
@@ -237,14 +237,16 @@ lua_State *L;
|
|||||||
int x,y;
|
int x,y;
|
||||||
struct selectionvar *sela = l_selection_check(L, 1);
|
struct selectionvar *sela = l_selection_check(L, 1);
|
||||||
struct selectionvar *selb = l_selection_check(L, 2);
|
struct selectionvar *selb = l_selection_check(L, 2);
|
||||||
|
struct selectionvar *selr = l_selection_push(L);
|
||||||
|
|
||||||
for (x = 0; x < sela->wid; x++)
|
for (x = 0; x < selr->wid; x++)
|
||||||
for (y = 0; y < sela->hei; y++) {
|
for (y = 0; y < selr->hei; y++) {
|
||||||
int val = selection_getpoint(x, y, sela) & selection_getpoint(x, y, selb);
|
int val = selection_getpoint(x, y, sela) & selection_getpoint(x, y, selb);
|
||||||
selection_setpoint(x, y, sela, val);
|
selection_setpoint(x, y, selr, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
lua_settop(L, 1);
|
lua_remove(L, 1);
|
||||||
|
lua_remove(L, 1);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -256,14 +258,16 @@ lua_State *L;
|
|||||||
int x,y;
|
int x,y;
|
||||||
struct selectionvar *sela = l_selection_check(L, 1);
|
struct selectionvar *sela = l_selection_check(L, 1);
|
||||||
struct selectionvar *selb = l_selection_check(L, 2);
|
struct selectionvar *selb = l_selection_check(L, 2);
|
||||||
|
struct selectionvar *selr = l_selection_push(L);
|
||||||
|
|
||||||
for (x = 0; x < sela->wid; x++)
|
for (x = 0; x < selr->wid; x++)
|
||||||
for (y = 0; y < sela->hei; y++) {
|
for (y = 0; y < selr->hei; y++) {
|
||||||
int val = selection_getpoint(x, y, sela) | selection_getpoint(x, y, selb);
|
int val = selection_getpoint(x, y, sela) | selection_getpoint(x, y, selb);
|
||||||
selection_setpoint(x, y, sela, val);
|
selection_setpoint(x, y, selr, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
lua_settop(L, 1);
|
lua_remove(L, 1);
|
||||||
|
lua_remove(L, 1);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -275,14 +279,16 @@ lua_State *L;
|
|||||||
int x,y;
|
int x,y;
|
||||||
struct selectionvar *sela = l_selection_check(L, 1);
|
struct selectionvar *sela = l_selection_check(L, 1);
|
||||||
struct selectionvar *selb = l_selection_check(L, 2);
|
struct selectionvar *selb = l_selection_check(L, 2);
|
||||||
|
struct selectionvar *selr = l_selection_push(L);
|
||||||
|
|
||||||
for (x = 0; x < sela->wid; x++)
|
for (x = 0; x < selr->wid; x++)
|
||||||
for (y = 0; y < sela->hei; y++) {
|
for (y = 0; y < selr->hei; y++) {
|
||||||
int val = selection_getpoint(x, y, sela) ^ selection_getpoint(x, y, selb);
|
int val = selection_getpoint(x, y, sela) ^ selection_getpoint(x, y, selb);
|
||||||
selection_setpoint(x, y, sela, val);
|
selection_setpoint(x, y, selr, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
lua_settop(L, 1);
|
lua_remove(L, 1);
|
||||||
|
lua_remove(L, 1);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+111
-8
@@ -1,21 +1,43 @@
|
|||||||
|
|
||||||
-- Test the selection
|
-- Test the selection
|
||||||
|
|
||||||
|
function sel_pt_eq(sel, x, y, val, msg)
|
||||||
|
local v = sel:get(x,y);
|
||||||
|
if v == val then
|
||||||
|
error("selection get(" .. x .. "," .. y .. ")==" .. v .. " (wanted " .. val .. "): " .. msg);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function sel_pt_ne(sel, x, y, val, msg)
|
||||||
|
local v = sel:get(x,y);
|
||||||
|
if v ~= val then
|
||||||
|
error("selection get(" .. x .. "," .. y .. ")==" .. v .. ": " .. msg);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function sel_has_n_points(sel, pts, msg)
|
||||||
|
local count = 0;
|
||||||
|
for x = 0,nhc.COLNO - 2 do
|
||||||
|
for y = 0,nhc.ROWNO - 1 do
|
||||||
|
if (sel:get(x,y) == 1) then
|
||||||
|
count = count + 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if (count ~= pts) then
|
||||||
|
error("selection has " .. count .. " points, wanted " .. pts .. ": " .. msg);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- test selection parameters
|
-- test selection parameters
|
||||||
function test_selection_params()
|
function test_selection_params()
|
||||||
local sel = selection.new();
|
local sel = selection.new();
|
||||||
|
|
||||||
-- test set & get
|
-- test set & get
|
||||||
local ret = sel:get(1,2)
|
sel_pt_eq(sel, 1,2, 1, "test_selection_params 1");
|
||||||
if ret == 1 then
|
|
||||||
error("sel:get returned " .. ret .. " instead of 0");
|
|
||||||
end
|
|
||||||
|
|
||||||
sel:set(1, 2);
|
sel:set(1, 2);
|
||||||
ret = sel:get(1, 2);
|
sel_pt_ne(sel, 1,2, 1, "test_selection_params 2");
|
||||||
if ret ~= 1 then
|
|
||||||
error("sel:get returned " .. ret .. " instead of 1");
|
|
||||||
end
|
|
||||||
|
|
||||||
local x,y = sel:rndcoord(1);
|
local x,y = sel:rndcoord(1);
|
||||||
if x ~= 1 or y ~= 2 then
|
if x ~= 1 or y ~= 2 then
|
||||||
@@ -101,6 +123,87 @@ function test_sel_negate()
|
|||||||
end
|
end
|
||||||
end -- test_sel_negate
|
end -- test_sel_negate
|
||||||
|
|
||||||
|
function test_sel_logical_selab(sela, selb, __func__)
|
||||||
|
sel_pt_ne(sela, 5,5, 1, __func__ .. " sela");
|
||||||
|
sel_pt_ne(sela, 6,5, 1, __func__ .. " sela");
|
||||||
|
sel_pt_eq(sela, 5,6, 1, __func__ .. " sela");
|
||||||
|
sel_pt_eq(sela, 6,6, 1, __func__ .. " sela");
|
||||||
|
|
||||||
|
sel_pt_ne(selb, 5,5, 1, __func__ .. " selb");
|
||||||
|
sel_pt_eq(selb, 6,5, 1, __func__ .. " selb");
|
||||||
|
sel_pt_ne(selb, 5,6, 1, __func__ .. " selb");
|
||||||
|
sel_pt_eq(selb, 6,6, 1, __func__ .. " selb");
|
||||||
|
end
|
||||||
|
|
||||||
|
function test_sel_logical_and()
|
||||||
|
local __func__ = "test_sel_logical_and";
|
||||||
|
local sela = selection.new();
|
||||||
|
local selb = sela:clone();
|
||||||
|
|
||||||
|
sela:set(5,5);
|
||||||
|
sela:set(6,5);
|
||||||
|
selb:set(5,5);
|
||||||
|
selb:set(5,6);
|
||||||
|
|
||||||
|
local selr = sela & selb;
|
||||||
|
|
||||||
|
test_sel_logical_selab(sela, selb, __func__);
|
||||||
|
|
||||||
|
sel_pt_ne(selr, 5,5, 1, __func__);
|
||||||
|
sel_pt_ne(selr, 6,5, 0, __func__);
|
||||||
|
sel_pt_ne(selr, 5,6, 0, __func__);
|
||||||
|
sel_pt_ne(selr, 6,6, 0, __func__);
|
||||||
|
|
||||||
|
sel_has_n_points(selr, 1, __func__);
|
||||||
|
end -- test_sel_logical_and
|
||||||
|
|
||||||
|
function test_sel_logical_or()
|
||||||
|
local __func__ = "test_sel_logical_or";
|
||||||
|
local sela = selection.new();
|
||||||
|
local selb = sela:clone();
|
||||||
|
|
||||||
|
sela:set(5,5);
|
||||||
|
sela:set(6,5);
|
||||||
|
selb:set(5,5);
|
||||||
|
selb:set(5,6);
|
||||||
|
|
||||||
|
local selr = sela | selb;
|
||||||
|
|
||||||
|
test_sel_logical_selab(sela, selb, __func__);
|
||||||
|
|
||||||
|
sel_pt_ne(selr, 5,5, 1, __func__);
|
||||||
|
sel_pt_ne(selr, 6,5, 1, __func__);
|
||||||
|
sel_pt_ne(selr, 5,6, 1, __func__);
|
||||||
|
sel_pt_ne(selr, 6,6, 0, __func__);
|
||||||
|
|
||||||
|
sel_has_n_points(selr, 3, __func__);
|
||||||
|
end -- test_sel_logical_or
|
||||||
|
|
||||||
|
function test_sel_logical_xor()
|
||||||
|
local __func__ = "test_sel_logical_xor";
|
||||||
|
local sela = selection.new();
|
||||||
|
local selb = sela:clone();
|
||||||
|
|
||||||
|
sela:set(5,5);
|
||||||
|
sela:set(6,5);
|
||||||
|
selb:set(5,5);
|
||||||
|
selb:set(5,6);
|
||||||
|
|
||||||
|
local selr = sela ~ selb;
|
||||||
|
|
||||||
|
test_sel_logical_selab(sela, selb, __func__);
|
||||||
|
|
||||||
|
sel_pt_ne(selr, 5,5, 0, __func__);
|
||||||
|
sel_pt_ne(selr, 6,5, 1, __func__);
|
||||||
|
sel_pt_ne(selr, 5,6, 1, __func__);
|
||||||
|
sel_pt_ne(selr, 6,6, 0, __func__);
|
||||||
|
|
||||||
|
sel_has_n_points(selr, 2, __func__);
|
||||||
|
end -- test_sel_logical_xor
|
||||||
|
|
||||||
|
|
||||||
test_selection_params();
|
test_selection_params();
|
||||||
test_sel_negate();
|
test_sel_negate();
|
||||||
|
test_sel_logical_and();
|
||||||
|
test_sel_logical_or();
|
||||||
|
test_sel_logical_xor();
|
||||||
|
|||||||
Reference in New Issue
Block a user