Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / wpf / src / Core / CSharp / MS / Internal / FontCache / CachedFontFamily.cs / 1 / CachedFontFamily.cs
//----------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
//
// Description: The CachedFontFamily class
//
// History:
// 03/04/2004 : mleonov - Cache layout and interface changes for font enumeration.
//
//---------------------------------------------------------------------------
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using System.Windows;
using System.Windows.Markup; // for XmlLanguage
using System.Windows.Media;
using MS.Win32;
using MS.Utility;
using MS.Internal;
using MS.Internal.FontFace;
namespace MS.Internal.FontCache
{
///
/// This structure exists because we need a common wrapper for enumeration, but we can't use original cache structures:
/// 1. C# doesn't allow IEnumerable/IEnumerator on pointer.
/// 2. The cache structures don't inherit from base class.
///
internal struct CachedFontFamily : IEnumerable
{
private FamilyCollection _familyCollection;
///
/// Critical: This holds reference to a pointer which is not ok to expose
///
[SecurityCritical]
private unsafe FamilyCollection.CachedFamily * _family;
///
/// Critical: Determines value of CheckedPointer.Size, which is used for bounds checking.
///
[SecurityCritical]
private int _sizeInBytes;
///
/// Critical: This stores a pointer and the class is unsafe because it manipulates the pointer; the sizeInBytes
/// parameter is critical because it is used for bounds checking (via CheckedPointer)
///
[SecurityCritical]
public unsafe CachedFontFamily(FamilyCollection familyCollection, FamilyCollection.CachedFamily* family, int sizeInBytes)
{
_familyCollection = familyCollection;
_family = family;
_sizeInBytes = sizeInBytes;
}
///
/// Critical: This acccesses a pointer
/// TreatAsSafe: This information is ok to expose
///
public bool IsNull
{
[SecurityCritical,SecurityTreatAsSafe]
get
{
unsafe
{
return _family == null;
}
}
}
///
/// Critical: This acccesses a pointer
/// TreatAsSafe: This information is ok to expose
///
public bool IsPhysical
{
[SecurityCritical,SecurityTreatAsSafe]
get
{
unsafe
{
return _family->familyType == FamilyCollection.FamilyType.Physical;
}
}
}
///
/// Critical: This acccesses a pointer
/// TreatAsSafe: This information is ok to expose
///
public bool IsComposite
{
[SecurityCritical,SecurityTreatAsSafe]
get
{
unsafe
{
return _family->familyType == FamilyCollection.FamilyType.Composite;
}
}
}
///
/// Critical: This acccesses a pointer
/// TreatAsSafe: This information is ok to expose
///
public string OrdinalName
{
[SecurityCritical,SecurityTreatAsSafe]
get
{
unsafe
{
return _familyCollection.GetFamilyName(_family);
}
}
}
///
/// Critical: This acccesses a pointer and returns a pointer to a structure
///
public unsafe FamilyCollection.CachedPhysicalFamily* PhysicalFamily
{
[SecurityCritical]
get
{
Invariant.Assert(IsPhysical);
return (FamilyCollection.CachedPhysicalFamily *)_family;
}
}
///
/// Critical: This acccesses a pointer and returns a pointer to a structure
///
public unsafe FamilyCollection.CachedCompositeFamily* CompositeFamily
{
[SecurityCritical]
get
{
Invariant.Assert(IsComposite);
return (FamilyCollection.CachedCompositeFamily *)_family;
}
}
///
/// Critical: Accesses critical fields and constructs a CheckedPointer which is a critical operation.
/// TreatAsSafe: The fields used to construct the CheckedPointer are marked critical and CheckedPointer
/// itself is safe to expose.
///
public CheckedPointer CheckedPointer
{
[SecurityCritical,SecurityTreatAsSafe]
get
{
unsafe
{
return new CheckedPointer(_family, _sizeInBytes);
}
}
}
public FamilyCollection FamilyCollection
{
get
{
return _familyCollection;
}
}
///
/// Critical: This acccesses a pointer
/// TreatAsSafe: This information is ok to expose
///
public int NumberOfFaces
{
[SecurityCritical,SecurityTreatAsSafe]
get
{
unsafe
{
return _family->numberOfTypefaces;
}
}
}
///
/// Critical: This acccesses a pointer
/// TreatAsSafe: This information is ok to expose
///
public double Baseline
{
[SecurityCritical,SecurityTreatAsSafe]
get
{
unsafe
{
return _family->baseline;
}
}
}
///
/// Critical: This acccesses a pointer
/// TreatAsSafe: This information is ok to expose
///
public double LineSpacing
{
[SecurityCritical, SecurityTreatAsSafe]
get
{
unsafe
{
return _family->lineSpacing;
}
}
}
///
/// Critical: This acccesses a pointer
/// TreatAsSafe: This information is ok to expose
///
public IDictionary Names
{
[SecurityCritical,SecurityTreatAsSafe]
get
{
unsafe
{
return _familyCollection.GetLocalizedNameDictionary(_family);
}
}
}
#region IEnumerable Members
IEnumerator IEnumerable.GetEnumerator()
{
return new Enumerator(this);
}
#endregion
#region IEnumerable Members
IEnumerator IEnumerable.GetEnumerator()
{
return new Enumerator(this);
}
#endregion
private unsafe struct Enumerator : IEnumerator
{
private int _currentFace;
private CachedFontFamily _family;
public Enumerator(CachedFontFamily family)
{
_family = family;
_currentFace = -1;
}
#region IEnumerator Members
///
/// Critical: This acccesses a pointer
/// TreatAsSafe: This funtions moves to the next
///
[SecurityCritical,SecurityTreatAsSafe]
public bool MoveNext()
{
++_currentFace;
if (0 <= _currentFace && _currentFace < _family.NumberOfFaces)
return true;
_currentFace = _family.NumberOfFaces;
return false;
}
///
/// Critical: This acccesses a pointer
/// TreatAsSafe: This information is ok to expose
///
CachedFontFace IEnumerator.Current
{
[SecurityCritical,SecurityTreatAsSafe]
get
{
return _family.FamilyCollection.GetCachedFace(_family, _currentFace);
}
}
#endregion
#region IEnumerator Members
object IEnumerator.Current
{
get
{
return ((IEnumerator)this).Current;
}
}
void IEnumerator.Reset()
{
_currentFace = -1;
}
#endregion
#region IDisposable Members
public void Dispose() {}
#endregion
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
//----------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
//
// Description: The CachedFontFamily class
//
// History:
// 03/04/2004 : mleonov - Cache layout and interface changes for font enumeration.
//
//---------------------------------------------------------------------------
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using System.Windows;
using System.Windows.Markup; // for XmlLanguage
using System.Windows.Media;
using MS.Win32;
using MS.Utility;
using MS.Internal;
using MS.Internal.FontFace;
namespace MS.Internal.FontCache
{
///
/// This structure exists because we need a common wrapper for enumeration, but we can't use original cache structures:
/// 1. C# doesn't allow IEnumerable/IEnumerator on pointer.
/// 2. The cache structures don't inherit from base class.
///
internal struct CachedFontFamily : IEnumerable
{
private FamilyCollection _familyCollection;
///
/// Critical: This holds reference to a pointer which is not ok to expose
///
[SecurityCritical]
private unsafe FamilyCollection.CachedFamily * _family;
///
/// Critical: Determines value of CheckedPointer.Size, which is used for bounds checking.
///
[SecurityCritical]
private int _sizeInBytes;
///
/// Critical: This stores a pointer and the class is unsafe because it manipulates the pointer; the sizeInBytes
/// parameter is critical because it is used for bounds checking (via CheckedPointer)
///
[SecurityCritical]
public unsafe CachedFontFamily(FamilyCollection familyCollection, FamilyCollection.CachedFamily* family, int sizeInBytes)
{
_familyCollection = familyCollection;
_family = family;
_sizeInBytes = sizeInBytes;
}
///
/// Critical: This acccesses a pointer
/// TreatAsSafe: This information is ok to expose
///
public bool IsNull
{
[SecurityCritical,SecurityTreatAsSafe]
get
{
unsafe
{
return _family == null;
}
}
}
///
/// Critical: This acccesses a pointer
/// TreatAsSafe: This information is ok to expose
///
public bool IsPhysical
{
[SecurityCritical,SecurityTreatAsSafe]
get
{
unsafe
{
return _family->familyType == FamilyCollection.FamilyType.Physical;
}
}
}
///
/// Critical: This acccesses a pointer
/// TreatAsSafe: This information is ok to expose
///
public bool IsComposite
{
[SecurityCritical,SecurityTreatAsSafe]
get
{
unsafe
{
return _family->familyType == FamilyCollection.FamilyType.Composite;
}
}
}
///
/// Critical: This acccesses a pointer
/// TreatAsSafe: This information is ok to expose
///
public string OrdinalName
{
[SecurityCritical,SecurityTreatAsSafe]
get
{
unsafe
{
return _familyCollection.GetFamilyName(_family);
}
}
}
///
/// Critical: This acccesses a pointer and returns a pointer to a structure
///
public unsafe FamilyCollection.CachedPhysicalFamily* PhysicalFamily
{
[SecurityCritical]
get
{
Invariant.Assert(IsPhysical);
return (FamilyCollection.CachedPhysicalFamily *)_family;
}
}
///
/// Critical: This acccesses a pointer and returns a pointer to a structure
///
public unsafe FamilyCollection.CachedCompositeFamily* CompositeFamily
{
[SecurityCritical]
get
{
Invariant.Assert(IsComposite);
return (FamilyCollection.CachedCompositeFamily *)_family;
}
}
///
/// Critical: Accesses critical fields and constructs a CheckedPointer which is a critical operation.
/// TreatAsSafe: The fields used to construct the CheckedPointer are marked critical and CheckedPointer
/// itself is safe to expose.
///
public CheckedPointer CheckedPointer
{
[SecurityCritical,SecurityTreatAsSafe]
get
{
unsafe
{
return new CheckedPointer(_family, _sizeInBytes);
}
}
}
public FamilyCollection FamilyCollection
{
get
{
return _familyCollection;
}
}
///
/// Critical: This acccesses a pointer
/// TreatAsSafe: This information is ok to expose
///
public int NumberOfFaces
{
[SecurityCritical,SecurityTreatAsSafe]
get
{
unsafe
{
return _family->numberOfTypefaces;
}
}
}
///
/// Critical: This acccesses a pointer
/// TreatAsSafe: This information is ok to expose
///
public double Baseline
{
[SecurityCritical,SecurityTreatAsSafe]
get
{
unsafe
{
return _family->baseline;
}
}
}
///
/// Critical: This acccesses a pointer
/// TreatAsSafe: This information is ok to expose
///
public double LineSpacing
{
[SecurityCritical, SecurityTreatAsSafe]
get
{
unsafe
{
return _family->lineSpacing;
}
}
}
///
/// Critical: This acccesses a pointer
/// TreatAsSafe: This information is ok to expose
///
public IDictionary Names
{
[SecurityCritical,SecurityTreatAsSafe]
get
{
unsafe
{
return _familyCollection.GetLocalizedNameDictionary(_family);
}
}
}
#region IEnumerable Members
IEnumerator IEnumerable.GetEnumerator()
{
return new Enumerator(this);
}
#endregion
#region IEnumerable Members
IEnumerator IEnumerable.GetEnumerator()
{
return new Enumerator(this);
}
#endregion
private unsafe struct Enumerator : IEnumerator
{
private int _currentFace;
private CachedFontFamily _family;
public Enumerator(CachedFontFamily family)
{
_family = family;
_currentFace = -1;
}
#region IEnumerator Members
///
/// Critical: This acccesses a pointer
/// TreatAsSafe: This funtions moves to the next
///
[SecurityCritical,SecurityTreatAsSafe]
public bool MoveNext()
{
++_currentFace;
if (0 <= _currentFace && _currentFace < _family.NumberOfFaces)
return true;
_currentFace = _family.NumberOfFaces;
return false;
}
///
/// Critical: This acccesses a pointer
/// TreatAsSafe: This information is ok to expose
///
CachedFontFace IEnumerator.Current
{
[SecurityCritical,SecurityTreatAsSafe]
get
{
return _family.FamilyCollection.GetCachedFace(_family, _currentFace);
}
}
#endregion
#region IEnumerator Members
object IEnumerator.Current
{
get
{
return ((IEnumerator)this).Current;
}
}
void IEnumerator.Reset()
{
_currentFace = -1;
}
#endregion
#region IDisposable Members
public void Dispose() {}
#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
- ShaderRenderModeValidation.cs
- VolatileResourceManager.cs
- TextEditor.cs
- TextBounds.cs
- WindowsRegion.cs
- RowBinding.cs
- MouseWheelEventArgs.cs
- ComplexObject.cs
- PerfService.cs
- NullableConverter.cs
- VirtualizedItemPattern.cs
- WebPartTransformerCollection.cs
- SessionStateModule.cs
- CollectionExtensions.cs
- DataGridViewElement.cs
- ItemMap.cs
- InfoCardTraceRecord.cs
- TextTreeObjectNode.cs
- ConfigurationValues.cs
- WindowsFormsLinkLabel.cs
- MultiView.cs
- EntityDataSourceValidationException.cs
- FileDialogCustomPlacesCollection.cs
- InlineObject.cs
- TextTreeFixupNode.cs
- SecurityDocument.cs
- RectangleHotSpot.cs
- MonthCalendar.cs
- printdlgexmarshaler.cs
- MtomMessageEncoder.cs
- FieldAccessException.cs
- ExpressionReplacer.cs
- MatrixAnimationBase.cs
- TextRangeAdaptor.cs
- InternalConfigRoot.cs
- LightweightCodeGenerator.cs
- QilTernary.cs
- MemberProjectedSlot.cs
- XhtmlBasicSelectionListAdapter.cs
- ToolStripContentPanelRenderEventArgs.cs
- XNodeSchemaApplier.cs
- MethodAccessException.cs
- TextDecorationLocationValidation.cs
- ADMembershipProvider.cs
- DecoderReplacementFallback.cs
- MaskedTextProvider.cs
- Range.cs
- RightsManagementInformation.cs
- StorageComplexPropertyMapping.cs
- EffectiveValueEntry.cs
- SetterBaseCollection.cs
- COM2Properties.cs
- ServiceAuthorizationManager.cs
- RoutedEvent.cs
- ToolStripGripRenderEventArgs.cs
- FileRecordSequenceHelper.cs
- DropDownButton.cs
- QueryStoreStatusRequest.cs
- TextEvent.cs
- Thread.cs
- DbConnectionOptions.cs
- ClientSession.cs
- EventLogPermissionAttribute.cs
- MonitorWrapper.cs
- DependencyObjectType.cs
- PaintValueEventArgs.cs
- ComNativeDescriptor.cs
- NetCodeGroup.cs
- ListViewItemMouseHoverEvent.cs
- UserNamePasswordValidationMode.cs
- StringFreezingAttribute.cs
- WinFormsSecurity.cs
- Visitors.cs
- DesignerCategoryAttribute.cs
- ClientConvert.cs
- GenericAuthenticationEventArgs.cs
- assemblycache.cs
- CommandDevice.cs
- TableLayoutRowStyleCollection.cs
- RemotingSurrogateSelector.cs
- XPathSelfQuery.cs
- FileLevelControlBuilderAttribute.cs
- KnownTypesHelper.cs
- XmlDictionaryReaderQuotasElement.cs
- DbConnectionPoolGroupProviderInfo.cs
- PostBackOptions.cs
- PowerStatus.cs
- DatagridviewDisplayedBandsData.cs
- AssemblyBuilderData.cs
- MeshGeometry3D.cs
- HitTestDrawingContextWalker.cs
- TreeNodeCollection.cs
- MobileControlsSection.cs
- ToolStripHighContrastRenderer.cs
- Drawing.cs
- ObjectCloneHelper.cs
- SmtpReplyReaderFactory.cs
- SessionStateModule.cs
- GridPattern.cs
- HeaderedContentControl.cs