30 #include YFM_YSLib_UI_YWindow
31 #include YFM_YSLib_Service_TextLayout
36 using namespace Drawing;
47 template<
typename _tBi>
52 while(b != --s && *s !=
c)
61 template<
typename _tBi>
63 FindLineFeed(
const TextRegion&
r, _tBi s, _tBi e)
65 const SDst wmax(r.GetWidth() - GetHorizontalOf(r.Margin));
69 while(s != e && *s !=
'\n')
73 w += r.Font.GetAdvance(*s);
86 template<
typename _tBi>
88 FindPreviousLineFeed(TextRegion& r, _tBi s, _tBi b)
94 auto t(FindPreviousChar(s, b,
'\n'));
101 t = FindLineFeed(r, t, e);
111 template<
typename _tIn,
class _tArea,
class _tCon>
113 AdjustForNewline(_tArea& area, _tIn& i, _tCon&
c)
117 i = FindLineFeed(area,
next_if_eq(i,
'\n'), end(c));
124 template<
typename _tIn,
class _tArea,
class _tCon>
126 AdjustPrevious(_tArea& area, _tIn& i, _tCon& c)
130 i = FindPreviousLineFeed(area, i, begin(c));
147 size_t dst_offset, ptrdiff_t offset,
size_t n)
149 YAssert(n != 0,
"Invalid number of lines found.");
150 YAssert(n <=
size_t(std::abs(offset)),
"Invalid offset found.");
152 const SDst w(src_area.GetWidth());
154 YAssert(w == dst_area.GetWidth(),
"Distinct screen widths found.");
155 yunseq(src_offset *= w, dst_offset *= w, n *= w);
157 yunseq(std::copy_n(src_area.GetBufferPtr() + src_offset, n,
158 dst_area.GetBufferPtr() + dst_offset),
159 std::copy_n(src_area.GetBufferAlphaPtr() + src_offset, n,
160 dst_area.GetBufferAlphaPtr() + dst_offset));
174 "No enough space of areas found.");
177 dst_off(area_up.GetHeight() - area_up.
Margin.
Bottom - n);
178 auto* p_src(&area_dn);
179 auto* p_dst(&area_up);
189 clr_off = area_dn.GetHeight() - area_dn.
Margin.
Bottom - n;
190 CopyScrollArea(*p_src, src_off, *p_dst, dst_off, offset, n);
191 p_src->ClearLine(clr_off, n);
196 CheckOverRead(TextRegion& r)
200 return r.Pen.Y < b ? (b - r.Pen.Y) / GetTextLineHeightExOf(r) : 0;
213 : p_text(),
fc(fc_), i_top(), i_btm(), overread_line_n(0), scroll_offset(0),
215 area_up(
Rect({}, w, h_up),
fc), area_dn(
Rect({}, w, h_down),
fc)
237 SetVisibleOf(area_up, b), SetVisibleOf(area_dn, b);
247 DualScreenReader::SetFont(
const Font& fnt)
254 area_up.
Font.SetSize(s),
255 area_dn.
Font.SetSize(s);
308 if(
const auto p_con = dynamic_cast<Window*>(FetchContainerPtr(area_up)))
310 if(
const auto p_con = dynamic_cast<Window*>(FetchContainerPtr(area_dn)))
339 MoveScrollArea(area_up, area_dn, hx, h);
342 CarriageReturn(area_up);
353 CarriageReturn(area_dn);
361 auto ln(area_up.GetTextLineNEx() + area_dn.GetTextLineNEx());
367 while(ln-- && !IsTextBottom())
394 const auto s(
p_text->GetTextSize());
420 p_text = make_unique<Text::TextFileBuffer>(file);
436 MoveScrollArea(area_up, area_dn, off, h);
438 u16 n(area_dn.GetTextLineNEx());
440 YAssert(n != 0,
"No Enough height.");
454 area_up.ClearImage();
455 area_dn.ClearImage();
466 const FontSize ln_h_ex(GetTextLineHeightExOf(area_up));
475 CarriageReturn(area_dn);
494 RestrictInClosedInterval<SDst>(h, 0, MainScreenHeight - 40);
495 h = MainScreenHeight - h;
497 const SDst w(area_dn.GetWidth());
500 area_dn.SetSize(w, h);
void AdjustForFirstNewline()
void AdjustForPrevNewline()
Drawing::FontSize ScrollByPixel(Drawing::FontSize)
向下滚屏指定像素行。
Drawing::FontSize AdjustScrollOffset()
调整滚屏像素偏移量:立即继续滚动至下一整文本行。
Drawing::FontSize scroll_offset
滚屏像素偏移量。
Text::TextFileBuffer::iterator i_top
文本区域输入迭代器。
YF_API void Invalidate(IWidget &, const Rect &)
无效化:使相对于部件的指定区域在直接和间接的窗口缓冲区中无效。
void SetVisible(bool=true)
设置文本区域可见性。
YF_API void SetSizeOf(IWidget &, const Size &)
设置部件大小。
std::uint16_t SDst
屏幕坐标距离。
SDst AdjustBottomMarginOf(TextRegion &tr)
按字体高度和行距调整文本区域的底边距。
YF_API SPos FetchLastLineBasePosition(const TextState &, SDst)
取指定文本状态在指定高的区域中表示的最底行的基线位置(纵坐标)。
Padding Margin
边距:文本区域到显示区域的距离。
YSLib::UI::BufferedTextArea area_up
上下屏幕对应文本区域。
void swap(any &x, any &y)
交换对象。
#define YB_UNLIKELY(expr)
分支预测提示。
#define yunseq
无序列依赖表达式组求值。
void Attach(YSLib::UI::Window &, YSLib::UI::Window &)
附加到窗口。
Text::TextFileBuffer::iterator PutLastLine()
YSLib::UI::BufferedTextArea area_dn
Drawing::Padding Margin
公用边距。
void MoveUpForLastLine(ptrdiff_t, size_t)
bool Execute(Command)
执行阅读器命令。
void SetCurrentTextLineNOf(TextState &ts, u16 n)
_tIter PutLine(_tRenderer &r, _tIter s)
打印迭代器指定的起始字符的字符串,直至行尾或字符迭代终止。
unique_ptr< Text::TextFileBuffer > p_text
文本资源。
void SetLineGap(u8=0)
设置行距。
_tIter PutString(_tRenderer &r, _tIter s)
打印迭代器指定的起始字符的字符串,直至区域末尾或字符迭代终止。
char32_t ucs4_t
UCS-4 字符类型。
void Invalidate()
无效化文本区域,并调用 ViewChanged (仅当非空)。
std::function< void()> ViewChanged
视图变更回调函数。
void AdjustMargins()
调整边距:使用公用边距更新各文本显示区域的边距。
Text::TextFileBuffer::iterator i_btm
FontSize GetHeight() const ynothrow
取字体对应的字符高度。
void Scroll(ptrdiff_t n)
缓冲区特效:整体移动 n 像素。
_tIn next_if_eq(_tIn i, const _type &val, typename std::iterator_traits< _tIn >::difference_type n=1)
PDefHOp(TextState &,=, const PenStyle &ps) ImplRet(PenStyle void ResetPen()
赋值:笔样式。
void SetFontSize(Drawing::FontSize=Drawing::Font::DefaultSize)
设置文本区域的字体大小。
u16 overread_line_n
读入文件结束后的空行数。
#define YAssert(_expr, _msg)
void Stretch(SDst)
伸缩:从最大值起向上调整(减少)下文字区域的高后更新视图。
void LoadText(TextFile &)
载入文本。