Gdk::Pixmap Problem

lgorse

Mitglied
Hallo,

ich habe folgendes Problem: Ich würde gerne eine Grafikausgabe auf eine Gtk::DrawingArea mittels eines Gdk::Pixmap buffern, da sich das Bild relativ langsam aufbaut (Es werden ganz viele Quadrate mit einer For-Schleife gezeichnet). Ein Quadrat, welches ich außerhalb der for-Schleife zeichne wird ganz normal ausgegeben, die Quadrate in der for-Schleife werden erst ausgegeben, nachdem das Fenster maximiert wird. An den leeren Stellen wird ein zufälliger Bereich aus dem Grafikspeicher ausgegeben (manchmal das Programm selbst, meistens jedoch nur eine schwarze Fläche mit Weißen Linien und Punkten). Was mache ich da falsch?

Hier noch mein Code (etwas vereinfacht, drawingWidth und drawinHeight sind Größe und Breite des Ausgabefensters)
C++:
void drawToWindow(Gtk::DrawingArea* output) {
            // In diesen buffer wird die Grafikausgabe gebuffert
            Glib::RefPtr<Gdk::Pixmap> buffer = Gdk::Pixmap::create(output->get_window(), drawingWidth, drawingHeight);

            // Entsprechender Cairo-Kontext, mit dem auf den Buffer gezeichnet werden kann
            Cairo::RefPtr<Cairo::Context> cr_buffer = buffer->create_cairo_context();
            cr_buffer->save();

            cr_buffer->set_line_width(2.0);
            
            // Wird ganz normal gezeichnet
            cr_buffer->set_source_rgb(0, 1, 0);
            cr_buffer->rectangle(5, 5, 5, 5);
            cr_buffer->fill();

            // Der Inhalt von raster wird in buffer gezeichnet
            for(int i = 0; i < worldWidth; i++) {
                for(int j = 0; j < worldHeight; j++) {
                    if(raster[i][j] == 0) {
                        cr_buffer->set_source_rgb(0, 0, 0);
                    } else if (raster[i][j] == 1) {
                        cr_buffer->set_source_rgb(0, 1, 0);
                    } else {
                        cr_buffer->set_source_rgb(0, 0, 1);
                    }

                    // Die Zeile funktioniert nicht
                    cr_buffer->rectangle(i * (sizeSquares) + marginLeft + 2, j * (sizeSquares) + marginTop + 2, sizeSquares - 4, sizeSquares - 4);
                    cr_buffer->fill();

                    // Die Zeile funktioniert
                    cr_buffer->rectangle(i * 5, j * 5, 2, 2);
                    
                    cr_buffer->fill();
                }
            }

            output->get_window()->draw_drawable(Gdk::GC::create(buffer), buffer, 0, 0, 0, 0, -1, -1);

            cr_buffer->restore();
        }

//edit: Wenn ich das Fenster maximiere, wird das Rechteck gezeichnet, aber drumherum ist noch der gleiche Grafiksalat.

//edit: Hat sich erledigt. sizeSquares war 4 ;)

Lg,
lgorse
 
Zuletzt bearbeitet:
Zurück