Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Cario的文本区域:OpenGL_C++_Opengl_Cairo - Fatal编程技术网

C++ Cario的文本区域:OpenGL

C++ Cario的文本区域:OpenGL,c++,opengl,cairo,C++,Opengl,Cairo,是否有现成的textarea类使用Cario(目标OpenGL)作为渲染器 我所说的textarea是指具有换行、宽度和高度约束的多行文本字段。 需要使用这个类的代码是用C++编写的。< P>一个解决方案是使用开罗的绑定。使用它会很快让人困惑,所以这里有一个要点。如果你想要,可以在C++中创建它的类。 #include <pango/pangocairo.h> // Pango context PangoContext* pangoContext = pango_font_map_

是否有现成的textarea类使用Cario(目标OpenGL)作为渲染器

我所说的textarea是指具有换行、宽度和高度约束的多行文本字段。 需要使用这个类的代码是用C++编写的。

< P>一个解决方案是使用开罗的绑定。使用它会很快让人困惑,所以这里有一个要点。如果你想要,可以在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;
#包括
//盘古语境
PangoContext*PangoContext=pango\u字体\u地图\u创建\u上下文(
pango_cairo_font_map_get_default());
//布局和属性
PangoLayout*PangoLayout=pango_布局_新(pangoContext);
pango_布局(pangoLayout,pango_wrap)(单词)(CHAR);;
pango_布局设置宽度(pangoLayout,最大宽度*pango_比例);
pango_布局设置高度(pangoLayout,最大高度*pango_比例);
//设置字体
PangoFontDescription*fontDesc=
pango_字体描述来自字符串(“Verdana 10”);
pango_布局_集合_字体_描述(pangoLayout,fontDesc);
pango_font_description_free(fontDesc);
//设置要渲染的文本
pango_布局_集合_文本(pangoLayout,text.data(),text.length());
//分配缓冲区
const cairo_format_t format=cairo_format_A8;
const int stride=cairo\u format\u stride\u表示宽度(format,maxWidth);
GLubyte*buffer=新的GLubyte[stride*maxHeight];
标准::填充(缓冲区,缓冲区+步幅*最大高度,0);
//为缓冲区创建cairo曲面
cairo\u surface\u t*crSurface=cairo\u image\u surface\u为数据创建(
缓冲区、格式、最大宽度、最大高度、步幅);
if(开罗表面状态(crSurface)!=开罗表面状态成功){
//错误
}
//创建开罗上下文
cairo\u t*crContext=cairo\u create(crSurface);
if(cairo\u status(crContext)!=cairo\u status\u SUCCESS){
//错误
}
//画
cairo_set_source_rgb(crContext,1.0,1.0,1.0);
pango_cairo_show_布局图(crContext,pangoLayout);
//清理
开罗(crContext);
开罗表面破坏(crSurface);
g_object_unref(pangoLayout);
g_object_unref(pangoContext);
//TODO:现在你可以用缓冲区做任何你想做的事情
//复制纹理?
删除[]缓冲区;
在这种情况下,缓冲区将仅包含8位alpha通道值。如果您需要其他内容,请使用格式变量。编译
pkg-config--cflags--libs-pangocairo
应该在Linux上完成。我对windows一无所知