Code:
/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Core / MS / Internal / Media / XamlSerializationHelper.cs / 1 / XamlSerializationHelper.cs
//---------------------------------------------------------------------------- // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // // Description: Utilities for converting types to custom Binary format // // History: // 11/09/05 : [....] - Created // //--------------------------------------------------------------------------- using System; using System.IO; using System.Collections; using System.Globalization; // CultureInfo #if PRESENTATION_CORE using MS.Internal.PresentationCore; // FriendAccessAllowed #elif PRESENTATIONFRAMEWORK using MS.Internal.PresentationFramework; #endif #if PBTCOMPILER using System.Collections.Generic; namespace MS.Internal.Markup #else using System.Windows; using System.Windows.Media ; using System.Windows.Media.Media3D; namespace MS.Internal.Media #endif { #if PBTCOMPILER // // Internal class used during serialization of Point3D, or Vectors. // // We define this struct so that we can create a collection of types during serialization. // If we used defined avalon types, like Point & Vector, we'd have to bring these into PBT // with a compiler change everytime these types are changed. // // The type is called "ThreeDoubles" to make clear what it is and what it's for. // // If either Vector3D or Point3D changes - we will need to change this code. // internal class ThreeDoublesMarkup { internal ThreeDoublesMarkup( double X, double Y, double Z) { _x = X; _y = Y; _z = Z; } internal double X { get { return _x; } } internal double Y { get { return _y; } } internal double Z { get { return _z; } } double _x ; double _y ; double _z ; } internal struct Point { internal Point(double x, double y) { _x = x; _y = y; } internal double X { set { _x = value; } get { return _x; } } internal double Y { set { _y = value; } get { return _y; } } private double _x; private double _y; } internal struct Size { internal Size(double width, double height) { _width = width; _height = height; } internal double Width { set { _width = value; } get { return _width; } } internal double Height { set { _height = value; } get { return _height; } } private double _width; private double _height; } #endif internal static class XamlSerializationHelper { // ===================================================== // // All PBT specific types and methods go here. // // ===================================================== internal enum SerializationFloatType : byte { Unknown = 0, Zero = 1, One = 2, MinusOne = 3, ScaledInteger = 4, Double = 5, Other } ////// Serialize this object using the passed writer in compact BAML binary format. /// ////// This is called ONLY from the Parser and is not a general public method. /// #if !PBTCOMPILER [FriendAccessAllowed] // Built into Core, also used by Framework. #endif internal static bool SerializePoint3D(BinaryWriter writer, string stringValues) { #if PBTCOMPILER Listpoint3Ds = ParseThreeDoublesCollection( stringValues, CultureInfo.GetCultureInfo("en-us") ) ; ThreeDoublesMarkup curPoint; #else Point3DCollection point3Ds = Point3DCollection.Parse( stringValues ) ; Point3D curPoint ; #endif // Write out the size. writer.Write( ( uint ) point3Ds.Count ) ; // Write out the doubles. for ( int i = 0; i < point3Ds.Count ; i ++ ) { curPoint = point3Ds[i] ; WriteDouble( writer, curPoint.X); WriteDouble( writer, curPoint.Y); WriteDouble( writer, curPoint.Z); } return true ; } /// /// Serialize this object using the passed writer in compact BAML binary format. /// ////// This is called ONLY from the Parser and is not a general public method. /// #if !PBTCOMPILER [FriendAccessAllowed] // Built into Core, also used by Framework. #endif internal static bool SerializeVector3D(BinaryWriter writer, string stringValues) { #if PBTCOMPILER Listpoints = ParseThreeDoublesCollection( stringValues, CultureInfo.GetCultureInfo("en-us") ) ; ThreeDoublesMarkup curPoint; #else Vector3DCollection points = Vector3DCollection.Parse( stringValues ) ; Vector3D curPoint ; #endif // Write out the size. writer.Write( ( uint ) points.Count ) ; // Write out the doubles. for ( int i = 0; i < points.Count ; i ++ ) { curPoint = points[ i ] ; WriteDouble( writer, curPoint.X); WriteDouble( writer, curPoint.Y); WriteDouble( writer, curPoint.Z); } return true ; } /// /// Serialize this object using the passed writer in compact BAML binary format. /// ////// This is called ONLY from the Parser and is not a general public method. /// #if !PBTCOMPILER [FriendAccessAllowed] // Built into Core, also used by Framework. #endif internal static bool SerializePoint(BinaryWriter writer, string stringValue) { #if PBTCOMPILER Listpoints = ParsePointCollection( stringValue, CultureInfo.GetCultureInfo("en-us") ) ; Point curPoint; #else PointCollection points = PointCollection.Parse( stringValue ) ; Point curPoint ; #endif // Write out the size. writer.Write( ( uint ) points.Count ) ; // Write out the doubles. for ( int i = 0; i < points.Count ; i ++ ) { curPoint = points[ i ] ; WriteDouble( writer, curPoint.X); WriteDouble( writer, curPoint.Y); } return true ; } private const double scaleFactor = 1000000 ; // approx == 2^20 private const double inverseScaleFactor = 0.000001 ; // approx = 1 / 2^20 // // Write a double into our internal binary format // // // The format is : // ( <4 bytes for scaledinteger> | < 8 bytes for double> ) // internal static void WriteDouble( BinaryWriter writer, Double value ) { if ( value == 0.0 ) { writer.Write( (byte) SerializationFloatType.Zero ) ; } else if ( value == 1.0 ) { writer.Write( (byte) SerializationFloatType.One ) ; } else if ( value == -1.0 ) { writer.Write( (byte) SerializationFloatType.MinusOne ) ; } else { int intValue = 0 ; if ( CanConvertToInteger( value, ref intValue ) ) { writer.Write( (byte) SerializationFloatType.ScaledInteger ) ; writer.Write( intValue ) ; } else { writer.Write( (byte) SerializationFloatType.Double ) ; writer.Write( value ) ; } } } #if !PBTCOMPILER // // Read a double from our internal binary format. // We assume that the binary reader is at the start of a byte. // internal static double ReadDouble( BinaryReader reader ) { SerializationFloatType type = ( SerializationFloatType ) reader.ReadByte(); switch( type ) { case SerializationFloatType.Zero : return 0.0 ; case SerializationFloatType.One : return 1.0 ; case SerializationFloatType.MinusOne : return -1.0 ; case SerializationFloatType.ScaledInteger : return ReadScaledInteger( reader ); case SerializationFloatType.Double : return reader.ReadDouble(); default: throw new ArgumentException(SR.Get(SRID.FloatUnknownBamlType)); } } internal static double ReadScaledInteger(BinaryReader reader ) { double value = (double) reader.ReadInt32(); value = value * inverseScaleFactor ; return value ; } #endif #if PBTCOMPILER /// /// Parse - returns an instance converted from the provided string. /// string with Point3DCollection data /// IFormatprovider for processing string /// private static ListParseThreeDoublesCollection(string source, IFormatProvider formatProvider) { TokenizerHelper th = new TokenizerHelper(source, formatProvider); List resource = new List ( source.Length/ 8 ) ; // SWAG the length of the collection. ThreeDoublesMarkup value; while (th.NextToken()) { value = new ThreeDoublesMarkup( Convert.ToDouble(th.GetCurrentToken(), formatProvider), Convert.ToDouble(th.NextTokenRequired(), formatProvider), Convert.ToDouble(th.NextTokenRequired(), formatProvider)); resource.Add(value); } return resource; } /// /// Parse - returns an instance converted from the provided string. /// string with Point3DCollection data /// IFormatprovider for processing string /// private static ListParsePointCollection(string source, IFormatProvider formatProvider) { TokenizerHelper th = new TokenizerHelper(source, formatProvider); List resource = new List (source.Length/ 8 ); // SWAG the length of the collection. Point value; while (th.NextToken()) { value = new Point( Convert.ToDouble(th.GetCurrentToken(), formatProvider), Convert.ToDouble(th.NextTokenRequired(), formatProvider) ); resource.Add(value); } return resource; } #endif // // Can we convert this double to a "scaled integer" // // We multiply by approx 2^20 - see if the result is either // - greater than maxInt // - if there is a non-numeric integer remaining // // as a result this routine will convert doubles with six-digits precision between +/- 2048 // internal static bool CanConvertToInteger( Double doubleValue , ref int intValue ) { double scaledValue ; double scaledInteger ; scaledValue = doubleValue * scaleFactor ; scaledInteger = Math.Floor( scaledValue ) ; if ( !( scaledInteger <= Int32.MaxValue ) // equivalent to scaledInteger > MaxValue, but take care of NaN. || !( scaledInteger >= Int32.MinValue ) ) // equivalent to scaledInteger < Minvalue but take care of NaN. { return false ; } else if ( ( scaledValue - scaledInteger ) > Double.Epsilon ) { return false ; } else { intValue = (int) scaledValue ; return true ; } } } } // 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
- PersonalizationProviderHelper.cs
- MouseWheelEventArgs.cs
- CryptoStream.cs
- Win32SafeHandles.cs
- DeviceSpecificChoice.cs
- Container.cs
- SqlExpressionNullability.cs
- HtmlInputPassword.cs
- ExtendedPropertyDescriptor.cs
- XmlQuerySequence.cs
- ChtmlPhoneCallAdapter.cs
- BasePattern.cs
- TreeViewDesigner.cs
- BitmapImage.cs
- TypedElement.cs
- LabelEditEvent.cs
- ComboBoxItem.cs
- CollectionBuilder.cs
- CodeExpressionCollection.cs
- PolicyFactory.cs
- AuditLog.cs
- _FtpDataStream.cs
- HandlerElementCollection.cs
- EnterpriseServicesHelper.cs
- Currency.cs
- FileSystemEventArgs.cs
- DbConnectionPool.cs
- XmlDeclaration.cs
- ManagedIStream.cs
- ConvertersCollection.cs
- FileUpload.cs
- ReferencedType.cs
- CompilerErrorCollection.cs
- ChainedAsyncResult.cs
- StandardBindingCollectionElement.cs
- BitmapEffectCollection.cs
- SEHException.cs
- DataGridCommandEventArgs.cs
- RelationshipFixer.cs
- RandomNumberGenerator.cs
- DoubleCollectionConverter.cs
- InputBuffer.cs
- BezierSegment.cs
- BufferedGraphicsContext.cs
- Configuration.cs
- RtfFormatStack.cs
- WindowsFormsSynchronizationContext.cs
- OptimalTextSource.cs
- BitmapEffectGroup.cs
- HwndStylusInputProvider.cs
- CharKeyFrameCollection.cs
- TextEditorParagraphs.cs
- IQueryable.cs
- EndCreateSecurityTokenRequest.cs
- AsyncMethodInvoker.cs
- Speller.cs
- XmlSchemaSimpleContentExtension.cs
- HttpHandlerActionCollection.cs
- CounterCreationDataCollection.cs
- ContentPlaceHolder.cs
- FigureHelper.cs
- AxWrapperGen.cs
- FtpRequestCacheValidator.cs
- SelectionEditingBehavior.cs
- ProtocolsSection.cs
- ScriptBehaviorDescriptor.cs
- TextTreeInsertUndoUnit.cs
- DBCommand.cs
- SqlMethods.cs
- UIInitializationException.cs
- Point3DConverter.cs
- TreeNodeCollection.cs
- CodeMethodInvokeExpression.cs
- UserControlCodeDomTreeGenerator.cs
- CuspData.cs
- DesignerDataStoredProcedure.cs
- DataGridViewColumn.cs
- ApplicationServicesHostFactory.cs
- PcmConverter.cs
- ArgumentDirectionHelper.cs
- BamlLocalizerErrorNotifyEventArgs.cs
- StrokeIntersection.cs
- InputScopeAttribute.cs
- WizardPanel.cs
- LockedHandleGlyph.cs
- TemplateComponentConnector.cs
- NotFiniteNumberException.cs
- IpcChannel.cs
- WebEvents.cs
- MouseActionValueSerializer.cs
- InfoCardSymmetricAlgorithm.cs
- ExtenderHelpers.cs
- RoleService.cs
- RequestDescription.cs
- DiagnosticEventProvider.cs
- WebPartMovingEventArgs.cs
- ToolStripDropDownClosingEventArgs.cs
- _TransmitFileOverlappedAsyncResult.cs
- invalidudtexception.cs
- TCPListener.cs