www.mikrocontroller.net

Forum: PC-Programmierung Cairo Programmierung GTK+


Autor: Hue \a (hue)
Datum:

Bewertung
0 lesenswert
nicht 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.
    #include <cairo.h>
    #include <gtk/gtk.h>


    static gboolean
    on_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data)
    {
       cairo_t *cr;

       cr = gdk_cairo_create(widget->window);

       cairo_set_source_rgb(cr,1,1,1);
       cairo_paint(cr);
       cairo_set_source_rgb(cr, 0, 0, 0);
       cairo_set_line_width (cr, 0.3);
       
       int i;
       for ( i = 1; i <= 16 ; i++) {
          cairo_move_to(cr, 10, 35 * i );
          cairo_line_to(cr, 10, 35 * i - 20 );
          cairo_move_to(cr, 10, 35 * i );
          cairo_line_to(cr, 790, 35 * i );
          cairo_stroke(cr);
       }

       cairo_destroy(cr);

       return FALSE;
    }

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

      GtkWidget *window;

      gtk_init(&argc, &argv);
     
      window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

      gtk_widget_add_events (window, GDK_BUTTON_PRESS_MASK);

      g_signal_connect(window, "expose-event",
          G_CALLBACK(on_expose_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_title(GTK_WINDOW(window), "LA_II");
      gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
      gtk_widget_set_app_paintable(window, TRUE);

      gtk_widget_show_all(window);

      gtk_main();

      return 0;
    }

Hat jemand dazu eine Verbesserung? Die Linien sind in meiner Ausgabe am 
Bildschirm sehr blass, fast nicht sichtbar.

HUE \a

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder die Linie ist zu dünn

Autor: Lukas K. (carrotindustries)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Walter schrieb:
> oder die Linie ist zu dünn

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

Autor: Hue \a (hue)
Datum:

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

MfG

HUE \a

Autor: Simon Budig (nomis)
Datum:

Bewertung
0 lesenswert
nicht 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
   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

Autor: Simon Budig (nomis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach, nochwas.

Wenn Du den Schleifenrumpf umbaust zu:
          cairo_move_to(cr, 10, 35 * i - 20 );
          cairo_line_to(cr, 10, 35 * i );
          cairo_line_to(cr, 790, 35 * i );
          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

Autor: Hue \a (hue)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Vielen Dank!

MfG

HUE \a

Autor: Clown (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alternativ auch möglich:
...
cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE);
cairo_set_source_rgb(cr, 0, 0, 0);
//    cairo_set_line_width (cr, 0.3);
cairo_set_line_width (cr, 1.0);
...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.