161 lines
4.7 KiB
Lua
161 lines
4.7 KiB
Lua
local surface = require("gears.surface")
|
|
local color = require("gears.color")
|
|
local lgi = require("lgi")
|
|
local cairo = lgi.cairo
|
|
local gdk = lgi.Gdk
|
|
|
|
describe("gears.surface", function ()
|
|
describe("crop_surface", function ()
|
|
local function test_square()
|
|
local surf = cairo.ImageSurface(cairo.Format.ARGB32, 50, 50)
|
|
local ctx = cairo.Context(surf)
|
|
-- creates complicated pattern, to make sure each pixel has a
|
|
-- different color value
|
|
ctx:rectangle(0,0,50,50)
|
|
local pattern = cairo.Pattern.create_linear(0, 0, 50, 50)
|
|
pattern:add_color_stop_rgba(0, color.parse_color("#00000000"))
|
|
pattern:add_color_stop_rgba(1, color.parse_color("#FF00FF55"))
|
|
ctx:set_source(pattern)
|
|
ctx:fill()
|
|
local ctx2 = cairo.Context(surf)
|
|
ctx2:rectangle(0,0,50,50)
|
|
local pattern2 = cairo.Pattern.create_linear(0, 50, 50, 0)
|
|
pattern2:add_color_stop_rgba(0, color.parse_color("#00FF0088"))
|
|
pattern2:add_color_stop_rgba(1, color.parse_color("#00000000"))
|
|
ctx2:set_source(pattern2)
|
|
ctx2:fill()
|
|
|
|
return surf
|
|
end
|
|
|
|
-- if cutoff + ratio are tested only right and bottom cutoff can be
|
|
-- used because the test should not rebuild the math logic of the actual
|
|
-- function
|
|
---@param args table
|
|
---@param target_heigth integer
|
|
---@param target_width integer
|
|
local function test(args, target_width, target_heigth)
|
|
args.surface = test_square()
|
|
local out = surface.crop_surface(args)
|
|
|
|
-- check size
|
|
local w, h = surface.get_size(out)
|
|
assert.is_equal(w, target_width)
|
|
assert.is_equal(h, target_heigth)
|
|
|
|
-- check if area in img and cropped img are the same
|
|
local calc_w_offset = math.ceil((50 - w - (args.right or 0))/2)
|
|
local calc_h_offset = math.ceil((50 - h - (args.bottom or 0))/2)
|
|
|
|
local pbuf1_in = gdk.pixbuf_get_from_surface(
|
|
args.surface,
|
|
args.left or calc_w_offset,
|
|
args.top or calc_h_offset,
|
|
w,
|
|
h
|
|
)
|
|
local pbuf1_out = gdk.pixbuf_get_from_surface(out, 0, 0, w, h)
|
|
assert.is_equal(pbuf1_in:get_pixels(), pbuf1_out:get_pixels())
|
|
end
|
|
|
|
it("keep size using offsets", function ()
|
|
test({
|
|
left = 0,
|
|
top = 0,
|
|
}, 50, 50)
|
|
end)
|
|
|
|
it("keep size using ratio", function ()
|
|
test({
|
|
ratio = 1,
|
|
left = 0,
|
|
top = 0,
|
|
}, 50, 50)
|
|
end)
|
|
|
|
it("crop to 50x25 with offsets", function ()
|
|
test({
|
|
top = 12,
|
|
bottom = 13,
|
|
left = 0,
|
|
}, 50, 25)
|
|
end)
|
|
|
|
it("crop to 25x50 with offsets", function ()
|
|
test({
|
|
left = 12,
|
|
right = 13,
|
|
top = 0,
|
|
}, 25, 50)
|
|
end)
|
|
|
|
it("crop all edges", function ()
|
|
test({
|
|
left = 7,
|
|
right = 13,
|
|
top = 9,
|
|
bottom = 16
|
|
}, 30, 25)
|
|
end)
|
|
|
|
it("use ratio to crop width", function ()
|
|
test({
|
|
ratio = 3/5,
|
|
}, 30, 50)
|
|
end)
|
|
|
|
it("use ratio to crop height", function ()
|
|
test({
|
|
ratio = 5/3,
|
|
}, 50, 30)
|
|
end)
|
|
|
|
it("use very large ratio", function ()
|
|
test({
|
|
ratio = 10000
|
|
}, 50, 1)
|
|
end)
|
|
|
|
it("use very small ratio", function ()
|
|
test({
|
|
ratio = 0.0001
|
|
}, 1, 50)
|
|
end)
|
|
|
|
it("use ratio and offset", function ()
|
|
test({
|
|
bottom = 20,
|
|
ratio = 1
|
|
}, 30, 30)
|
|
end)
|
|
|
|
it("use too large offset", function ()
|
|
assert.has.errors(function ()
|
|
test({
|
|
left = 55,
|
|
top = 0,
|
|
}, 0, 0)
|
|
end)
|
|
end)
|
|
|
|
it("use negative offset", function ()
|
|
assert.has.errors(function ()
|
|
test({
|
|
left = -1,
|
|
top = 0
|
|
}, 0, 0)
|
|
end)
|
|
end)
|
|
|
|
it("use negative ratio", function ()
|
|
assert.has.errors(function ()
|
|
test({
|
|
ratio = - 1,
|
|
}, 0, 0)
|
|
end)
|
|
end)
|
|
end)
|
|
end)
|
|
|
|
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80
|