4#ifndef _Stroika_Frameworks_Led_BiDiLayoutEngine_h_
5#define _Stroika_Frameworks_Led_BiDiLayoutEngine_h_ 1
7#include "Stroika/Frameworks/StroikaPreComp.h"
23#include "Stroika/Frameworks/Led/GDI.h"
24#include "Stroika/Frameworks/Led/Support.h"
26namespace Stroika::Frameworks::Led {
48#ifndef qTryToUseUNISCRIBEForTextRuns
49#if qStroika_Foundation_Common_Platform_Windows && qUniscribeAvailableWithSDK
50#define qTryToUseUNISCRIBEForTextRuns 1
52#define qTryToUseUNISCRIBEForTextRuns 0
71 class TextLayoutBlock {
73 TextLayoutBlock () =
default;
74 virtual ~TextLayoutBlock () =
default;
77 nonvirtual
const Led_tChar* PeekAtRealText ()
const;
78 nonvirtual
const Led_tChar* PeekAtVirtualText ()
const;
79 nonvirtual
size_t GetTextLength ()
const;
82 virtual void PeekAtRealText_ (
const Led_tChar** startText,
const Led_tChar** endText)
const = 0;
83 virtual void PeekAtVirtualText_ (
const Led_tChar** startText,
const Led_tChar** endText)
const = 0;
86 nonvirtual TextDirection GetCharacterDirection (
size_t realCharOffset)
const;
89 nonvirtual
size_t MapRealOffsetToVirtual (
size_t i)
const;
90 nonvirtual
size_t MapVirtualOffsetToReal (
size_t i)
const;
95 TextDirection fDirection;
101 nonvirtual
bool operator== (
const ScriptRunElt& rhs)
const =
default;
103 struct LessThanVirtualStart;
106 virtual vector<ScriptRunElt> GetScriptRuns ()
const = 0;
109 nonvirtual
void CopyOutRealText (
const ScriptRunElt& scriptRunElt, Led_tChar* buf)
const;
110 nonvirtual
void CopyOutVirtualText (
const ScriptRunElt& scriptRunElt, Led_tChar* buf)
const;
113 nonvirtual
void PeekAtRealText (
const ScriptRunElt& scriptRunElt,
const Led_tChar** startText,
const Led_tChar** endText)
const;
114 nonvirtual Led_tString GetRealText ()
const;
115 nonvirtual Led_tString GetRealText (
const ScriptRunElt& scriptRunElt)
const;
116 nonvirtual
void PeekAtVirtualText (
const ScriptRunElt& scriptRunElt,
const Led_tChar** startText,
const Led_tChar** endText)
const;
117 nonvirtual Led_tString GetVirtualText ()
const;
118 nonvirtual Led_tString GetVirtualText (
const ScriptRunElt& scriptRunElt)
const;
121 nonvirtual
bool operator== (
const TextLayoutBlock& rhs)
const;
125 nonvirtual
void Invariant ()
const;
126#if qStroika_Foundation_Debug_AssertionsChecked
128 virtual void Invariant_ ()
const;
144 struct TextLayoutBlock::LessThanVirtualStart {
145 bool operator() (
const ScriptRunElt& lhs,
const ScriptRunElt& rhs)
147 int diff = int (lhs.fVirtualStart) - int (rhs.fVirtualStart);
157 class TextLayoutBlock_Basic :
public TextLayoutBlock {
159 using inherited = TextLayoutBlock;
162 TextLayoutBlock_Basic (
const Led_tChar* realText,
const Led_tChar* realTextEnd);
163 TextLayoutBlock_Basic (
const Led_tChar* realText,
const Led_tChar* realTextEnd, TextDirection initialDirection);
166 nonvirtual
void Construct (
const Led_tChar* realText,
const Led_tChar* realTextEnd,
const TextDirection* initialDirection);
169#if qTryToUseUNISCRIBEForTextRuns
170 nonvirtual
bool Construct_UNISCRIBE (
const TextDirection* initialDirection);
173 nonvirtual
void Construct_FriBidi (
const TextDirection* initialDirection);
176 nonvirtual
void Construct_ICU (
const TextDirection* initialDirection);
178 nonvirtual
void Construct_Default ();
181 virtual void PeekAtRealText_ (
const Led_tChar** startText,
const Led_tChar** endText)
const override;
182 virtual void PeekAtVirtualText_ (
const Led_tChar** startText,
const Led_tChar** endText)
const override;
185 virtual vector<ScriptRunElt> GetScriptRuns ()
const override;
189 Foundation::Memory::InlineBuffer<Led_tChar> fRealText;
190 Foundation::Memory::InlineBuffer<Led_tChar> fVirtualText;
191 vector<ScriptRunElt> fScriptRuns;
201 class TextLayoutBlock_Copy :
public TextLayoutBlock {
203 using inherited = TextLayoutBlock;
206 TextLayoutBlock_Copy (
const TextLayoutBlock& from);
207 TextLayoutBlock_Copy (
const TextLayoutBlock_Copy& from);
210 virtual void PeekAtRealText_ (
const Led_tChar** startText,
const Led_tChar** endText)
const override;
211 virtual void PeekAtVirtualText_ (
const Led_tChar** startText,
const Led_tChar** endText)
const override;
214 virtual vector<ScriptRunElt> GetScriptRuns ()
const override;
218 nonvirtual
void operator delete (
void* p);
220 size_t fTextLength{};
221 const Led_tChar* fRealText{};
222 const Led_tChar* fVirtualText{};
223 const ScriptRunElt* fScriptRuns{};
224 const ScriptRunElt* fScriptRunsEnd{};
227 shared_ptr<BlockRep> fRep;
242 class TextLayoutBlock_VirtualSubset :
public TextLayoutBlock {
244 using inherited = TextLayoutBlock;
247 TextLayoutBlock_VirtualSubset (
const TextLayoutBlock& subsetOf,
size_t vStart,
size_t vEnd);
250 virtual void PeekAtRealText_ (
const Led_tChar** startText,
const Led_tChar** endText)
const override;
251 virtual void PeekAtVirtualText_ (
const Led_tChar** startText,
const Led_tChar** endText)
const override;
254 virtual vector<ScriptRunElt> GetScriptRuns ()
const override;
257 const TextLayoutBlock& fSubsetOf;
260 vector<ScriptRunElt> fScriptRuns;
261 Foundation::Memory::InlineBuffer<Led_tChar> fRealText;
271#include "BiDiLayoutEngine.inl"