Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / wpf / src / Core / CSharp / System / Windows / Media / Effects / BitmapEffectGroup.cs / 1 / BitmapEffectGroup.cs
//------------------------------------------------------------------------------
// Microsoft Avalon
// Copyright (c) Microsoft Corporation, 2005
//
// File: BitmapEffectGroup.cs
//-----------------------------------------------------------------------------
using System;
using System.Windows;
using System.Windows.Media;
using System.ComponentModel;
using System.ComponentModel.Design.Serialization;
using System.Reflection;
using System.Collections;
using System.Collections.Generic;
using MS.Internal;
using System.Windows.Media.Animation;
using System.Globalization;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Markup;
using System.Windows.Media.Composition;
using System.Diagnostics;
using SR=MS.Internal.PresentationCore.SR;
using SRID=MS.Internal.PresentationCore.SRID;
namespace System.Windows.Media.Effects
{
///
/// This contains the managed effect object and
/// a corresponding unmanaged handle
///
internal struct BitmapEffectHandle
{
public BitmapEffect effect;
public SafeHandle handle;
public BitmapEffectHandle(BitmapEffect e, SafeHandle h)
{
effect = e;
handle = h;
}
}
///
/// The class defintion for BitmapEffectGroup
///
[ContentProperty("Children")]
public sealed partial class BitmapEffectGroup : BitmapEffect
{
List _childrenHandles;
Dictionary> _mapGroupToChildren;
///
///
///
public BitmapEffectGroup()
{
_mapGroupToChildren = new Dictionary>();
}
///
/// 1. Updates (propagates) the properties to the unmanaged handle of all
/// the child effects
/// 2. Sets up all the connections
/// 3. Wraps the list with the aggregate effect
///
/// Unmanaged handle for aggregate effect
protected override void UpdateUnmanagedPropertyState(SafeHandle unmanagedEffect)
{
// if the group has no children, there is nothing to update
if (Children == null || Children.Count <= 0)
return;
List children = GetChildrenHandles(unmanagedEffect);
for (int i = 0; i < children.Count; i++)
{
children[i].effect.Internal_UpdateUnmanagedPropertyState(children[i].handle);
}
SetupConnections(unmanagedEffect, children);
}
///
/// Setup the connections
///
private void SetupConnections(SafeHandle unmanagedEffect, List children)
{
if (!_connectionsSetup)
{
// find the first effect that has both inputs and outputs
BitmapEffectHandle firstEffect = children[0];
int index = 0;
for (; index < children.Count; index++)
{
if (BitmapEffect.GetNumberInputs(children[index].handle) >= 1 &&
BitmapEffect.GetNumberOutputs(children[index].handle) >= 1)
{
firstEffect = children[index];
break;
}
}
if (index >= children.Count)
return;
BitmapEffectHandle lastEffect = firstEffect;
// update the connections
for (int i = index + 1; i < children.Count; i++)
{
// skip any effects that don't have inputs or outputs
if (BitmapEffect.GetNumberInputs(children[i].handle) < 1 ||
BitmapEffect.GetNumberOutputs(children[i].handle) < 1)
continue;
BitmapEffect.GetInputConnector(children[i].handle, 0).ConnectTo(
BitmapEffect.GetOutputConnector(lastEffect.handle, 0));
lastEffect = children[i];
}
// we should have already handled these cases
Debug.Assert(BitmapEffect.GetNumberInputs(firstEffect.handle) >= 1);
Debug.Assert(BitmapEffect.GetNumberOutputs(lastEffect.handle) >= 1);
BitmapEffect.GetInputConnector(firstEffect.handle, 0).ConnectTo(
BitmapEffect.GetInteriorInputConnector(unmanagedEffect, 0));
BitmapEffect.GetInteriorOutputConnector(unmanagedEffect, 0).ConnectTo(
BitmapEffect.GetOutputConnector(lastEffect.handle, 0));
BitmapEffect.Add(unmanagedEffect, lastEffect.handle);
_connectionsSetup = true;
}
}
///
/// Resets the cache of unmanaged effects
///
internal void ChildrenPropertyChangedHook(DependencyPropertyChangedEventArgs e)
{
// we are caching the unmanaged effects, so if the collection changes
// we want to throw away the cache
_childrenHandles = null;
UnmanagedEffectGroup = null;
_mapGroupToChildren.Clear();
_connectionsSetup = false;
}
///
/// Returns a list of the child effect handles, given the unmanaged
/// aggregate handle.
///
/// unmanaged aggregate handle
///
private List GetChildrenHandles(SafeHandle unmanagedEffect)
{
if (UnmanagedEffectGroup == unmanagedEffect)
{
if (_childrenHandles == null)
{
_childrenHandles = CreateEffectHandleList();
}
return _childrenHandles;
}
if (_mapGroupToChildren[unmanagedEffect] == null)
{
_mapGroupToChildren[unmanagedEffect] = CreateEffectHandleList();
}
return _mapGroupToChildren[unmanagedEffect];
}
///
/// Creates a list of unmanaged effect handles from the list of BitmapEffect children
///
///
private List CreateEffectHandleList()
{
if (Children == null)
return null;
List handles = new List(Children.Count);
foreach (BitmapEffect e in Children)
{
handles.Add(new BitmapEffectHandle(e, e.Internal_CreateUnmanagedEffect()));
}
return handles;
}
///
/// Updates (propagates) the properties for the aggreagate effect.
///
/// This is called only if GetOutput is called directly on the BitmapEffectGroup
/// object.
///
///
internal override bool UpdateUnmanagedGroupState()
{
if (Children == null || Children.Count <= 0)
return false;
UpdateUnmanagedPropertyState(UnmanagedEffectGroup);
if (BitmapEffect.GetNumberInputs(UnmanagedEffectGroup) < 1 ||
BitmapEffect.GetNumberOutputs(UnmanagedEffectGroup) < 1)
{
return false;
}
return true;
}
///
/// Create an unmanaged handle for the group effect
///
///
protected override unsafe SafeHandle CreateUnmanagedEffect()
{
SafeMILHandle effect = Create(new Guid("AC9C1A9A-7E18-4F64-AC7E-47CF7F051E95"));
_mapGroupToChildren.Add(effect, null);
return effect;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
//------------------------------------------------------------------------------
// Microsoft Avalon
// Copyright (c) Microsoft Corporation, 2005
//
// File: BitmapEffectGroup.cs
//-----------------------------------------------------------------------------
using System;
using System.Windows;
using System.Windows.Media;
using System.ComponentModel;
using System.ComponentModel.Design.Serialization;
using System.Reflection;
using System.Collections;
using System.Collections.Generic;
using MS.Internal;
using System.Windows.Media.Animation;
using System.Globalization;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Markup;
using System.Windows.Media.Composition;
using System.Diagnostics;
using SR=MS.Internal.PresentationCore.SR;
using SRID=MS.Internal.PresentationCore.SRID;
namespace System.Windows.Media.Effects
{
///
/// This contains the managed effect object and
/// a corresponding unmanaged handle
///
internal struct BitmapEffectHandle
{
public BitmapEffect effect;
public SafeHandle handle;
public BitmapEffectHandle(BitmapEffect e, SafeHandle h)
{
effect = e;
handle = h;
}
}
///
/// The class defintion for BitmapEffectGroup
///
[ContentProperty("Children")]
public sealed partial class BitmapEffectGroup : BitmapEffect
{
List _childrenHandles;
Dictionary> _mapGroupToChildren;
///
///
///
public BitmapEffectGroup()
{
_mapGroupToChildren = new Dictionary>();
}
///
/// 1. Updates (propagates) the properties to the unmanaged handle of all
/// the child effects
/// 2. Sets up all the connections
/// 3. Wraps the list with the aggregate effect
///
/// Unmanaged handle for aggregate effect
protected override void UpdateUnmanagedPropertyState(SafeHandle unmanagedEffect)
{
// if the group has no children, there is nothing to update
if (Children == null || Children.Count <= 0)
return;
List children = GetChildrenHandles(unmanagedEffect);
for (int i = 0; i < children.Count; i++)
{
children[i].effect.Internal_UpdateUnmanagedPropertyState(children[i].handle);
}
SetupConnections(unmanagedEffect, children);
}
///
/// Setup the connections
///
private void SetupConnections(SafeHandle unmanagedEffect, List children)
{
if (!_connectionsSetup)
{
// find the first effect that has both inputs and outputs
BitmapEffectHandle firstEffect = children[0];
int index = 0;
for (; index < children.Count; index++)
{
if (BitmapEffect.GetNumberInputs(children[index].handle) >= 1 &&
BitmapEffect.GetNumberOutputs(children[index].handle) >= 1)
{
firstEffect = children[index];
break;
}
}
if (index >= children.Count)
return;
BitmapEffectHandle lastEffect = firstEffect;
// update the connections
for (int i = index + 1; i < children.Count; i++)
{
// skip any effects that don't have inputs or outputs
if (BitmapEffect.GetNumberInputs(children[i].handle) < 1 ||
BitmapEffect.GetNumberOutputs(children[i].handle) < 1)
continue;
BitmapEffect.GetInputConnector(children[i].handle, 0).ConnectTo(
BitmapEffect.GetOutputConnector(lastEffect.handle, 0));
lastEffect = children[i];
}
// we should have already handled these cases
Debug.Assert(BitmapEffect.GetNumberInputs(firstEffect.handle) >= 1);
Debug.Assert(BitmapEffect.GetNumberOutputs(lastEffect.handle) >= 1);
BitmapEffect.GetInputConnector(firstEffect.handle, 0).ConnectTo(
BitmapEffect.GetInteriorInputConnector(unmanagedEffect, 0));
BitmapEffect.GetInteriorOutputConnector(unmanagedEffect, 0).ConnectTo(
BitmapEffect.GetOutputConnector(lastEffect.handle, 0));
BitmapEffect.Add(unmanagedEffect, lastEffect.handle);
_connectionsSetup = true;
}
}
///
/// Resets the cache of unmanaged effects
///
internal void ChildrenPropertyChangedHook(DependencyPropertyChangedEventArgs e)
{
// we are caching the unmanaged effects, so if the collection changes
// we want to throw away the cache
_childrenHandles = null;
UnmanagedEffectGroup = null;
_mapGroupToChildren.Clear();
_connectionsSetup = false;
}
///
/// Returns a list of the child effect handles, given the unmanaged
/// aggregate handle.
///
/// unmanaged aggregate handle
///
private List GetChildrenHandles(SafeHandle unmanagedEffect)
{
if (UnmanagedEffectGroup == unmanagedEffect)
{
if (_childrenHandles == null)
{
_childrenHandles = CreateEffectHandleList();
}
return _childrenHandles;
}
if (_mapGroupToChildren[unmanagedEffect] == null)
{
_mapGroupToChildren[unmanagedEffect] = CreateEffectHandleList();
}
return _mapGroupToChildren[unmanagedEffect];
}
///
/// Creates a list of unmanaged effect handles from the list of BitmapEffect children
///
///
private List CreateEffectHandleList()
{
if (Children == null)
return null;
List handles = new List(Children.Count);
foreach (BitmapEffect e in Children)
{
handles.Add(new BitmapEffectHandle(e, e.Internal_CreateUnmanagedEffect()));
}
return handles;
}
///
/// Updates (propagates) the properties for the aggreagate effect.
///
/// This is called only if GetOutput is called directly on the BitmapEffectGroup
/// object.
///
///
internal override bool UpdateUnmanagedGroupState()
{
if (Children == null || Children.Count <= 0)
return false;
UpdateUnmanagedPropertyState(UnmanagedEffectGroup);
if (BitmapEffect.GetNumberInputs(UnmanagedEffectGroup) < 1 ||
BitmapEffect.GetNumberOutputs(UnmanagedEffectGroup) < 1)
{
return false;
}
return true;
}
///
/// Create an unmanaged handle for the group effect
///
///
protected override unsafe SafeHandle CreateUnmanagedEffect()
{
SafeMILHandle effect = Create(new Guid("AC9C1A9A-7E18-4F64-AC7E-47CF7F051E95"));
_mapGroupToChildren.Add(effect, null);
return effect;
}
}
}
// 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
- TextElement.cs
- TrackingStringDictionary.cs
- WebPartChrome.cs
- CompileLiteralTextParser.cs
- Partitioner.cs
- RuntimeHelpers.cs
- EditorZoneBase.cs
- HScrollProperties.cs
- TextBoxView.cs
- CodeSnippetExpression.cs
- NetworkStream.cs
- SamlAttribute.cs
- SerializationBinder.cs
- XDeferredAxisSource.cs
- DocumentXmlWriter.cs
- _ReceiveMessageOverlappedAsyncResult.cs
- GeometryHitTestResult.cs
- RSAPKCS1KeyExchangeFormatter.cs
- GenericIdentity.cs
- WorkflowDebuggerSteppingAttribute.cs
- DataKeyArray.cs
- DesignerUtility.cs
- RemoteX509Token.cs
- TextRangeEdit.cs
- TabControlCancelEvent.cs
- Quaternion.cs
- TextEditorThreadLocalStore.cs
- DataSourceProvider.cs
- CharacterString.cs
- RecoverInstanceLocksCommand.cs
- XmlNamespaceMapping.cs
- TreeNodeCollection.cs
- RealizationContext.cs
- GlobalItem.cs
- ZoneMembershipCondition.cs
- RectKeyFrameCollection.cs
- AppSettingsExpressionBuilder.cs
- ResourceExpressionBuilder.cs
- MulticastIPAddressInformationCollection.cs
- Comparer.cs
- DataGridItemEventArgs.cs
- PreviewPrintController.cs
- CacheAxisQuery.cs
- PrintEvent.cs
- SizeFConverter.cs
- XmlQuerySequence.cs
- ObservableCollection.cs
- UnionExpr.cs
- MatrixAnimationBase.cs
- WebPartZoneCollection.cs
- ProxyFragment.cs
- InputQueue.cs
- PresentationTraceSources.cs
- Line.cs
- OracleRowUpdatedEventArgs.cs
- WindowsUpDown.cs
- DBConcurrencyException.cs
- RewritingSimplifier.cs
- XamlContextStack.cs
- Debugger.cs
- FieldBuilder.cs
- HttpModuleActionCollection.cs
- Exceptions.cs
- DataControlFieldCell.cs
- ClaimTypes.cs
- Operator.cs
- Context.cs
- Vector3dCollection.cs
- RowParagraph.cs
- GeneralTransformGroup.cs
- TransformPatternIdentifiers.cs
- HttpMethodConstraint.cs
- DataServiceRequest.cs
- WindowsGrip.cs
- WorkflowLayouts.cs
- Rijndael.cs
- TransactionalPackage.cs
- __FastResourceComparer.cs
- ExternalCalls.cs
- HtmlInputSubmit.cs
- SizeChangedEventArgs.cs
- PersistenceTypeAttribute.cs
- DataGridViewRowPostPaintEventArgs.cs
- QuaternionValueSerializer.cs
- Bidi.cs
- TraceSection.cs
- RichTextBox.cs
- TimerEventSubscriptionCollection.cs
- panel.cs
- ProcessHostConfigUtils.cs
- DefaultValueMapping.cs
- IProvider.cs
- ToolboxComponentsCreatingEventArgs.cs
- ContentControl.cs
- TreeNodeBinding.cs
- Typography.cs
- ToolBar.cs
- DetailsViewCommandEventArgs.cs
- MutexSecurity.cs
- StoreAnnotationsMap.cs