1
私はGtkDrawingAreaで作業しています。このイベントは、公開イベントでpixbufのセクションをタイル状に描画しています。タイルタイプは、ソースイメージによって異なります。それは直交、等尺性または六角形であり得る。 gdk_draw_pixmapでこれを描画するのは簡単です。ここでは、アイソメトリックタイリングのためにどのように見えるかの例です:GTK + gdk_draw_pixbufをカイロに置き換えてください。
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);
結果:カイロは、単に通常のラスタ画像が描画されるような画像を描画することを拒否
。私は間違って何をしているのですか?これはどのように解決されますか?
['cairo_paint()'は現在のパスではなくクリップ領域を塗りつぶします](https://developer.gnome.org/cairo/stable/cairo-cairo-t.html#cairo-paint); 'cairo_rectangle()'で作成したパスを 'cairo_clip()'でクリップ領域に変換する必要があります。 (クリップ領域は時間の経過と共に保存されるので、forループに 'cairo_save()'と 'cairo_restore()'も必要です) – andlabs
'cairo_fill'が画像ソースをどのように扱うのか分かりません。それを試すことができます。私は単色でしか使用していません。 – oldtechaa
いいえ、同じ結果です。問題は、ソースイメージ全体がパターンとして使用されていることです。たとえそのセクションだけを使用したいとしてもです。私はsrc_x、src_yを修正する必要があります。これはカイロでは起こっていません。src_x、src_yは単にソースイメージの開始点です。それに応じてソースイメージをx、yで調整します。 –