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"
21namespace Stroika::Frameworks::Led {
29#ifndef qStroika_Frameworks_Led_AssertWarningForEqualPriorityMarkers
30#define qStroika_Frameworks_Led_AssertWarningForEqualPriorityMarkers qStroika_Foundation_Debug_AssertionsChecked
50 struct StyleRunElement {
51 StyleRunElement (StyleMarker* marker,
size_t length);
53 StyleMarker* fMarker{
nullptr};
55 vector<StyleMarker*> fSupercededMarkers;
58#if qStroika_Frameworks_Led_SupportGDI
59 class StyledTextImager;
68 class StyleMarker :
public Marker {
70 StyleMarker () =
default;
78 virtual int GetPriority ()
const;
80#if qStroika_Frameworks_Led_SupportGDI
89 virtual void DrawSegment (
const StyledTextImager* imager,
const StyleRunElement& runElement, Tablet* tablet,
size_t from,
size_t to,
90 const TextLayoutBlock& text,
const Led_Rect& drawInto,
const Led_Rect& invalidRect,
91 CoordinateType useBaseLine, DistanceType* pixelsDrawn) = 0;
98 virtual void MeasureSegmentWidth (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to,
99 const Led_tChar* text, DistanceType* distanceResults)
const = 0;
105 virtual DistanceType MeasureSegmentHeight (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to)
const = 0;
112 virtual DistanceType MeasureSegmentBaseLine (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to)
const = 0;
124 class StyleMarkerSummarySink :
public TextStore::MarkerSink {
126 using inherited = TextStore::MarkerSink;
129 StyleMarkerSummarySink (
size_t from,
size_t to);
130 StyleMarkerSummarySink (
size_t from,
size_t to,
const TextLayoutBlock& text);
133 nonvirtual vector<StyleRunElement> ProduceOutputSummary ()
const;
136 virtual void Append (Marker* m)
override;
139 virtual void CombineElements (StyleRunElement* runElement, StyleMarker* newStyleMarker);
142 nonvirtual
void SplitIfNeededAt (
size_t markerPos);
145 vector<StyleRunElement> fBuckets;
146 const TextLayoutBlock* fText;
156 class StyleMarkerSummarySinkForSingleOwner :
public StyleMarkerSummarySink {
158 using inherited = StyleMarkerSummarySink;
161 StyleMarkerSummarySinkForSingleOwner (
const MarkerOwner& owner,
size_t from,
size_t to);
162 StyleMarkerSummarySinkForSingleOwner (
const MarkerOwner& owner,
size_t from,
size_t to,
const TextLayoutBlock& text);
165 virtual void CombineElements (StyleRunElement* runElement, StyleMarker* newStyleMarker)
override;
168 const MarkerOwner& fOwner;
184 template <
class BASECLASS = StyleMarker>
185 class SimpleStyleMarkerByFontSpec :
public BASECLASS {
187 using inherited = BASECLASS;
190 SimpleStyleMarkerByFontSpec () =
default;
192#if qStroika_Frameworks_Led_SupportGDI
202 virtual FontSpecification MakeFontSpec (
const StyledTextImager* imager,
const StyleRunElement& runElement)
const;
205#if qStroika_Frameworks_Led_SupportGDI
207 virtual void DrawSegment (
const StyledTextImager* imager,
const StyleRunElement& runElement, Tablet* tablet,
size_t from,
size_t to,
208 const TextLayoutBlock& text,
const Led_Rect& drawInto,
const Led_Rect& ,
209 CoordinateType useBaseLine, DistanceType* pixelsDrawn)
override;
210 virtual void MeasureSegmentWidth (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to,
211 const Led_tChar* text, DistanceType* distanceResults)
const override;
212 virtual DistanceType MeasureSegmentHeight (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to)
const override;
213 virtual DistanceType MeasureSegmentBaseLine (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to)
const override;
224 template <
class BASECLASS>
225 class SimpleStyleMarkerByIncrementalFontSpec :
public BASECLASS {
227 using inherited = BASECLASS;
230 SimpleStyleMarkerByIncrementalFontSpec (
const IncrementalFontSpecification& styleInfo = IncrementalFontSpecification ());
232#if qStroika_Frameworks_Led_SupportGDI
234 virtual FontSpecification MakeFontSpec (
const StyledTextImager* imager,
const StyleRunElement& runElement)
const override;
238 IncrementalFontSpecification fFontSpecification;
248 class TrivialFontSpecStyleMarker :
public SimpleStyleMarkerByIncrementalFontSpec<SimpleStyleMarkerByFontSpec<>>,
249 public Foundation::Memory::UseBlockAllocationIfAppropriate<TrivialFontSpecStyleMarker> {
251 using inherited = SimpleStyleMarkerByIncrementalFontSpec<SimpleStyleMarkerByFontSpec<>>;
254 TrivialFontSpecStyleMarker (
const IncrementalFontSpecification& styleInfo);
257 virtual int GetPriority ()
const override;
269 template <
typename BASECLASS = StyleMarker>
270 class SimpleStyleMarkerWithExtraDraw :
public SimpleStyleMarkerByFontSpec<BASECLASS> {
272 using inherited = SimpleStyleMarkerByFontSpec<BASECLASS>;
275 SimpleStyleMarkerWithExtraDraw () =
default;
277#if qStroika_Frameworks_Led_SupportGDI
284 virtual void DrawExtra (
const StyledTextImager* imager,
const StyleRunElement& runElement, Tablet* tablet,
size_t from,
size_t to,
285 const TextLayoutBlock& text,
const Led_Rect& drawInto, CoordinateType useBaseLine, DistanceType pixelsDrawn) = 0;
289 virtual StyleRunElement MungeRunElement (
const StyleRunElement& inRunElt)
const;
291#if qStroika_Frameworks_Led_SupportGDI
293 virtual void DrawSegment (
const StyledTextImager* imager,
const StyleRunElement& runElement, Tablet* tablet,
size_t from,
size_t to,
294 const TextLayoutBlock& text,
const Led_Rect& drawInto,
const Led_Rect& ,
295 CoordinateType useBaseLine, DistanceType* pixelsDrawn)
override;
296 virtual void MeasureSegmentWidth (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to,
297 const Led_tChar* text, DistanceType* distanceResults)
const override;
298 virtual DistanceType MeasureSegmentHeight (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to)
const override;
299 virtual DistanceType MeasureSegmentBaseLine (
const StyledTextImager* imager,
const StyleRunElement& runElement,
size_t from,
size_t to)
const override;
310 template <
class BASECLASS = SimpleStyleMarkerWithExtraDraw<StyleMarker>>
311 class SimpleStyleMarkerWithLightUnderline :
public BASECLASS {
313 using inherited = BASECLASS;
316 SimpleStyleMarkerWithLightUnderline () =
default;
318#if qStroika_Frameworks_Led_SupportGDI
320 virtual void DrawExtra (
const StyledTextImager* imager,
const StyleRunElement& runElement, Tablet* tablet,
size_t from,
size_t to,
321 const TextLayoutBlock& text,
const Led_Rect& drawInto, CoordinateType useBaseLine, DistanceType pixelsDrawn)
override;
325 virtual Color GetUnderlineBaseColor ()
const;
328#if qStroika_Frameworks_Led_SupportGDI
352 class StyledTextImager :
public virtual TextImager {
354 using inherited = TextImager;
357 StyledTextImager () =
default;
360 virtual vector<StyleRunElement> SummarizeStyleMarkers (
size_t from,
size_t to)
const;
361 virtual vector<StyleRunElement> SummarizeStyleMarkers (
size_t from,
size_t to,
const TextLayoutBlock& text)
const;
366 virtual void DrawSegment (Tablet* tablet,
size_t from,
size_t to,
const TextLayoutBlock& text,
const Led_Rect& drawInto,
367 const Led_Rect& invalidRect, CoordinateType useBaseLine, DistanceType* pixelsDrawn)
override;
368 virtual void MeasureSegmentWidth (
size_t from,
size_t to,
const Led_tChar* text, DistanceType* distanceResults)
const override;
369 virtual DistanceType MeasureSegmentHeight (
size_t from,
size_t to)
const override;
370 virtual DistanceType MeasureSegmentBaseLine (
size_t from,
size_t to)
const override;
374 nonvirtual
void Invariant ()
const;
375#if qStroika_Foundation_Debug_AssertionsChecked
377 virtual void Invariant_ ()
const;
390#include "StyledTextImager.inl"
void Append(TARGET_CONTAINER *v)