diff --git a/devel/0157.md b/devel/0157.md new file mode 100644 index 0000000000..8bc884fa76 --- /dev/null +++ b/devel/0157.md @@ -0,0 +1,41 @@ +# [0157] 修复"automatic"渲染模式下文字缺失问题 + +## 1 相关文档 +- [dddd.md](dddd.md) - 任务文档模板 + +## 2 任务相关的代码文件 +- `src/Edit/Interface/edit_repaint.cpp` +- `src/Graphics/Renderer/renderer.cpp` +- `src/Graphics/Renderer/renderer.hpp` + +## 3 如何测试 + +### 3.1 非确定性测试(文档验证) +编译并运行程序,任意打开一个有文字的文档,在页面渲染下拉框选择"屏幕",然后将光标置于英文单词中间,观察光标消失时字体渲染是否完整 + +## 4 如何提交 + +```bash +git add devel/0157.md +git commit -m "[0157] 更新任务文档" +git add src/Edit/Interface/edit_repaint.cpp src/Graphics/Renderer/renderer.cpp src/Graphics/Renderer/renderer.hpp +git commit -m "[0157] 修复automatic渲染模式下文字缺失问题" +git push +``` + +## 5 What + +1. Render基类新增`void end_text()`接口 +2. 在`edit_interface_rep::draw_surround()`函数中,针对所有渲染模式,强制调用`end_text`,确保PDF相关渲染器中缓冲的文字写入流被提交刷新(对QT渲染器无影响) + +## 6 Why +当 `page-medium` 设置为 `automatic` 时,页面渲染显示为"屏幕",光标附近的文字渲染会部分消失 + +## 7 How +PDF相关渲染器要求BT、ET操作配对,才能完成文字写入 +光标闪烁的渲染器调用序列为: +1. 清空光标所在矩形区域 +2. 重绘光标所在文本区域的文字(BT操作) +3. 调用`edit_interface_rep::draw_surround()`函数处理页面周围 + - 非automatic时,会调用clear,间接产生ET操作 + - automatic直接return,无ET操作,文字序列停留缓冲区,未渲染 \ No newline at end of file diff --git a/src/Edit/Interface/edit_repaint.cpp b/src/Edit/Interface/edit_repaint.cpp index 1f2e914fa0..99db313a78 100644 --- a/src/Edit/Interface/edit_repaint.cpp +++ b/src/Edit/Interface/edit_repaint.cpp @@ -136,6 +136,7 @@ void edit_interface_rep::draw_surround (renderer ren, rectangle r) { ren->set_background (tm_background); string medium= get_init_string (PAGE_MEDIUM); + ren->end_text (); if (medium == "automatic") return; if (medium == "beamer" && full_screen) return; ren->clear (r->x1, r->y1, max (r->x1, eb->x1), r->y2); diff --git a/src/Graphics/Renderer/renderer.cpp b/src/Graphics/Renderer/renderer.cpp index 1abcdcba23..35aa9861bf 100644 --- a/src/Graphics/Renderer/renderer.cpp +++ b/src/Graphics/Renderer/renderer.cpp @@ -536,6 +536,11 @@ renderer_rep::draw_emoji (int char_code, font_glyphs fn, SI x, SI y) { return true; } +void +renderer_rep::end_text () { + return; +} + /****************************************************************************** * Drawing selections using alpha transparency ******************************************************************************/ diff --git a/src/Graphics/Renderer/renderer.hpp b/src/Graphics/Renderer/renderer.hpp index b66051c4f7..4fe5bd8dea 100644 --- a/src/Graphics/Renderer/renderer.hpp +++ b/src/Graphics/Renderer/renderer.hpp @@ -118,6 +118,7 @@ class renderer_rep { virtual void draw_selection (rectangles rs); virtual void draw_curve (curve c, bool filled= false); virtual bool support_native_curve (curve c); + virtual void end_text (); bool draw_emoji (int char_code, font_glyphs fn, SI x, SI y); /* shadowing and copying rectangular regions across renderers */