Ich arbeite an einer GtkDrawingArea, die in dem Expose-Ereignis einen Abschnitt eines Pixbuf in einer gekachelten Weise zeichnet. Der Kacheltyp variiert - abhängig vom Quellbild; es kann orthogonal, isometrisch oder hexagonal sein. Das Zeichnen mit gdk_draw_pixmap ist einfach genug; Hier ist ein Beispiel dafür, wie es für isometrische Fliesen aussieht:GTK + Ersetze gdk_draw_pixbuf durch Kairo
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);
Ergebnis:
jedoch zeichnet das gleiche mit Kairo erwiesen sich als recht nicht das gleiche sein. Das ist, was ich bisher habe, was nicht funktioniert:
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);
Ergebnis:
Kairo einfach weigert sich, das Bild zu zeichnen, wie ein normales Rasterbild gezeichnet werden würde. Was mache ich falsch, wie ist das gelöst?
['cairo_paint()' füllt die Clip-Region, nicht den aktuellen Pfad] (https://developer.gnome.org/cairo/stable/cairo-cairo-t.html#cairo-paint); Sie müssen den Pfad, den Sie mit 'cairo_rectangle()' erstellt haben, in einen Clipbereich mit 'cairo_clip()' konvertieren. (Denken Sie daran, dass die Clip-Region im Laufe der Zeit erhalten bleibt. Sie brauchen also 'cairo_save()' und 'cairo_restore()' in Ihrer for-Schleife.) – andlabs
Ich weiß nicht, wie 'cairo_fill' Bildquellen behandelt; Du könntest das versuchen. Ich habe es nur mit festen Farben verwendet. – oldtechaa
Nein, dasselbe Ergebnis. Das Problem ist, dass das gesamte Quellbild als Muster verwendet wird, auch wenn ich nur einen Teil davon verwenden möchte. Ich muss src_x, src_y reparieren, was nicht in Kairo passiert - src_x, src_y ist einfach der Startpunkt im Quellbild, dann passt es sich im Quellbild entsprechend um x, y an. –