Forum: PC-Programmierung Cairo Programmierung GTK+


von Hue \. (hue)


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

von Walter (Gast)


Lesenswert?

Hue \a schrieb:
> cairo_set_source_rgb(cr,1,1,1);

ich hab zwar von cairo keine Ahnung,
aber vielleicht
rgb(255,255,255);

von Walter (Gast)


Lesenswert?

oder die Linie ist zu dünn

von Lukas K. (carrotindustries)


Angehängte Dateien:

Lesenswert?

Walter schrieb:
> oder die Linie ist zu dünn

Genau, cairo verwendet Antialiasing. Eine 3 breite Linie sieht aus wie 
im Anhang gezeigt.

von Hue \. (hue)


Lesenswert?

Vielen Dank für Eure Antworten, gibt es aber keinen Workaround für dünne 
Linien?

MfG

HUE \a

von Simon B. (nomis)


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

von Simon B. (nomis)


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

von Hue \. (hue)


Lesenswert?

Hallo,

Jungs, oder auch Mädels, Ihr seid einfach KLASSE!

Vielen Dank!

MfG

HUE \a

von Clown (Gast)


Lesenswert?

Alternativ auch möglich:
1
...
2
cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE);
3
cairo_set_source_rgb(cr, 0, 0, 0);
4
//    cairo_set_line_width (cr, 0.3);
5
cairo_set_line_width (cr, 1.0);
6
...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.