Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Core / CSharp / System / Windows / Media / Parsers.cs / 1305600 / Parsers.cs
//------------------------------------------------------------------------------ // Microsoft Avalon // Copyright (c) Microsoft Corporation, 2001 // // File: Parsers.cs // Synopsis: Implements class Parsers for internal use of type converters // Created: 06/13/2002 // //----------------------------------------------------------------------------- using System; using System.Collections; using System.Collections.Specialized; using System.Diagnostics; using MS.Internal; using System.ComponentModel; using System.Globalization; using System.Windows.Media; using System.Windows.Media.Media3D; using System.Windows.Media.Animation; using System.Windows.Media.Imaging; using System.Windows; using SR=MS.Internal.PresentationCore.SR; using SRID=MS.Internal.PresentationCore.SRID; namespace MS.Internal { internal static partial class Parsers { private const int s_zeroChar = (int) '0'; private const int s_aLower = (int) 'a'; private const int s_aUpper = (int) 'A'; static private int ParseHexChar(char c ) { int intChar = (int) c; if ((intChar >= s_zeroChar) && (intChar <= (s_zeroChar+9))) { return (intChar-s_zeroChar); } if ((intChar >= s_aLower) && (intChar <= (s_aLower+5))) { return (intChar-s_aLower + 10); } if ((intChar >= s_aUpper) && (intChar <= (s_aUpper+5))) { return (intChar-s_aUpper + 10); } throw new FormatException(SR.Get(SRID.Parsers_IllegalToken)); } static private Color ParseHexColor(string trimmedColor) { int a,r,g,b; a = 255; if ( trimmedColor.Length > 7 ) { a = ParseHexChar(trimmedColor[1]) * 16 + ParseHexChar(trimmedColor[2]); r = ParseHexChar(trimmedColor[3]) * 16 + ParseHexChar(trimmedColor[4]); g = ParseHexChar(trimmedColor[5]) * 16 + ParseHexChar(trimmedColor[6]); b = ParseHexChar(trimmedColor[7]) * 16 + ParseHexChar(trimmedColor[8]); } else if ( trimmedColor.Length > 5) { r = ParseHexChar(trimmedColor[1]) * 16 + ParseHexChar(trimmedColor[2]); g = ParseHexChar(trimmedColor[3]) * 16 + ParseHexChar(trimmedColor[4]); b = ParseHexChar(trimmedColor[5]) * 16 + ParseHexChar(trimmedColor[6]); } else if (trimmedColor.Length > 4) { a = ParseHexChar(trimmedColor[1]); a = a + a*16; r = ParseHexChar(trimmedColor[2]); r = r + r*16; g = ParseHexChar(trimmedColor[3]); g = g + g*16; b = ParseHexChar(trimmedColor[4]); b = b + b*16; } else { r = ParseHexChar(trimmedColor[1]); r = r + r*16; g = ParseHexChar(trimmedColor[2]); g = g + g*16; b = ParseHexChar(trimmedColor[3]); b = b + b*16; } return ( Color.FromArgb ((byte)a, (byte)r, (byte)g, (byte)b) ); } internal const string s_ContextColor = "ContextColor "; internal const string s_ContextColorNoSpace = "ContextColor"; static private Color ParseContextColor(string trimmedColor, IFormatProvider formatProvider, ITypeDescriptorContext context) { if (!trimmedColor.StartsWith(s_ContextColor, StringComparison.OrdinalIgnoreCase)) { throw new FormatException(SR.Get(SRID.Parsers_IllegalToken)); } string tokens = trimmedColor.Substring(s_ContextColor.Length); tokens = tokens.Trim(); string[] preSplit = tokens.Split(new Char[] { ' ' }); if (preSplit.GetLength(0)< 2) { throw new FormatException(SR.Get(SRID.Parsers_IllegalToken)); } tokens = tokens.Substring(preSplit[0].Length); TokenizerHelper th = new TokenizerHelper(tokens, formatProvider); string[] split = tokens.Split(new Char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries); int numTokens = split.GetLength(0); float alpha = Convert.ToSingle(th.NextTokenRequired(), formatProvider); float[] values = new float[numTokens - 1]; for (int i = 0; i < numTokens - 1; i++) { values[i] = Convert.ToSingle(th.NextTokenRequired(), formatProvider); } string profileString = preSplit[0]; UriHolder uriHolder = TypeConverterHelper.GetUriFromUriContext(context,profileString); Uri profileUri; if (uriHolder.BaseUri != null) { profileUri = new Uri(uriHolder.BaseUri, uriHolder.OriginalUri); } else { profileUri = uriHolder.OriginalUri; } Color result = Color.FromAValues(alpha, values, profileUri); // If the number of color values found does not match the number of channels in the profile, we must throw if (result.ColorContext.NumChannels != values.Length) { throw new FormatException(SR.Get(SRID.Parsers_IllegalToken)); } return result; } static private Color ParseScRgbColor(string trimmedColor, IFormatProvider formatProvider) { if (!trimmedColor.StartsWith("sc#", StringComparison.Ordinal)) { throw new FormatException(SR.Get(SRID.Parsers_IllegalToken)); } string tokens = trimmedColor.Substring(3, trimmedColor.Length - 3); // The tokenizer helper will tokenize a list based on the IFormatProvider. TokenizerHelper th = new TokenizerHelper(tokens, formatProvider); float[] values = new float[4]; for (int i = 0; i < 3; i++) { values[i] = Convert.ToSingle(th.NextTokenRequired(), formatProvider); } if (th.NextToken()) { values[3] = Convert.ToSingle(th.GetCurrentToken(), formatProvider); // We should be out of tokens at this point if (th.NextToken()) { throw new FormatException(SR.Get(SRID.Parsers_IllegalToken)); } return Color.FromScRgb(values[0], values[1], values[2], values[3]); } else { return Color.FromScRgb(1.0f, values[0], values[1], values[2]); } } ////// ParseColor /// string with color description /// IFormatProvider for processing string /// internal static Color ParseColor(string color, IFormatProvider formatProvider) { return ParseColor(color, formatProvider, null); } ////// ParseColor /// string with color description /// IFormatProvider for processing string /// ITypeDescriptorContext /// internal static Color ParseColor(string color, IFormatProvider formatProvider, ITypeDescriptorContext context) { bool isPossibleKnowColor; bool isNumericColor; bool isScRgbColor; bool isContextColor; string trimmedColor = KnownColors.MatchColor(color, out isPossibleKnowColor, out isNumericColor, out isContextColor, out isScRgbColor); if ((isPossibleKnowColor == false) && (isNumericColor == false) && (isScRgbColor == false) && (isContextColor== false)) { throw new FormatException(SR.Get(SRID.Parsers_IllegalToken)); } //Is it a number? if (isNumericColor) { return ParseHexColor(trimmedColor); } else if (isContextColor) { return ParseContextColor(trimmedColor, formatProvider, context); } else if (isScRgbColor) { return ParseScRgbColor(trimmedColor, formatProvider); } else { KnownColor kc = KnownColors.ColorStringToKnownColor(trimmedColor); if (kc == KnownColor.UnknownColor) { throw new FormatException(SR.Get(SRID.Parsers_IllegalToken)); } return Color.FromUInt32((uint)kc); } } ////// ParseBrush /// string with brush description /// IFormatProvider for processing string /// ITypeDescriptorContext /// internal static Brush ParseBrush(string brush, IFormatProvider formatProvider, ITypeDescriptorContext context) { bool isPossibleKnownColor; bool isNumericColor; bool isScRgbColor; bool isContextColor; string trimmedColor = KnownColors.MatchColor(brush, out isPossibleKnownColor, out isNumericColor, out isContextColor, out isScRgbColor); if (trimmedColor.Length == 0) { throw new FormatException(SR.Get(SRID.Parser_Empty)); } // Note that because trimmedColor is exactly brush.Trim() we don't have to worry about // extra tokens as we do with TokenizerHelper. If we return one of the solid color // brushes then the ParseColor routine (or ColorStringToKnownColor) matched the entire // input. if (isNumericColor) { return (new SolidColorBrush(ParseHexColor(trimmedColor))); } if (isContextColor) { return (new SolidColorBrush(ParseContextColor(trimmedColor, formatProvider, context))); } if (isScRgbColor) { return (new SolidColorBrush(ParseScRgbColor(trimmedColor, formatProvider))); } if (isPossibleKnownColor) { SolidColorBrush scp = KnownColors.ColorStringToKnownBrush(trimmedColor); if (scp != null) { return scp; } } // If it's not a color, so the content is illegal. throw new FormatException(SR.Get(SRID.Parsers_IllegalToken)); } ////// ParseTransform - parse a Transform from a string /// internal static Transform ParseTransform( string transformString, IFormatProvider formatProvider) { Matrix matrix = Matrix.Parse(transformString); return new MatrixTransform(matrix); } ////// Parse a PathFigureCollection string. /// internal static PathFigureCollection ParsePathFigureCollection( string pathString, IFormatProvider formatProvider) { PathStreamGeometryContext context = new PathStreamGeometryContext(); AbbreviatedGeometryParser parser = new AbbreviatedGeometryParser(); parser.ParseToGeometryContext(context, pathString, 0 /* curIndex */); PathGeometry pathGeometry = context.GetPathGeometry(); return pathGeometry.Figures; } } } // 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
- QuaternionRotation3D.cs
- BrowserDefinitionCollection.cs
- FormatSettings.cs
- DescendantOverDescendantQuery.cs
- RIPEMD160.cs
- SchemaNamespaceManager.cs
- EncodingStreamWrapper.cs
- MaterialCollection.cs
- COM2ColorConverter.cs
- OpCellTreeNode.cs
- RepeatButtonAutomationPeer.cs
- SR.cs
- RegexFCD.cs
- InfoCardRSAPKCS1KeyExchangeFormatter.cs
- HttpResponse.cs
- StyleXamlParser.cs
- TrailingSpaceComparer.cs
- SchemaImporter.cs
- ServiceRouteHandler.cs
- EncoderFallback.cs
- StoragePropertyMapping.cs
- ObjectIDGenerator.cs
- PackageRelationship.cs
- SchemaMerger.cs
- TypedElement.cs
- MimeParameter.cs
- PageFunction.cs
- PagedDataSource.cs
- CannotUnloadAppDomainException.cs
- SeekableReadStream.cs
- DetailsViewRowCollection.cs
- CacheForPrimitiveTypes.cs
- RegistryHandle.cs
- ContentPosition.cs
- ActivityMarkupSerializer.cs
- DataBindingCollectionEditor.cs
- CommandBinding.cs
- DataControlField.cs
- SqlServer2KCompatibilityAnnotation.cs
- ReflectionHelper.cs
- SoapTypeAttribute.cs
- OleDbCommand.cs
- SrgsElementList.cs
- Identifier.cs
- securestring.cs
- InternalBufferOverflowException.cs
- LocatorPart.cs
- ObjectReaderCompiler.cs
- SystemEvents.cs
- CommentEmitter.cs
- WebPartManagerInternals.cs
- HashCoreRequest.cs
- LockedHandleGlyph.cs
- GregorianCalendar.cs
- ProjectionPath.cs
- WCFServiceClientProxyGenerator.cs
- BamlResourceDeserializer.cs
- SkinIDTypeConverter.cs
- ChannelServices.cs
- PeerName.cs
- QueryAccessibilityHelpEvent.cs
- ConstraintStruct.cs
- Listbox.cs
- SplayTreeNode.cs
- FlowDocumentPageViewerAutomationPeer.cs
- UIntPtr.cs
- SynchronizedMessageSource.cs
- CodeCatchClause.cs
- StaticSiteMapProvider.cs
- SynchronizedInputPattern.cs
- CommandHelper.cs
- SymbolMethod.cs
- WSTrust.cs
- CodeDelegateCreateExpression.cs
- ServiceNameCollection.cs
- ClientProxyGenerator.cs
- TimeSpan.cs
- HtmlForm.cs
- RankException.cs
- ObjectListItemCollection.cs
- VoiceSynthesis.cs
- documentsequencetextview.cs
- FixedHyperLink.cs
- RadioButton.cs
- typedescriptorpermission.cs
- HttpApplicationFactory.cs
- ResourceSet.cs
- AncestorChangedEventArgs.cs
- WaitForChangedResult.cs
- DrawingVisualDrawingContext.cs
- PropertyValidationContext.cs
- StyleCollection.cs
- AnnotationResourceCollection.cs
- RevocationPoint.cs
- BoundField.cs
- AnimationException.cs
- NullableBoolConverter.cs
- SourceSwitch.cs
- SqlConnection.cs
- AccessViolationException.cs