Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Core / CSharp / System / Windows / Media / textformatting / TextCharacters.cs / 1305600 / TextCharacters.cs
//------------------------------------------------------------------------ // // Microsoft Windows Client Platform // Copyright (C) Microsoft Corporation, 2004 // // File: TextCharacters.cs // // Contents: Implementation of text symbol for characters // // Spec: http://team/sites/Avalon/Specs/Text%20Formatting%20API.doc // // Created: 1-2-2004 Worachai Chaoweeraprasit (wchao) // //----------------------------------------------------------------------- using System; using System.Diagnostics; using System.Globalization; using System.Collections; using System.Collections.Generic; using System.Security; using System.Windows; using MS.Internal; using MS.Internal.Shaping; using MS.Internal.TextFormatting; using SR=MS.Internal.PresentationCore.SR; using SRID=MS.Internal.PresentationCore.SRID; namespace System.Windows.Media.TextFormatting { ////// A specialized TextSymbols implemented by TextFormatter to produces /// a collection of TextCharacterShape – each represents a collection of /// character glyphs from distinct physical typeface. /// public class TextCharacters : TextRun, ITextSymbols, IShapeableTextCollector { private CharacterBufferReference _characterBufferReference; private int _length; private TextRunProperties _textRunProperties; #region Constructors ////// Construct a run of text content from character array /// public TextCharacters( char[] characterArray, int offsetToFirstChar, int length, TextRunProperties textRunProperties ) : this( new CharacterBufferReference(characterArray, offsetToFirstChar), length, textRunProperties ) {} ////// Construct a run for text content from string /// public TextCharacters( string characterString, TextRunProperties textRunProperties ) : this( characterString, 0, // offserToFirstChar (characterString == null) ? 0 : characterString.Length, textRunProperties ) {} ////// Construct a run for text content from string /// public TextCharacters( string characterString, int offsetToFirstChar, int length, TextRunProperties textRunProperties ) : this( new CharacterBufferReference(characterString, offsetToFirstChar), length, textRunProperties ) {} ////// Construct a run for text content from unsafe character string /// ////// Critical: This manipulates unsafe pointers and calls into the critical CharacterBufferReference ctor. /// PublicOK: The caller needs unmanaged code permission in order to pass unsafe pointers to us. /// [SecurityCritical] [CLSCompliant(false)] public unsafe TextCharacters( char* unsafeCharacterString, int length, TextRunProperties textRunProperties ) : this( new CharacterBufferReference(unsafeCharacterString, length), length, textRunProperties ) {} ////// Internal constructor of TextContent /// private TextCharacters( CharacterBufferReference characterBufferReference, int length, TextRunProperties textRunProperties ) { if (length <= 0) { throw new ArgumentOutOfRangeException("length", SR.Get(SRID.ParameterMustBeGreaterThanZero)); } if (textRunProperties == null) { throw new ArgumentNullException("textRunProperties"); } if (textRunProperties.Typeface == null) { throw new ArgumentNullException("textRunProperties.Typeface"); } if (textRunProperties.CultureInfo == null) { throw new ArgumentNullException("textRunProperties.CultureInfo"); } if (textRunProperties.FontRenderingEmSize <= 0) { throw new ArgumentOutOfRangeException("textRunProperties.FontRenderingEmSize", SR.Get(SRID.ParameterMustBeGreaterThanZero)); } _characterBufferReference = characterBufferReference; _length = length; _textRunProperties = textRunProperties; } #endregion #region TextRun implementation ////// Character buffer /// public sealed override CharacterBufferReference CharacterBufferReference { get { return _characterBufferReference; } } ////// Character length of the run /// ///public sealed override int Length { get { return _length; } } /// /// A set of properties shared by every characters in the run /// public sealed override TextRunProperties Properties { get { return _textRunProperties; } } #endregion #region ITextSymbols implementation ////// Break a run of text into individually shape items. /// Shape items are delimited by /// Change of writing system /// Change of glyph typeface /// IListITextSymbols.GetTextShapeableSymbols( GlyphingCache glyphingCache, CharacterBufferReference characterBufferReference, int length, bool rightToLeft, bool isRightToLeftParagraph, CultureInfo digitCulture, TextModifierScope textModifierScope, TextFormattingMode textFormattingMode, bool isSideways ) { if (characterBufferReference.CharacterBuffer == null) { throw new ArgumentNullException("characterBufferReference.CharacterBuffer"); } int offsetToFirstChar = characterBufferReference.OffsetToFirstChar - _characterBufferReference.OffsetToFirstChar; Debug.Assert(characterBufferReference.CharacterBuffer == _characterBufferReference.CharacterBuffer); Debug.Assert(offsetToFirstChar >= 0 && offsetToFirstChar < _length); if ( length < 0 || offsetToFirstChar + length > _length) { length = _length - offsetToFirstChar; } // Get the actual text run properties in effect, after invoking any // text modifiers that may be in scope. TextRunProperties textRunProperties = _textRunProperties; if (textModifierScope != null) { textRunProperties = textModifierScope.ModifyProperties(textRunProperties); } if (!rightToLeft) { // Fast loop early out for run with all non-complex characters // which can be optimized by not going thru shaping engine. int nominalLength; if (textRunProperties.Typeface.CheckFastPathNominalGlyphs( new CharacterBufferRange(characterBufferReference, length), textRunProperties.FontRenderingEmSize, 1.0, double.MaxValue, // widthMax true, // keepAWord digitCulture != null, CultureMapper.GetSpecificCulture(textRunProperties.CultureInfo), textFormattingMode, isSideways, out nominalLength ) && length == nominalLength) { return new TextShapeableCharacters[] { new TextShapeableCharacters( new CharacterBufferRange(characterBufferReference, nominalLength), textRunProperties, textRunProperties.FontRenderingEmSize, new MS.Internal.Text.TextInterface.ItemProps(), null, // shapeTypeface (no shaping required) false, // nullShape, textFormattingMode, isSideways ) }; } } IList shapeables = new List (2); glyphingCache.GetShapeableText( textRunProperties.Typeface, characterBufferReference, length, textRunProperties, digitCulture, isRightToLeftParagraph, shapeables, this as IShapeableTextCollector, textFormattingMode ); return shapeables; } #endregion #region IShapeableTextCollector implementation /// /// Add shapeable text object to the list /// void IShapeableTextCollector.Add( IListshapeables, CharacterBufferRange characterBufferRange, TextRunProperties textRunProperties, MS.Internal.Text.TextInterface.ItemProps textItem, ShapeTypeface shapeTypeface, double emScale, bool nullShape, TextFormattingMode textFormattingMode ) { Debug.Assert(shapeables != null); shapeables.Add( new TextShapeableCharacters( characterBufferRange, textRunProperties, textRunProperties.FontRenderingEmSize * emScale, textItem, shapeTypeface, nullShape, textFormattingMode, false ) ); } #endregion } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------------------ // // Microsoft Windows Client Platform // Copyright (C) Microsoft Corporation, 2004 // // File: TextCharacters.cs // // Contents: Implementation of text symbol for characters // // Spec: http://team/sites/Avalon/Specs/Text%20Formatting%20API.doc // // Created: 1-2-2004 Worachai Chaoweeraprasit (wchao) // //----------------------------------------------------------------------- using System; using System.Diagnostics; using System.Globalization; using System.Collections; using System.Collections.Generic; using System.Security; using System.Windows; using MS.Internal; using MS.Internal.Shaping; using MS.Internal.TextFormatting; using SR=MS.Internal.PresentationCore.SR; using SRID=MS.Internal.PresentationCore.SRID; namespace System.Windows.Media.TextFormatting { /// /// A specialized TextSymbols implemented by TextFormatter to produces /// a collection of TextCharacterShape – each represents a collection of /// character glyphs from distinct physical typeface. /// public class TextCharacters : TextRun, ITextSymbols, IShapeableTextCollector { private CharacterBufferReference _characterBufferReference; private int _length; private TextRunProperties _textRunProperties; #region Constructors ////// Construct a run of text content from character array /// public TextCharacters( char[] characterArray, int offsetToFirstChar, int length, TextRunProperties textRunProperties ) : this( new CharacterBufferReference(characterArray, offsetToFirstChar), length, textRunProperties ) {} ////// Construct a run for text content from string /// public TextCharacters( string characterString, TextRunProperties textRunProperties ) : this( characterString, 0, // offserToFirstChar (characterString == null) ? 0 : characterString.Length, textRunProperties ) {} ////// Construct a run for text content from string /// public TextCharacters( string characterString, int offsetToFirstChar, int length, TextRunProperties textRunProperties ) : this( new CharacterBufferReference(characterString, offsetToFirstChar), length, textRunProperties ) {} ////// Construct a run for text content from unsafe character string /// ////// Critical: This manipulates unsafe pointers and calls into the critical CharacterBufferReference ctor. /// PublicOK: The caller needs unmanaged code permission in order to pass unsafe pointers to us. /// [SecurityCritical] [CLSCompliant(false)] public unsafe TextCharacters( char* unsafeCharacterString, int length, TextRunProperties textRunProperties ) : this( new CharacterBufferReference(unsafeCharacterString, length), length, textRunProperties ) {} ////// Internal constructor of TextContent /// private TextCharacters( CharacterBufferReference characterBufferReference, int length, TextRunProperties textRunProperties ) { if (length <= 0) { throw new ArgumentOutOfRangeException("length", SR.Get(SRID.ParameterMustBeGreaterThanZero)); } if (textRunProperties == null) { throw new ArgumentNullException("textRunProperties"); } if (textRunProperties.Typeface == null) { throw new ArgumentNullException("textRunProperties.Typeface"); } if (textRunProperties.CultureInfo == null) { throw new ArgumentNullException("textRunProperties.CultureInfo"); } if (textRunProperties.FontRenderingEmSize <= 0) { throw new ArgumentOutOfRangeException("textRunProperties.FontRenderingEmSize", SR.Get(SRID.ParameterMustBeGreaterThanZero)); } _characterBufferReference = characterBufferReference; _length = length; _textRunProperties = textRunProperties; } #endregion #region TextRun implementation ////// Character buffer /// public sealed override CharacterBufferReference CharacterBufferReference { get { return _characterBufferReference; } } ////// Character length of the run /// ///public sealed override int Length { get { return _length; } } /// /// A set of properties shared by every characters in the run /// public sealed override TextRunProperties Properties { get { return _textRunProperties; } } #endregion #region ITextSymbols implementation ////// Break a run of text into individually shape items. /// Shape items are delimited by /// Change of writing system /// Change of glyph typeface /// IListITextSymbols.GetTextShapeableSymbols( GlyphingCache glyphingCache, CharacterBufferReference characterBufferReference, int length, bool rightToLeft, bool isRightToLeftParagraph, CultureInfo digitCulture, TextModifierScope textModifierScope, TextFormattingMode textFormattingMode, bool isSideways ) { if (characterBufferReference.CharacterBuffer == null) { throw new ArgumentNullException("characterBufferReference.CharacterBuffer"); } int offsetToFirstChar = characterBufferReference.OffsetToFirstChar - _characterBufferReference.OffsetToFirstChar; Debug.Assert(characterBufferReference.CharacterBuffer == _characterBufferReference.CharacterBuffer); Debug.Assert(offsetToFirstChar >= 0 && offsetToFirstChar < _length); if ( length < 0 || offsetToFirstChar + length > _length) { length = _length - offsetToFirstChar; } // Get the actual text run properties in effect, after invoking any // text modifiers that may be in scope. TextRunProperties textRunProperties = _textRunProperties; if (textModifierScope != null) { textRunProperties = textModifierScope.ModifyProperties(textRunProperties); } if (!rightToLeft) { // Fast loop early out for run with all non-complex characters // which can be optimized by not going thru shaping engine. int nominalLength; if (textRunProperties.Typeface.CheckFastPathNominalGlyphs( new CharacterBufferRange(characterBufferReference, length), textRunProperties.FontRenderingEmSize, 1.0, double.MaxValue, // widthMax true, // keepAWord digitCulture != null, CultureMapper.GetSpecificCulture(textRunProperties.CultureInfo), textFormattingMode, isSideways, out nominalLength ) && length == nominalLength) { return new TextShapeableCharacters[] { new TextShapeableCharacters( new CharacterBufferRange(characterBufferReference, nominalLength), textRunProperties, textRunProperties.FontRenderingEmSize, new MS.Internal.Text.TextInterface.ItemProps(), null, // shapeTypeface (no shaping required) false, // nullShape, textFormattingMode, isSideways ) }; } } IList shapeables = new List (2); glyphingCache.GetShapeableText( textRunProperties.Typeface, characterBufferReference, length, textRunProperties, digitCulture, isRightToLeftParagraph, shapeables, this as IShapeableTextCollector, textFormattingMode ); return shapeables; } #endregion #region IShapeableTextCollector implementation /// /// Add shapeable text object to the list /// void IShapeableTextCollector.Add( IListshapeables, CharacterBufferRange characterBufferRange, TextRunProperties textRunProperties, MS.Internal.Text.TextInterface.ItemProps textItem, ShapeTypeface shapeTypeface, double emScale, bool nullShape, TextFormattingMode textFormattingMode ) { Debug.Assert(shapeables != null); shapeables.Add( new TextShapeableCharacters( characterBufferRange, textRunProperties, textRunProperties.FontRenderingEmSize * emScale, textItem, shapeTypeface, nullShape, textFormattingMode, false ) ); } #endregion } } // 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
- ConfigXmlReader.cs
- TextAutomationPeer.cs
- DateTimeConstantAttribute.cs
- PenContext.cs
- EndpointInfo.cs
- ErrorRuntimeConfig.cs
- RelationshipConstraintValidator.cs
- UIElementCollection.cs
- ILGen.cs
- Visual3D.cs
- ClipboardData.cs
- UIElementParaClient.cs
- PipelineModuleStepContainer.cs
- FrameworkContentElement.cs
- RelationshipEnd.cs
- EventMappingSettingsCollection.cs
- PeerCredential.cs
- RequiredAttributeAttribute.cs
- Utils.cs
- AppearanceEditorPart.cs
- ResourceSet.cs
- CommandEventArgs.cs
- ChooseAction.cs
- TableCell.cs
- ExtractedStateEntry.cs
- ToolboxComponentsCreatedEventArgs.cs
- DummyDataSource.cs
- WindowsRegion.cs
- InternalConfigConfigurationFactory.cs
- DragDeltaEventArgs.cs
- EntityConnection.cs
- SafeNativeMethods.cs
- SqlClientFactory.cs
- DbConnectionHelper.cs
- Parser.cs
- RtfControlWordInfo.cs
- DoubleMinMaxAggregationOperator.cs
- Bezier.cs
- CheckBox.cs
- OdbcParameter.cs
- AssertUtility.cs
- Variant.cs
- WebReferencesBuildProvider.cs
- XsltFunctions.cs
- UpdatePanelTriggerCollection.cs
- configsystem.cs
- SubpageParagraph.cs
- DiscoveryServerProtocol.cs
- sortedlist.cs
- HttpProcessUtility.cs
- QilName.cs
- Figure.cs
- QilReplaceVisitor.cs
- ScrollableControlDesigner.cs
- EventProxy.cs
- XmlSchemaAttribute.cs
- WarningException.cs
- HMAC.cs
- CounterSample.cs
- ContextProperty.cs
- HtmlTableRowCollection.cs
- ComboBoxAutomationPeer.cs
- HelpProvider.cs
- WebPartConnectionsCloseVerb.cs
- ForeignKeyConstraint.cs
- ToolStripProgressBar.cs
- DBCommand.cs
- StylusPoint.cs
- SqlPersonalizationProvider.cs
- SQLGuidStorage.cs
- MDIWindowDialog.cs
- NavigationHelper.cs
- EmptyEnumerable.cs
- DropShadowBitmapEffect.cs
- ArrayElementGridEntry.cs
- Viewport2DVisual3D.cs
- Shared.cs
- RectAnimationUsingKeyFrames.cs
- ChtmlPageAdapter.cs
- SharedPerformanceCounter.cs
- Thread.cs
- DesignerAttribute.cs
- ElementHostPropertyMap.cs
- VirtualizingPanel.cs
- ButtonDesigner.cs
- FlowLayoutPanel.cs
- CompiledQuery.cs
- TextEffectCollection.cs
- TreeBuilder.cs
- DataGridViewControlCollection.cs
- DisableDpiAwarenessAttribute.cs
- IdentityReference.cs
- RegistryKey.cs
- ImportDesigner.xaml.cs
- ListControlActionList.cs
- AffineTransform3D.cs
- FolderBrowserDialog.cs
- UnitySerializationHolder.cs
- RectangleHotSpot.cs
- ConfigurationLocation.cs