a575963da9
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
401 lines
12 KiB
C#
401 lines
12 KiB
C#
//
|
|
// System.Drawing.Imaging.ImageAttributes.cs
|
|
//
|
|
// Authors:
|
|
// Dennis Hayes (dennish@raytek.com) (stubbed out)
|
|
// Jordi Mas i Hernàndez (jmas@softcatala.org)
|
|
// Sanjay Gupta (gsanjay@novell.com)
|
|
// Sebastien Pouliot <sebastien@ximian.com>
|
|
//
|
|
// (C) 2002-4 Ximian, Inc. http://www.ximian.com
|
|
// Copyright (C) 2004, 2006-2007 Novell, Inc (http://www.novell.com)
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining
|
|
// a copy of this software and associated documentation files (the
|
|
// "Software"), to deal in the Software without restriction, including
|
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|
// distribute, sublicense, and/or sell copies of the Software, and to
|
|
// permit persons to whom the Software is furnished to do so, subject to
|
|
// the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be
|
|
// included in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
//
|
|
|
|
using System.Drawing.Drawing2D;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace System.Drawing.Imaging {
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
public sealed class ImageAttributes : ICloneable, IDisposable {
|
|
|
|
private IntPtr nativeImageAttr;
|
|
|
|
internal IntPtr NativeObject {
|
|
get {
|
|
return nativeImageAttr;
|
|
}
|
|
}
|
|
|
|
internal ImageAttributes (IntPtr native)
|
|
{
|
|
nativeImageAttr = native;
|
|
}
|
|
|
|
public ImageAttributes ()
|
|
{
|
|
Status status = GDIPlus.GdipCreateImageAttributes (out nativeImageAttr);
|
|
GDIPlus.CheckStatus (status);
|
|
}
|
|
|
|
public void ClearBrushRemapTable ()
|
|
{
|
|
ClearRemapTable (ColorAdjustType.Brush);
|
|
}
|
|
|
|
//Clears the color keys for all GDI+ objects
|
|
public void ClearColorKey ()
|
|
{
|
|
ClearColorKey (ColorAdjustType.Default);
|
|
}
|
|
|
|
public void ClearColorKey (ColorAdjustType type)
|
|
{
|
|
Status status = GDIPlus.GdipSetImageAttributesColorKeys (nativeImageAttr, type, false, 0, 0);
|
|
GDIPlus.CheckStatus (status);
|
|
}
|
|
|
|
public void ClearColorMatrix ()
|
|
{
|
|
ClearColorMatrix (ColorAdjustType.Default);
|
|
}
|
|
|
|
public void ClearColorMatrix (ColorAdjustType type)
|
|
{
|
|
Status status = GDIPlus.GdipSetImageAttributesColorMatrix (nativeImageAttr, type, false,
|
|
IntPtr.Zero, IntPtr.Zero, ColorMatrixFlag.Default);
|
|
GDIPlus.CheckStatus (status);
|
|
}
|
|
|
|
public void ClearGamma ()
|
|
{
|
|
ClearGamma (ColorAdjustType.Default);
|
|
}
|
|
|
|
public void ClearGamma (ColorAdjustType type)
|
|
{
|
|
Status status = GDIPlus.GdipSetImageAttributesGamma (nativeImageAttr, type, false, 0);
|
|
GDIPlus.CheckStatus (status);
|
|
}
|
|
|
|
public void ClearNoOp ()
|
|
{
|
|
ClearNoOp (ColorAdjustType.Default);
|
|
}
|
|
|
|
public void ClearNoOp (ColorAdjustType type)
|
|
{
|
|
Status status = GDIPlus.GdipSetImageAttributesNoOp (nativeImageAttr, type, false);
|
|
GDIPlus.CheckStatus (status);
|
|
}
|
|
|
|
public void ClearOutputChannel ()
|
|
{
|
|
ClearOutputChannel (ColorAdjustType.Default);
|
|
}
|
|
|
|
public void ClearOutputChannel (ColorAdjustType type)
|
|
{
|
|
Status status = GDIPlus.GdipSetImageAttributesOutputChannel (nativeImageAttr, type, false,
|
|
ColorChannelFlag.ColorChannelLast);
|
|
GDIPlus.CheckStatus (status);
|
|
}
|
|
|
|
public void ClearOutputChannelColorProfile ()
|
|
{
|
|
ClearOutputChannelColorProfile (ColorAdjustType.Default);
|
|
}
|
|
|
|
public void ClearOutputChannelColorProfile (ColorAdjustType type)
|
|
{
|
|
Status status = GDIPlus.GdipSetImageAttributesOutputChannelColorProfile (nativeImageAttr, type, false,
|
|
null);
|
|
GDIPlus.CheckStatus (status);
|
|
}
|
|
|
|
public void ClearRemapTable ()
|
|
{
|
|
ClearRemapTable (ColorAdjustType.Default);
|
|
}
|
|
|
|
public void ClearRemapTable (ColorAdjustType type)
|
|
{
|
|
Status status = GDIPlus.GdipSetImageAttributesRemapTable (nativeImageAttr, type, false, 0, IntPtr.Zero);
|
|
GDIPlus.CheckStatus (status);
|
|
}
|
|
|
|
public void ClearThreshold ()
|
|
{
|
|
ClearThreshold (ColorAdjustType.Default);
|
|
}
|
|
|
|
public void ClearThreshold (ColorAdjustType type)
|
|
{
|
|
Status status = GDIPlus.GdipSetImageAttributesThreshold (nativeImageAttr, type, false, 0);
|
|
GDIPlus.CheckStatus (status);
|
|
}
|
|
|
|
//Sets the color keys for all GDI+ objects
|
|
public void SetColorKey (Color colorLow, Color colorHigh)
|
|
{
|
|
SetColorKey (colorLow, colorHigh, ColorAdjustType.Default);
|
|
}
|
|
|
|
public void SetColorMatrix (ColorMatrix colorMatrix)
|
|
{
|
|
SetColorMatrix (colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Default);
|
|
}
|
|
|
|
public void SetColorMatrix (ColorMatrix colorMatrix, ColorMatrixFlag colorMatrixFlag)
|
|
{
|
|
SetColorMatrix (colorMatrix, colorMatrixFlag, ColorAdjustType.Default);
|
|
}
|
|
|
|
public void SetColorMatrix (ColorMatrix colorMatrix, ColorMatrixFlag colorMatrixFlag, ColorAdjustType colorAdjustType)
|
|
{
|
|
IntPtr cm = ColorMatrix.Alloc (colorMatrix);
|
|
try {
|
|
Status status = GDIPlus.GdipSetImageAttributesColorMatrix (nativeImageAttr,
|
|
colorAdjustType, true, cm, IntPtr.Zero, colorMatrixFlag);
|
|
GDIPlus.CheckStatus (status);
|
|
}
|
|
finally {
|
|
ColorMatrix.Free (cm);
|
|
}
|
|
}
|
|
|
|
public void Dispose ()
|
|
{
|
|
if (nativeImageAttr != IntPtr.Zero) {
|
|
Status status = GDIPlus.GdipDisposeImageAttributes (nativeImageAttr);
|
|
nativeImageAttr = IntPtr.Zero;
|
|
GDIPlus.CheckStatus (status);
|
|
}
|
|
System.GC.SuppressFinalize (this);
|
|
}
|
|
|
|
~ImageAttributes ()
|
|
{
|
|
Dispose ();
|
|
}
|
|
|
|
public object Clone ()
|
|
{
|
|
IntPtr imgclone;
|
|
|
|
Status status = GDIPlus.GdipCloneImageAttributes (nativeImageAttr, out imgclone);
|
|
GDIPlus.CheckStatus (status);
|
|
|
|
return new ImageAttributes (imgclone);
|
|
}
|
|
|
|
[MonoTODO ("Not supported by libgdiplus")]
|
|
public void GetAdjustedPalette (ColorPalette palette, ColorAdjustType type)
|
|
{
|
|
IntPtr colorPalette = palette.getGDIPalette ();
|
|
try {
|
|
Status status = GDIPlus.GdipGetImageAttributesAdjustedPalette (nativeImageAttr, colorPalette, type);
|
|
GDIPlus.CheckStatus (status);
|
|
palette.setFromGDIPalette (colorPalette);
|
|
} finally {
|
|
if (colorPalette != IntPtr.Zero)
|
|
Marshal.FreeHGlobal (colorPalette);
|
|
}
|
|
}
|
|
|
|
public void SetBrushRemapTable (ColorMap[] map)
|
|
{
|
|
GdiColorMap gdiclr = new GdiColorMap ();
|
|
IntPtr clrmap, lpPointer;
|
|
int mapsize = Marshal.SizeOf (gdiclr);
|
|
int size = mapsize * map.Length;
|
|
clrmap = lpPointer = Marshal.AllocHGlobal (size);
|
|
try {
|
|
for (int i=0; i < map.Length; i++) {
|
|
gdiclr.from = map[i].OldColor.ToArgb();
|
|
gdiclr.to = map[i].NewColor.ToArgb();
|
|
|
|
Marshal.StructureToPtr (gdiclr, lpPointer, false);
|
|
lpPointer = (IntPtr) (lpPointer.ToInt64() + mapsize);
|
|
}
|
|
|
|
Status status = GDIPlus.GdipSetImageAttributesRemapTable (nativeImageAttr,
|
|
ColorAdjustType.Brush, true, (uint) map.Length, clrmap);
|
|
GDIPlus.CheckStatus (status);
|
|
}
|
|
finally {
|
|
Marshal.FreeHGlobal (clrmap);
|
|
}
|
|
}
|
|
|
|
public void SetColorKey (Color colorLow, Color colorHigh, ColorAdjustType type)
|
|
{
|
|
Status status = GDIPlus.GdipSetImageAttributesColorKeys (nativeImageAttr, type, true,
|
|
colorLow.ToArgb (), colorHigh.ToArgb ());
|
|
GDIPlus.CheckStatus (status);
|
|
}
|
|
|
|
public void SetColorMatrices (ColorMatrix newColorMatrix, ColorMatrix grayMatrix)
|
|
{
|
|
SetColorMatrices (newColorMatrix, grayMatrix, ColorMatrixFlag.Default, ColorAdjustType.Default);
|
|
}
|
|
|
|
public void SetColorMatrices (ColorMatrix newColorMatrix, ColorMatrix grayMatrix, ColorMatrixFlag flags)
|
|
{
|
|
SetColorMatrices (newColorMatrix, grayMatrix, flags, ColorAdjustType.Default);
|
|
}
|
|
|
|
public void SetColorMatrices (ColorMatrix newColorMatrix, ColorMatrix grayMatrix, ColorMatrixFlag mode, ColorAdjustType type)
|
|
{
|
|
Status status;
|
|
IntPtr cm = ColorMatrix.Alloc (newColorMatrix);
|
|
try {
|
|
if (grayMatrix == null) {
|
|
status = GDIPlus.GdipSetImageAttributesColorMatrix (nativeImageAttr, type, true, cm,
|
|
IntPtr.Zero, mode);
|
|
} else {
|
|
IntPtr gm = ColorMatrix.Alloc (grayMatrix);
|
|
try {
|
|
status = GDIPlus.GdipSetImageAttributesColorMatrix (nativeImageAttr, type, true,
|
|
cm, gm, mode);
|
|
}
|
|
finally {
|
|
ColorMatrix.Free (gm);
|
|
}
|
|
}
|
|
}
|
|
finally {
|
|
ColorMatrix.Free (cm);
|
|
}
|
|
GDIPlus.CheckStatus (status);
|
|
}
|
|
|
|
public void SetGamma (float gamma)
|
|
{
|
|
SetGamma (gamma, ColorAdjustType.Default);
|
|
}
|
|
|
|
public void SetGamma (float gamma, ColorAdjustType coloradjust)
|
|
{
|
|
Status status = GDIPlus.GdipSetImageAttributesGamma (nativeImageAttr, coloradjust, true, gamma);
|
|
GDIPlus.CheckStatus (status);
|
|
}
|
|
|
|
public void SetNoOp ()
|
|
{
|
|
SetNoOp (ColorAdjustType.Default);
|
|
}
|
|
|
|
public void SetNoOp (ColorAdjustType type)
|
|
{
|
|
Status status = GDIPlus.GdipSetImageAttributesNoOp (nativeImageAttr, type, true);
|
|
GDIPlus.CheckStatus (status);
|
|
}
|
|
|
|
[MonoTODO ("Not supported by libgdiplus")]
|
|
public void SetOutputChannel (ColorChannelFlag flags)
|
|
{
|
|
SetOutputChannel (flags, ColorAdjustType.Default);
|
|
}
|
|
|
|
[MonoTODO ("Not supported by libgdiplus")]
|
|
public void SetOutputChannel (ColorChannelFlag flags, ColorAdjustType type)
|
|
{
|
|
Status status = GDIPlus.GdipSetImageAttributesOutputChannel (nativeImageAttr, type, true, flags);
|
|
GDIPlus.CheckStatus (status);
|
|
}
|
|
|
|
[MonoTODO ("Not supported by libgdiplus")]
|
|
public void SetOutputChannelColorProfile (string colorProfileFilename)
|
|
{
|
|
SetOutputChannelColorProfile (colorProfileFilename, ColorAdjustType.Default);
|
|
}
|
|
|
|
[MonoTODO ("Not supported by libgdiplus")]
|
|
public void SetOutputChannelColorProfile (string colorProfileFilename, ColorAdjustType type)
|
|
{
|
|
Status status = GDIPlus.GdipSetImageAttributesOutputChannelColorProfile (nativeImageAttr,
|
|
type, true, colorProfileFilename);
|
|
GDIPlus.CheckStatus (status);
|
|
}
|
|
|
|
public void SetRemapTable (ColorMap[] map)
|
|
{
|
|
SetRemapTable (map, ColorAdjustType.Default);
|
|
}
|
|
|
|
public void SetRemapTable (ColorMap[] map, ColorAdjustType type)
|
|
{
|
|
GdiColorMap gdiclr = new GdiColorMap ();
|
|
IntPtr clrmap, lpPointer;
|
|
int mapsize = Marshal.SizeOf (gdiclr);
|
|
int size = mapsize * map.Length;
|
|
clrmap = lpPointer = Marshal.AllocHGlobal (size);
|
|
try {
|
|
for (int i=0; i < map.Length; i++) {
|
|
gdiclr.from = map[i].OldColor.ToArgb();
|
|
gdiclr.to = map[i].NewColor.ToArgb();
|
|
|
|
Marshal.StructureToPtr (gdiclr, lpPointer, false);
|
|
lpPointer = (IntPtr) (lpPointer.ToInt64() + mapsize);
|
|
}
|
|
|
|
Status status = GDIPlus.GdipSetImageAttributesRemapTable (nativeImageAttr,
|
|
type, true, (uint) map.Length, clrmap);
|
|
GDIPlus.CheckStatus (status);
|
|
}
|
|
finally {
|
|
Marshal.FreeHGlobal (clrmap);
|
|
}
|
|
}
|
|
|
|
[MonoTODO ("Not supported by libgdiplus")]
|
|
public void SetThreshold (float threshold)
|
|
{
|
|
SetThreshold (threshold, ColorAdjustType.Default);
|
|
}
|
|
|
|
[MonoTODO ("Not supported by libgdiplus")]
|
|
public void SetThreshold (float threshold, ColorAdjustType type)
|
|
{
|
|
Status status = GDIPlus.GdipSetImageAttributesThreshold (nativeImageAttr, type, true, 0);
|
|
GDIPlus.CheckStatus (status);
|
|
}
|
|
|
|
public void SetWrapMode (WrapMode mode)
|
|
{
|
|
SetWrapMode (mode, Color.Black);
|
|
}
|
|
|
|
public void SetWrapMode (WrapMode mode, Color color)
|
|
{
|
|
SetWrapMode (mode, color, false);
|
|
}
|
|
|
|
public void SetWrapMode (WrapMode mode, Color color, bool clamp)
|
|
{
|
|
Status status = GDIPlus.GdipSetImageAttributesWrapMode (nativeImageAttr, mode, color.ToArgb (), clamp);
|
|
GDIPlus.CheckStatus (status);
|
|
}
|
|
}
|
|
}
|