2012-07-06 24 views
7

Estoy usando un gradiente radial en El Cairo, pero no estoy obteniendo los resultados esperados. El gradiente radial que obtengo es mucho menos difuso de lo que esperaba y no puedo jugar con las paradas de color para obtener los resultados deseados. Aquí está el código:Gradiente Radial de El 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); 

Aquí hay una imagen de lo que estoy hablando.

radial gradient

+0

¿Cómo creó la imagen 'lo que yo quiero'? –

+0

Entré en Pixelmator y utilicé un pincel con un set de dureza del 0%. – Q2Ftb3k

+0

El resultado de cairo está utilizando la interpolación linealmente. Cada píxel más alejado del centro obtiene 2 tonos de gris más claro. El resultado 'Lo que quiero' no es lineal. Si quieres que adivine, el resultado de Pixelmator es corregido con rayos gamma, lo que funciona alrededor de la visión humana. –

Respuesta

5

El canal IRC#cairo sugirió (Gracias Company!) Para utilizar cairo_mask() en lugar de cairo_paint() para dibujar el degradado. Eso resulta en una progresión cuadrada en lugar de lineal.

Hice lo siguiente en lua. Perdón por el lenguaje, pero es más fácil prototipar algo. Esto mapea 1: 1 a la API de C y no debe ser difícil de traducir:

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

Para mí, el segundo círculo (la que fue cairo_mask() 'd con una fuente de negro) se parece mucho más al igual que lo que quiere:

The image that the lua code produces

+0

¡Excelente! Esto funciona perfectamente, gracias! – Q2Ftb3k