문제

나는 Pango가 주어진 캐릭터로 렌더링 한 비트 맵을 얻으려고 노력하고 있습니다.이 경우 문자 "t"입니다. 나는 이것이 효과가 있다고 생각했지만 쓰레기를 인쇄한다 ..

이 코드에서 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");
}

출력은 매번 다르지만 예를 들어.

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 

문자 "t"처럼 보이지 않습니다!

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

도움이 되었습니까?

해결책

좋아, 나는 그것을 알아 냈다. 색상을 올바르게 설정하고 사용하기 전에 영역을 지우는 것이 필요했습니다. gdk_draw_rectangle:

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

나에게 제공 :

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
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 

다른 팁

몇 가지 기본 힌트만으로 코드를 시도하지 않았습니다.

  • 오류 확인을 언급하지 않습니다. 당신은 모든 GTK+/GDK 호출이 성공적인 것을 통과해야합니다. 그들은 모두 입력에 대한 널 확인하고 경고를 방출해야하지만 여전히 남아 있어야합니다.
  • 모든 채널을 동시에 인쇄하고 있습니다. ~할 것 같다 해석하기 어려운 이미지를 시각적으로 연결합니다. 데이터에서 두 개의 채널을 필터링하려고 시도했지만 도움이되지 않았습니다. 물론, 당신은 매번 출력이 다르다고 말하기 때문에 그것은 긴 샷이었습니다.
  • GDK 그리기 호출의 동기성, 즉시 발생한 후 돌아 오거나 돌아 오거나 나중에 "더러운 영역 업데이트"핸들러로 연기 될 수 있는지 확실하지 않습니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top