Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions devel/0157.md
Original file line number Diff line number Diff line change
@@ -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操作,文字序列停留缓冲区,未渲染
1 change: 1 addition & 0 deletions src/Edit/Interface/edit_repaint.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
5 changes: 5 additions & 0 deletions src/Graphics/Renderer/renderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
******************************************************************************/
Expand Down
1 change: 1 addition & 0 deletions src/Graphics/Renderer/renderer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down
Loading