Frage

Ich versuche, ein Bitmap von Pango mit einem bestimmten Charakter gemacht zu bekommen, in diesem Fall der Buchstabe „T“. Ich dachte, das sollte funktionieren, aber es druckt nur Müll aus ..

In diesem Code gtk_window bereits als GTK Fenster initialisiert wird.

int width, height;
PangoLayout *layout = gtk_widget_create_pango_layout(gtk_window, "T");
PangoFontDescription *fontdesc = pango_font_description_from_string("Terminus 12");
pango_layout_set_font_description (layout, fontdesc);
pango_layout_get_pixel_size (layout, &width, &height);

GdkPixmap *temp_pixmap = gdk_pixmap_new(NULL, width, height, 24) ;
GdkGC *gc = gdk_gc_new(temp_pixmap);
gdk_draw_layout( temp_pixmap, gc, 0, 0, layout) ;

GdkColormap *cmap = gdk_colormap_get_system() ;
GdkPixbuf *temp_pixbuf = gdk_pixbuf_get_from_drawable(NULL, temp_pixmap,
                                       cmap, 0, 0, 0, 0, width, height);

int n_channels = gdk_pixbuf_get_n_channels (temp_pixbuf);
int rowstride = gdk_pixbuf_get_rowstride(temp_pixbuf);
guchar *pixels = gdk_pixbuf_get_pixels(temp_pixbuf);

int i,j;
for (j=0; j<height; j++) {
    for (i=0; i<(width*n_channels); i++) {
        printf("%02x ",
               *(pixels + i + j*rowstride));
    }
    printf("\n");
}

Die Ausgabe ist jedes Mal anders, aber ein Beispiel:

dd 24 f8 dd 24 f8 8f 28 28 8f 28 28 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 fc 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
ef 14 ce 00 00 00 d0 00 20 00 00 00 ef 02 02 d0 00 01 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 fc 00 00 00 00 00 ef 02 02 00 03 40 00 00 b9 00 00 c8 
00 00 01 00 00 07 00 00 07 00 00 00 00 00 02 00 00 00 00 00 d0 00 00 c8 
00 00 01 00 00 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 
00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 0e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 12 ff ff ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 7a 4e 00 00 00 01 00 00 00 00 00 00 00 00 00 01 ff ff ff ff ff ff 
ff ff ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

Welche nichts wie der Buchstabe "T"!

sieht

Jede Idee, was mache ich falsch? Dank!

War es hilfreich?

Lösung

Okay, ich es herausgefunden. Ich brauchte die Farben richtig zu setzen und den Bereich zu löschen, bevor gdk_draw_rectangle Zeichnung mit:

PangoLayout *layout = gtk_widget_create_pango_layout(me->gtk_window, "T");
int width, height;
PangoFontDescription *fontdesc = pango_font_description_from_string("Sans 10");
pango_layout_set_font_description (layout, fontdesc);
pango_layout_get_pixel_size (layout, &width, &height);

GdkPixmap *temp_pixmap = gdk_pixmap_new(NULL, width, height, 24);
GdkGC *gc = gdk_gc_new(temp_pixmap);

GdkColor white = {0,0xFF00,0xFF00,0xFF00};
GdkColor black = {0,0,0,0};

GdkColormap *cmap = gdk_gc_get_colormap(gc);

gdk_gc_set_rgb_fg_color(gc, &black);
gdk_gc_set_rgb_bg_color(gc, &white);
gdk_draw_rectangle(temp_pixmap, gc, TRUE, 0, 0, width, height);

gdk_gc_set_rgb_fg_color(gc, &white);
gdk_gc_set_rgb_bg_color(gc, &black);
gdk_draw_layout(temp_pixmap, gc, 0, 0, layout);

GdkPixbuf *temp_pixbuf = gdk_pixbuf_get_from_drawable(NULL, temp_pixmap,
                                        cmap, 0, 0, 0, 0, width, height);

int n_channels = gdk_pixbuf_get_n_channels (temp_pixbuf);
int rowstride = gdk_pixbuf_get_rowstride(temp_pixbuf);
guchar *pixels = gdk_pixbuf_get_pixels(temp_pixbuf);

int i,j;
for (j=0; j<height; j++) {
    for (i=0; i<(width*n_channels); i++) {
        printf("%02x ",
               *(pixels + i + j*rowstride));
    }
    printf("\n");
}

gibt mir:

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
c5 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff e3 
25 30 33 33 33 33 33 33 3d 68 ba f6 ff d8 86 4a 35 33 33 33 33 33 31 2a 
00 00 00 00 00 00 00 00 0c 41 a7 f1 fe cc 66 1c 03 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 0c 41 a7 f1 fe cc 66 1c 03 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 0c 41 a7 f1 fe cc 66 1c 03 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 0c 41 a7 f1 fe cc 66 1c 03 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 0c 41 a7 f1 fe cc 66 1c 03 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 0c 41 a7 f1 fe cc 66 1c 03 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 0c 41 a7 f1 fe cc 66 1c 03 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 0c 41 a7 f1 fe cc 66 1c 03 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

Andere Tipps

Nur ein paar grundlegende Hinweise, haben Sie Ihren Code nicht versucht:

  • Sie haben keine Fehlerprüfung erwähnen; Sie durchlaufen sollten und sehen, dass alle verschiedenen GTK + / GDK succeeed nennt. Sie sollten alle tun NULL Kontrolle an den Eingängen und emittieren Warnungen, aber immer noch.
  • Sie drucken alle Kanäle zur gleichen Zeit, die könnten führen zu einem schwer zu interpretieren Bild visuell. Ich habe versucht, in Ihren Daten zwei der Kanäle herausfiltern, aber das half nicht. da man natürlich sagen, dass die Ausgabe jedes Mal anders ist, das war eine lange erschossen.
  • Ich bin über die Synchronität der GDK Zeichnung Anrufe nicht sicher, ob sie garantiert sofort geschehen und dann zurückkehren, oder wenn sie auf einige später verschoben werden kann „update schmutzigen Umgebungen“ Handler.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top