Re: Replicating Microsoft's AlphaBlend function with Cairo

Chris Wilson <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <1345818880_8416@CP5-2952>
On Fri, 24 Aug 2012 10:11:08 -0400, Anthony Walter <[email protected]> wrote:
> How can I stretch draw an area of a gdk pixbuf to a cairo surface with a
> user defined opacity?
> 
> I am trying to write a cross platform interface for working with bitmaps
> and want to add alpha blending to my cairo stretch draw method. What I have
> right now works just fine, but I am unable to think up a way of to mold
> alpha blending into a series of cairo/gdk apis which work somewhat like
> Microsoft's [AlphaBlend][1] function.
> 
> What I have so far is this:
> 
>     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);

Replace the fill with: cairo_clip(C); cairo_paint_with_opacity(C, alpha);

>       cairo_destroy(C);
>     end;

I'd been contemplating explicit alpha support ala globalAlpha from the
canvas spec, but the above should solve your problem.

Have fun with Cairo,
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre
-- 
cairo mailing list
[email protected]
http://lists.cairographics.org/mailman/listinfo/cairo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.