4

我有一种感觉,我可能会错过 Pango 的一些东西。API 中的几乎所有内容似乎都旨在显示静态文本,但在特定位置绘制/移动光标的两个函数除外,这表明可能存在实现编辑文本的内置方法。

例如,要用鼠标标记一个文本块(即更改两点之间的背景颜色),我可以为每次鼠标移动重新生成带有更改标签的文本,或者在 Cairo 中绘制矩形,然后使用 Pango 绘制顶部有透明背景的文本。有没有办法在不重新生成或重绘整个屏幕的情况下将属性应用于范围?

同样,如果我让 Pango 自己绘制光标并处理按键事件,是否有替代重绘整个屏幕的方法?

GtkTextBuffer 不是一个选项 - 我在任何时候都没有所有文本,并且使用紧凑的二进制格式并使用一组不断变化的过滤器来计算需要动态显示的内容要高效得多。除了臃肿、多余和不优雅之外,它还非常缓慢。

4

1 回答 1

3

在除了最稀疏的文档之外没有任何文档的情况下,我检查了 GtkTextView 的来源(https://git.gnome.org/browse/gtk+/tree/gtk/gtktextview.c),以了解如何在 GTK 本身中使用 pango 布局.

似乎每次按下键或鼠标更改标记区域时渲染窗口是其问题最少的问题,并且优化(虽然不如 GTK 灵活)超出了它们使用的范围。

例如,文本标记涉及将标签插入渲染树,重新计算树,然后对输出进行双缓冲 - 这应该是大量的过度杀伤并保留用于 3d 渲染。通过抓取输出图像然后渲染文本的子部分来加快滚动速度。

我想彻底的解决方案是重新设计 GtkTextBuffer/GtkTextView 以更接近于 MVC 模型并且不需要预先提供全文,但现在我想我会坚持对用户绘制的小部件进行小幅优化。

于 2015-05-06T20:30:38.567 回答