2010-08-03 4 views
1

Cario (타깃 OpenGL)를 렌더러로 사용하는 선반 용 텍스트 영역 클래스가 있습니까?카디오 용 텍스트 영역 : OpenGL

텍스트 영역이란 단어 줄 바꿈과 너비 및 높이 제약이있는 여러 줄 문자 입력란을 의미합니다. 이 클래스를 사용해야하는 코드는 C++로 작성되었습니다.

답변

1

하나의 해결책은 pango의 카이로 바인딩을 사용하는 것입니다. 그것을 사용하면 매우 혼란 스러울 수 있으므로 정말 빠릅니다. 원한다면 C++로 클래스를 만들 수 있습니다.

#include <pango/pangocairo.h> 

// Pango context 
PangoContext* pangoContext = pango_font_map_create_context(
    pango_cairo_font_map_get_default()); 

// Layout and attributes 
PangoLayout* pangoLayout = pango_layout_new(pangoContext); 
pango_layout_set_wrap(pangoLayout, PANGO_WRAP_WORD_CHAR); 
pango_layout_set_width(pangoLayout, maxWidth * PANGO_SCALE); 
pango_layout_set_height(pangoLayout, maxHeight * PANGO_SCALE); 

// Set font 
PangoFontDescription* fontDesc = 
    pango_font_description_from_string("Verdana 10"); 
pango_layout_set_font_description(pangoLayout, fontDesc); 
pango_font_description_free(fontDesc); 

// Set text to render 
pango_layout_set_text(pangoLayout, text.data(), text.length()); 

// Allocate buffer 
const cairo_format_t format = CAIRO_FORMAT_A8; 
const int stride = cairo_format_stride_for_width(format, maxWidth); 
GLubyte* buffer = new GLubyte[stride * maxHeight]; 
std::fill(buffer, buffer + stride * maxHeight, 0); 

// Create cairo surface for buffer 
cairo_surface_t* crSurface = cairo_image_surface_create_for_data(
    buffer, format, maxWidth, maxHeight, stride); 
if (cairo_surface_status(crSurface) != CAIRO_STATUS_SUCCESS) { 
    // Error 
} 

// Create cairo context 
cairo_t* crContext = cairo_create(crSurface); 
if (cairo_status(crContext) != CAIRO_STATUS_SUCCESS) { 
    // Error 
} 

// Draw 
cairo_set_source_rgb(crContext, 1.0, 1.0, 1.0); 
pango_cairo_show_layout(crContext, pangoLayout); 

// Cleanup 
cairo_destroy(crContext); 
cairo_surface_destroy(crSurface); 
g_object_unref(pangoLayout); 
g_object_unref(pangoContext); 

// TODO: you can do whatever you want with buffer now 
// copy on the texture maybe? 

delete[] buffer; 

이 경우 버퍼에는 8 비트 알파 채널 값만 포함됩니다. 당신이 다른 것을 원한다면 형식 변수로 바이올린을하십시오. 컴파일 중 ... pkg-config --cflags --libs pangocairo해야합니다. 나는 창문에 대해서 모른다.