潘戈+开罗;是否存在处理文本中 <img> 样式标签的现有方法?
Pango + Cairo; is there an existing approach for handling <img> style tags in text?
Pango 语法支持一些纯文本标记。据我所知,这也没有扩展到嵌入图像。
环顾四周,我找不到太多现有实施方式,但我之前没有做过 pango+cairo 工作,所以我可能会错过明显的社区。
据我所知,一个合理的方法是只分析一个字符串,提取任何标签,创建 cairo 图像,然后相应地修改它们周围的 pango 布局。
这看起来也像是以前有人做过的事情。
我专门寻找这些问题的答案:
- pango+cairo 是否已经解决了这个问题,我只是看错了文档?
- 有没有人做过类似的事情,有参考资料吗?
- 这是一种合理的方法吗,或者我应该尝试其他方法吗?
(另请注意,我使用的是 ruby,因此这可能会影响我的选择)
我已经查看了标记解析器的源代码,它不允许 "shape" 属性(Pango 几乎包含图形的方式)但可以做到 "by hand"。
由于网络上完全没有示例代码,这里是Pango/Cairo/Images101.
为了一个简单的演示,我创建了一个 800x400 window,添加了一个 GtkDrawingArea 并连接了 "draw" 信号。在进入主程序循环之前,我用下面的代码对其进行了初始化:
PangoLayout *Pango;
void init_drawingArea (GtkWidget *pWidget)
{
cairo_surface_t *pImg = cairo_image_surface_create_from_png ("linux.png");
PangoRectangle r = {0, 0, PANGO_SCALE * cairo_image_surface_get_width (pImg),
PANGO_SCALE * cairo_image_surface_get_height(pImg)};
PangoContext *ctxt = gtk_widget_get_pango_context (pWidget);
PangoAttrList *attList = pango_attr_list_new();
PangoAttribute *attr;
Pango = pango_layout_new (ctxt);
pango_cairo_context_set_shape_renderer (ctxt, render, NULL, NULL);
pango_layout_set_text (Pango, pszLorem, -1);
pango_layout_set_width(Pango, PANGO_SCALE * 800);
attr = pango_attr_shape_new_with_data(&r, &r, pImg, NULL, NULL);
attr->start_index = 0; attr->end_index = 1;
pango_attr_list_insert (attList, attr);
attr = pango_attr_shape_new_with_data(&r, &r, pImg, NULL, NULL);
attr->start_index = 152; attr->end_index = 153;
pango_attr_list_insert (attList, attr);
pango_layout_set_attributes (Pango, attList);
}
context的shape renderer被设置为render()并且创建并初始化了一个PangoLayout。然后它创建 2 个形状属性,将用户数据设置为我们从 png 文件填充的 cairo 表面,并将属性应用于文本的字符 0 和 152。
"draw" 信号处理很简单。
gboolean onDraw (GtkWidget *pWidget, cairo_t *cr, gpointer user_data)
{
pango_cairo_show_layout (cr, Pango);
return 1;
}
并根据需要调用render()PangoCairoShapeRenderFunc函数:
void render (cairo_t *cr, PangoAttrShape *pShape, gboolean do_path, gpointer data)
{
cairo_surface_t *img = (cairo_surface_t *)pShape->data;
double dx, dy;
cairo_get_current_point(cr, &dx, &dy);
cairo_set_source_surface(cr, img, dx, dy);
cairo_rectangle (cr, dx, dy, pShape->ink_rect.width/PANGO_SCALE,
pShape->ink_rect.height/PANGO_SCALE);
cairo_fill(cr);
}
从开罗获取当前点,它绘制一个矩形并用图像填充它。
这就是它所做的一切。图片是事后添加的,它显示了。它们遵循与任何其他字形相同的规则,因此它们被限制为等同于 CSS 的显示:内联。
如果有人想玩的话,我已经把代码放在 http://immortalsofar.com/PangoDemo/ 了。我,我来到这里试图绕过 GtkTextBuffer 的限制。我想我只需要更深入一点。
Pango 语法支持一些纯文本标记。据我所知,这也没有扩展到嵌入图像。
环顾四周,我找不到太多现有实施方式,但我之前没有做过 pango+cairo 工作,所以我可能会错过明显的社区。
据我所知,一个合理的方法是只分析一个字符串,提取任何标签,创建 cairo 图像,然后相应地修改它们周围的 pango 布局。
这看起来也像是以前有人做过的事情。
我专门寻找这些问题的答案:
- pango+cairo 是否已经解决了这个问题,我只是看错了文档?
- 有没有人做过类似的事情,有参考资料吗?
- 这是一种合理的方法吗,或者我应该尝试其他方法吗?
(另请注意,我使用的是 ruby,因此这可能会影响我的选择)
我已经查看了标记解析器的源代码,它不允许 "shape" 属性(Pango 几乎包含图形的方式)但可以做到 "by hand"。
由于网络上完全没有示例代码,这里是Pango/Cairo/Images101.
为了一个简单的演示,我创建了一个 800x400 window,添加了一个 GtkDrawingArea 并连接了 "draw" 信号。在进入主程序循环之前,我用下面的代码对其进行了初始化:
PangoLayout *Pango;
void init_drawingArea (GtkWidget *pWidget)
{
cairo_surface_t *pImg = cairo_image_surface_create_from_png ("linux.png");
PangoRectangle r = {0, 0, PANGO_SCALE * cairo_image_surface_get_width (pImg),
PANGO_SCALE * cairo_image_surface_get_height(pImg)};
PangoContext *ctxt = gtk_widget_get_pango_context (pWidget);
PangoAttrList *attList = pango_attr_list_new();
PangoAttribute *attr;
Pango = pango_layout_new (ctxt);
pango_cairo_context_set_shape_renderer (ctxt, render, NULL, NULL);
pango_layout_set_text (Pango, pszLorem, -1);
pango_layout_set_width(Pango, PANGO_SCALE * 800);
attr = pango_attr_shape_new_with_data(&r, &r, pImg, NULL, NULL);
attr->start_index = 0; attr->end_index = 1;
pango_attr_list_insert (attList, attr);
attr = pango_attr_shape_new_with_data(&r, &r, pImg, NULL, NULL);
attr->start_index = 152; attr->end_index = 153;
pango_attr_list_insert (attList, attr);
pango_layout_set_attributes (Pango, attList);
}
context的shape renderer被设置为render()并且创建并初始化了一个PangoLayout。然后它创建 2 个形状属性,将用户数据设置为我们从 png 文件填充的 cairo 表面,并将属性应用于文本的字符 0 和 152。
"draw" 信号处理很简单。
gboolean onDraw (GtkWidget *pWidget, cairo_t *cr, gpointer user_data)
{
pango_cairo_show_layout (cr, Pango);
return 1;
}
并根据需要调用render()PangoCairoShapeRenderFunc函数:
void render (cairo_t *cr, PangoAttrShape *pShape, gboolean do_path, gpointer data)
{
cairo_surface_t *img = (cairo_surface_t *)pShape->data;
double dx, dy;
cairo_get_current_point(cr, &dx, &dy);
cairo_set_source_surface(cr, img, dx, dy);
cairo_rectangle (cr, dx, dy, pShape->ink_rect.width/PANGO_SCALE,
pShape->ink_rect.height/PANGO_SCALE);
cairo_fill(cr);
}
从开罗获取当前点,它绘制一个矩形并用图像填充它。
这就是它所做的一切。图片是事后添加的,它显示了。它们遵循与任何其他字形相同的规则,因此它们被限制为等同于 CSS 的显示:内联。
如果有人想玩的话,我已经把代码放在 http://immortalsofar.com/PangoDemo/ 了。我,我来到这里试图绕过 GtkTextBuffer 的限制。我想我只需要更深入一点。