4#ifndef _Stroika_Frameworks_Led_BiDiLayoutEngine_h_
5#define _Stroika_Frameworks_Led_BiDiLayoutEngine_h_ 1
7#include "Stroika/Frameworks/StroikaPreComp.h"
27#include "Stroika/Frameworks/Led/GDI.h"
28#include "Stroika/Frameworks/Led/Support.h"
30namespace Stroika::Frameworks::Led {
37 class TextLayoutBlock {
39 TextLayoutBlock () =
default;
40 virtual ~TextLayoutBlock () =
default;
43 nonvirtual
const Led_tChar* PeekAtRealText ()
const;
44 nonvirtual
const Led_tChar* PeekAtVirtualText ()
const;
45 nonvirtual
size_t GetTextLength ()
const;
48 virtual void PeekAtRealText_ (
const Led_tChar** startText,
const Led_tChar** endText)
const = 0;
49 virtual void PeekAtVirtualText_ (
const Led_tChar** startText,
const Led_tChar** endText)
const = 0;
52 nonvirtual TextDirection GetCharacterDirection (
size_t realCharOffset)
const;
55 nonvirtual
size_t MapRealOffsetToVirtual (
size_t i)
const;
56 nonvirtual
size_t MapVirtualOffsetToReal (
size_t i)
const;
61 TextDirection fDirection;
67 nonvirtual
bool operator== (
const ScriptRunElt& rhs)
const =
default;
69 struct LessThanVirtualStart;
72 virtual vector<ScriptRunElt> GetScriptRuns ()
const = 0;
75 nonvirtual
void CopyOutRealText (
const ScriptRunElt& scriptRunElt, Led_tChar* buf)
const;
76 nonvirtual
void CopyOutVirtualText (
const ScriptRunElt& scriptRunElt, Led_tChar* buf)
const;
79 nonvirtual
void PeekAtRealText (
const ScriptRunElt& scriptRunElt,
const Led_tChar** startText,
const Led_tChar** endText)
const;
80 nonvirtual Led_tString GetRealText ()
const;
81 nonvirtual Led_tString GetRealText (
const ScriptRunElt& scriptRunElt)
const;
82 nonvirtual
void PeekAtVirtualText (
const ScriptRunElt& scriptRunElt,
const Led_tChar** startText,
const Led_tChar** endText)
const;
83 nonvirtual Led_tString GetVirtualText ()
const;
84 nonvirtual Led_tString GetVirtualText (
const ScriptRunElt& scriptRunElt)
const;
87 nonvirtual
bool operator== (
const TextLayoutBlock& rhs)
const;
91 nonvirtual
void Invariant ()
const;
92#if qStroika_Foundation_Debug_AssertionsChecked
94 virtual void Invariant_ ()
const;
110 struct TextLayoutBlock::LessThanVirtualStart {
111 bool operator() (
const ScriptRunElt& lhs,
const ScriptRunElt& rhs)
113 int diff = int (lhs.fVirtualStart) - int (rhs.fVirtualStart);
123 class TextLayoutBlock_Basic :
public TextLayoutBlock {
125 using inherited = TextLayoutBlock;
128 TextLayoutBlock_Basic (
const Led_tChar* realText,
const Led_tChar* realTextEnd);
129 TextLayoutBlock_Basic (
const Led_tChar* realText,
const Led_tChar* realTextEnd, TextDirection initialDirection);
132 nonvirtual
void Construct (
const Led_tChar* realText,
const Led_tChar* realTextEnd,
const TextDirection* initialDirection);
135 nonvirtual
void Construct_Default ();
138 virtual void PeekAtRealText_ (
const Led_tChar** startText,
const Led_tChar** endText)
const override;
139 virtual void PeekAtVirtualText_ (
const Led_tChar** startText,
const Led_tChar** endText)
const override;
142 virtual vector<ScriptRunElt> GetScriptRuns ()
const override;
146 Foundation::Memory::InlineBuffer<Led_tChar> fRealText;
147 Foundation::Memory::InlineBuffer<Led_tChar> fVirtualText;
148 vector<ScriptRunElt> fScriptRuns;
158 class TextLayoutBlock_Copy :
public TextLayoutBlock {
160 using inherited = TextLayoutBlock;
163 TextLayoutBlock_Copy (
const TextLayoutBlock& from);
164 TextLayoutBlock_Copy (
const TextLayoutBlock_Copy& from);
167 virtual void PeekAtRealText_ (
const Led_tChar** startText,
const Led_tChar** endText)
const override;
168 virtual void PeekAtVirtualText_ (
const Led_tChar** startText,
const Led_tChar** endText)
const override;
171 virtual vector<ScriptRunElt> GetScriptRuns ()
const override;
175 nonvirtual
void operator delete (
void* p);
177 size_t fTextLength{};
178 const Led_tChar* fRealText{};
179 const Led_tChar* fVirtualText{};
180 const ScriptRunElt* fScriptRuns{};
181 const ScriptRunElt* fScriptRunsEnd{};
184 shared_ptr<BlockRep> fRep;
199 class TextLayoutBlock_VirtualSubset :
public TextLayoutBlock {
201 using inherited = TextLayoutBlock;
204 TextLayoutBlock_VirtualSubset (
const TextLayoutBlock& subsetOf,
size_t vStart,
size_t vEnd);
207 virtual void PeekAtRealText_ (
const Led_tChar** startText,
const Led_tChar** endText)
const override;
208 virtual void PeekAtVirtualText_ (
const Led_tChar** startText,
const Led_tChar** endText)
const override;
211 virtual vector<ScriptRunElt> GetScriptRuns ()
const override;
214 const TextLayoutBlock& fSubsetOf;
217 vector<ScriptRunElt> fScriptRuns;
218 Foundation::Memory::InlineBuffer<Led_tChar> fRealText;
228#include "BiDiLayoutEngine.inl"