From 89b3aba2bdcce704b327270eb1f89b618f71cc16 Mon Sep 17 00:00:00 2001 From: xjl12 Date: Sat, 23 May 2026 10:34:36 +0800 Subject: [PATCH 1/2] =?UTF-8?q?[0157]=20=E4=BF=AE=E5=A4=8Dautomatic?= =?UTF-8?q?=E6=B8=B2=E6=9F=93=E6=A8=A1=E5=BC=8F=E4=B8=8B=E6=96=87=E5=AD=97?= =?UTF-8?q?=E7=BC=BA=E5=A4=B1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devel/0157.md | 41 +++++++++++++++++++++++++++++ src/Edit/Interface/edit_repaint.cpp | 1 + src/Graphics/Renderer/renderer.cpp | 5 ++++ src/Graphics/Renderer/renderer.hpp | 1 + 4 files changed, 48 insertions(+) create mode 100644 devel/0157.md diff --git a/devel/0157.md b/devel/0157.md new file mode 100644 index 0000000000..20ad70cb42 --- /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 */ From 28d3bae4e63f311d7e1aaf9e841648db9771ea6d Mon Sep 17 00:00:00 2001 From: xjl12 Date: Sat, 23 May 2026 10:40:03 +0800 Subject: [PATCH 2/2] doc --- devel/0157.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devel/0157.md b/devel/0157.md index 20ad70cb42..8bc884fa76 100644 --- a/devel/0157.md +++ b/devel/0157.md @@ -11,7 +11,7 @@ ## 3 如何测试 ### 3.1 非确定性测试(文档验证) -编译并运行程序,任意打开一个有文字的文档,在页面渲染下拉框选择屏幕"屏幕", +编译并运行程序,任意打开一个有文字的文档,在页面渲染下拉框选择"屏幕",然后将光标置于英文单词中间,观察光标消失时字体渲染是否完整 ## 4 如何提交