8

カイロで放射状グラデーションを使用していますが、期待した結果が得られません。私が取得している放射状のグラデーションは、予想よりもはるかに曖昧ではなく、目的の結果を得るためにカラー ストップをいじることができないようです。コードは次のとおりです。

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);

これが私が話していることのイメージです。

放射状グラデーション

4

1 に答える 1

6

#cairo IRC チャンネルは、勾配を描画するために cairo_paint() の代わりに cairo_mask() を使用することを (会社に感謝します!) 提案しました。その結果、線形進行ではなく二乗進行になります。

luaで次のことを行いました。言語については申し訳ありませんが、プロトタイプを作成する方が簡単です。これは C API に 1:1 で対応しているため、翻訳は難しくありません。

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")

私には、2 番目の円 (黒のソースで cairo_mask() された円) は、あなたが望むものにずっと似ています。

lua コードが生成するイメージ

于 2012-07-07T07:23:10.450 に答える