gears.color: Add a way to bypass the pattern cache
Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
parent
ae63b5a758
commit
5c387f3bd1
|
@ -170,6 +170,36 @@ color.types = {
|
||||||
radial = color.create_radial_pattern
|
radial = color.create_radial_pattern
|
||||||
}
|
}
|
||||||
|
|
||||||
|
--- Create a pattern from a given string.
|
||||||
|
-- For full documentation of this function, please refer to create_pattern().
|
||||||
|
-- This difference between create_pattern() and this function is that this
|
||||||
|
-- function does not insert the generated objects into the pattern cache. Thus,
|
||||||
|
-- you are allowed to modify the returned object.
|
||||||
|
-- @see create_pattern
|
||||||
|
-- @param col The string describing the pattern.
|
||||||
|
-- @return a cairo pattern object
|
||||||
|
function color.create_pattern_uncached(col)
|
||||||
|
-- If it already is a cairo pattern, just leave it as that
|
||||||
|
if cairo.Pattern:is_type_of(col) then
|
||||||
|
return col
|
||||||
|
end
|
||||||
|
local col = col or "#000000"
|
||||||
|
if type(col) == "string" then
|
||||||
|
local t = string.match(col, "[^:]+")
|
||||||
|
if color.types[t] then
|
||||||
|
local pos = string.len(t)
|
||||||
|
local arg = string.sub(col, pos + 2)
|
||||||
|
return color.types[t](arg)
|
||||||
|
end
|
||||||
|
elseif type(col) == "table" then
|
||||||
|
local t = col.type
|
||||||
|
if color.types[t] then
|
||||||
|
return color.types[t](col)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return color.create_solid_pattern(col)
|
||||||
|
end
|
||||||
|
|
||||||
--- Create a pattern from a given string.
|
--- Create a pattern from a given string.
|
||||||
-- This function can create solid, linear, radial and png patterns. In general,
|
-- This function can create solid, linear, radial and png patterns. In general,
|
||||||
-- patterns are specified as strings formatted as"type:arguments". "arguments"
|
-- patterns are specified as strings formatted as"type:arguments". "arguments"
|
||||||
|
@ -180,8 +210,13 @@ color.types = {
|
||||||
-- { type = "radial", from = { 50, 50, 10 }, to = { 55, 55, 30 },
|
-- { type = "radial", from = { 50, 50, 10 }, to = { 55, 55, 30 },
|
||||||
-- stops = { { 0, "#ff0000" }, { 0.5, "#00ff00" }, { 1, "#0000ff" } } }
|
-- stops = { { 0, "#ff0000" }, { 0.5, "#00ff00" }, { 1, "#0000ff" } } }
|
||||||
-- Any argument that cannot be understood is passed to create_solid_pattern().
|
-- Any argument that cannot be understood is passed to create_solid_pattern().
|
||||||
-- @see create_solid_pattern, create_png_pattern, create_linear_pattern,
|
--
|
||||||
-- create_radial_pattern
|
-- Please note that you MUST NOT modify the returned pattern, for example by
|
||||||
|
-- calling :set_matrix() on it, because this function uses a cache and your
|
||||||
|
-- changes could thus have unintended side effects. Use create_pattern_uncached
|
||||||
|
-- if you need to modify the returned pattern.
|
||||||
|
-- @see create_pattern_uncached, create_solid_pattern, create_png_pattern,
|
||||||
|
-- create_linear_pattern, create_radial_pattern
|
||||||
-- @param col The string describing the pattern.
|
-- @param col The string describing the pattern.
|
||||||
-- @return a cairo pattern object
|
-- @return a cairo pattern object
|
||||||
function color.create_pattern(col)
|
function color.create_pattern(col)
|
||||||
|
@ -191,26 +226,10 @@ function color.create_pattern(col)
|
||||||
end
|
end
|
||||||
local col = col or "#000000"
|
local col = col or "#000000"
|
||||||
local result = pattern_cache[col]
|
local result = pattern_cache[col]
|
||||||
if result then
|
|
||||||
return result
|
|
||||||
end
|
|
||||||
if type(col) == "string" then
|
|
||||||
local t = string.match(col, "[^:]+")
|
|
||||||
if color.types[t] then
|
|
||||||
local pos = string.len(t)
|
|
||||||
local arg = string.sub(col, pos + 2)
|
|
||||||
result = color.types[t](arg)
|
|
||||||
end
|
|
||||||
elseif type(col) == "table" then
|
|
||||||
local t = col.type
|
|
||||||
if color.types[t] then
|
|
||||||
result = color.types[t](col)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if not result then
|
if not result then
|
||||||
result = color.create_solid_pattern(col)
|
result = color.create_pattern_uncached(col)
|
||||||
|
pattern_cache[col] = result
|
||||||
end
|
end
|
||||||
pattern_cache[col] = result
|
|
||||||
return result
|
return result
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -151,17 +151,14 @@ describe("gears.color", function()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it("with NONE repeat", function()
|
it("with NONE repeat", function()
|
||||||
-- XXX: Can't use color() here because else the returned object
|
local pattern = color.create_pattern_uncached("linear:0,0:0,10:0,#00ff00ff:1,#ff00ffff")
|
||||||
-- ends up in the pattern cache. What should we do about that?
|
|
||||||
local pattern = color.create_linear_pattern("0,0:0,10:0,#00ff00ff:1,#ff00ffff")
|
|
||||||
pattern:set_extend("NONE")
|
pattern:set_extend("NONE")
|
||||||
assert.is_not.opaque(pattern)
|
assert.is_not.opaque(pattern)
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it("opaque linear pattern", function()
|
it("opaque linear pattern", function()
|
||||||
local pattern = color("linear:0,0:0,10:0,#00ff00ff:1,#ff00ffff")
|
assert.is.opaque("linear:0,0:0,10:0,#00ff00ff:1,#ff00ffff")
|
||||||
assert.is.opaque(pattern)
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it("opaque surface pattern", function()
|
it("opaque surface pattern", function()
|
||||||
|
@ -196,6 +193,18 @@ describe("gears.color", function()
|
||||||
pending("unsupported pattern type")
|
pending("unsupported pattern type")
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
describe("pattern cache", function()
|
||||||
|
it("caching works", function()
|
||||||
|
assert.is.equal(color("#00ff00"), color("#00ff00"))
|
||||||
|
end)
|
||||||
|
|
||||||
|
it("create_pattern_uncached does not cache", function()
|
||||||
|
-- Since tests run in order, the above test already inserted
|
||||||
|
-- "#00ff00" into the cache
|
||||||
|
assert.is_not.equal(color.create_pattern_uncached("#00ff00"), color.create_pattern_uncached("#00ff00"))
|
||||||
|
end)
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80
|
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80
|
||||||
|
|
Loading…
Reference in New Issue