【发布时间】:2012-08-25 08:20:38
【问题描述】:
如何使用用户定义的不透明度将 gdk pixbuf 的区域拉伸到 cairo 表面?
我正在尝试编写一个用于处理位图的跨平台界面,并希望将 alpha 混合添加到我的 cairo 拉伸绘制方法中。我现在所拥有的工作正常,但我无法想出将 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 模式正常工作。我可以想象一种方法,它涉及创建第二个 cairo 表面,使用用户定义的不透明度将整个 pixbuf 绘制到它,然后使用新表面为第一个表面创建图案,这一切都变得有点混乱,可能比某些东西慢得多我会很高兴的。
这是我目前工作的video recording。我想从熟悉 cairo 的人那里知道,我可以在上面的例程中插入什么来设置 pixbuf 源模式的 alpha 级别?
【问题讨论】:
-
这被标记为delphi。那是对的吗?不应该是free-pascal吗?
-
@sysrpl,我对您的问答进行了一些重大更改。无论如何,不要忘记接受你的回答;-)
-
David Heffernan:Cairo 是一个类似于 Canvas 的第 3 方库,具有程序界面,可在 Windows 上使用。我不明白为什么你不能在 Delphi 中使用它。
标签: cairo freepascal lazarus gdk