Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
#include "Common.h"
namespace MS { namespace Internal
{
private ref struct Span sealed
private value struct Span
{
/// <summary>
/// Constructor
Expand All @@ -20,12 +20,12 @@ namespace MS { namespace Internal
/// <summary>
/// Span element
/// </summary>
Object^ element;
initonly Object^ element;

/// <summary>
/// Span length
/// </summary>
int length;
initonly int length;
};
}}//MS::Internal
#endif //_ITEM_SPAN_H
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ namespace MS { namespace Internal { namespace Text { namespace TextInterface
_textAnalyzer = gcnew NativeIUnknownWrapper<IDWriteTextAnalyzer>(textAnalyzer);
}

IList<Span^>^ TextAnalyzer::Itemize(
IList<Span>^ TextAnalyzer::Itemize(
__in_ecount(length) const WCHAR* text,
UINT32 length,
CultureInfo^ culture,
Expand Down Expand Up @@ -46,7 +46,7 @@ namespace MS { namespace Internal { namespace Text { namespace TextInterface
try
{
hr = pDWriteFactory->CreateTextAnalyzer(&pTextAnalyzer);
ConvertHresultToException(hr, "List<Span^>^ TextAnalyzer::Itemize");
ConvertHresultToException(hr, "List<Span>^ TextAnalyzer::Itemize");

pin_ptr<const WCHAR> pNumberSubstitutionLocaleNamePinned;

Expand All @@ -73,7 +73,7 @@ namespace MS { namespace Internal { namespace Text { namespace TextInterface
ignoreUserOverride,
numberSubstitutionMethod,
(void**)&pTextAnalysisSource));
ConvertHresultToException(hr, "List<Span^>^ TextAnalyzer::Itemize");
ConvertHresultToException(hr, "List<Span>^ TextAnalyzer::Itemize");


pTextAnalysisSink = (IDWriteTextAnalysisSink*)pfnCreateTextAnalysisSink();
Expand All @@ -83,14 +83,14 @@ namespace MS { namespace Internal { namespace Text { namespace TextInterface
0,
length,
pTextAnalysisSink);
ConvertHresultToException(hr, "List<Span^>^ TextAnalyzer::Itemize");
ConvertHresultToException(hr, "List<Span>^ TextAnalyzer::Itemize");

// Analyze the number substitution ranges.
hr = pTextAnalyzer->AnalyzeNumberSubstitution(pTextAnalysisSource,
0,
length,
pTextAnalysisSink);
ConvertHresultToException(hr, "List<Span^>^ TextAnalyzer::Itemize");
ConvertHresultToException(hr, "List<Span>^ TextAnalyzer::Itemize");

DWriteTextAnalysisNode<DWRITE_SCRIPT_ANALYSIS>* dwriteScriptAnalysisNode = (DWriteTextAnalysisNode<DWRITE_SCRIPT_ANALYSIS>*)pfnGetScriptAnalysisList((void*)pTextAnalysisSink);
DWriteTextAnalysisNode<IDWriteNumberSubstitution*>* dwriteNumberSubstitutionNode = (DWriteTextAnalysisNode<IDWriteNumberSubstitution*>*)pfnGetNumberSubstitutionList((void*)pTextAnalysisSink);
Expand All @@ -114,7 +114,7 @@ namespace MS { namespace Internal { namespace Text { namespace TextInterface

}

IList<Span^>^ TextAnalyzer::AnalyzeExtendedAndItemize(
IList<Span>^ TextAnalyzer::AnalyzeExtendedAndItemize(
TextItemizer^ textItemizer,
__in_ecount(length) const WCHAR *text,
UINT32 length,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ namespace MS { namespace Internal { namespace Text { namespace TextInterface
}
}

static IList<Span^>^ AnalyzeExtendedAndItemize(
static IList<Span>^ AnalyzeExtendedAndItemize(
TextItemizer^ textItemizer,
__in_ecount(length) const WCHAR *text,
UINT32 length,
Expand All @@ -147,7 +147,7 @@ namespace MS { namespace Internal { namespace Text { namespace TextInterface
IDWriteTextAnalyzer* textAnalyzer
);

static IList<Span^>^ Itemize(
static IList<Span>^ Itemize(
__in_ecount(length) const WCHAR* text,
UINT32 length,
CultureInfo^ culture,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ namespace MS { namespace Internal { namespace Text { namespace TextInterface

}

__declspec(noinline) IList<Span^>^ TextItemizer::Itemize(CultureInfo^ numberCulture, __in_ecount(textLength) CharAttributeType* pCharAttribute, UINT32 textLength)
__declspec(noinline) IList<Span>^ TextItemizer::Itemize(CultureInfo^ numberCulture, __in_ecount(textLength) CharAttributeType* pCharAttribute, UINT32 textLength)
{
DWriteTextAnalysisNode<DWRITE_SCRIPT_ANALYSIS>* pScriptAnalysisListPrevious = _pScriptAnalysisListHead;
DWriteTextAnalysisNode<DWRITE_SCRIPT_ANALYSIS>* pScriptAnalysisListCurrent = _pScriptAnalysisListHead;
Expand All @@ -79,7 +79,7 @@ namespace MS { namespace Internal { namespace Text { namespace TextInterface
&pNumberSubstitutionListCurrent, numberSubstitutionRangeIndex,
isDigitIndex, isDigitRangeIndex);

List<Span^>^ spanVector = gcnew List<Span^>();
List<Span>^ spanVector = gcnew List<Span>();
while (
rangeEnd != textLength
&& (pScriptAnalysisListCurrent != NULL
Expand Down Expand Up @@ -193,7 +193,7 @@ namespace MS { namespace Internal { namespace Text { namespace TextInterface
isLatin
);

spanVector->Add(gcnew Span(itemProps, (int)(rangeEnd - rangeStart)));
spanVector->Add(Span(itemProps, (int)(rangeEnd - rangeStart)));
}

return spanVector;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ namespace MS { namespace Internal { namespace Text { namespace TextInterface
TextItemizer(DWriteTextAnalysisNode<DWRITE_SCRIPT_ANALYSIS>* pScriptAnalysisListHead,
DWriteTextAnalysisNode<IDWriteNumberSubstitution*>* pNumberSubstitutionListHead);

IList<Span^>^ Itemize(CultureInfo^ numberCulture, __in_ecount(textLength) CharAttributeType* pCharAttribute, UINT32 textLength);
IList<Span>^ Itemize(CultureInfo^ numberCulture, __in_ecount(textLength) CharAttributeType* pCharAttribute, UINT32 textLength);

void SetIsDigit(
UINT32 textPosition,
Expand Down
39 changes: 26 additions & 13 deletions src/Microsoft.DotNet.Wpf/src/PresentationCore/MS/internal/Span.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public IEnumerator GetEnumerator()
/// <summary>
/// Add a new span to vector
/// </summary>
private void Add(Span span)
private void Add(in Span span)
{
_spans.Add(span);
}
Expand Down Expand Up @@ -87,6 +87,13 @@ private void Insert(int index, int count)
}

#region Public operation
/// <summary>
/// Place item into the store at index
/// </summary>
public void SetAt(int index, in Span span)
{
_spans.SetAt(index, span);
}

/// <summary>
/// Finds the span that contains the specified character position.
Expand Down Expand Up @@ -164,7 +171,7 @@ internal bool FindSpan(int cp, SpanPosition latestPosition, out SpanPosition spa
// Return true if the span is in range.
return spanIndex != spanCount;
}


/// <summary>
/// Set an element as a value to a character range
Expand Down Expand Up @@ -226,19 +233,23 @@ private SpanPosition Set(int first, int length, object element, Equals equals, S
Add(new Span(_defaultObject, first - fc));
}

if ( Count > 0
&& equals(_spans[Count-1].element, element))
bool addElement = true;
if (Count > 0)
{
// New Element matches end Element, just extend end Element
_spans[Count - 1].length += length;

// Make sure fs and fc still agree
if (fs == Count)
var span = _spans[Count - 1];
if (equals(span.element, element))
{
fc += length;
// New Element matches end Element, just extend end Element
_spans[Count - 1] = new(span.element, span.length + length);
addElement = false;
// Make sure fs and fc still agree
if (fs == Count)
{
fc += length;
}
}
}
else
if (addElement)
{
Add(new Span(element, length));
}
Expand Down Expand Up @@ -314,7 +325,8 @@ private SpanPosition Set(int first, int length, object element, Equals equals, S
if (!Resize(fs + 2))
throw new OutOfMemoryException();
}
_spans[fs].length = first - fc;
var oldFsSpan = _spans[fs];
_spans[fs] = new Span(oldFsSpan.element, first - fc);
_spans[fs + 1] = new Span(element, length);
}
else
Expand Down Expand Up @@ -370,7 +382,8 @@ private SpanPosition Set(int first, int length, object element, Equals equals, S

if (fc < first)
{
_spans[fs].length = first - fc;
var oldFsSpan = _spans[fs];
_spans[fs] = new Span(oldFsSpan.element, first - fc);
fs++;
fc = first;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1076,7 +1076,8 @@ internal bool InsertFakeLineBreak(int cpLimit)
if (lsrun.Type == Plsrun.Text && cp + lsrun.Length > cpLimit)
{
lsrun.Truncate(cpLimit - cp);
span.length = lsrun.Length;
span = new(span.element, lsrun.Length);
_plsrunVector.SetAt(i, span);
}

_lscchUpTo = lscp + lsrun.Length;
Expand Down
11 changes: 11 additions & 0 deletions src/Microsoft.DotNet.Wpf/src/Shared/MS/Utility/FrugalList.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2221,6 +2221,17 @@ public void Insert(int index, T value)
throw new ArgumentOutOfRangeException(nameof(index));
}

public void SetAt(int index, T value)
{
if ((_listStore is not null) && ((index < _listStore.Count) && (index >= 0)))
{
_listStore.SetAt(index, value);
return;
}

throw new ArgumentOutOfRangeException(nameof(index));
}

public bool Remove(T value)
{
if ((_listStore is not null) && (_listStore.Count > 0))
Expand Down