cairo - 如何以任意不透明度拉伸(stretch)绘制 cairo gdk pixbuf 图案区域?

标签 cairo freepascal lazarus gdk

如何使用用户定义的不透明度将 gdk pixbuf 的区域拉伸(stretch)到 cairo 表面?

我正在尝试编写一个用于处理位图的跨平台界面,并希望将 alpha 混合添加到我的 cairo 拉伸(stretch)绘制方法中。我现在所拥有的工作得很好,但我无法想出一种将 alpha 混合模制到一系列 cairo/gdk api 中的方法,这些 api 的工作方式有点像 Microsoft 的 AlphaBlend功能。

到目前为止我所拥有的是:

procedure TGtkBitmap.Draw(const Source: TRect; Canvas: TCanvas;
  const Dest: TRect; Alpha: Byte = $FF);
var
  D: PGdkDrawable;
  C: Pcairo_t;
  M: cairo_matrix_t;
begin
  if FBuffer = nil then
    Exit;
  if (WidthOf(Source) < 1) or (WidthOf(Dest) < 1) then
    Exit;
  if (HeightOf(Source) < 1) or (HeightOf(Dest) < 1) then
    Exit;
  D := TGtk2DeviceContext(Canvas.Handle).Drawable;
  C := gdk_cairo_create(D);
  gdk_cairo_set_source_pixbuf(C, FBuffer, 0, 0);
  cairo_matrix_init_identity(@M);
  cairo_matrix_translate(@M, Source.Left, Source.Top);
  cairo_matrix_scale(@M, WidthOf(Source) / WidthOf(Dest),
    HeightOf(Source) / HeightOf(Dest));
  cairo_matrix_translate(@M, -Dest.Left, -Dest.Top);
  cairo_pattern_set_matrix(cairo_get_source(C), @M);
  cairo_rectangle(C, Dest.Left, Dest.Top, WidthOf(Dest), HeightOf(Dest));
  // what cairo functions can I combine here to vary
  // the opacity of the pattern fill using Alpha argument?
  cairo_fill(C);
  cairo_destroy(C);
end;

一切正常,但我不确定如何使 alpha 混合与像素 buff 模式一起工作。我可以想象一种方法,其中涉及创建第二个开罗表面,使用用户定义的不透明度将整个 pixbuf 绘制到其上,然后使用新表面为第一个表面创建图案,这一切都会变得有点困惑,并且可能比其他表面慢得多我会很高兴。

这是一个video recording到目前为止我所做的工作。我想从熟悉 cairo 的人那里知道,我可以在上面的例程中插入什么来设置 pixbuf 源模式的 alpha 级别?

最佳答案

来自开罗邮件列表的 Chris Wilson 提供了这个完美运行的解决方案。

替换:

cairo_fill(C);

与:

cairo_clip(C);
cairo_paint_with_alpha(C, Alpha / $FF);

感谢开罗邮件列表中的 Chris Wilson!

关于cairo - 如何以任意不透明度拉伸(stretch)绘制 cairo gdk pixbuf 图案区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12104147/

相关文章:

x11 - 有没有办法完全禁用pixman

c - 使用 Cairo 图形绘制多个矩形

c++ - 如果我想关闭之前打开的窗口,则 X11-Window-ID 无效。 (C/C++)

android - 基于 MIPS 的 Android 免费 Pascal

coding-style - Lazarus 编码风格指南

c++ - C/C++ 中的 svg 示例

Delphi TFrame 创建/销毁

Delphi:当PChar指向的字符串变量改变后,临时PChar是否保证具有相同的值?

ssh - 系统命令执行但立即后台

delphi - 类的属性和方法参数的重复标识符