4#include "Stroika/Frameworks/StroikaPreComp.h"
8#include "StandardStyledTextImager.h"
12using Memory::MakeSharedPtr;
14using namespace Stroika::Frameworks;
15using namespace Stroika::Frameworks::Led;
22#if qStroika_Foundation_Debug_AssertionsChecked
23void AbstractStyleDatabaseRep::Invariant_ ()
const
33#if qStroika_Frameworks_Led_SupportGDI
34void StandardStyleMarker::DrawSegment (
const StyledTextImager* imager,
const StyleRunElement& , Tablet* tablet,
size_t from,
35 size_t to,
const TextLayoutBlock& text,
const Led_Rect& drawInto,
const Led_Rect& ,
36 CoordinateType useBaseLine, DistanceType* pixelsDrawn)
39 imager->DrawSegment_ (tablet, fFontSpecification, from, to, text, drawInto, useBaseLine, pixelsDrawn);
42void StandardStyleMarker::MeasureSegmentWidth (
const StyledTextImager* imager,
const StyleRunElement& ,
size_t from,
43 size_t to,
const Led_tChar* text, DistanceType* distanceResults)
const
46 imager->MeasureSegmentWidth_ (fFontSpecification, from, to, text, distanceResults);
49DistanceType StandardStyleMarker::MeasureSegmentHeight (
const StyledTextImager* imager,
const StyleRunElement& ,
size_t from,
size_t to)
const
52 return (imager->MeasureSegmentHeight_ (fFontSpecification, from, to));
55DistanceType StandardStyleMarker::MeasureSegmentBaseLine (
const StyledTextImager* imager,
const StyleRunElement& ,
size_t from,
size_t to)
const
58 return (imager->MeasureSegmentBaseLine_ (fFontSpecification, from, to));
67StyleDatabaseRep::StyleDatabaseRep (TextStore& textStore)
68 : inheritedMC{textStore, GetStaticDefaultFont ()}
72vector<StyledInfoSummaryRecord> StyleDatabaseRep::GetStyleInfo (
size_t charAfterPos,
size_t nTCharsFollowing)
const
74 MarkerVector standardStyleMarkers = GetInfoMarkers (charAfterPos, nTCharsFollowing);
76 vector<StyledInfoSummaryRecord> result;
77 size_t tCharsSoFar = 0;
78 size_t nStandardStyleMarkers = standardStyleMarkers.size ();
79 for (
size_t i = 0; i < nStandardStyleMarkers; ++i) {
80 StandardStyleMarker* marker = standardStyleMarkers[i];
84 marker->GetRange (&markerStart, &markerEnd);
88 size_t length = markerEnd - markerStart;
90 Assert (charAfterPos >= markerStart);
91 Assert (charAfterPos - markerStart < length);
92 length -= (charAfterPos - markerStart);
94 if (i == nStandardStyleMarkers - 1) {
95 Assert (length >= nTCharsFollowing - tCharsSoFar);
96 length = nTCharsFollowing - tCharsSoFar;
98 Assert (length > 0 or nTCharsFollowing == 0);
99 Assert (length <= nTCharsFollowing);
100 result.push_back (StyledInfoSummaryRecord (marker->fFontSpecification, length));
101 tCharsSoFar += length;
103 Assert (tCharsSoFar == nTCharsFollowing);
107void StyleDatabaseRep::SetStyleInfo (
size_t charAfterPos,
size_t nTCharsFollowing,
const IncrementalFontSpecification& styleInfo)
109 SetInfo (charAfterPos, nTCharsFollowing, styleInfo);
112void StyleDatabaseRep::SetStyleInfo (
size_t charAfterPos,
size_t nTCharsFollowing,
size_t nStyleInfos,
const StyledInfoSummaryRecord* styleInfos)
114 size_t setAt = charAfterPos;
115 size_t lengthUsedSoFar = 0;
116 for (
size_t i = 0; i < nStyleInfos and lengthUsedSoFar < nTCharsFollowing; ++i) {
117 StyledInfoSummaryRecord isr = styleInfos[i];
118 size_t length = isr.fLength;
119 Assert (nTCharsFollowing >= lengthUsedSoFar);
120 length = min (nTCharsFollowing - lengthUsedSoFar, length);
121 SetStyleInfo (setAt, length, IncrementalFontSpecification{isr});
123 lengthUsedSoFar += length;
127#if qStroika_Foundation_Debug_AssertionsChecked
128void StyleDatabaseRep::Invariant_ ()
const
130 inheritedMC::Invariant_ ();
134#if qStroika_Frameworks_Led_SupportGDI
140void StandardStyledTextImager::HookLosingTextStore ()
142 inherited::HookLosingTextStore ();
143 HookLosingTextStore_ ();
146void StandardStyledTextImager::HookLosingTextStore_ ()
149 if (fICreatedDatabase) {
150 fICreatedDatabase =
false;
151 if (fStyleDatabase.get () !=
nullptr) {
152 fStyleDatabase =
nullptr;
153 HookStyleDatabaseChanged ();
158void StandardStyledTextImager::HookGainedNewTextStore ()
160 inherited::HookGainedNewTextStore ();
161 HookGainedNewTextStore_ ();
164void StandardStyledTextImager::HookGainedNewTextStore_ ()
166 if (fStyleDatabase ==
nullptr) {
167 fStyleDatabase = MakeSharedPtr<StyleDatabaseRep> (GetTextStore ());
168 fICreatedDatabase =
true;
169 HookStyleDatabaseChanged ();
173void StandardStyledTextImager::SetStyleDatabase (
const shared_ptr<AbstractStyleDatabaseRep>& styleDatabase)
175 fStyleDatabase = styleDatabase;
176 fICreatedDatabase =
false;
177 if (fStyleDatabase ==
nullptr and PeekAtTextStore () !=
nullptr) {
178 fStyleDatabase = MakeSharedPtr<StyleDatabaseRep> (GetTextStore ());
179 fICreatedDatabase =
true;
181 HookStyleDatabaseChanged ();
190void StandardStyledTextImager::HookStyleDatabaseChanged ()
194FontMetrics StandardStyledTextImager::GetFontMetricsAt (
size_t charAfterPos)
const
196 Tablet_Acquirer tablet (
this);
199 FontCacheInfoUpdater fontCacheUpdater (
this, tablet, GetStyleInfo (charAfterPos));
200 return (fontCacheUpdater.GetMetrics ());
209 vector<StyledInfoSummaryRecord> summaryInfo = GetStyleInfo (GetSelectionEnd (), 0);
210 Assert (summaryInfo.size () == 1);
211 return summaryInfo[0];
222IncrementalFontSpecification StandardStyledTextImager::GetContinuousStyleInfo (
size_t from,
size_t nTChars)
const
224 vector<StyledInfoSummaryRecord> summaryInfo = GetStyleInfo (from, nTChars);
225 return (GetContinuousStyleInfo_ (summaryInfo));
228IncrementalFontSpecification StandardStyledTextImager::GetContinuousStyleInfo_ (
const vector<StyledInfoSummaryRecord>& summaryInfo)
const
230 IncrementalFontSpecification fontSpec;
241 int countOfValidThings = 7 +
242#if qStroika_Platform_Windows
247 for (
size_t i = 0; i < summaryInfo.size (); ++i) {
249 fontSpec = IncrementalFontSpecification{summaryInfo[0]};
254 StyledInfoSummaryRecord isr = summaryInfo[i];
257 if (fontSpec.GetFontNameSpecifier_Valid () and fontSpec.GetFontNameSpecifier () != isr.GetFontNameSpecifier ()) {
258 fontSpec.InvalidateFontNameSpecifier ();
259 if (--countOfValidThings == 0) {
265 if (fontSpec.GetStyle_Bold_Valid () and fontSpec.GetStyle_Bold () != isr.GetStyle_Bold ()) {
266 fontSpec.InvalidateStyle_Bold ();
267 if (--countOfValidThings == 0) {
271 if (fontSpec.GetStyle_Italic_Valid () and fontSpec.GetStyle_Italic () != isr.GetStyle_Italic ()) {
272 fontSpec.InvalidateStyle_Italic ();
273 if (--countOfValidThings == 0) {
277 if (fontSpec.GetStyle_Underline_Valid () and fontSpec.GetStyle_Underline () != isr.GetStyle_Underline ()) {
278 fontSpec.InvalidateStyle_Underline ();
279 if (--countOfValidThings == 0) {
283 if (fontSpec.GetStyle_SubOrSuperScript_Valid () and fontSpec.GetStyle_SubOrSuperScript () != isr.GetStyle_SubOrSuperScript ()) {
284 fontSpec.InvalidateStyle_SubOrSuperScript ();
285 if (--countOfValidThings == 0) {
289#if qStroika_Platform_Windows
290 if (fontSpec.GetStyle_Strikeout_Valid () and fontSpec.GetStyle_Strikeout () != isr.GetStyle_Strikeout ()) {
291 fontSpec.InvalidateStyle_Strikeout ();
292 if (--countOfValidThings == 0) {
299 if (fontSpec.GetPointSize_Valid () and fontSpec.GetPointSize () != isr.GetPointSize ()) {
300 fontSpec.InvalidatePointSize ();
301 if (--countOfValidThings == 0) {
307 if (fontSpec.GetTextColor_Valid () and fontSpec.GetTextColor () != isr.GetTextColor ()) {
308 fontSpec.InvalidateTextColor ();
309 if (--countOfValidThings == 0) {
319#if qStroika_Foundation_Debug_AssertionsChecked
320void StandardStyledTextImager::Invariant_ ()
const
322 StyledTextImager::Invariant_ ();
323 if (fStyleDatabase.get () !=
nullptr) {
324 fStyleDatabase->Invariant ();
#define RequireNotNull(p)