当前位置: 首页 > 知识库问答 >
问题:

GTK 用开罗取代gdk_draw_pixbuf

卢志业
2023-03-14

我正在处理一个GtkDrawingArea,它在expose事件中以平铺方式绘制了pixbuf的一部分。平铺类型因源图像而异;它可以是正交的、等距的或六边形的。用gdk_draw_pixmap画这个就够简单了;下面是一个等轴测镶嵌的示例:

for(y=0,row=0; y+tile_height<height; y+=tile_half_height,++row)
  for(x=((row&1)? tile_half_width : 0); x+tile_width<width; x+=tile_width)
    gdk_draw_pixbuf(widget->window,NULL,
                    pixbuf,src_x,src_y,
                    x,y,tile_width,tile_height,
                    GDK_RGB_DITHER_NONE,0,0);

结果:

然而,画同样的开罗被证明是完全不一样的。这是我目前掌握的信息,但不起作用:

cairo_t *cr = gdk_cairo_create(widget->window);
gdk_cairo_set_source_pixbuf(cr,pixbuf,src_x,src_y);
for(y=0,row=0; y+tile_height<height; y+=tile_half_height,++row)
  for(x=((row&1)? tile_half_width : 0); x+tile_width<width; x+=tile_width) {
    cairo_rectangle(cr,x,y,tile_width,tile_height);
    cairo_paint(cr);
  }
}
cairo_destroy(cr);

结果:

开罗只是拒绝像绘制普通光栅图像那样绘制图像。我做错了什么,这怎么解决?

共有1个答案

贺华容
2023-03-14

未经测试,但可能有效。如果没有,请报告回来,我会再试一次:

static void _cairo_gdk_draw_pixbuf(cairo_t *cr, cairo_surface_t *source,
        int src_x, int src_y,
        int dest_x, int dest_y,
        int width, int height)
{
    cairo_save(cr);

    /* Move (0, 0) to the destination position */
    cairo_translate(cr, dest_x, dest_y);

    /* Set up the source surface in such a way that (src_x, src_y) maps to
     * (0, 0) in user coordinates. */
    cairo_set_source_surface(cr, source, -src_x, -src_y);

    /* Do the drawing */
    cairo_rectangle(cr, 0, 0, width, height);
    cairo_fill(cr);

    /* Undo all of our modifications to the drawing state */
    cairo_restore(cr);
}

上述函数的工作方式应该类似于gdk_draw_pixbuf(嗯,与之类似)。

 类似资料:
  • 我是开罗和GTK的新手,我正在制作的程序需要绘制500x500或1000x1000的圆形平铺。此外,在绘图之前还有一些工作要做,但现在我专注于绘图部分,这将涉及鼠标交互来改变任何圆形的颜色。 因此,平铺是相同的,并且随着时间的推移,圆圈必须改变其颜色(全部)。我必须检查每个圆圈并执行操作,并且在检查所有圆圈后,我必须显示更改。此过程必须执行任意次数。 现在我有一个滚动窗口的平铺,但是仅仅用这个滚动

  • 在GDK/GTK中检索开罗上下文的机制已损坏和/或在文档中未正确描述。我正在尝试从按钮按回调中绘制Gtk绘制区域,但没有成功。文档建议做 然后用开罗的语境画画,然后在 所有这些似乎都适用于GTK 3.22.30(和cairo 1.15.12),但不适用于GTK3.24.30(和cair 1.16.0)。显然有些事情已经改变了。知道吗?下面是一个完整的例子:

  • 这一章包含一些让你开始学习GTK+编程的指导信息,假设你已经安装了GTK+,依赖库和C编译器。如果你想构建GTK+本身,可以参考编译GTK+的部分。

  • 我想只显示绘图区域内的开罗绘图,但由于某种原因,绘图周围总是有一个彩色矩形形状的背景。我如何摆脱这种情况?我特别不想将其设置为仅透明(因为我可能不支持透明),而只显示绘图本身。 我的例子是在 Rust 中使用 gtk-rs,但其他语言中的任何提示也很棒! 我希望这只显示圆,并查看并保持浏览器在圆周围可单击。我如何才能做到这一点?

  • GTK

    GTK(GIMP Toolkit)是一套跨多种平台的图形工具包,按LGPL许可协议发布的。虽然最初是为GIMP写的,但目前已发展为一个功能强大、设计灵活的一个通用图形库。特别是被GNOME选中使得GTK+广为流传,成为Linux下开发图形界面的应用程序的主流开发工具之一,当然GTK+并不要求必须在Linux上,事实上,目前GTK+已经有了成功的windows版本。 GTK虽然是用C语言写的,但是您

  • Gtk#是个.NET的函数库,用来系结GTK+ GUI 函数库。它让你可以使用Mono或其他相容CLR的语言来开发GNOME应用程式。  Gtk#像其他现在的视窗函式库一样,采用事件驱动,让开发者可以在视窗元件的事件被触发时,处理要做的事情。 以Gtk#建立的应用程式可以执行在许多平台上,如Linux、Microsoft Windows与Mac OS X等。 Mono的Windows版本里面就直接