2010-08-03 3 views
1

Existe-t-il une classe textarea standard utilisant Cario (ciblant OpenGL) comme moteur de rendu? Par textarea, je veux dire un champ de texte multiligne avec des contraintes de largeur de wordwrap et de largeur et de hauteur. Le code qui doit utiliser cette classe est écrit en C++.Textarea for Cario: OpenGL

Répondre

1

Une solution consiste à utiliser les fixations cairo pango. L'utiliser pourrait devenir très déroutant très rapidement, alors voici un essentiel. Vous pouvez créer une classe autour de C++ si vous le souhaitez.

#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; 

Dans ce cas, le tampon contiendra uniquement des valeurs de canal alpha de 8 bits. Fiddle avec la variable de format si vous voulez quelque chose d'autre. Compiler ... pkg-config --cflags --libs pangocairo devrait le faire sur Linux. Je n'ai aucune idée de Windows.