2016-04-06 35 views
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); 

結果:

Isometric tiling with gdk_draw_pixbuf

しかし、カイロと同じを描くことは全く同じではないことが判明しました。これは私が働いていないされ、これまで持っているものです。

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); 

結果:カイロは、単に通常のラスタ画像が描画されるような画像を描画することを拒否

Isometric tiling with Cairo

。私は間違って何をしているのですか?これはどのように解決されますか?

+2

['cairo_paint()'は現在のパスではなくクリップ領域を塗りつぶします](https://developer.gnome.org/cairo/stable/cairo-cairo-t.html#cairo-paint); 'cairo_rectangle()'で作成したパスを 'cairo_clip()'でクリップ領域に変換する必要があります。 (クリップ領域は時間の経過と共に保存されるので、forループに 'cairo_save()'と 'cairo_restore()'も必要です) – andlabs

+1

'cairo_fill'が画像ソースをどのように扱うのか分かりません。それを試すことができます。私は単色でしか使用していません。 – oldtechaa

+0

いいえ、同じ結果です。問題は、ソースイメージ全体がパターンとして使用されていることです。たとえそのセクションだけを使用したいとしてもです。私はsrc_x、src_yを修正する必要があります。これはカイロでは起こっていません。src_x、src_yは単にソースイメージの開始点です。それに応じてソースイメージをx、yで調整します。 –

答えて

1

未テストですが、動作する可能性があります。そうでない場合には、折り返し報告し、私は再びみます:

static void _cairo_gdk_draw_pixbuf(cairo_t *cr, cairo_surface_t *source, 
     int src_x, int src_y, 
     int dest_x, int dest_y, 
     int width, int height) 
{ 
    cairo_save(cr); 

    /* Move (0, 0) to the destination position */ 
    cairo_translate(cr, dest_x, dest_y); 

    /* Set up the source surface in such a way that (src_x, src_y) maps to 
    * (0, 0) in user coordinates. */ 
    cairo_set_source_surface(cr, source, -src_x, -src_y); 

    /* Do the drawing */ 
    cairo_rectangle(cr, 0, 0, width, height); 
    cairo_fill(cr); 

    /* Undo all of our modifications to the drawing state */ 
    cairo_restore(cr); 
} 

上記の機能がgdk_draw_pixbufのように動作するはずです(まあ、それに似ています)。

関連する問題