不使用设置颜色的开罗渐变图案

Cairo gradient pattern not using set colors

我一直在尝试使用下面的代码来设置渐变,但它显示的是从黑到白的渐变(显然这不是颜色)。

cairo_t *cr;
cr = gdk_cairo_create(widget->window);
cairo_pattern_t *pat1;  
pat1 = cairo_pattern_create_linear(0.0, 0.0,  50.0, 512);
cairo_pattern_add_color_stop_rgb(pat1, 0, 0, 0, 0);
cairo_pattern_add_color_stop_rgb(pat1, 1, 1, 254, 255);
cairo_pattern_add_color_stop_rgb(pat1, 2, 2, 253, 255);
cairo_pattern_add_color_stop_rgb(pat1, 3, 3, 252, 255);
cairo_pattern_add_color_stop_rgb(pat1, 4, 4, 251, 255);
cairo_pattern_add_color_stop_rgb(pat1, 5, 5, 250, 255);
cairo_pattern_add_color_stop_rgb(pat1, 6, 6, 249, 255);
cairo_pattern_add_color_stop_rgb(pat1, 7, 6, 249, 255);
cairo_pattern_add_color_stop_rgb(pat1, 8, 7, 248, 255);
cairo_pattern_add_color_stop_rgb(pat1, 9, 8, 247, 255);
cairo_rectangle(cr, 0, 0, 50, 512);
cairo_set_source(cr, pat1);
cairo_fill(cr);  
cairo_pattern_destroy(pat1);
cairo_destroy(cr);

但是,此代码显示了从红色到紫色再到蓝色的渐变:

cairo_t *cr;
cr = gdk_cairo_create(widget->window);
cairo_pattern_t *pat1;  
pat1 = cairo_pattern_create_linear(0.0, 0.0,  50.0, 512);
cairo_pattern_add_color_stop_rgb(pat1, 0, 256, 0, 0);
cairo_pattern_add_color_stop_rgb(pat1, 1, 0, 0, 256);
cairo_pattern_add_color_stop_rgb(pat1, 2, 0, 256, 256);
cairo_rectangle(cr, 0, 0, 50, 512);
cairo_set_source(cr, pat1);
cairo_fill(cr);  
cairo_pattern_destroy(pat1);
cairo_destroy(cr);

为什么第一个显示灰度,而第二个不显示? 顶部有非灰度颜色,所以我不知道为什么它不起作用。

编辑:一个答案解释说大于 1 的值被限制了,所以我将我的代码更改为:

cairo_pattern_add_color_stop_rgb(pat1, 0, 0, 0, 0);
cairo_pattern_add_color_stop_rgb(pat1, 1, (1/256), (254/256), (255/256));
cairo_pattern_add_color_stop_rgb(pat1, 2, (2/256), (253/256), (255/256));
cairo_pattern_add_color_stop_rgb(pat1, 3, (3/256), (252/256), (255/256));
cairo_pattern_add_color_stop_rgb(pat1, 4, (4/256), (251/256), (255/256));
cairo_pattern_add_color_stop_rgb(pat1, 5, (5/256), (250/256), (255/256));
cairo_pattern_add_color_stop_rgb(pat1, 6, (6/256), (249/256), (255/256));
cairo_pattern_add_color_stop_rgb(pat1, 7, (6/256), (249/256), (255/256));
cairo_pattern_add_color_stop_rgb(pat1, 8, (7/256), (248/256), (255/256));
cairo_pattern_add_color_stop_rgb(pat1, 9, (8/256), (247/256), (255/256));

条形现在完全变黑了。

https://www.cairographics.org/manual/cairo-cairo-t.html#cairo-set-source-rgb

The color and alpha components are floating point numbers in the range 0 to 1. If the values passed in are outside that range, they will be clamped.

有效的 256 被固定为 1。所以你得到 (1,0,0) 到 (0,0,1) 到 (0,1,1)。

在不起作用的那个中,第一个仍然是 (0,0,0),每个其他停止都固定在 (1,1,1)。简而言之,黑色到白色是第一个中使用的颜色。所以 cairo 显示黑色到白色。