mirror of
https://github.com/ZuneDev/MicrosoftIris.git
synced 2026-07-27 13:13:29 -07:00
154 lines
5.2 KiB
C#
154 lines
5.2 KiB
C#
// 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;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|