Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(C+;GTK+;开罗)可以';不要让线性梯度工作_C_Linux_Gtk_Cairo_Linear Gradients - Fatal编程技术网

(C+;GTK+;开罗)可以';不要让线性梯度工作

(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_

我有一个用随机函数产生的正弦波。结果点被放入一个数组中,其中索引为0到799(对应于我的x值),并且所述索引的值对应于y的位置

现在,我正在尝试创建一个梯度,从绿色开始,100%alpha,然后向下100像素,到绿色20%alpha。看起来波浪基本上是向下衰减的。我画了一个1px宽x 100px高梯度,从我的直线上每个点的y位置开始

这是我的绘图函数中的代码

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