开罗径向渐变

Q2F*_*b3k 7 radial-gradients cairo

我在开罗使用径向渐变,但我没有得到预期的结果.我得到的径向渐变比我预期的要模糊得多,我似乎无法摆弄颜色停止以获得理想的效果.这是代码:

cairo_pattern_t *pat;

pat = cairo_pattern_create_radial(100.0, 100.0, 0.0, 100.0, 100.0, 20.0);
cairo_pattern_add_color_stop_rgba(pat, 0, 0, 0, 0, 1);
cairo_pattern_add_color_stop_rgba(pat, 1, 0, 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)

这是我正在谈论的图像.

径向梯度

Uli*_*ter 5

#cairo IRC频道建议(感谢公司!)使用cairo_mask()而不是cairo_paint()来绘制渐变.这导致平方而不是线性进展.

我在lua做了以下.对不起该语言,但原型更​​容易.这将1:1映射到C API,不应该难以翻译:

cairo = require("lgi").cairo

s = cairo.ImageSurface(cairo.Format.ARGB32, 200, 100)
c = cairo.Context(s)
c:set_source_rgb(1, 1, 1)
c:paint()

p = cairo.Pattern.create_radial(50, 50, 0, 50, 50, 20)
p:add_color_stop_rgba(0, 0, 0, 0, 1)
p:add_color_stop_rgba(1, 0, 0, 0, 0)

c:save()
c:rectangle(0, 0, 100, 100)
c:clip()
c.source = p
c:paint()
c:restore()

p = cairo.Pattern.create_radial(50, 50, 2, 50, 50, 25)
p:add_color_stop_rgba(0, 0, 0, 0, 1)
p:add_color_stop_rgba(1, 0, 0, 0, 0)

c:translate(100, 0)
c:save()
c:rectangle(0, 0, 100, 100)
c:clip()
c.source = p
c:mask(p)
c:restore()

s:write_to_png("test.png")
Run Code Online (Sandbox Code Playgroud)

对我来说,第二个圆圈(那个带有黑色来源的cairo_mask()'看起来更像你想要的东西:

lua代码生成的图像