YSTest: DSReader.cpp 源文件

YSTest PreAlpha_b700_20160611 The YSLib Test Project

- 首页
- 相关页面
- 模块
- 命名空间
- 类
- 文件

- 文件列表
- 文件成员

DSReader.cpp
浏览该文件的文档.
1 /*
2 © 2010-2016 FrankHB.
3
4 This file is part of the YSLib project, and may only be used,
5 modified, and distributed under the terms of the YSLib project
6 license, LICENSE.TXT. By continuing to use, modify, or distribute
7 this file you indicate that you have read the license and
8 understand and accept it fully.
9 */
10
28 #include "DSReader.h"
29 #include <algorithm> // for std::copy_n;
30 #include YFM_YSLib_UI_YWindow
31 #include YFM_YSLib_Service_TextLayout
32
33 namespace YSLib
34 {
35
36 using namespace Drawing;
37 using namespace Text;
38 using ystdex::next_if_eq;
39
40 namespace
41 {
42
47 template<typename _tBi>
48 _tBi
49 FindPreviousChar(_tBi s, _tBi b, char32_t c = char32_t())
50 {
51 // while(b < --s && *s != c)
52 while(b != --s && *s != c)
53 ;
54 return s;
55 }
56
61 template<typename _tBi>
62 _tBi
63 FindLineFeed(const TextRegion& r, _tBi s, _tBi e)
64 {
65 const SDst wmax(r.GetWidth() - GetHorizontalOf(r.Margin));
66 SDst w(0);
67
68 // while(s < e && *s != '\n')
69 while(s != e && *s != '\n')
70 {
71 if(IsPrint(*s))
72 {
73 w += SDst(r.Font.GetAdvance(*s));
74 if(w >= wmax)
75 break;
76 }
77 ++s;
78 }
79 return s;
80 }
81
86 template<typename _tBi>
87 _tBi
88 FindPreviousLineFeed(TextRegion& r, _tBi s, _tBi b)
89 {
90 // if(b < s)
91 if(b != s)
92 {
93 const auto e(s);
94
95 for(auto t(FindPreviousChar(s, b, '\n')); t != e;
96 t = FindLineFeed(r, t, e))
97 {
98 s = t;
99 if(*t == '\n')
100 ++t;
101 }
102 }
103 return s;
104 }
105
110 template<typename _tIn, class _tArea, class _tCon>
111 inline void
112 AdjustForNewline(_tArea& area, _tIn& i, _tCon& c)
113 {
114 i = FindLineFeed(area, next_if_eq(i, '\n'), end(c));
115 }
116
121 template<typename _tIn, class _tArea, class _tCon>
122 inline void
123 AdjustPrevious(_tArea& area, _tIn& i, _tCon& c)
124 {
125 i = FindPreviousLineFeed(area, i, begin(c));
126 }
127
139 void
140 CopyScrollArea(YSLib::UI::BufferedTextArea& src_area,
141 size_t src_offset, YSLib::UI::BufferedTextArea& dst_area,
142 size_t dst_offset, ptrdiff_t offset, size_t n)
143 {
144 YAssert(n != 0, "Invalid number of lines found.");
145 YAssert(n <= size_t(std::abs(offset)), "Invalid offset found.");
146
147 const SDst w(src_area.GetWidth());
148
149 YAssert(w == dst_area.GetWidth(), "Distinct screen widths found.");
150 yunseq(src_offset *= w, dst_offset *= w, n *= w);
151 dst_area.Scroll(offset);
152 yunseq(std::copy_n(src_area.GetBufferPtr() + src_offset, n,
153 dst_area.GetBufferPtr() + dst_offset),
154 std::copy_n(src_area.GetBufferAlphaPtr() + src_offset, n,
155 dst_area.GetBufferAlphaPtr() + dst_offset));
156 src_area.Scroll(offset);
157 }
158
164 void
165 MoveScrollArea(YSLib::UI::BufferedTextArea& area_up,
166 YSLib::UI::BufferedTextArea& area_dn, ptrdiff_t offset, SDst n)
167 {
168 // XXX: Conversion to 'SPos' might be implementation-defined.
169 YAssert(SPos(area_up.GetHeight()) - area_up.Margin.Bottom - SPos(n) > 0,
170 "No enough space of areas found.");
171
172 const SDst up_btm(SDst(max<SPos>(area_up.Margin.Bottom, 0)));
173
174 if(YB_UNLIKELY(area_up.GetHeight() <= up_btm + n))
175 return;
176
177 auto src_off(SDst(max<SPos>(area_dn.Margin.Top, 0))),
178 dst_off(SDst(area_up.GetHeight() - up_btm - n));
179 auto* p_src(&area_dn);
180 auto* p_dst(&area_up);
181 SDst clr_off;
182
183 if(offset > 0) //复制区域向下移动，即浏览区域向上滚动。
184 {
185 std::swap(p_src, p_dst),
186 std::swap(src_off, dst_off),
187 clr_off = SDst(max<SPos>(area_up.Margin.Top, 0));
188 }
189 else
190 clr_off = area_dn.GetHeight()
191 - SDst(max<SPos>(area_dn.Margin.Bottom, 0)) - n;
192 CopyScrollArea(*p_src, src_off, *p_dst, dst_off, offset, size_t(n));
193 p_src->ClearLine(clr_off, n);
194 }
195
197 std::uint16_t
198 CheckOverRead(TextRegion& r)
199 {
200 const auto b(FetchLastLineBasePosition(r, r.GetHeight()));
201
202 // XXX: Conversion to 'SPos' might be implementation-defined.
203 return r.Pen.Y < b ? (b - r.Pen.Y) / SPos(GetTextLineHeightExOf(r)) : 0;
204 }
205
206 } // unnamed namespace;
207
208 namespace DS
209 {
210
211 namespace UI
212 {
213
214 DualScreenReader::DualScreenReader(SDst w, SDst h_up, SDst h_down,
215 FontCache& fc_)
216 : p_text(), fc(fc_), i_top(), i_btm(), overread_line_n(0), scroll_offset(0),
217 Margin(4, 4, 4, 4),
218 area_up(Rect({}, w, h_up), fc), area_dn(Rect({}, w, h_down), fc)
219 {
220 SetFontSize(),
221 SetColor(),
222 SetLineGap(),
223 area_up.Background = nullptr,
224 area_dn.Background = nullptr;
225 }
226
227 void
228 DualScreenReader::SetLineGap(std::uint8_t g)
229 {
230 if(area_up.LineGap != g)
231 {
232 yunseq(area_up.LineGap = g, area_dn.LineGap = g);
233 UpdateView();
234 }
235 }
236
237 void
238 DualScreenReader::SetVisible(bool b)
239 {
240 SetVisibleOf(area_up, b), SetVisibleOf(area_dn, b);
241
242 using YSLib::UI::Invalidate;
243
244 //强制刷新背景。
245 Invalidate(area_up);
246 Invalidate(area_dn);
247 }
248
249 void
250 DualScreenReader::SetFont(const Font& fnt)
251 {
252 yunseq(area_up.Font = fnt, area_dn.Font = fnt);
253 }
254 void
255 DualScreenReader::SetFontSize(FontSize s)
256 {
257 area_up.Font.SetSize(s),
258 area_dn.Font.SetSize(s);
259 // NOTE: Margins shall be adjusted before output.
260 }
261
262 void
263 DualScreenReader::AdjustForFirstNewline()
264 {
265 AdjustForNewline(area_up, i_top, *p_text);
266 }
267
268 void
269 DualScreenReader::AdjustForPrevNewline()
270 {
271 AdjustPrevious(area_up, i_top, *p_text);
272 }
273
274 void
275 DualScreenReader::AdjustMargins()
276 {
277 yunseq(area_up.Margin = Margin, area_dn.Margin = Margin);
278 AdjustBottomMarginOf(area_up), AdjustBottomMarginOf(area_dn);
279 {
280 const SPos v((area_up.Margin.Bottom - area_up.Margin.Top) / 2);
281
282 yunseq(area_up.Margin.Top += v, area_up.Margin.Bottom -= v);
283 }
284 {
285 const SPos v((area_dn.Margin.Bottom - area_dn.Margin.Top) / 2);
286
287 yunseq(area_dn.Margin.Top += v, area_dn.Margin.Bottom -= v);
288 }
289 }
290
291 FontSize
292 DualScreenReader::AdjustScrollOffset()
293 {
294 return bool(p_text) && scroll_offset != 0
295 ? ScrollByPixel(GetTextLineHeightExOf(area_up) - scroll_offset) : 0;
296 }
297
298 void
299 DualScreenReader::Attach(YSLib::UI::Window& wnd_up,
300 YSLib::UI::Window& wnd_dn)
301 {
302 wnd_up += area_up,
303 wnd_dn += area_dn;
304 }
305
306 void
307 DualScreenReader::Detach()
308 {
309 using YSLib::UI::Window;
310
311 if(const auto p_con
312 = dynamic_cast<Window*>(FetchContainerPtr(area_up).get()))
313 *p_con -= area_up;
314 if(const auto p_con
315 = dynamic_cast<Window*>(FetchContainerPtr(area_dn).get()))
316 *p_con -= area_dn;
317 }
318
319 bool
320 DualScreenReader::Execute(Command cmd)
321 {
322 if(YB_UNLIKELY(!p_text || p_text->GetTextSize() == 0))
323 return {};
324 if(YB_UNLIKELY(~cmd & Scroll))
325 return {};
326 if(AdjustScrollOffset() != 0)
327 return {};
328 if(cmd & Up)
329 {
330 if(YB_UNLIKELY(IsTextTop()))
331 return {};
332 }
333 else if(YB_UNLIKELY(IsTextBottom()))
334 return {};
335 YAssert(area_up.LineGap == area_dn.LineGap, "Distinct line gaps found.");
336 // TODO: Assert the fonts are same.
337 cmd &= ~Scroll;
338 if(cmd & Line)
339 {
340 const FontSize h(area_up.Font.GetHeight()), hx(h + GetLineGap());
341
342 if(cmd & Up)
343 {
344 MoveScrollArea(area_up, area_dn, hx, SDst(h));
345 SetCurrentTextLineNOf(area_up, 0);
346 AdjustForPrevNewline();
347 CarriageReturn(area_up);
348 PutLine(area_up, next_if_eq(i_top, '\n'), p_text->end(), '\n');
349 if(overread_line_n > 0)
350 --overread_line_n;
351 else
352 AdjustPrevious(area_up, i_btm, *p_text);
353 }
354 else
355 {
356 MoveUpForLastLine(-hx, h);
357 //注意缓冲区不保证以空字符结尾。
358 CarriageReturn(area_dn);
359 i_btm = PutLastLine();
360 AdjustForFirstNewline();
361 }
362 Invalidate();
363 }
364 else
365 {
366 auto ln(area_up.GetTextLineNEx() + area_dn.GetTextLineNEx());
367
368 if(cmd & Up)
369 while(ln--)
370 AdjustForPrevNewline();
371 else
372 while(ln-- && !IsTextBottom())
373 {
374 AdjustForNewline(area_dn, i_btm, *p_text);
375 AdjustForFirstNewline();
376 }
377 UpdateView();
378 }
379 return true;
380 }
381
382 void
383 DualScreenReader::Invalidate()
384 {
385 using YSLib::UI::Invalidate;
386
387 //强制刷新背景。
388 Invalidate(area_up);
389 Invalidate(area_dn);
390 if(ViewChanged)
391 ViewChanged();
392 }
393
394 void
395 DualScreenReader::Locate(size_t pos)
396 {
397 const auto s(Deref(p_text).GetTextSize());
398
399 if(s == 0)
400 {
401 Reset();
402 Invalidate();
403 return;
404 }
405 if(pos == 0)
406 i_top = p_text->begin();
407 else if(pos < s)
408 {
409 i_top = p_text->GetIterator(pos);
410 ++i_top;
411 AdjustForPrevNewline();
412 }
413 else
414 return;
415 UpdateView();
416 }
417
418 void
419 DualScreenReader::LoadText(ifstream& file, Encoding enc)
420 {
421 if(file.is_open())
422 {
423 file.unsetf(std::ios_base::skipws);
424 p_text.reset(new Text::TextFileBuffer(file, enc));
425 yunseq(i_top = p_text->begin(), i_btm = p_text->end());
426 UpdateView();
427 }
428 else
429 {
430 UnloadText();
431 Reset();
432 PutString(area_up, u"文件打开失败！");
433 Invalidate();
434 }
435 }
436
437 void
438 DualScreenReader::MoveUpForLastLine(ptrdiff_t off, size_t h)
439 {
440 MoveScrollArea(area_up, area_dn, off, SDst(h));
441
442 std::uint16_t n(area_dn.GetTextLineNEx());
443
444 YAssert(n != 0, "No Enough height.");
445 SetCurrentTextLineNOf(area_dn, --n);
446 }
447
448 Text::TextFileBuffer::iterator
449 DualScreenReader::PutLastLine()
450 {
451 return PutLine(area_dn, next_if_eq(i_btm, '\n'), p_text->end(), '\n');
452 }
453
454 void
455 DualScreenReader::Reset()
456 {
457 //清除字符区域缓冲区。
458 area_up.ClearImage();
459 area_dn.ClearImage();
460 //根据行距调整并均衡边距。
461 AdjustMargins();
462 //复位缓存区域写入位置。
463 area_up.ResetPen();
464 area_dn.ResetPen();
465 }
466
467 FontSize
468 DualScreenReader::ScrollByPixel(Drawing::FontSize h)
469 {
470 const FontSize ln_h_ex(GetTextLineHeightExOf(area_up));
471
472 YAssert(scroll_offset < ln_h_ex, "Invalid scroll offset found.");
473 if(YB_UNLIKELY(i_btm == Deref(p_text).end()
474 || scroll_offset + h > ln_h_ex))
475 return 0;
476 MoveUpForLastLine(-h, h);
477 //注意缓冲区不保证以空字符结尾。
478 CarriageReturn(area_dn);
479 if(YB_LIKELY((scroll_offset += h) < ln_h_ex))
480 {
481 area_dn.Pen.Y += ln_h_ex - scroll_offset;
482 PutLastLine();
483 }
484 else
485 {
486 i_btm = PutLastLine();
487 AdjustForFirstNewline();
488 scroll_offset = 0;
489 }
490 Invalidate();
491 return h;
492 }
493
494 void
495 DualScreenReader::Stretch(SDst h)
496 {
497 RestrictInClosedInterval<SDst>(h, 0, MainScreenHeight - 40);
498 h = MainScreenHeight - h;
499
500 const SDst w(area_dn.GetWidth());
501
502 SetSizeOf(area_dn, Size(w, h)),
503 area_dn.SetSize(w, h);
504 UpdateView();
505 }
506
507 void
508 DualScreenReader::UnloadText()
509 {
510 yunseq(i_top = Text::TextFileBuffer::iterator(),
511 i_btm = Text::TextFileBuffer::iterator(),
512 p_text = nullptr);
513 }
514
515 void
516 DualScreenReader::UpdateView()
517 {
518 if(YB_UNLIKELY(!p_text || p_text->GetTextSize() == 0))
519 return;
520 Reset();
521 {
522 auto i_new(PutString(area_up, next_if_eq(i_top, '\n'),
523 p_text->end()));
524
525 if(YB_UNLIKELY(i_new == p_text->end()))
526 {
527 i_btm = i_new;
528 overread_line_n = CheckOverRead(area_up) + area_dn.GetTextLineNEx();
529 }
530 else
531 {
532 i_btm = PutString(area_dn, i_new, p_text->end());
533 overread_line_n = CheckOverRead(area_dn);
534 }
535 }
536 if(YB_LIKELY(!IsTextBottom() && *i_btm == '\n'))
537 --i_btm;
538 Invalidate();
539 }
540
541 } // namespace UI;
542
543 } // namespace DS;
544
545 } // namespace YSLib;
546
YSLib::UI::fc
fc
Definition: Console.h:93
YSLib::DS::UI::DualScreenReader::AdjustForPrevNewline
void AdjustForPrevNewline()
Definition: DSReader.cpp:269
CHRLib::enc
enc
Definition: CharacterProcessing.h:81
YSLib::DS::UI::DualScreenReader::Reset
void Reset()
复位输出显示状态。
Definition: DSReader.cpp:455
YSLib::Drawing::w
The boundary is out of the const Rect SDst w
Definition: YDraw.h:127
YSLib::Drawing::Font
字体：字模，包含字型、样式和大小。
Definition: Font.h:583
YSLib::DS::UI::DualScreenReader::Stretch
void Stretch(SDst)
伸缩：从最大值起向上调整（减少）下文字区域的高后更新视图。
Definition: DSReader.cpp:495
YSLib::UI::BufferedTextArea
缓冲文本区域。
Definition: TextArea.h:79
YSLib::Drawing::FontSize
std::uint8_t FontSize
字体大小。
Definition: Font.h:73
ystdex::swap
void swap(container_adaptor< _tSeqCon > &x, container_adaptor< _tSeqCon > &y)
Definition: container.hpp:179
v
byte v
Definition: CharRenderer.cpp:75
YSLib::DS::UI::DualScreenReader::area_up
YSLib::UI::BufferedTextArea area_up
上下屏幕对应文本区域。
Definition: DSReader.h:127
YSLib::Drawing::TextState::Pen
Point Pen
笔坐标。
Definition: TextBase.h:98
YSLib::Drawing::FontCache
字体缓存。
Definition: Font.h:460
YSLib::Drawing::TextRegion::Scroll
void Scroll(ptrdiff_t n)
缓冲区特效：整体移动 n 像素。
Definition: TextRenderer.cpp:187
YSLib::DS::UI::DualScreenReader::Line
Definition: DSReader.h:69
YSLib::DS::UI::DualScreenReader::LoadText
void LoadText(ifstream &, Text::Encoding)
载入指定编码的文本。
Definition: DSReader.cpp:419
YSLib
YSLib 命名空间。
Definition: AndroidHost.h:45
YSLib::DS::UI::DualScreenReader::Execute
bool Execute(Command)
执行阅读器命令。
Definition: DSReader.cpp:320
YSLib::DS::UI::DualScreenReader::Up
Definition: DSReader.h:67
CHRLib::e
const char const char * e
Definition: CharacterProcessing.h:109
YSLib::DS::UI::DualScreenReader::i_btm
Text::TextFileBuffer::iterator i_btm
Definition: DSReader.h:97
YSLib::DS::UI::DualScreenReader::ScrollByPixel
Drawing::FontSize ScrollByPixel(Drawing::FontSize)
向下滚屏指定像素行。
Definition: DSReader.cpp:468
YSLib::DS::UI::DualScreenReader::AdjustScrollOffset
Drawing::FontSize AdjustScrollOffset()
调整滚屏像素偏移量：立即继续滚动至下一整文本行。
Definition: DSReader.cpp:292
YSLib::Drawing::PenStyle::Font
Drawing::Font Font
字体。
Definition: TextBase.h:57
YSLib::DS::UI::DualScreenReader::SetVisible
void SetVisible(bool=true)
设置文本区域可见性。
Definition: DSReader.cpp:238
YSLib::Drawing::FetchLastLineBasePosition
YF_API SPos FetchLastLineBasePosition(const TextState &, SDst)
取指定文本状态在指定高的区域中表示的最底行的基线位置（纵坐标）。
Definition: TextLayout.cpp:60
YSLib::UI::Styles::Window
窗口背景。
Definition: YStyle.h:311
YSLib::Text::TextFileBuffer::iterator
目标编码迭代器类型。
Definition: TextManager.h:68
YSLib::Drawing::PutLine
_tIter PutLine(_tRenderer &rd, _tIter s)
打印迭代器指定的起始字符的字符串，直至行尾或字符迭代终止。
Definition: TextRenderer.h:170
YSLib::DS::UI::DualScreenReader::overread_line_n
std::uint16_t overread_line_n
读入文件结束后的空行数。
Definition: DSReader.h:105
YSLib::Drawing::GBinaryGroup::Y
_type Y
分量。
Definition: YGDIBase.h:63
YSLib::DS::UI::DualScreenReader::Detach
void Detach()
从窗口分离。
Definition: DSReader.cpp:307
YSLib::DS::UI::DualScreenReader::UnloadText
void UnloadText()
卸载文本。
Definition: DSReader.cpp:508
YSLib::Drawing::char32_t
tr TextRegion &tr char32_t
Definition: TextLayout.h:92
YSLib::DS::UI::DualScreenReader::MoveUpForLastLine
void MoveUpForLastLine(ptrdiff_t, size_t)
Definition: DSReader.cpp:438
CHRLib::CharSet::Encoding
Encoding
字符流编码标识。
Definition: Encoding.h:58
YSLib::UI::Invalidate
YF_API void Invalidate(IWidget &, const Rect &)
无效化：使相对部件的指定区域在直接和间接的窗口缓冲区中无效。
Definition: YWidget.cpp:108
YSLib::UI::SetSizeOf
YF_API void SetSizeOf(IWidget &, const Size &)
设置部件大小。
Definition: YWidget.cpp:83
YSLib::DS::UI::DualScreenReader::SetFontSize
void SetFontSize(Drawing::FontSize=Drawing::Font::DefaultSize)
设置文本区域的字体大小。
Definition: DSReader.cpp:255
YB_UNLIKELY
#define YB_UNLIKELY(_expr)
分支预测提示。
Definition: ydef.h:438
YSLib::Drawing::Font::GetHeight
FontSize GetHeight() const ynothrow
取字体对应的字符高度。
Definition: Font.cpp:526
YSLib::DS::UI::DualScreenReader::i_top
Text::TextFileBuffer::iterator i_top
文本区域输入迭代器。
Definition: DSReader.h:96
platform::Deref
yconstfn auto Deref(_type &&p) -> decltype(*p)
断言并解引用非空指针。
Definition: Debug.h:440
YSLib::DS::UI::DualScreenReader::ViewChanged
std::function< void()> ViewChanged
视图变更回调函数。
Definition: DSReader.h:136
platform::SPos
std::int16_t SPos
屏幕坐标度量。
Definition: Video.h:42
YSLib::DS::UI::DualScreenReader::scroll_offset
Drawing::FontSize scroll_offset
滚屏像素偏移量。
Definition: DSReader.h:110
YSLib::Drawing::c
The boundary is out of the const Graphics const Rect const Point const Point Color c const Rect const Rect Color c
Definition: YDraw.h:174
YSLib::Drawing::TextState::ResetPen
PDefHOp(TextState &,=, const PenStyle &ps) ImplRet(PenStyle void ResetPen()
赋值：笔样式。
Definition: TextBase.h:145
DS
YSLib::YAssert
YAssert(!(v< Deref(a)),"Value less than lower bound found.")
YSLib::UI::Widget::Background
HBrush Background
背景。
Definition: YWidget.h:391
yunseq
#define yunseq
无序列依赖表达式组求值。
Definition: ydef.h:996
DSReader.h
适用于 DS 的双屏阅读器。
YSLib::DS::UI::DualScreenReader::AdjustForFirstNewline
void AdjustForFirstNewline()
Definition: DSReader.cpp:263
YSLib::Drawing::SetCurrentTextLineNOf
void SetCurrentTextLineNOf(TextState &ts, std::uint16_t n)
Definition: TextBase.cpp:75
YSLib::Drawing::Rect
屏幕标准矩形：表示屏幕矩形区域。
Definition: YGDIBase.h:540
YSLib::Drawing::Padding::Top
SPos Top
Definition: YGDI.h:52
YSLib::Drawing::Size
屏幕区域大小。
Definition: YGDIBase.h:293
YSLib::Drawing::r
The boundary is out of the const Graphics const Rect const Point const Point Color c const Rect const Rect & r
Definition: YDraw.h:174
YSLib::DS::UI::DualScreenReader::Attach
void Attach(YSLib::UI::Window &, YSLib::UI::Window &)
附加到窗口。
Definition: DSReader.cpp:299
YSLib::Drawing::TextState::LineGap
std::uint8_t LineGap
行距。
Definition: TextBase.h:99
YSLib::Drawing::TextState::Margin
Padding Margin
边距：文本区域到显示区域的距离。
Definition: TextBase.h:93
Drawing
YSLib::DS::UI::DualScreenReader::Scroll
Definition: DSReader.h:66
YSLib::DS::UI::DualScreenReader::UpdateView
void UpdateView()
更新视图。
Definition: DSReader.cpp:516
UI
YSLib::DS::UI::DualScreenReader::Margin
Drawing::Padding Margin
公用边距。
Definition: DSReader.h:119
YSLib::DS::UI::DualScreenReader::PutLastLine
Text::TextFileBuffer::iterator PutLastLine()
Definition: DSReader.cpp:449
YSLib::DS::UI::DualScreenReader::p_text
unique_ptr< Text::TextFileBuffer > p_text
文本资源。
Definition: DSReader.h:86
ystdex::next_if_eq
_tIn next_if_eq(_tIn i, const _type &val, typename std::iterator_traits< _tIn >::difference_type n=1)
Definition: iterator_op.hpp:63
YSLib::DS::UI::DualScreenReader::SetLineGap
void SetLineGap(std::uint8_t=0)
设置行距。
Definition: DSReader.cpp:228
YSLib::i
return i
Definition: YCoreUtilities.h:176
YSLib::DS::UI::DualScreenReader::Command
Command
命令类型。
Definition: DSReader.h:63
YSLib::DS::UI::DualScreenReader::Locate
void Locate(size_t)
文本定位。
Definition: DSReader.cpp:395
YSLib::DS::UI::DualScreenReader::area_dn
YSLib::UI::BufferedTextArea area_dn
Definition: DSReader.h:128
YSLib::p_con
name const ValueNode::Container * p_con
Definition: ValueNode.h:627
YSLib::DS::UI::DualScreenReader::Invalidate
void Invalidate()
无效化文本区域，并调用 ViewChanged （仅当非空）。
Definition: DSReader.cpp:383
YB_LIKELY
#define YB_LIKELY(_expr)
Definition: ydef.h:437
Text
YSLib::Text::TextFileBuffer
文本文件块缓冲区。
Definition: TextManager.h:46
YSLib::Drawing::Padding::Bottom
SPos Bottom
Definition: YGDI.h:52
YSLib::DS::UI::DualScreenReader::AdjustMargins
void AdjustMargins()
调整边距：使用公用边距更新各文本显示区域的边距。
Definition: DSReader.cpp:275
YSLib::UI::Window
窗口。
Definition: YWindow.h:44
YSLib::Drawing::PutString
_tIter PutString(_tRenderer &rd, _tIter s)
打印迭代器指定的起始字符的字符串，直至区域末尾或字符迭代终止。
Definition: TextRenderer.h:242
ystdex::cpp2011::begin
_type * begin(_type(&&array)[_vN])
Definition: range.hpp:46
YSLib::Drawing::g
The boundary is out of the const Graphics & g
Definition: YDraw.h:161
ystdex::cpp2011::end
_type * end(_type(&&array)[_vN])
Definition: range.hpp:54
CHRLib::s
_tDst const _tSrc * s
Definition: CharacterProcessing.h:140
platform::bool
std::FILE *fp bool
Definition: FileIO.h:1187
YSLib::Drawing::AdjustBottomMarginOf
tr AdjustBottomMarginOf
Definition: TextLayout.h:81
platform::n
size_t n
Definition: YCLib/FileSystem.cpp:321
platform::SDst
std::uint16_t SDst
屏幕坐标距离。
Definition: Video.h:43