Fehlerhafte Ausgabe bei cairo_show_glyphs

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
jolico
Beiträge: 4
Registriert: Do Mär 31, 2016 9:40 pm

Fehlerhafte Ausgabe bei cairo_show_glyphs

Beitrag von jolico » Do Mär 31, 2016 9:50 pm

Hallo,
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;
}
Der originale Programmabschnitt (Teil 1) alleine gibt die glyphs in einwandfreier normaler Form aus.
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

jolico
Beiträge: 4
Registriert: Do Mär 31, 2016 9:40 pm

Re: Fehlerhafte Ausgabe bei cairo_show_glyphs

Beitrag von jolico » Fr Apr 01, 2016 8:01 am

Hab's selbst gefunden.
cairo_show_glyphs gehört nicht in die Schleife.
Sorry, hatte Tomaten auf den Augen

Danke
Jolico

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Fehlerhafte Ausgabe bei cairo_show_glyphs

Beitrag von Xin » Fr Apr 01, 2016 3:13 pm

jolico hat geschrieben:Hab's selbst gefunden.
cairo_show_glyphs gehört nicht in die Schleife.
Sorry, hatte Tomaten auf den Augen
:lol: , ich habe gestern selbst mal drübergeguckt, aber spontan auch nix gesehen, daher wollte ich es heute testen.

Aber Daumen hoch, dass Du die Lösung noch gepostet hast - nichts ist ätzender als in einem Forum genau die Frage zu finden, die man sucht und darunter nichts weiter als "Danke, hab den Fehler selbst gefunden"... ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten