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 ListmarkupOrder = 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 ListmarkupOrder = 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
- SurrogateSelector.cs
- MetadataImporter.cs
- BitmapFrameEncode.cs
- Parameter.cs
- WebPartDisplayModeCancelEventArgs.cs
- EnumBuilder.cs
- FocusManager.cs
- PageFunction.cs
- AppDomainResourcePerfCounters.cs
- BindStream.cs
- WebPartMovingEventArgs.cs
- Parser.cs
- SelectionRange.cs
- GlyphTypeface.cs
- IgnorePropertiesAttribute.cs
- OdbcReferenceCollection.cs
- _Rfc2616CacheValidators.cs
- NegotiateStream.cs
- OptionalColumn.cs
- LayoutEditorPart.cs
- InkCanvasSelection.cs
- SendSecurityHeaderElementContainer.cs
- manifestimages.cs
- MessageBox.cs
- ToolStripContentPanel.cs
- SupportingTokenSpecification.cs
- XPathBinder.cs
- Token.cs
- DataGridViewRowConverter.cs
- COM2ExtendedTypeConverter.cs
- NameValueFileSectionHandler.cs
- EntitySqlQueryCacheEntry.cs
- ToolTip.cs
- Cursor.cs
- DetailsViewCommandEventArgs.cs
- Triangle.cs
- SoapReflectionImporter.cs
- KeyMatchBuilder.cs
- TextureBrush.cs
- ListViewItem.cs
- InitializerFacet.cs
- BookmarkEventArgs.cs
- ProcessModelInfo.cs
- AutomationElement.cs
- OleDbConnection.cs
- HttpCachePolicyBase.cs
- LayoutEvent.cs
- DesignSurfaceManager.cs
- RenderingEventArgs.cs
- UntrustedRecipientException.cs
- IPCCacheManager.cs
- QueryResponse.cs
- SvcMapFileLoader.cs
- GradientStop.cs
- DesignerVerbCollection.cs
- printdlgexmarshaler.cs
- CharEntityEncoderFallback.cs
- CompoundFileDeflateTransform.cs
- AppDomainManager.cs
- DataGridViewHeaderCell.cs
- TypeReference.cs
- TransactionInformation.cs
- OleDbCommandBuilder.cs
- IgnoreSectionHandler.cs
- PopupControlService.cs
- ResXBuildProvider.cs
- AtomParser.cs
- PublisherMembershipCondition.cs
- ForceCopyBuildProvider.cs
- UriTemplateClientFormatter.cs
- TextServicesHost.cs
- XmlSchemaDocumentation.cs
- DropShadowBitmapEffect.cs
- TemplateBindingExtensionConverter.cs
- ContentElement.cs
- XmlValidatingReader.cs
- InstancePersistenceContext.cs
- SqlGatherProducedAliases.cs
- CompilerGeneratedAttribute.cs
- connectionpool.cs
- BaseAppDomainProtocolHandler.cs
- MemberProjectedSlot.cs
- DmlSqlGenerator.cs
- ContentType.cs
- SlipBehavior.cs
- ToolStripEditorManager.cs
- PingReply.cs
- InvalidPropValue.cs
- InternalResources.cs
- KnownIds.cs
- SchemaElement.cs
- EncoderBestFitFallback.cs
- DatagridviewDisplayedBandsData.cs
- Timeline.cs
- PersonalizationProvider.cs
- _SSPIWrapper.cs
- HostedTransportConfigurationManager.cs
- xmlsaver.cs
- XPathNavigatorReader.cs
- SchemaMapping.cs