Files
MicrosoftIris/UIX/Microsoft/Iris/Drawing/TextMeasureParams.cs
T

154 lines
5.2 KiB
C#
Raw Normal View History

2022-03-03 08:14:05 -06:00
// Decompiled with JetBrains decompiler
// Type: Microsoft.Iris.Drawing.TextMeasureParams
// Assembly: UIX, Version=4.8.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217
// MVID: A56C6C9D-B7F6-46A9-8BDE-B3D9B8D60B11
// Assembly location: C:\Program Files\Zune\UIX.dll
using Microsoft.Iris.RenderAPI.Drawing;
using Microsoft.Iris.Session;
using Microsoft.Iris.ViewItems;
using System;
using System.Runtime.InteropServices;
namespace Microsoft.Iris.Drawing
{
internal struct TextMeasureParams
{
public TextMeasureParams.MarshalledData _data;
public TextStyle _textStyle;
public TextMeasureParams.FormattedRange[] _formattedRanges;
public TextStyle.MarshalledData[] _formattedRangeStyles;
private GCHandle[] _formattedRangeStyleFontFaces;
public void Initialize()
{
if (!UISession.Default.IsRtl)
return;
_data._flags |= MeasureFlags.IsRtl;
}
public void Dispose()
{
if (_formattedRangeStyleFontFaces == null)
return;
foreach (GCHandle rangeStyleFontFace in _formattedRangeStyleFontFaces)
{
if (rangeStyleFontFace.IsAllocated)
rangeStyleFontFace.Free();
}
_formattedRangeStyleFontFaces = null;
}
public unsafe void SetContent(char* content)
{
_data._flags |= MeasureFlags.Content;
_data._content = content;
}
public void SetFormat(LineAlignment lineAlignment, TextStyle style)
{
switch (lineAlignment)
{
case LineAlignment.Near:
_data._alignment = 1;
break;
case LineAlignment.Center:
_data._alignment = 3;
break;
case LineAlignment.Far:
_data._alignment = 2;
break;
}
_textStyle = style;
}
public void TrimLeftSideBearing() => _data._flags |= MeasureFlags.TrimLeftSideBearing;
public void SetEditMode(bool inEditMode)
{
if (inEditMode)
_data._flags |= MeasureFlags.FormatOnly;
else
_data._flags &= ~MeasureFlags.FormatOnly;
}
public void SetScale(float scale) => _data._scale = scale;
public void SetWordWrap(bool wordWrap)
{
_data._flags |= MeasureFlags.WordWrap;
if (wordWrap)
_data._flags |= MeasureFlags.WordWrapValue;
else
_data._flags &= ~MeasureFlags.WordWrapValue;
}
public void SetPasswordChar(char passwordChar)
{
_data._flags |= MeasureFlags.PasswordMasked;
_data._passwordChar = passwordChar;
}
public void SetConstraint(SizeF constraint) => _data._constraint = constraint;
public void AllocateFormattedRanges(int formattedRangeCount, int formattedRangeStylesCount)
{
_formattedRanges = new TextMeasureParams.FormattedRange[formattedRangeCount];
_formattedRangeStyles = new TextStyle.MarshalledData[formattedRangeStylesCount];
_formattedRangeStyleFontFaces = new GCHandle[formattedRangeStylesCount];
_data._formattedRangeCount = formattedRangeCount;
_data._formattedRangeStylesCount = formattedRangeStylesCount;
}
public TextMeasureParams.FormattedRange[] FormattedRanges => _formattedRanges;
public unsafe void SetFormattedRangeStyle(int index, TextStyle style)
{
_formattedRangeStyles[index] = new TextStyle.MarshalledData(style);
string fontFace = style.FontFace;
if (fontFace == null)
return;
GCHandle gcHandle = GCHandle.Alloc(fontFace, GCHandleType.Pinned);
_formattedRangeStyles[index]._fontFace = (char*)gcHandle.AddrOfPinnedObject().ToPointer();
_formattedRangeStyleFontFaces[index] = gcHandle;
}
internal struct MarshalledData
{
public TextMeasureParams.MeasureFlags _flags;
public byte _alignment;
[MarshalAs(UnmanagedType.U2)]
public char _passwordChar;
public unsafe char* _content;
public float _scale;
public SizeF _constraint;
public unsafe TextStyle.MarshalledData* _pTextStyle;
public int _formattedRangeCount;
public unsafe TextMeasureParams.FormattedRange* _pFormattedRanges;
public int _formattedRangeStylesCount;
public unsafe TextStyle.MarshalledData* _pFormattedRangeStyles;
}
[Flags]
internal enum MeasureFlags : byte
{
None = 0,
Content = 1,
IsRtl = 2,
WordWrap = 4,
WordWrapValue = 8,
PasswordMasked = 16, // 0x10
TrimLeftSideBearing = 32, // 0x20
FormatOnly = 64, // 0x40
}
internal struct FormattedRange
{
public int FirstCharacter;
public int LastCharacter;
public Color Color;
public int StyleIndex;
}
}
}