Cairo Programmierung GTK+

#2090283
Lesenswert?

Hallo,

ich habe folgendes Programm aus dem Internet geladen, und es dann an 
meine Bedürfnisse angepasst. Doch ich bekomme keine schwarze 
Vordergrundfarbe für die Linien hin. Ich poste mal hier das Programm. 
Ich entwickle unter NetBSD 5.1. Doch dies dürfte nicht das Problem sein.
1
    #include <cairo.h>
2
    #include <gtk/gtk.h>
3

4

5
    static gboolean
6
    on_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data)
7
    {
8
       cairo_t *cr;
9

10
       cr = gdk_cairo_create(widget->window);
11

12
       cairo_set_source_rgb(cr,1,1,1);
13
       cairo_paint(cr);
14
       cairo_set_source_rgb(cr, 0, 0, 0);
15
       cairo_set_line_width (cr, 0.3);
16
       
17
       int i;
18
       for ( i = 1; i <= 16 ; i++) {
19
          cairo_move_to(cr, 10, 35 * i );
20
          cairo_line_to(cr, 10, 35 * i - 20 );
21
          cairo_move_to(cr, 10, 35 * i );
22
          cairo_line_to(cr, 790, 35 * i );
23
          cairo_stroke(cr);
24
       }
25

26
       cairo_destroy(cr);
27

28
       return FALSE;
29
    }
30

31
    int main (int argc, char *argv[])
32
    {
33

34
      GtkWidget *window;
35

36
      gtk_init(&argc, &argv);
37
     
38
      window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
39

40
      gtk_widget_add_events (window, GDK_BUTTON_PRESS_MASK);
41

42
      g_signal_connect(window, "expose-event",
43
          G_CALLBACK(on_expose_event), NULL);
44
      g_signal_connect(window, "destroy",
45
          G_CALLBACK(gtk_main_quit), NULL);
46

47
    //  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
48
      gtk_window_set_title(GTK_WINDOW(window), "LA_II");
49
      gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
50
      gtk_widget_set_app_paintable(window, TRUE);
51

52
      gtk_widget_show_all(window);
53

54
      gtk_main();
55

56
      return 0;
57
    }
Hat jemand dazu eine Verbesserung? Die Linien sind in meiner Ausgabe am 
Bildschirm sehr blass, fast nicht sichtbar.

HUE \a
#2090313
Lesenswert?

Hue \a schrieb:
> Hat jemand dazu eine Verbesserung? Die Linien sind in meiner Ausgabe am
> Bildschirm sehr blass, fast nicht sichtbar.

Da Du keine Koordinatentransformation machst, malst Du hier 0.3 Pixel 
breite Linien (die natürlich durch ein entsprechend helleres Grau 
simuliert werden).

Als Problem kommt noch hinzu, dass Du auf den ganzzahligen Koordinaten 
malst, welche in Cairo mit den Grenzen zwischen den Pixeln 
zusammenfallen.

D.h. insbesonders, dass sich deine Linien gleichmäßig auf zwei Pixel 
verteilen, die eben entsprechend noch weniger von den Pixeln 
überdecken und entsprechend heller dargestellt werden.

Ich habe testweise mal ein
1
   cairo_translate (cr, 0.5, 0.5);

vor die Schleife im Expose-Event-Handler eingebaut. Damit liegen die 
ganzzahligen Koordinaten jetzt in der Pixelmitte und die Linien liegen 
exakt in der Pixelmitte, werden also dunkler und schmaler gerendert.

Viele Grüße,
        Simon
#2090329
Lesenswert?

Ach, nochwas.

Wenn Du den Schleifenrumpf umbaust zu:
1
          cairo_move_to(cr, 10, 35 * i - 20 );
2
          cairo_line_to(cr, 10, 35 * i );
3
          cairo_line_to(cr, 790, 35 * i );
4
          cairo_stroke(cr);

Dann hast Du auch eine ordentlich gerenderte Verbindung zwischen den 
zwei Linien. Bei dickeren Linien sieht man besser was ich meine...  :-)

Viele Grüße,
        Simon

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren