Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / wpf / src / Core / CSharp / System / Windows / Media / ColorTransform.cs / 1 / ColorTransform.cs
//------------------------------------------------------------------------------
// Microsoft Windows Client Platform
// Copyright (c) Microsoft Corporation, 2001, 2002, 2003
//
// File: ColorTransform.cs
//-----------------------------------------------------------------------------
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using MS.Internal;
using MS.Win32;
using System.Security;
using System.Security.Permissions;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design.Serialization;
using System.Reflection;
using System.Diagnostics;
using System.Globalization;
using Microsoft.Win32.SafeHandles;
using UnsafeNativeMethods=MS.Win32.PresentationCore.UnsafeNativeMethods;
namespace System.Windows.Media
{
///
///
internal class ColorTransform
{
//-----------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
#region Constructors
private ColorTransform()
{
}
///
/// SecurityCritical: This code calls critical code (unmanaged)
/// SecurityTreatAsSafe: Call passes in managed ColorContext to unmanaged code which is safe
/// The _colorTransformHelper comes out of an elevation and is stored locally
/// in a variable whose access is tracked to prevent any malicious tampering.
/// And that constructing this object is inherently a safe operation.
///
[SecurityCritical, SecurityTreatAsSafe]
internal ColorTransform(ColorContext srcContext, ColorContext dstContext)
{
InitializeICM();
if (srcContext == null)
{
srcContext = new ColorContext(PixelFormats.Bgra32);
}
if (dstContext == null)
{
dstContext = new ColorContext(PixelFormats.Bgra32);
}
_inputColorType = srcContext.ColorType;
_outputColorType = dstContext.ColorType;
_colorTransformHelper.CreateTransform(srcContext.ProfileHandle, dstContext.ProfileHandle);
}
///
/// SecurityCritical: This code calls critical code (unmanaged)
/// SecurityTreatAsSafe: All parameters to unmanaged call are generated inside of the method and are safe
/// The _colorTransformHelper comes out of an elevation and is stored locally
/// in a variable whose access is tracked to prevent any malicious tampering.
/// And that constructing this object is inherently a safe operation.
///
[SecurityCritical, SecurityTreatAsSafe]
internal ColorTransform(SafeMILHandle bitmapSource, ColorContext srcContext, ColorContext dstContext, System.Windows.Media.PixelFormat pixelFormat)
{
InitializeICM();
if (srcContext == null)
{
srcContext = new ColorContext(pixelFormat);
}
if (dstContext == null)
{
dstContext = new ColorContext(pixelFormat);
}
_inputColorType = srcContext.ColorType;
_outputColorType = dstContext.ColorType;
//if this failed or the handle is invalid, we can't continue
if (srcContext.ProfileHandle != null && !srcContext.ProfileHandle.IsInvalid)
{
//if this failed or the handle is invalid, we can't continue
if (dstContext.ProfileHandle != null && !dstContext.ProfileHandle.IsInvalid)
{
_colorTransformHelper.CreateTransform(srcContext.ProfileHandle, dstContext.ProfileHandle);
}
}
}
#endregion
//------------------------------------------------------
//
// Public Methods
//
//-----------------------------------------------------
#region Public Methods
#endregion
//------------------------------------------------------
//
// Internal Methods
//
//------------------------------------------------------
#region Internal Methods
///
/// SecurityCritical: This code calls critical code (unmanaged)
/// SecurityTreatAsSafe: All parameters to unmanaged call are generated inside of the method and are safe
/// The _colorTransformHelper comes out of an elevation and is stored locally
/// in a variable whose access is tracked to prevent any malicious tampering.
/// And that constructing this object is inherently a safe operation.
///
[SecurityCritical, SecurityTreatAsSafe]
internal void Translate(float[] srcValue, float[] dstValue)
{
// 3. create Win32 unmanaged profile handle from memory source profile using OpenColorProfileW
IntPtr[] pProfiles = new IntPtr[2];
IntPtr paInputColors = IntPtr.Zero;
IntPtr paOutputColors = IntPtr.Zero;
try
{
// 6. transform colors using TranslateColors
UInt32 numColors = 1;
long inputColor = ICM2Color(srcValue);
paInputColors = Marshal.AllocHGlobal(64);
Marshal.WriteInt64(paInputColors, inputColor);
paOutputColors = Marshal.AllocHGlobal(64);
long outputColor = 0;
Marshal.WriteInt64(paOutputColors, outputColor);
_colorTransformHelper.TranslateColors(
(IntPtr)paInputColors,
numColors,
_inputColorType,
(IntPtr)paOutputColors,
_outputColorType
);
outputColor = Marshal.ReadInt64(paOutputColors);
for (int i = 0; i < dstValue.GetLength(0); i++)
{
UInt32 result = 0x0000ffff & (UInt32)(outputColor >> (16 * i));
float a = (result & 0x7fffffff) / (float)(0x10000);
if (result < 0)
dstValue[i] = -a;
else
dstValue[i] = a;
}
}
finally
{
Marshal.FreeHGlobal(paInputColors);
Marshal.FreeHGlobal(paOutputColors);
}
}
#endregion Internal Methods
//-----------------------------------------------------
//
// Private Methods
//
//------------------------------------------------------
#region Private Methods
///
/// SecurityCritical: This code calls critical code (unmanaged)
///
[SecurityCritical]
private void InitializeICM()
{
_colorTransformHelper = new ColorTransformHelper();
}
private long ICM2Color(float[] srcValue)
{
long colorValue;
if (srcValue.GetLength(0) < 3 || srcValue.GetLength(0) > 8)
{
throw new NotSupportedException(); // Only support color spaces with 3,4,5,6,7,8 channels
}
if (srcValue.GetLength(0) <= 4)
{
UInt16[] channel = new UInt16[4];
channel[0] = channel[1] = channel[2] = channel[3] = 0;
for (int i = 0; i < srcValue.GetLength(0); i++)
{
if (srcValue[i] >= 1.0)// this fails for values above 1.0 and below 0.0
{
channel[i] = 0xffff;
}
else if (srcValue[i] <= 0.0)
{
channel[i] = 0x0;
}
else
{
channel[i] = (UInt16)(srcValue[i] * (float)0xFFFF);
}
}
colorValue = (long)(((UInt64)channel[3] << 48) + ((UInt64)channel[2] << 32) + ((UInt64)channel[1] << 16) + (UInt64)channel[0]);
}
else
{
byte[] channel = new byte[8];
channel[0] = channel[1] = channel[2] = channel[3] =
channel[4] = channel[5] = channel[6] = channel[7] = 0;
for (int i = 0; i < srcValue.GetLength(0); i++)
{
if (srcValue[i] >= 1.0)// this fails for values above 1.0 and below 0.0
{
channel[i] = 0xff;
}
else if (srcValue[i] <= 0.0)
{
channel[i] = 0x0;
}
else
{
channel[i] = (byte)(srcValue[i] * (float)0xFF);
}
}
colorValue = (long)(((UInt64)channel[7] << 56) + ((UInt64)channel[6] << 48) +
((UInt64)channel[5] << 40) + ((UInt64)channel[4] << 32) +
((UInt64)channel[3] << 24) + ((UInt64)channel[2] << 16) +
((UInt64)channel[1] << 8) + ((UInt64)channel[0] << 0));
}
return colorValue;
}
#endregion
//-----------------------------------------------------
//
// Private Fields
//
//-----------------------------------------------------
#region Private Fields
///
/// SecurityCritical: This comes out of an elevation needs to be critical and tracked.
///
[SecurityCritical]
private ColorTransformHelper _colorTransformHelper;
private UInt32 _inputColorType;
private UInt32 _outputColorType;
#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, 2001, 2002, 2003
//
// File: ColorTransform.cs
//-----------------------------------------------------------------------------
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using MS.Internal;
using MS.Win32;
using System.Security;
using System.Security.Permissions;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design.Serialization;
using System.Reflection;
using System.Diagnostics;
using System.Globalization;
using Microsoft.Win32.SafeHandles;
using UnsafeNativeMethods=MS.Win32.PresentationCore.UnsafeNativeMethods;
namespace System.Windows.Media
{
///
///
internal class ColorTransform
{
//-----------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
#region Constructors
private ColorTransform()
{
}
///
/// SecurityCritical: This code calls critical code (unmanaged)
/// SecurityTreatAsSafe: Call passes in managed ColorContext to unmanaged code which is safe
/// The _colorTransformHelper comes out of an elevation and is stored locally
/// in a variable whose access is tracked to prevent any malicious tampering.
/// And that constructing this object is inherently a safe operation.
///
[SecurityCritical, SecurityTreatAsSafe]
internal ColorTransform(ColorContext srcContext, ColorContext dstContext)
{
InitializeICM();
if (srcContext == null)
{
srcContext = new ColorContext(PixelFormats.Bgra32);
}
if (dstContext == null)
{
dstContext = new ColorContext(PixelFormats.Bgra32);
}
_inputColorType = srcContext.ColorType;
_outputColorType = dstContext.ColorType;
_colorTransformHelper.CreateTransform(srcContext.ProfileHandle, dstContext.ProfileHandle);
}
///
/// SecurityCritical: This code calls critical code (unmanaged)
/// SecurityTreatAsSafe: All parameters to unmanaged call are generated inside of the method and are safe
/// The _colorTransformHelper comes out of an elevation and is stored locally
/// in a variable whose access is tracked to prevent any malicious tampering.
/// And that constructing this object is inherently a safe operation.
///
[SecurityCritical, SecurityTreatAsSafe]
internal ColorTransform(SafeMILHandle bitmapSource, ColorContext srcContext, ColorContext dstContext, System.Windows.Media.PixelFormat pixelFormat)
{
InitializeICM();
if (srcContext == null)
{
srcContext = new ColorContext(pixelFormat);
}
if (dstContext == null)
{
dstContext = new ColorContext(pixelFormat);
}
_inputColorType = srcContext.ColorType;
_outputColorType = dstContext.ColorType;
//if this failed or the handle is invalid, we can't continue
if (srcContext.ProfileHandle != null && !srcContext.ProfileHandle.IsInvalid)
{
//if this failed or the handle is invalid, we can't continue
if (dstContext.ProfileHandle != null && !dstContext.ProfileHandle.IsInvalid)
{
_colorTransformHelper.CreateTransform(srcContext.ProfileHandle, dstContext.ProfileHandle);
}
}
}
#endregion
//------------------------------------------------------
//
// Public Methods
//
//-----------------------------------------------------
#region Public Methods
#endregion
//------------------------------------------------------
//
// Internal Methods
//
//------------------------------------------------------
#region Internal Methods
///
/// SecurityCritical: This code calls critical code (unmanaged)
/// SecurityTreatAsSafe: All parameters to unmanaged call are generated inside of the method and are safe
/// The _colorTransformHelper comes out of an elevation and is stored locally
/// in a variable whose access is tracked to prevent any malicious tampering.
/// And that constructing this object is inherently a safe operation.
///
[SecurityCritical, SecurityTreatAsSafe]
internal void Translate(float[] srcValue, float[] dstValue)
{
// 3. create Win32 unmanaged profile handle from memory source profile using OpenColorProfileW
IntPtr[] pProfiles = new IntPtr[2];
IntPtr paInputColors = IntPtr.Zero;
IntPtr paOutputColors = IntPtr.Zero;
try
{
// 6. transform colors using TranslateColors
UInt32 numColors = 1;
long inputColor = ICM2Color(srcValue);
paInputColors = Marshal.AllocHGlobal(64);
Marshal.WriteInt64(paInputColors, inputColor);
paOutputColors = Marshal.AllocHGlobal(64);
long outputColor = 0;
Marshal.WriteInt64(paOutputColors, outputColor);
_colorTransformHelper.TranslateColors(
(IntPtr)paInputColors,
numColors,
_inputColorType,
(IntPtr)paOutputColors,
_outputColorType
);
outputColor = Marshal.ReadInt64(paOutputColors);
for (int i = 0; i < dstValue.GetLength(0); i++)
{
UInt32 result = 0x0000ffff & (UInt32)(outputColor >> (16 * i));
float a = (result & 0x7fffffff) / (float)(0x10000);
if (result < 0)
dstValue[i] = -a;
else
dstValue[i] = a;
}
}
finally
{
Marshal.FreeHGlobal(paInputColors);
Marshal.FreeHGlobal(paOutputColors);
}
}
#endregion Internal Methods
//-----------------------------------------------------
//
// Private Methods
//
//------------------------------------------------------
#region Private Methods
///
/// SecurityCritical: This code calls critical code (unmanaged)
///
[SecurityCritical]
private void InitializeICM()
{
_colorTransformHelper = new ColorTransformHelper();
}
private long ICM2Color(float[] srcValue)
{
long colorValue;
if (srcValue.GetLength(0) < 3 || srcValue.GetLength(0) > 8)
{
throw new NotSupportedException(); // Only support color spaces with 3,4,5,6,7,8 channels
}
if (srcValue.GetLength(0) <= 4)
{
UInt16[] channel = new UInt16[4];
channel[0] = channel[1] = channel[2] = channel[3] = 0;
for (int i = 0; i < srcValue.GetLength(0); i++)
{
if (srcValue[i] >= 1.0)// this fails for values above 1.0 and below 0.0
{
channel[i] = 0xffff;
}
else if (srcValue[i] <= 0.0)
{
channel[i] = 0x0;
}
else
{
channel[i] = (UInt16)(srcValue[i] * (float)0xFFFF);
}
}
colorValue = (long)(((UInt64)channel[3] << 48) + ((UInt64)channel[2] << 32) + ((UInt64)channel[1] << 16) + (UInt64)channel[0]);
}
else
{
byte[] channel = new byte[8];
channel[0] = channel[1] = channel[2] = channel[3] =
channel[4] = channel[5] = channel[6] = channel[7] = 0;
for (int i = 0; i < srcValue.GetLength(0); i++)
{
if (srcValue[i] >= 1.0)// this fails for values above 1.0 and below 0.0
{
channel[i] = 0xff;
}
else if (srcValue[i] <= 0.0)
{
channel[i] = 0x0;
}
else
{
channel[i] = (byte)(srcValue[i] * (float)0xFF);
}
}
colorValue = (long)(((UInt64)channel[7] << 56) + ((UInt64)channel[6] << 48) +
((UInt64)channel[5] << 40) + ((UInt64)channel[4] << 32) +
((UInt64)channel[3] << 24) + ((UInt64)channel[2] << 16) +
((UInt64)channel[1] << 8) + ((UInt64)channel[0] << 0));
}
return colorValue;
}
#endregion
//-----------------------------------------------------
//
// Private Fields
//
//-----------------------------------------------------
#region Private Fields
///
/// SecurityCritical: This comes out of an elevation needs to be critical and tracked.
///
[SecurityCritical]
private ColorTransformHelper _colorTransformHelper;
private UInt32 _inputColorType;
private UInt32 _outputColorType;
#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
- IImplicitResourceProvider.cs
- baseaxisquery.cs
- Authorization.cs
- RegexNode.cs
- GridViewCommandEventArgs.cs
- ScriptControlManager.cs
- XPathBinder.cs
- FileSystemWatcher.cs
- DataBoundControlAdapter.cs
- FileDialog.cs
- ProfilePropertySettings.cs
- HTTPNotFoundHandler.cs
- TransformationRules.cs
- CoreSwitches.cs
- RectAnimation.cs
- ColumnMapTranslator.cs
- OpenFileDialog.cs
- MatchAllMessageFilter.cs
- GetRecipientListRequest.cs
- DataGridPagerStyle.cs
- SessionEndedEventArgs.cs
- XamlGridLengthSerializer.cs
- CalendarTable.cs
- ToolConsole.cs
- COM2FontConverter.cs
- Pen.cs
- EditorZoneBase.cs
- IconHelper.cs
- DataGridViewCellStyleConverter.cs
- Parsers.cs
- RelationshipEntry.cs
- Size.cs
- MenuItem.cs
- HostedHttpContext.cs
- ObjectDataSourceEventArgs.cs
- DataGridViewCellValueEventArgs.cs
- __FastResourceComparer.cs
- AttributeSetAction.cs
- RemoteWebConfigurationHostServer.cs
- AnimationException.cs
- SqlFactory.cs
- Guid.cs
- Activity.cs
- HttpListenerException.cs
- EventLogPermissionEntryCollection.cs
- CheckedPointers.cs
- DataServiceException.cs
- Label.cs
- GACMembershipCondition.cs
- CompoundFileStreamReference.cs
- Stack.cs
- DataColumnMappingCollection.cs
- ManagementInstaller.cs
- StylusButtonEventArgs.cs
- ToolboxItemFilterAttribute.cs
- Point3DCollection.cs
- FontDialog.cs
- BulletChrome.cs
- ApplicationInterop.cs
- ClientTargetSection.cs
- WindowsImpersonationContext.cs
- ConfigurationSettings.cs
- FixedDSBuilder.cs
- RtfControls.cs
- ManifestResourceInfo.cs
- List.cs
- PeerReferralPolicy.cs
- ArithmeticException.cs
- HierarchicalDataTemplate.cs
- KeyToListMap.cs
- OdbcConnectionPoolProviderInfo.cs
- XmlSchemaSequence.cs
- OrderingExpression.cs
- TileBrush.cs
- XmlResolver.cs
- MergeFilterQuery.cs
- HtmlInputImage.cs
- ValidationHelper.cs
- ContainerActivationHelper.cs
- SmiRecordBuffer.cs
- cookiecollection.cs
- loginstatus.cs
- RealizationDrawingContextWalker.cs
- AgileSafeNativeMemoryHandle.cs
- httpapplicationstate.cs
- SoapObjectWriter.cs
- TakeQueryOptionExpression.cs
- ListBoxItemWrapperAutomationPeer.cs
- DataBindingList.cs
- Table.cs
- WebPartMenuStyle.cs
- DispatchChannelSink.cs
- MetadataProperty.cs
- HandleCollector.cs
- odbcmetadatafactory.cs
- OracleNumber.cs
- PagesSection.cs
- EventMappingSettingsCollection.cs
- WebPartsPersonalizationAuthorization.cs
- PriorityQueue.cs