4#ifndef _Stroika_Frameworks_Led_MultiRowTextImager_h_
5#define _Stroika_Frameworks_Led_MultiRowTextImager_h_ 1
7#include "Stroika/Frameworks/StroikaPreComp.h"
19#include "LineBasedPartition.h"
20#include "PartitioningTextImager.h"
22namespace Stroika::Frameworks::Led {
24#if qStroika_Frameworks_Led_SupportGDI
38 class MultiRowTextImager :
public PartitioningTextImager {
40 MultiRowTextImager () =
default;
41 virtual ~MultiRowTextImager ();
44 MultiRowTextImager (
const MultiRowTextImager&) =
delete;
45 nonvirtual
void operator= (
const MultiRowTextImager&) =
delete;
48 using inherited = PartitioningTextImager;
51 virtual void HookLosingTextStore ()
override;
52 nonvirtual
void HookLosingTextStore_ ();
53 virtual void HookGainedNewTextStore ()
override;
54 nonvirtual
void HookGainedNewTextStore_ ();
57 class PartitionElementCacheInfo;
60 virtual void SetPartition (
const PartitionPtr& partitionPtr)
override;
63 virtual PartitionPtr MakeDefaultPartition ()
const override;
76 RowReference (
const RowReference& from) =
default;
77 RowReference (PartitionMarker* partitionMarker,
size_t subRow);
82 nonvirtual RowReference& operator= (
const RowReference& rhs);
85 nonvirtual PartitionMarker* GetPartitionMarker ()
const;
86 nonvirtual
size_t GetSubRow ()
const;
89 nonvirtual
bool operator== (RowReference rhs)
const;
92 PartitionMarker* fPartitionMarker;
95 friend class RowReference;
98 nonvirtual PartitionElementCacheInfo GetPartitionElementCacheInfo (Partition::PartitionMarker* pm)
const;
99 nonvirtual PartitionElementCacheInfo GetPartitionElementCacheInfo (RowReference row)
const;
102 class PMInfoCacheMgr;
103 unique_ptr<PMInfoCacheMgr> fPMCacheMgr;
107 nonvirtual
bool GetNextRowReference (RowReference* adjustMeInPlace)
const;
108 nonvirtual
bool GetPreviousRowReference (RowReference* adjustMeInPlace)
const;
111 nonvirtual
bool GetIthRowReferenceFromHere (RowReference* adjustMeInPlace, ptrdiff_t ith)
const;
112 nonvirtual RowReference GetIthRowReferenceFromHere (RowReference fromHere, ptrdiff_t ith)
const;
113 nonvirtual RowReference GetIthRowReference (
size_t ith)
const;
115 nonvirtual
size_t GetRowNumber (RowReference rowRef)
const;
118 nonvirtual
size_t CountRowDifference (RowReference lhs, RowReference rhs)
const;
119 nonvirtual
size_t CountRowDifferenceLimited (RowReference lhs, RowReference rhs,
size_t limit)
const;
125 virtual size_t GetTopRowInWindow ()
const override;
126 virtual size_t GetTotalRowsInWindow ()
const override;
127 virtual size_t GetLastRowInWindow ()
const override;
128 virtual void SetTopRowInWindow (
size_t newTopRow)
override;
129 virtual size_t GetMarkerPositionOfStartOfWindow ()
const override;
130 virtual size_t GetMarkerPositionOfEndOfWindow ()
const override;
131 virtual size_t GetMarkerPositionOfStartOfLastRowOfWindow ()
const override;
132 virtual ptrdiff_t CalculateRowDeltaFromCharDeltaFromTopOfWindow (
long deltaChars)
const override;
133 virtual ptrdiff_t CalculateCharDeltaFromRowDeltaFromTopOfWindow (ptrdiff_t deltaRows)
const override;
134 virtual void ScrollByIfRoom (ptrdiff_t downByRows);
140 virtual void ScrollSoShowing (
size_t markerPos,
size_t andTryToShowMarkerPos = 0)
override;
143 nonvirtual RowReference GetTopRowReferenceInWindow ()
const;
144 nonvirtual RowReference GetLastRowReferenceInWindow ()
const;
145 virtual void SetTopRowInWindow (RowReference row);
148 nonvirtual
void SetTopRowInWindow_ (RowReference row);
155 virtual void AssureWholeWindowUsedIfNeeded ()
override;
158 virtual Led_Rect GetCharLocation (
size_t afterPosition)
const override;
159 virtual size_t GetCharAtLocation (
const Led_Point& where)
const override;
160 virtual Led_Rect GetCharWindowLocation (
size_t afterPosition)
const override;
161 virtual size_t GetCharAtWindowLocation (
const Led_Point& where)
const override;
163 virtual size_t GetStartOfRow (
size_t rowNumber)
const override;
164 virtual size_t GetStartOfRowContainingPosition (
size_t charPosition)
const override;
165 virtual size_t GetEndOfRow (
size_t rowNumber)
const override;
166 virtual size_t GetEndOfRowContainingPosition (
size_t charPosition)
const override;
167 virtual size_t GetRealEndOfRow (
size_t rowNumber)
const override;
168 virtual size_t GetRealEndOfRowContainingPosition (
size_t charPosition)
const override;
169 virtual size_t GetRowContainingPosition (
size_t charPosition)
const override;
170 virtual size_t GetRowCount ()
const override;
171 virtual Led_Rect GetCharLocationRowRelativeByPosition (
size_t afterPosition,
size_t positionOfTopRow,
size_t maxRowsToCheck)
const override;
174 nonvirtual
size_t GetStartOfRow (RowReference row)
const;
175 nonvirtual
size_t GetEndOfRow (RowReference row)
const;
176 nonvirtual
size_t GetRealEndOfRow (RowReference row)
const;
177 nonvirtual RowReference GetRowReferenceContainingPosition (
size_t charPosition)
const;
178 nonvirtual
size_t GetRowLength (RowReference row)
const;
181 virtual DistanceType GetRowHeight (
size_t rowNumber)
const override;
182 nonvirtual DistanceType GetRowHeight (RowReference row)
const;
185 virtual DistanceType GetRowRelativeBaselineOfRowContainingPosition (
size_t charPosition)
const override;
188 nonvirtual DistanceType GetHeightOfRows (
size_t startingRow,
size_t rowCount)
const;
189 nonvirtual DistanceType GetHeightOfRows (RowReference startingRow,
size_t rowCount)
const;
192 virtual void GetStableTypingRegionContaingMarkerRange (
size_t fromMarkerPos,
size_t toMarkerPos,
size_t* expandedFromMarkerPos,
193 size_t* expandedToMarkerPos)
const;
196 virtual void Draw (
const Led_Rect& subsetToDraw,
bool printing);
199 virtual void DrawPartitionElement (PartitionMarker* pm,
size_t startSubRow,
size_t maxSubRow, Tablet* tablet, OffscreenTablet* offscreenTablet,
200 bool printing,
const Led_Rect& subsetToDraw, Led_Rect* remainingDrawArea,
size_t* rowsDrawn);
203 virtual Led_Rect GetCharLocationRowRelative (
size_t afterPosition, RowReference topRow,
size_t maxRowsToCheck = UINT_MAX)
const;
204 virtual size_t GetCharAtLocationRowRelative (
const Led_Point& where, RowReference topRow,
size_t maxRowsToCheck = UINT_MAX)
const;
207 virtual void FillCache (PartitionMarker* pm, PartitionElementCacheInfo& cacheInfo) = 0;
208 virtual DistanceType CalculateInterLineSpace (
const PartitionMarker* pm)
const;
211 virtual bool ContainsMappedDisplayCharacters (
const Led_tChar* text,
size_t nTChars)
const;
212 virtual size_t RemoveMappedDisplayCharacters (Led_tChar* copyText,
size_t nTChars)
const;
217 virtual void SetDefaultFont (
const IncrementalFontSpecification& defaultFont);
219 nonvirtual
void SetDefaultFont_ (
const IncrementalFontSpecification& );
224 virtual void DidUpdateText (
const UpdateInfo& updateInfo)
noexcept;
228 virtual void SetWindowRect (
const Led_Rect& windowRect)
override;
231 virtual void InvalidateAllCaches ()
override;
234 nonvirtual RowReference AdjustPotentialTopRowReferenceSoWholeWindowUsed (
const RowReference& potentialTopRow);
235 nonvirtual
bool PositionWouldFitInWindowWithThisTopRow (
size_t markerPos,
const RowReference& newTopRow);
238 PartitionMarker* fTopLinePartitionMarkerInWindow{
nullptr};
239 size_t fSubRowInTopLineInWindow{0};
242 nonvirtual
void ReValidateSubRowInTopLineInWindow ();
249 mutable size_t fTotalRowsInWindow{0};
251 nonvirtual
size_t GetTotalRowsInWindow_ ()
const;
252 nonvirtual
void InvalidateTotalRowsInWindow ();
253 virtual size_t ComputeRowsThatWouldFitInWindowWithTopRow (
const RowReference& newTopRow)
const;
256 friend class PMInfoCacheMgr;
264 class MultiRowTextImager::PartitionElementCacheInfo {
266 PartitionElementCacheInfo ();
269 nonvirtual DistanceType GetPixelHeight ()
const;
270 nonvirtual
size_t GetRowCount ()
const;
271 nonvirtual
size_t PeekRowCount ()
const;
272 nonvirtual
size_t GetLastRow ()
const;
273 nonvirtual DistanceType GetRowHeight (
size_t ithRow)
const;
274 nonvirtual
size_t GetLineRelativeRowStartPosition (
size_t ithRow)
const;
275 nonvirtual
size_t LineRelativePositionInWhichRow (
size_t charPos)
const;
278 nonvirtual DistanceType GetInterLineSpace ()
const;
279 nonvirtual
void SetInterLineSpace (DistanceType interlineSpace);
285 nonvirtual
void Clear ();
286 nonvirtual
void IncrementRowCountAndFixCacheBuffers (
size_t newStart, DistanceType newRowsHeight);
292 nonvirtual DistanceType PeekAtRowHeight (
size_t ithRow)
const;
293 nonvirtual
void SetRowHeight (
size_t i, DistanceType rowHeight);
295 nonvirtual
size_t PeekAtRowStart (
size_t i)
const;
296 nonvirtual
void SetRowStart (
size_t i,
size_t rowStart);
299 using RowHeight_ = uint16_t;
303 using RowStart_ = size_t;
305 kPackRowStartCount =
sizeof (RowStart_*) /
sizeof (RowStart_)
308 kPackRowHeightCount =
sizeof (RowHeight_*) /
sizeof (RowHeight_)
312 struct Rep :
public Foundation::Memory::UseBlockAllocationIfAppropriate<Rep> {
318 DistanceType fInterlineSpace;
319 DistanceType fPixelHeightCache;
320 size_t fRowCountCache;
321 RowStart_* fRowStartArray;
322 RowHeight_* fRowHeightArray;
325 Rep (
const Rep&) =
delete;
326 void operator= (
const Rep&) =
delete;
330 shared_ptr<Rep> fRep;
334 friend class shared_ptr<Rep>;
343 class MultiRowTextImager::PMInfoCacheMgr :
public Partition::PartitionWatcher {
345 using inherited = Partition::PartitionWatcher;
348 PMInfoCacheMgr (MultiRowTextImager& imager);
352 nonvirtual MultiRowTextImager::PartitionElementCacheInfo GetPartitionElementCacheInfo (Partition::PartitionMarker* pm)
const;
355 nonvirtual
void ClearCache ();
358 virtual void AboutToSplit (PartitionMarker* pm,
size_t at,
void** infoRecord)
const noexcept override;
359 virtual void DidSplit (
void* infoRecord)
const noexcept override;
360 virtual void AboutToCoalece (PartitionMarker* pm,
void** infoRecord)
const noexcept override;
361 virtual void DidCoalece (
void* infoRecord)
const noexcept override;
364 nonvirtual
void MyMarkerDidUpdateCallback ();
368 mutable map<PartitionMarker*, PartitionElementCacheInfo> fPMCache;
369 mutable PartitionMarker* fCurFillCachePM;
370 mutable PartitionElementCacheInfo fCurFillCacheInfo;
371 MultiRowTextImager& fImager;
372 unique_ptr<MyMarker> fMyMarker;
375 friend class MyMarker;
385 class MultiRowTextImager::PMInfoCacheMgr::MyMarker :
public Marker {
387 using inherited = Marker;
390 MyMarker (PMInfoCacheMgr& pmInfoCacheMgr);
393 virtual void DidUpdateText (
const UpdateInfo& updateInfo)
noexcept override;
396 PMInfoCacheMgr& fPMInfoCacheMgr;
407#include "MultiRowTextImager.inl"