ich programmiere hobbymäßig. Um meinen Anwendungen künftig eine grafische Oberfläche hinzufügen zu können, arbeite ich mich derzeit durch diverse gtk und cairo Tutorials. Bei folgendem Beispiel habe ich einen Effekt, den ich mir nicht erklären kann :
Code: Alles auswählen
#include <cairo.h>
#include <gtk/gtk.h>
static void do_drawing(cairo_t *, GtkWidget *widget);
static gboolean on_draw_event(GtkWidget *widget, cairo_t *cr, gpointer user_data)
{
do_drawing(cr, widget);
return FALSE;
}
static void do_drawing(cairo_t *cr, GtkWidget *widget)
{
/* Teil 1 aus http://zetcode.com/gfx/cairo/cairotext/ Codebeispiel : glyphs */
cairo_select_font_face(cr, "sans-serif",
CAIRO_FONT_SLANT_NORMAL,
CAIRO_FONT_WEIGHT_NORMAL);
cairo_set_font_size(cr, 13);
const int n_glyphs = 20 * 35;
cairo_glyph_t glyphs[n_glyphs];
gint i = 0;
gint x, y;
for (y=0; y<20; y++) {
for (x=0; x<35; x++) {
glyphs[i] = (cairo_glyph_t) {i, x*15 + 20, y*18 + 20};
i++;
}
}
cairo_show_glyphs(cr, glyphs, n_glyphs);
/* Wiederholung Teil 1 im Bereich ab y = 410 */
/*
i = 0;
for (y=0; y<20; y++) {
for (x=0; x<35; x++) {
glyphs[i] = (cairo_glyph_t) {i, x*15 + 20, y*18 + 410};
i++;
}
}
cairo_show_glyphs(cr, glyphs, n_glyphs);
*/
/* Teil 2 von mir hinzugefügt. Schriftbild der Ausgabe aus diesem und dem zuvor
abgearbeiteten Codeabschnitt ist verfälscht. Ursache ? Abhilfe ? */
i = 0, x = 10, y = 385;
gint text[50] = {48, 68, 81, 70, 75, 72, 1, 61, 72, 76, 70, 75, 72, 81, 1, 72,
85, 86, 70, 75, 72, 76, 81, 72, 81, 1, 90, 76, 72, 1, 37, 50, 47, 39,
1, 15, 1, 86, 76, 72, 75, 72, 1, 61, 72, 76, 79, 72, 1, 20};
for (i = 0; i < 50; i++)
{
glyphs[i] = (cairo_glyph_t) {text[i], x*i + 30, y};
cairo_show_glyphs(cr, glyphs, 50); //n_glyphs);
}
}
int main(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *darea;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
darea = gtk_drawing_area_new();
gtk_container_add(GTK_CONTAINER(window), darea);
g_signal_connect(G_OBJECT(darea), "draw", G_CALLBACK(on_draw_event), NULL);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 560, 760);
gtk_window_set_title(GTK_WINDOW(window), "GTK window");
gtk_widget_show_all(window);
gtk_main();
return 0;
}
Auch bei wiederholter Ausgabe von Teil 1 wird alles korrekt angezeigt.
Nachdem ich einige eigene Codezeilen hinzufügte (Teil 2) wird die Ausgabe meiner Codezeilen sowie die gleiche Anzahl glyphs der Ausgabe von Teil 1 in verfälschter Form dargestellt. Das sieht wie unsauberes bold aus.
Der Effekt zeigt sich immer in der Ausgabe von Teil 2 und der Ausgabe des zuvor abgearbeiteten Codeabschnittes. Lasse ich Teil 1 vor Teil 2 wiederholen, ist diese Wiederholung von Teil 1 betroffen. Setze ich die Wiederholung von Teil 1 hinter Teil 2, ist die erste Ausgabe von Teil 1 betroffen.
Was ist die Ursache für diesen Effekt und wie kann man dem abhelfen ?
Was mache ich falsch ? Gedankenfehler ?
Gruß
jolico