4#ifndef _Stroika_Frameworks_Led_StyledTextImager_h_
5#define _Stroika_Frameworks_Led_StyledTextImager_h_ 1
7#include "Stroika/Frameworks/StroikaPreComp.h"
9#include "Stroika/Frameworks/Led/MarkerCover.h"
10#include "Stroika/Frameworks/Led/Support.h"
11#include "Stroika/Frameworks/Led/TextImager.h"
21#if qStroika_Foundation_Common_Platform_MacOS
26namespace Stroika::Frameworks::Led {
34#ifndef qStroika_Frameworks_Led_AssertWarningForEqualPriorityMarkers
35#define qStroika_Frameworks_Led_AssertWarningForEqualPriorityMarkers qStroika_Foundation_Debug_AssertionsChecked
55 struct StyleRunElement {
56 StyleRunElement (StyleMarker* marker,
size_t length);
58 StyleMarker* fMarker{
nullptr};
60 vector<StyleMarker*> fSupercededMarkers;
63#if qStroika_Frameworks_Led_SupportGDI
64 class StyledTextImager;
73 class StyleMarker :
public Marker {
75 StyleMarker () =
default;
83 virtual int GetPriority ()
const;
85#if qStroika_Frameworks_Led_SupportGDI
94 virtual void DrawSegment (
const StyledTextImager* imager,
const StyleRunElement& runElement, Tablet* tablet,
size_t from,
size_t to,
95 const TextLayoutBlock& text,
const Led_Rect& drawInto,
const Led_Rect& invalidRect,
96 CoordinateType useBaseLine, DistanceType* pixelsDrawn) = 0;
103 virtual void MeasureSegmentWidth (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to,
104 const Led_tChar* text, DistanceType* distanceResults)
const = 0;
110 virtual DistanceType MeasureSegmentHeight (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to)
const = 0;
117 virtual DistanceType MeasureSegmentBaseLine (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to)
const = 0;
129 class StyleMarkerSummarySink :
public TextStore::MarkerSink {
131 using inherited = TextStore::MarkerSink;
134 StyleMarkerSummarySink (
size_t from,
size_t to);
135 StyleMarkerSummarySink (
size_t from,
size_t to,
const TextLayoutBlock& text);
138 nonvirtual vector<StyleRunElement> ProduceOutputSummary ()
const;
141 virtual void Append (Marker* m)
override;
144 virtual void CombineElements (StyleRunElement* runElement, StyleMarker* newStyleMarker);
147 nonvirtual
void SplitIfNeededAt (
size_t markerPos);
150 vector<StyleRunElement> fBuckets;
151 const TextLayoutBlock* fText;
161 class StyleMarkerSummarySinkForSingleOwner :
public StyleMarkerSummarySink {
163 using inherited = StyleMarkerSummarySink;
166 StyleMarkerSummarySinkForSingleOwner (
const MarkerOwner& owner,
size_t from,
size_t to);
167 StyleMarkerSummarySinkForSingleOwner (
const MarkerOwner& owner,
size_t from,
size_t to,
const TextLayoutBlock& text);
170 virtual void CombineElements (StyleRunElement* runElement, StyleMarker* newStyleMarker)
override;
173 const MarkerOwner& fOwner;
189 template <
class BASECLASS = StyleMarker>
190 class SimpleStyleMarkerByFontSpec :
public BASECLASS {
192 using inherited = BASECLASS;
195 SimpleStyleMarkerByFontSpec () =
default;
197#if qStroika_Frameworks_Led_SupportGDI
207 virtual FontSpecification MakeFontSpec (
const StyledTextImager* imager,
const StyleRunElement& runElement)
const;
210#if qStroika_Frameworks_Led_SupportGDI
212 virtual void DrawSegment (
const StyledTextImager* imager,
const StyleRunElement& runElement, Tablet* tablet,
size_t from,
size_t to,
213 const TextLayoutBlock& text,
const Led_Rect& drawInto,
const Led_Rect& ,
214 CoordinateType useBaseLine, DistanceType* pixelsDrawn)
override;
215 virtual void MeasureSegmentWidth (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to,
216 const Led_tChar* text, DistanceType* distanceResults)
const override;
217 virtual DistanceType MeasureSegmentHeight (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to)
const override;
218 virtual DistanceType MeasureSegmentBaseLine (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to)
const override;
229 template <
class BASECLASS>
230 class SimpleStyleMarkerByIncrementalFontSpec :
public BASECLASS {
232 using inherited = BASECLASS;
235 SimpleStyleMarkerByIncrementalFontSpec (
const IncrementalFontSpecification& styleInfo = IncrementalFontSpecification ());
237#if qStroika_Frameworks_Led_SupportGDI
239 virtual FontSpecification MakeFontSpec (
const StyledTextImager* imager,
const StyleRunElement& runElement)
const override;
243 IncrementalFontSpecification fFontSpecification;
253 class TrivialFontSpecStyleMarker :
public SimpleStyleMarkerByIncrementalFontSpec<SimpleStyleMarkerByFontSpec<>>,
254 public Foundation::Memory::UseBlockAllocationIfAppropriate<TrivialFontSpecStyleMarker> {
256 using inherited = SimpleStyleMarkerByIncrementalFontSpec<SimpleStyleMarkerByFontSpec<>>;
259 TrivialFontSpecStyleMarker (
const IncrementalFontSpecification& styleInfo);
262 virtual int GetPriority ()
const override;
274 template <
typename BASECLASS = StyleMarker>
275 class SimpleStyleMarkerWithExtraDraw :
public SimpleStyleMarkerByFontSpec<BASECLASS> {
277 using inherited = SimpleStyleMarkerByFontSpec<BASECLASS>;
280 SimpleStyleMarkerWithExtraDraw () =
default;
282#if qStroika_Frameworks_Led_SupportGDI
289 virtual void DrawExtra (
const StyledTextImager* imager,
const StyleRunElement& runElement, Tablet* tablet,
size_t from,
size_t to,
290 const TextLayoutBlock& text,
const Led_Rect& drawInto, CoordinateType useBaseLine, DistanceType pixelsDrawn) = 0;
294 virtual StyleRunElement MungeRunElement (
const StyleRunElement& inRunElt)
const;
296#if qStroika_Frameworks_Led_SupportGDI
298 virtual void DrawSegment (
const StyledTextImager* imager,
const StyleRunElement& runElement, Tablet* tablet,
size_t from,
size_t to,
299 const TextLayoutBlock& text,
const Led_Rect& drawInto,
const Led_Rect& ,
300 CoordinateType useBaseLine, DistanceType* pixelsDrawn)
override;
301 virtual void MeasureSegmentWidth (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to,
302 const Led_tChar* text, DistanceType* distanceResults)
const override;
303 virtual DistanceType MeasureSegmentHeight (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to)
const override;
304 virtual DistanceType MeasureSegmentBaseLine (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to)
const override;
315 template <
class BASECLASS = SimpleStyleMarkerWithExtraDraw<StyleMarker>>
316 class SimpleStyleMarkerWithLightUnderline :
public BASECLASS {
318 using inherited = BASECLASS;
321 SimpleStyleMarkerWithLightUnderline () =
default;
323#if qStroika_Frameworks_Led_SupportGDI
325 virtual void DrawExtra (
const StyledTextImager* imager,
const StyleRunElement& runElement, Tablet* tablet,
size_t from,
size_t to,
326 const TextLayoutBlock& text,
const Led_Rect& drawInto, CoordinateType useBaseLine, DistanceType pixelsDrawn)
override;
330 virtual Color GetUnderlineBaseColor ()
const;
333#if qStroika_Frameworks_Led_SupportGDI
357 class StyledTextImager :
public virtual TextImager {
359 using inherited = TextImager;
362 StyledTextImager () =
default;
365 virtual vector<StyleRunElement> SummarizeStyleMarkers (
size_t from,
size_t to)
const;
366 virtual vector<StyleRunElement> SummarizeStyleMarkers (
size_t from,
size_t to,
const TextLayoutBlock& text)
const;
371 virtual void DrawSegment (Tablet* tablet,
size_t from,
size_t to,
const TextLayoutBlock& text,
const Led_Rect& drawInto,
372 const Led_Rect& invalidRect, CoordinateType useBaseLine, DistanceType* pixelsDrawn)
override;
373 virtual void MeasureSegmentWidth (
size_t from,
size_t to,
const Led_tChar* text, DistanceType* distanceResults)
const override;
374 virtual DistanceType MeasureSegmentHeight (
size_t from,
size_t to)
const override;
375 virtual DistanceType MeasureSegmentBaseLine (
size_t from,
size_t to)
const override;
379 nonvirtual
void Invariant ()
const;
380#if qStroika_Foundation_Debug_AssertionsChecked
382 virtual void Invariant_ ()
const;
395#include "StyledTextImager.inl"
void Append(TARGET_CONTAINER *v)