开发者

Textarea for Cario:OpenGL [closed]

Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.

We don’t allow questions seeking recommendations for books, tools, software libraries, and more. You can edit the question so it can be answered with facts and citations.

Closed 4 years ago.

开发者_如何学Go Improve this question

Is there an off the shelf textarea class that uses Cario (targetting OpenGL) as the renderer?

By textarea I mean a multiline textfield with wordwrap and width and height constraints. The code that needs to use this class is written in C++.


One solution is to use pango's cairo bindings. Using it could get quite confusing really fast so here's a essentials. You could create class around it in C++ if you want.

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

In this case buffer will contain 8 bit alpha channel values only. Fiddle with format variable if you want something else. Compiling... pkg-config --cflags --libs pangocairo should do it on Linux. I have no idea about windows.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜