2009-12-02 6 views
2

주어진 문자 (이 경우 문자 "T")로 Pango에서 렌더링 한 비트 맵을 얻으려고합니다. 나는 이것이 효과가 있다고 생각하지만 그냥 쓰레기를 출력한다.GTK/GDK를 사용하여 판고 렌더링 된 픽셀을 얻습니다.

이 코드에서 gtk_window은 이미 GTK 윈도우로 초기화되어있다.

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"); 
} 

출력마다 다르지만, 예 :

문자 "T"와 같은 아무것도 보지 않는다
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 

!

내가 뭘 잘못하고 있는지 아는 사람이 있습니까? 감사!

답변

3

좋아요, 알아 냈습니다. 나에게주는

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"); 
} 

: 나는 정확하게 색상을 설정하고, gdk_draw_rectangle 사용하여 그리기 전에 지역을 취소하는 데 필요한

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 
0

그냥 몇 가지 기본적인 힌트는, 코드 시도하지 않은 : 당신은 오류 검사를 언급하지 않는

  • 을; GTK +/GDK의 모든 호출이 성공했는지 확인해야합니다. 그들은 모두 입력에 대해 NULL 검사를하고 경고를 내야하지만 여전히 그렇습니다.
  • 모든 채널을 동시에 인쇄합니다.이 경우 일 수도 있고 일 수 있습니다. 해석하기 어려운 이미지가 시각적으로 표시됩니다. 귀하의 데이터에서 두 개의 채널을 걸러 내 보았지만 도움이되지 않았습니다. 물론, 매번 출력이 다르다고 말하면, 그것은 장거리입니다.
  • GDK 그리기 호출의 동시성에 대해 확신하지 못합니다. 즉, 즉시 발생했다가 다시 돌아 오거나, 나중에 "업데이트 더티 영역"처리기로 연기 될 수있는 경우입니다.