Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / wpf / src / Framework / System / Windows / Documents / FixedSOMTextRun.cs / 2 / FixedSOMTextRun.cs
/*++
File: FixedSOMTextRun.cs
Copyright (C) 2005 Microsoft Corporation. All rights reserved.
Description:
This class represents a (partial) Glyphs element on the page. Most of the time it will be a full glyphs element
Partial elements are necessary when we decide that a single Glyphs element represents multiple semantic entitites such as table cells
History:
05/17/2005: agurcan - Created
--*/
namespace System.Windows.Documents
{
using System.Windows.Shapes;
using System.Windows.Markup; // for XmlLanguage
using System.Windows.Media;
using System.Diagnostics;
using System.Globalization;
using System.Windows;
using System.Collections.Generic;
//a set of characters that have the same font, face and size
internal sealed class FixedSOMTextRun : FixedSOMElement, IComparable
{
//--------------------------------------------------------------------
//
// Constructors
//
//---------------------------------------------------------------------
#region Constructors
private FixedSOMTextRun(Rect boundingRect, GeneralTransform trans, FixedNode fixedNode, int startIndex, int endIndex) : base(fixedNode, startIndex, endIndex, trans)
{
_boundingRect = trans.TransformBounds(boundingRect);
}
#endregion Constructors
int IComparable.CompareTo(object comparedObj)
{
FixedSOMTextRun otherRun = comparedObj as FixedSOMTextRun;
Debug.Assert(otherRun != null);
int result = 0;
if (_fixedBlock.IsRTL)
{
Rect thisRect = this.BoundingRect;
Rect otherRect = otherRun.BoundingRect;
if (!this.Matrix.IsIdentity)
{
Matrix inversionMat = _mat;
inversionMat.Invert();
thisRect.Transform(inversionMat);
thisRect.Offset(_mat.OffsetX, _mat.OffsetY);
otherRect.Transform(inversionMat);
otherRect.Offset(_mat.OffsetX, _mat.OffsetY);
}
thisRect.Offset(_mat.OffsetX, _mat.OffsetY);
otherRect.Offset(otherRun.Matrix.OffsetX, otherRun.Matrix.OffsetY);
if (FixedTextBuilder.IsSameLine(otherRect.Top - thisRect.Top, thisRect.Height, otherRect.Height))
{
result = (thisRect.Left < otherRect.Left) ? 1 : -1;
}
else
{
result = (thisRect.Top < otherRect.Top) ? -1 : +1;
}
}
else
{
//Markup order for LTR languages
List markupOrder = this.FixedBlock.FixedSOMPage.MarkupOrder;
result = markupOrder.IndexOf(this.FixedNode) - markupOrder.IndexOf(otherRun.FixedNode);
}
return result;
}
//-------------------------------------------------------------------
//
// Public Methods
//
//---------------------------------------------------------------------
#region public Methods
public static FixedSOMTextRun Create(Rect boundingRect, GeneralTransform transform, Glyphs glyphs, FixedNode fixedNode, int startIndex, int endIndex, bool allowReverseGlyphs)
{
if (String.IsNullOrEmpty(glyphs.UnicodeString) ||
glyphs.FontRenderingEmSize <= 0)
{
return null;
}
FixedSOMTextRun run = new FixedSOMTextRun(boundingRect, transform, fixedNode, startIndex, endIndex);
run._fontUri = glyphs.FontUri;
run._cultureInfo = glyphs.Language.GetCompatibleCulture();
run._bidiLevel = glyphs.BidiLevel;
run._isSideways = glyphs.IsSideways;
run._fontSize = glyphs.FontRenderingEmSize;
GlyphRun glyphRun = glyphs.ToGlyphRun();
GlyphTypeface gtf = glyphRun.GlyphTypeface;
// Find font family
// glyphs.FontUri, glyphRun.glyphTypeface
gtf.FamilyNames.TryGetValue(run._cultureInfo, out run._fontFamily);
if (run._fontFamily == null)
{
//Try getting the English name
gtf.FamilyNames.TryGetValue(System.Windows.Markup.TypeConverterHelper.EnglishUSCulture, out run._fontFamily);
}
// Find font style (normal, italics, Oblique)
// need to open Font file.
run._fontStyle = gtf.Style;
// Find font weight (bold, semibold, ExtraLight)
run._fontWeight = gtf.Weight;
// Find font stretch (UltraCondensed, SemiExpanded, etc)
run._fontStretch = gtf.Stretch;
//Height and width should be the same for x character
run._defaultCharWidth = gtf.XHeight > 0 ? gtf.XHeight * glyphs.FontRenderingEmSize : glyphRun.AdvanceWidths[startIndex];
Transform trans = transform.AffineTransform;
if (trans != null &&
!(trans.Value.IsIdentity))
{
Matrix mat = trans.Value;
double yScale = Math.Sqrt(mat.M12*mat.M12 + mat.M22*mat.M22);
double xScale = Math.Sqrt(mat.M11 * mat.M11 + mat.M21 * mat.M21);
run._fontSize *= yScale;
run._defaultCharWidth *= xScale;
}
run._foreground = glyphs.Fill;
String s = glyphs.UnicodeString;
run.Text = s.Substring(startIndex, endIndex-startIndex);
if (allowReverseGlyphs && run._bidiLevel == 0 && !run._isSideways &&
startIndex == 0 && endIndex == s.Length
&& String.IsNullOrEmpty(glyphs.CaretStops)
&& FixedTextBuilder.MostlyRTL(s))
{
char[] chars = new char[run.Text.Length];
for (int i=0; i 0)
{
run._isWhiteSpace = false;
}
else
{
run._isWhiteSpace = true;
for (int i = 0; i < s.Length; i++)
{
if (!Char.IsWhiteSpace(s[i]))
{
run._isWhiteSpace = false;
break;
}
}
}
return run;
}
#if DEBUG
public override void Render(DrawingContext dc, string label, DrawDebugVisual debugVisual)
{
Pen pen = new Pen(Brushes.Blue, 1);
Rect rect = _boundingRect;
rect.Inflate(-1,-1);
dc.DrawRectangle(null, pen , rect);
if (label != null && debugVisual == DrawDebugVisual.TextRuns)
{
base.RenderLabel(dc, label);
}
}
///
/// Create a string representation of this object
///
/// string - A string representation of this object
public override string ToString()
{
return _text;
}
#endif
public bool HasSameRichProperties(FixedSOMTextRun run)
{
if (run.FontRenderingEmSize == this.FontRenderingEmSize &&
run.CultureInfo.Equals(this.CultureInfo) &&
run.FontStyle.Equals(this.FontStyle) &&
run.FontStretch.Equals(this.FontStretch) &&
run.FontWeight.Equals(this.FontWeight) &&
run.FontFamily == this.FontFamily &&
run.IsRTL == this.IsRTL)
{
SolidColorBrush thisBrush = this.Foreground as SolidColorBrush;
SolidColorBrush otherBrush = run.Foreground as SolidColorBrush;
if ((run.Foreground == null && this.Foreground == null) ||
thisBrush != null && otherBrush != null && thisBrush.Color == otherBrush.Color && thisBrush.Opacity == otherBrush.Opacity)
{
return true;
}
}
return false;
}
public override void SetRTFProperties(FixedElement element)
{
if (_cultureInfo != null)
{
element.SetValue(FrameworkElement.LanguageProperty, XmlLanguage.GetLanguage(_cultureInfo.IetfLanguageTag));
}
element.SetValue(TextElement.FontSizeProperty, _fontSize);
element.SetValue(TextElement.FontWeightProperty, _fontWeight);
element.SetValue(TextElement.FontStretchProperty, _fontStretch);
element.SetValue(TextElement.FontStyleProperty, _fontStyle);
if (this.IsRTL)
{
element.SetValue(FrameworkElement.FlowDirectionProperty, FlowDirection.RightToLeft);
}
else
{
element.SetValue(FrameworkElement.FlowDirectionProperty, FlowDirection.LeftToRight);
}
if (_fontFamily != null)
{
element.SetValue(TextElement.FontFamilyProperty, new FontFamily(_fontFamily));
}
element.SetValue(TextElement.ForegroundProperty, _foreground);
}
#endregion Public Methods
#region Public Properties
public double DefaultCharWidth
{
get
{
return _defaultCharWidth;
}
}
public bool IsSideways
{
get
{
return _isSideways;
}
}
public bool IsWhiteSpace
{
get
{
return _isWhiteSpace;
}
}
public CultureInfo CultureInfo
{
get
{
return _cultureInfo;
}
}
public bool IsLTR
{
get
{
return ((_bidiLevel & 1) == 0) && !_isReversed;
}
}
public bool IsRTL
{
get
{
return !(this.IsLTR);
}
}
public String Text
{
get
{
return _text;
}
set
{
_text = value;
}
}
public FixedSOMFixedBlock FixedBlock
{
get
{
return _fixedBlock;
}
set
{
_fixedBlock = value;
}
}
public String FontFamily
{
get
{
return _fontFamily;
}
}
///
/// Returns designed style (regular/italic/oblique) of this font face
///
/// Designed style of this font face.
public FontStyle FontStyle
{
get
{
return _fontStyle;
}
}
///
/// Returns designed weight of this font face.
///
/// Designed weight of this font face.
public FontWeight FontWeight
{
get
{
return _fontWeight;
}
}
///
/// Returns designed stretch of this font face.
///
/// Designed stretch of this font face.
public FontStretch FontStretch
{
get
{
return _fontStretch;
}
}
public double FontRenderingEmSize
{
get
{
return _fontSize;
}
}
public Brush Foreground
{
get
{
return _foreground;
}
}
public bool IsReversed
{
get
{
return _isReversed;
}
}
#endregion public Properties
#region Internal Properties
internal int LineIndex
{
get { return _lineIndex; }
set { _lineIndex = value; }
}
#endregion Internal Properties
//--------------------------------------------------------------------
//
// Private Fields
//
//---------------------------------------------------------------------
#region Private Fields
private double _defaultCharWidth;
private Uri _fontUri;
private CultureInfo _cultureInfo;
private bool _isSideways;
private int _bidiLevel;
private bool _isWhiteSpace;
private bool _isReversed;
private FixedSOMFixedBlock _fixedBlock;
private int _lineIndex;
private String _text;
private Brush _foreground;
private double _fontSize;
private String _fontFamily;
private FontStyle _fontStyle;
private FontWeight _fontWeight;
private FontStretch _fontStretch;
#endregion Private Fields
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
/*++
File: FixedSOMTextRun.cs
Copyright (C) 2005 Microsoft Corporation. All rights reserved.
Description:
This class represents a (partial) Glyphs element on the page. Most of the time it will be a full glyphs element
Partial elements are necessary when we decide that a single Glyphs element represents multiple semantic entitites such as table cells
History:
05/17/2005: agurcan - Created
--*/
namespace System.Windows.Documents
{
using System.Windows.Shapes;
using System.Windows.Markup; // for XmlLanguage
using System.Windows.Media;
using System.Diagnostics;
using System.Globalization;
using System.Windows;
using System.Collections.Generic;
//a set of characters that have the same font, face and size
internal sealed class FixedSOMTextRun : FixedSOMElement, IComparable
{
//--------------------------------------------------------------------
//
// Constructors
//
//---------------------------------------------------------------------
#region Constructors
private FixedSOMTextRun(Rect boundingRect, GeneralTransform trans, FixedNode fixedNode, int startIndex, int endIndex) : base(fixedNode, startIndex, endIndex, trans)
{
_boundingRect = trans.TransformBounds(boundingRect);
}
#endregion Constructors
int IComparable.CompareTo(object comparedObj)
{
FixedSOMTextRun otherRun = comparedObj as FixedSOMTextRun;
Debug.Assert(otherRun != null);
int result = 0;
if (_fixedBlock.IsRTL)
{
Rect thisRect = this.BoundingRect;
Rect otherRect = otherRun.BoundingRect;
if (!this.Matrix.IsIdentity)
{
Matrix inversionMat = _mat;
inversionMat.Invert();
thisRect.Transform(inversionMat);
thisRect.Offset(_mat.OffsetX, _mat.OffsetY);
otherRect.Transform(inversionMat);
otherRect.Offset(_mat.OffsetX, _mat.OffsetY);
}
thisRect.Offset(_mat.OffsetX, _mat.OffsetY);
otherRect.Offset(otherRun.Matrix.OffsetX, otherRun.Matrix.OffsetY);
if (FixedTextBuilder.IsSameLine(otherRect.Top - thisRect.Top, thisRect.Height, otherRect.Height))
{
result = (thisRect.Left < otherRect.Left) ? 1 : -1;
}
else
{
result = (thisRect.Top < otherRect.Top) ? -1 : +1;
}
}
else
{
//Markup order for LTR languages
List markupOrder = this.FixedBlock.FixedSOMPage.MarkupOrder;
result = markupOrder.IndexOf(this.FixedNode) - markupOrder.IndexOf(otherRun.FixedNode);
}
return result;
}
//-------------------------------------------------------------------
//
// Public Methods
//
//---------------------------------------------------------------------
#region public Methods
public static FixedSOMTextRun Create(Rect boundingRect, GeneralTransform transform, Glyphs glyphs, FixedNode fixedNode, int startIndex, int endIndex, bool allowReverseGlyphs)
{
if (String.IsNullOrEmpty(glyphs.UnicodeString) ||
glyphs.FontRenderingEmSize <= 0)
{
return null;
}
FixedSOMTextRun run = new FixedSOMTextRun(boundingRect, transform, fixedNode, startIndex, endIndex);
run._fontUri = glyphs.FontUri;
run._cultureInfo = glyphs.Language.GetCompatibleCulture();
run._bidiLevel = glyphs.BidiLevel;
run._isSideways = glyphs.IsSideways;
run._fontSize = glyphs.FontRenderingEmSize;
GlyphRun glyphRun = glyphs.ToGlyphRun();
GlyphTypeface gtf = glyphRun.GlyphTypeface;
// Find font family
// glyphs.FontUri, glyphRun.glyphTypeface
gtf.FamilyNames.TryGetValue(run._cultureInfo, out run._fontFamily);
if (run._fontFamily == null)
{
//Try getting the English name
gtf.FamilyNames.TryGetValue(System.Windows.Markup.TypeConverterHelper.EnglishUSCulture, out run._fontFamily);
}
// Find font style (normal, italics, Oblique)
// need to open Font file.
run._fontStyle = gtf.Style;
// Find font weight (bold, semibold, ExtraLight)
run._fontWeight = gtf.Weight;
// Find font stretch (UltraCondensed, SemiExpanded, etc)
run._fontStretch = gtf.Stretch;
//Height and width should be the same for x character
run._defaultCharWidth = gtf.XHeight > 0 ? gtf.XHeight * glyphs.FontRenderingEmSize : glyphRun.AdvanceWidths[startIndex];
Transform trans = transform.AffineTransform;
if (trans != null &&
!(trans.Value.IsIdentity))
{
Matrix mat = trans.Value;
double yScale = Math.Sqrt(mat.M12*mat.M12 + mat.M22*mat.M22);
double xScale = Math.Sqrt(mat.M11 * mat.M11 + mat.M21 * mat.M21);
run._fontSize *= yScale;
run._defaultCharWidth *= xScale;
}
run._foreground = glyphs.Fill;
String s = glyphs.UnicodeString;
run.Text = s.Substring(startIndex, endIndex-startIndex);
if (allowReverseGlyphs && run._bidiLevel == 0 && !run._isSideways &&
startIndex == 0 && endIndex == s.Length
&& String.IsNullOrEmpty(glyphs.CaretStops)
&& FixedTextBuilder.MostlyRTL(s))
{
char[] chars = new char[run.Text.Length];
for (int i=0; i 0)
{
run._isWhiteSpace = false;
}
else
{
run._isWhiteSpace = true;
for (int i = 0; i < s.Length; i++)
{
if (!Char.IsWhiteSpace(s[i]))
{
run._isWhiteSpace = false;
break;
}
}
}
return run;
}
#if DEBUG
public override void Render(DrawingContext dc, string label, DrawDebugVisual debugVisual)
{
Pen pen = new Pen(Brushes.Blue, 1);
Rect rect = _boundingRect;
rect.Inflate(-1,-1);
dc.DrawRectangle(null, pen , rect);
if (label != null && debugVisual == DrawDebugVisual.TextRuns)
{
base.RenderLabel(dc, label);
}
}
///
/// Create a string representation of this object
///
/// string - A string representation of this object
public override string ToString()
{
return _text;
}
#endif
public bool HasSameRichProperties(FixedSOMTextRun run)
{
if (run.FontRenderingEmSize == this.FontRenderingEmSize &&
run.CultureInfo.Equals(this.CultureInfo) &&
run.FontStyle.Equals(this.FontStyle) &&
run.FontStretch.Equals(this.FontStretch) &&
run.FontWeight.Equals(this.FontWeight) &&
run.FontFamily == this.FontFamily &&
run.IsRTL == this.IsRTL)
{
SolidColorBrush thisBrush = this.Foreground as SolidColorBrush;
SolidColorBrush otherBrush = run.Foreground as SolidColorBrush;
if ((run.Foreground == null && this.Foreground == null) ||
thisBrush != null && otherBrush != null && thisBrush.Color == otherBrush.Color && thisBrush.Opacity == otherBrush.Opacity)
{
return true;
}
}
return false;
}
public override void SetRTFProperties(FixedElement element)
{
if (_cultureInfo != null)
{
element.SetValue(FrameworkElement.LanguageProperty, XmlLanguage.GetLanguage(_cultureInfo.IetfLanguageTag));
}
element.SetValue(TextElement.FontSizeProperty, _fontSize);
element.SetValue(TextElement.FontWeightProperty, _fontWeight);
element.SetValue(TextElement.FontStretchProperty, _fontStretch);
element.SetValue(TextElement.FontStyleProperty, _fontStyle);
if (this.IsRTL)
{
element.SetValue(FrameworkElement.FlowDirectionProperty, FlowDirection.RightToLeft);
}
else
{
element.SetValue(FrameworkElement.FlowDirectionProperty, FlowDirection.LeftToRight);
}
if (_fontFamily != null)
{
element.SetValue(TextElement.FontFamilyProperty, new FontFamily(_fontFamily));
}
element.SetValue(TextElement.ForegroundProperty, _foreground);
}
#endregion Public Methods
#region Public Properties
public double DefaultCharWidth
{
get
{
return _defaultCharWidth;
}
}
public bool IsSideways
{
get
{
return _isSideways;
}
}
public bool IsWhiteSpace
{
get
{
return _isWhiteSpace;
}
}
public CultureInfo CultureInfo
{
get
{
return _cultureInfo;
}
}
public bool IsLTR
{
get
{
return ((_bidiLevel & 1) == 0) && !_isReversed;
}
}
public bool IsRTL
{
get
{
return !(this.IsLTR);
}
}
public String Text
{
get
{
return _text;
}
set
{
_text = value;
}
}
public FixedSOMFixedBlock FixedBlock
{
get
{
return _fixedBlock;
}
set
{
_fixedBlock = value;
}
}
public String FontFamily
{
get
{
return _fontFamily;
}
}
///
/// Returns designed style (regular/italic/oblique) of this font face
///
/// Designed style of this font face.
public FontStyle FontStyle
{
get
{
return _fontStyle;
}
}
///
/// Returns designed weight of this font face.
///
/// Designed weight of this font face.
public FontWeight FontWeight
{
get
{
return _fontWeight;
}
}
///
/// Returns designed stretch of this font face.
///
/// Designed stretch of this font face.
public FontStretch FontStretch
{
get
{
return _fontStretch;
}
}
public double FontRenderingEmSize
{
get
{
return _fontSize;
}
}
public Brush Foreground
{
get
{
return _foreground;
}
}
public bool IsReversed
{
get
{
return _isReversed;
}
}
#endregion public Properties
#region Internal Properties
internal int LineIndex
{
get { return _lineIndex; }
set { _lineIndex = value; }
}
#endregion Internal Properties
//--------------------------------------------------------------------
//
// Private Fields
//
//---------------------------------------------------------------------
#region Private Fields
private double _defaultCharWidth;
private Uri _fontUri;
private CultureInfo _cultureInfo;
private bool _isSideways;
private int _bidiLevel;
private bool _isWhiteSpace;
private bool _isReversed;
private FixedSOMFixedBlock _fixedBlock;
private int _lineIndex;
private String _text;
private Brush _foreground;
private double _fontSize;
private String _fontFamily;
private FontStyle _fontStyle;
private FontWeight _fontWeight;
private FontStretch _fontStretch;
#endregion Private Fields
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- TransformDescriptor.cs
- OLEDB_Util.cs
- Int16AnimationBase.cs
- ItemsPresenter.cs
- COM2IPerPropertyBrowsingHandler.cs
- ExceptionUtil.cs
- ToolStripOverflow.cs
- UIPropertyMetadata.cs
- MergablePropertyAttribute.cs
- NativeMethods.cs
- GcSettings.cs
- FixedSOMTableCell.cs
- GeometryGroup.cs
- SHA1.cs
- CharConverter.cs
- GeneralTransform3DTo2D.cs
- MessageBodyDescription.cs
- SizeLimitedCache.cs
- SafeMarshalContext.cs
- mediaeventargs.cs
- ListItemCollection.cs
- Schema.cs
- CodeSubDirectoriesCollection.cs
- ConfigurationSectionGroup.cs
- LinkedList.cs
- TreeView.cs
- ChameleonKey.cs
- TextEditorDragDrop.cs
- EntityException.cs
- TableCellAutomationPeer.cs
- FocusTracker.cs
- PeerApplicationLaunchInfo.cs
- TrustManagerMoreInformation.cs
- TabPanel.cs
- MD5.cs
- FramingChannels.cs
- SqlAliasesReferenced.cs
- LineInfo.cs
- ScriptingSectionGroup.cs
- relpropertyhelper.cs
- FontWeightConverter.cs
- ConfigXmlComment.cs
- UserControlBuildProvider.cs
- SerializationHelper.cs
- SubstitutionList.cs
- GraphicsState.cs
- CachingHintValidation.cs
- WebPartCatalogAddVerb.cs
- ListViewInsertionMark.cs
- Timer.cs
- SafeMemoryMappedViewHandle.cs
- IRCollection.cs
- WriteFileContext.cs
- NativeMethods.cs
- NameValuePermission.cs
- RunInstallerAttribute.cs
- TraceLog.cs
- DependencyProperty.cs
- Context.cs
- basecomparevalidator.cs
- CollectionBase.cs
- LocalizableResourceBuilder.cs
- FieldNameLookup.cs
- EditorOptionAttribute.cs
- ByteBufferPool.cs
- GridPattern.cs
- PictureBoxDesigner.cs
- SqlCacheDependencySection.cs
- JsonXmlDataContract.cs
- AssemblyAttributes.cs
- FaultFormatter.cs
- EditorZoneAutoFormat.cs
- IconBitmapDecoder.cs
- CopyOnWriteList.cs
- DeclaredTypeValidatorAttribute.cs
- OdbcInfoMessageEvent.cs
- XhtmlConformanceSection.cs
- UdpTransportSettingsElement.cs
- DataGridViewRowsAddedEventArgs.cs
- ScrollViewer.cs
- VerticalAlignConverter.cs
- WebPartsPersonalizationAuthorization.cs
- ListViewDeletedEventArgs.cs
- _SSPISessionCache.cs
- ListComponentEditorPage.cs
- HttpProfileBase.cs
- DataGridViewCellCollection.cs
- Setter.cs
- ReadingWritingEntityEventArgs.cs
- MemoryStream.cs
- UserUseLicenseDictionaryLoader.cs
- NeutralResourcesLanguageAttribute.cs
- Comparer.cs
- TrustSection.cs
- DataGridViewButtonColumn.cs
- SqlDataSourceConfigureFilterForm.cs
- EntityContainerAssociationSetEnd.cs
- SmtpFailedRecipientsException.cs
- SnapshotChangeTrackingStrategy.cs
- Dispatcher.cs