1

ユーザー定義の不透明度を使用して、gdk pixbuf の領域を cairo サーフェスに引き伸ばすにはどうすればよいですか?

ビットマップを操作するためのクロス プラットフォーム インターフェイスを作成しようとしており、カイロ ストレッチ描画メソッドにアルファ ブレンディングを追加したいと考えています。私が今持っているものは問題なく動作しますが、Microsoft のAlphaBlend関数のように機能する一連の cairo/gdk API にアルファ ブレンディングを形成する方法を考え出すことができません。

私がこれまでに持っているのはこれです:

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;

すべて正常に動作しますが、ピックス バフ パターンでアルファ ブレンディングを行う方法がわかりません。2 番目の cairo サーフェスを作成し、pixbuf 全体をユーザー定義の不透明度でそこに描画し、新しいサーフェスを使用して最初のサーフェスのパターンを作成するという 1 つの方法を想像できます。私は喜んでいます。

ここでは、私がこれまでに取り組んだことのビデオ記録を示します。カイロに精通している人から知りたいのですが、上記のルーチンに何を挿入して、pixbuf ソース パターンのアルファ レベルを設定できますか?

4

1 に答える 1

1

cairoメーリングリストのChrisWilsonは、完全に機能するこのソリューションを提供しました。

交換してください:

cairo_fill(C);

と:

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

cairoメーリングリストのChrisWilsonに感謝します!

于 2012-08-24T21:49:26.347 に答える