(C+;GTK+;开罗)可以';不要让线性梯度工作
我有一个用随机函数产生的正弦波。结果点被放入一个数组中,其中索引为0到799(对应于我的x值),并且所述索引的值对应于y的位置 现在,我正在尝试创建一个梯度,从绿色开始,100%alpha,然后向下100像素,到绿色20%alpha。看起来波浪基本上是向下衰减的。我画了一个1px宽x 100px高梯度,从我的直线上每个点的y位置开始 这是我的绘图函数中的代码(C+;GTK+;开罗)可以';不要让线性梯度工作,c,linux,gtk,cairo,linear-gradients,C,Linux,Gtk,Cairo,Linear Gradients,我有一个用随机函数产生的正弦波。结果点被放入一个数组中,其中索引为0到799(对应于我的x值),并且所述索引的值对应于y的位置 现在,我正在尝试创建一个梯度,从绿色开始,100%alpha,然后向下100像素,到绿色20%alpha。看起来波浪基本上是向下衰减的。我画了一个1px宽x 100px高梯度,从我的直线上每个点的y位置开始 这是我的绘图函数中的代码 void *do_draw(void *ptr) { /*** Prepare SIGALRM ***/ siginfo_
void *do_draw(void *ptr)
{
/*** Prepare SIGALRM ***/
siginfo_t info;
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset, SIGALRM);
while(1)
{
while(sigwaitinfo(&sigset, &info) > 0)
{
currently_drawing = 1;
int width, height;
gdk_threads_enter();
gdk_drawable_get_size(pixmap, &width, &height);
gdk_threads_leave();
/*** Create surface to draw on ***/
cairo_surface_t *cst = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
cairo_t *cr = cairo_create(cst);
/*** Draw stuff ***/
static int i = 0;
++i; i = i % 800;
cairo_set_source_rgba (cr, .0, .0, .0, 1);
cairo_paint(cr);
int j = 0;
for (j = 0; j < 799; ++j)
{
double y = (double)(height + sine[j]) / 2;
cairo_pattern_t *pat1;
pat1 = cairo_pattern_create_linear(j, y, j, y + 100);
cairo_pattern_add_color_stop_rgba(pat1, 0.1, 0, 1, 0, 1);
cairo_pattern_add_color_stop_rgba(pat1, 0.9, 0, 1, 0, 0.2);
cairo_rectangle(cr, j, y, j, y + 100);
cairo_set_source(cr, pat1);
cairo_fill(cr);
cairo_pattern_destroy(pat1);
}
cairo_destroy(cr);
gdk_threads_enter();
cairo_t *cr_pixmap = gdk_cairo_create(pixmap);
cairo_set_source_surface(cr_pixmap, cst, 0, 0);
cairo_paint(cr_pixmap);
cairo_destroy(cr_pixmap);
gdk_threads_leave();
cairo_surface_destroy(cst);
currently_drawing = 0;
}
}
}
void*do\u draw(void*ptr)
{
/***准备SIGALRM***/
siginfo_t info;
sigset_t sigset;
sigpentyset(&sigset);
sigaddset(&sigset,SIGALRM);
而(1)
{
while(sigwaitinfo(&sigset,&info)>0)
{
当前_图纸=1;
int宽度、高度;
gdk_threads_enter();
gdk_可绘制尺寸(像素图、宽度和高度);
gdk_线程_离开();
/***创建要在其上绘制的曲面***/
cairo\u surface\u t*cst=cairo\u image\u surface\u create(cairo\u格式\u ARGB32,宽度,高度);
cairo_t*cr=cairo_create(cst);
/***画画***/
静态int i=0;
++i、 i=i%800;
cairo\u set\u source\u rgba(cr、.0、.0、1);
开罗漆(cr);
int j=0;
对于(j=0;j<799;++j)
{
双y=(双)(高度+正弦[j])/2;
开罗模式第1页;
pat1=开罗模式创建线性(j,y,j,y+100);
cairo_图案_添加_颜色_停止_rgba(pat1,0.1,0,1,0,1);
cairo_图案_添加_颜色_停止_rgba(pat1,0.9,0,1,0,0.2);
cairo_矩形(cr,j,y,j,y+100);
cairo_集_源(cr,pat1);
开罗填料(cr);
开罗模式破坏(第1部分);
}
开罗大学(cr);
gdk_threads_enter();
cairo_t*cr_pixmap=gdk_cairo_create(pixmap);
cairo\u set\u source\u surface(cr\u pixmap,cst,0,0);
cairo_油漆(cr_pixmap);
开罗毁灭(cr_pixmap);
gdk_线程_离开();
开罗表面破坏(cst);
当前_图形=0;
}
}
}
我现在得到的结果只是一条20%的阿尔法绿100px粗线,但它确实遵循我的坐标。我怎样才能让这个梯度起作用?我不理解渐变空间是如何工作的。我把它转换成了一些独立的代码,实际上可以编译和测试,然后注意到对cairo_rectangle()的调用是错误的。此函数的参数为:
- x
- y
- 宽度
- 高度
- j
- y
- j
- y+100
- j
- y
- 一,
- 一百
#include <cairo.h>
#include <math.h>
int main(void)
{
int width = 800, height = 800;
int sine[800];
int k;
for (k = 0; k < 800; k++) {
sine[k] = height * sin(k*M_PI/180);
}
/*** Create surface to draw on ***/
cairo_surface_t *cst = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
cairo_t *cr = cairo_create(cst);
/*** Draw stuff ***/
static int i = 0;
++i; i = i % 800;
cairo_set_source_rgba (cr, .0, .0, .0, 1);
cairo_paint(cr);
int j = 0;
for (j = 0; j < 799; ++j)
{
double y = (double)(height + sine[j]) / 2;
cairo_pattern_t *pat1;
pat1 = cairo_pattern_create_linear(j, y, j, y + 100);
cairo_pattern_add_color_stop_rgba(pat1, 0.1, 0, 1, 0, 1);
cairo_pattern_add_color_stop_rgba(pat1, 0.9, 0, 1, 0, 0.2);
cairo_rectangle(cr, j, y, 1, 100);
cairo_set_source(cr, pat1);
cairo_fill(cr);
cairo_pattern_destroy(pat1);
}
cairo_destroy(cr);
cairo_surface_write_to_png(cst, "t.png");
cairo_surface_destroy(cst);
return 0;
}
#包括
#包括
内部主(空)
{
内部宽度=800,高度=800;
int正弦[800];
int k;
对于(k=0;k<800;k++){
正弦[k]=高度*sin(k*M_PI/180);
}
/***创建要在其上绘制的曲面***/
cairo\u surface\u t*cst=cairo\u image\u surface\u create(cairo\u格式\u ARGB32,宽度,高度);
cairo_t*cr=cairo_create(cst);
/***画画***/
静态int i=0;
++i、 i=i%800;
cairo\u set\u source\u rgba(cr、.0、.0、1);
开罗漆(cr);
int j=0;
对于(j=0;j<799;++j)
{
双y=(双)(高度+正弦[j])/2;
开罗模式第1页;
pat1=开罗模式创建线性(j,y,j,y+100);
cairo_图案_添加_颜色_停止_rgba(pat1,0.1,0,1,0,1);
cairo_图案_添加_颜色_停止_rgba(pat1,0.9,0,1,0,0.2);
cairo_矩形(cr,j,y,1100);
cairo_集_源(cr,pat1);
开罗填料(cr);
开罗模式破坏(第1部分);
}
开罗大学(cr);
cairo_surface_write___png(cst,“t.png”);
开罗表面破坏(cst);
返回0;
}