#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")
Для меня второй круг (тот, который был cairo_mask() 'd с черным источником) выглядит намного больше как то, что вы хотите:
Как вы создаете «То, что я хочу» образ? –
Я пошел в Pixelmator и использовал кисть, которая с 0% жесткостью установлена. – Q2Ftb3k
Результат cairo использует интерполирование линейно. Каждый пиксель, расположенный дальше от центра, получает 2 оттенка серой зажигалки. «Я хочу» - результат не линейный. Если вы хотите, чтобы я догадался, результат Pixelmator гамма-коррекция, которая работает вокруг человеческого зрения. –