2 // System.Drawing.Imaging.ImageAttributes.cs
5 // Dennis Hayes (dennish@raytek.com) (stubbed out)
6 // Jordi Mas i Hernàndez (jmas@softcatala.org)
7 // Sanjay Gupta (gsanjay@novell.com)
9 // (C) 2002-4 Ximian, Inc. http://www.ximian.com
13 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
15 // Permission is hereby granted, free of charge, to any person obtaining
16 // a copy of this software and associated documentation files (the
17 // "Software"), to deal in the Software without restriction, including
18 // without limitation the rights to use, copy, modify, merge, publish,
19 // distribute, sublicense, and/or sell copies of the Software, and to
20 // permit persons to whom the Software is furnished to do so, subject to
21 // the following conditions:
23 // The above copyright notice and this permission notice shall be
24 // included in all copies or substantial portions of the Software.
26 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
30 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
31 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
32 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
37 using System.Drawing.Drawing2D;
38 using System.Runtime.InteropServices;
40 namespace System.Drawing.Imaging
43 /// Summary description for ImageAttributes.
45 [StructLayout(LayoutKind.Sequential)]
46 public sealed class ImageAttributes : ICloneable, IDisposable {
48 private IntPtr nativeImageAttr = IntPtr.Zero;
50 internal IntPtr NativeObject{
52 return nativeImageAttr;
56 internal ImageAttributes(IntPtr native)
58 nativeImageAttr = native;
61 public ImageAttributes() {
63 Status status = GDIPlus.GdipCreateImageAttributes(out nativeImageAttr);
65 if (status != Status.Ok)
66 throw new Exception ("Error calling GDIPlus.GdipCreateImageAttributes:" +status);
70 public void ClearBrushRemapTable()
72 ClearRemapTable (ColorAdjustType.Brush);
75 //Clears the color keys for all GDI+ objects
76 public void ClearColorKey()
78 ClearColorKey (ColorAdjustType.Default);
81 public void ClearColorKey(ColorAdjustType type)
83 Status status = GDIPlus.GdipSetImageAttributesColorKeys (nativeImageAttr,
86 GDIPlus.CheckStatus (status);
89 public void ClearColorMatrix()
91 ClearColorMatrix (ColorAdjustType.Default);
94 public void ClearColorMatrix(ColorAdjustType type)
96 Status status = GDIPlus.GdipSetImageAttributesColorMatrix (nativeImageAttr,
97 type, false, null, null, ColorMatrixFlag.Default);
99 GDIPlus.CheckStatus (status);
102 public void ClearGamma()
104 ClearGamma (ColorAdjustType.Default);
107 public void ClearGamma(ColorAdjustType type)
109 Status status = GDIPlus.GdipSetImageAttributesGamma (nativeImageAttr, type, false, 0);
111 GDIPlus.CheckStatus (status);
114 public void ClearNoOp()
116 ClearNoOp (ColorAdjustType.Default);
119 public void ClearNoOp(ColorAdjustType type)
121 Status status = GDIPlus.GdipSetImageAttributesNoOp (nativeImageAttr, type, false);
123 GDIPlus.CheckStatus (status);
126 public void ClearOutputChannel()
128 ClearOutputChannel (ColorAdjustType.Default);
131 public void ClearOutputChannel(ColorAdjustType type)
133 Status status = GDIPlus.GdipSetImageAttributesOutputChannel (nativeImageAttr,
134 type, false, ColorChannelFlag.ColorChannelLast);
136 GDIPlus.CheckStatus (status);
139 public void ClearOutputChannelColorProfile()
141 ClearOutputChannelColorProfile (ColorAdjustType.Default);
144 public void ClearOutputChannelColorProfile(ColorAdjustType type)
146 Status status = GDIPlus.GdipSetImageAttributesOutputChannelColorProfile (nativeImageAttr,
149 GDIPlus.CheckStatus (status);
152 public void ClearRemapTable()
154 ClearRemapTable (ColorAdjustType.Default);
157 public void ClearRemapTable(ColorAdjustType type)
159 Status status = GDIPlus.GdipSetImageAttributesRemapTable (nativeImageAttr,
160 type, false, 0, IntPtr.Zero);
162 GDIPlus.CheckStatus (status);
165 public void ClearThreshold()
167 ClearThreshold (ColorAdjustType.Default);
170 public void ClearThreshold(ColorAdjustType type)
172 Status status = GDIPlus.GdipSetImageAttributesThreshold (nativeImageAttr,
175 GDIPlus.CheckStatus (status);
178 //Sets the color keys for all GDI+ objects
179 public void SetColorKey(Color colorLow, Color colorHigh)
182 Status status = GDIPlus.GdipSetImageAttributesColorKeys(nativeImageAttr,
183 ColorAdjustType.Default, true, colorLow.ToArgb(), colorHigh.ToArgb());
185 if (status != Status.Ok)
186 throw new Exception ("Error calling GDIPlus.GdipSetImageAttributesColorKeys:" +status);
189 public void SetColorMatrix(ColorMatrix colorMatrix)
192 Status status = GDIPlus.GdipSetImageAttributesColorMatrix(nativeImageAttr, ColorAdjustType.Default,
193 true, colorMatrix, (ColorMatrix)null, ColorMatrixFlag.Default);
195 if (status != Status.Ok)
196 throw new Exception ("Error calling GDIPlus.SetColorMatrix:" +status);
199 public void SetColorMatrix(ColorMatrix colorMatrix, ColorMatrixFlag colorMatrixFlag)
202 Status status = GDIPlus.GdipSetImageAttributesColorMatrix(nativeImageAttr, ColorAdjustType.Default,
203 true, colorMatrix, (ColorMatrix)null, colorMatrixFlag);
204 if (status != Status.Ok)
205 throw new Exception ("Error calling GDIPlus.SetColorMatrix:" +status);
209 public void SetColorMatrix(ColorMatrix colorMatrix, ColorMatrixFlag colorMatrixFlag, ColorAdjustType colorAdjustType) {
211 Status status = GDIPlus.GdipSetImageAttributesColorMatrix(nativeImageAttr,colorAdjustType,
212 true, colorMatrix, (ColorMatrix)null, colorMatrixFlag);
214 if (status != Status.Ok)
215 throw new Exception ("Error calling GDIPlus.SetColorMatrix:" +status);
218 public void Dispose()
220 if (nativeImageAttr != IntPtr.Zero) {
222 Status status = GDIPlus.GdipDisposeImageAttributes(nativeImageAttr);
223 GDIPlus.CheckStatus (status);
224 nativeImageAttr = IntPtr.Zero;
227 System.GC.SuppressFinalize (this);
235 public object Clone()
239 Status status = GDIPlus.GdipCloneImageAttributes (nativeImageAttr, out imgclone);
240 GDIPlus.CheckStatus (status);
242 return new ImageAttributes (imgclone);
245 public void GetAdjustedPalette(ColorPalette palette, ColorAdjustType type)
249 Status status = GDIPlus.GdipGetImageAttributesAdjustedPalette (nativeImageAttr,
250 out colorPalette, type);
252 palette.setFromGDIPalette (colorPalette);
253 GDIPlus.CheckStatus (status);
256 public void SetBrushRemapTable(ColorMap[] map)
258 GdiColorMap gdiclr = new GdiColorMap ();
259 IntPtr clrmap, lpPointer;
260 int mapsize = Marshal.SizeOf (gdiclr);
261 int size = mapsize * map.Length;
262 clrmap = lpPointer = Marshal.AllocHGlobal (size);
264 for (int i=0; i < map.Length; i++) {
265 gdiclr.from = map[i].OldColor.ToArgb();
266 gdiclr.to = map[i].NewColor.ToArgb();
268 Marshal.StructureToPtr (gdiclr, lpPointer, false);
269 lpPointer = (IntPtr) (lpPointer.ToInt64() + mapsize);
272 Status status = GDIPlus.GdipSetImageAttributesRemapTable (nativeImageAttr,
273 ColorAdjustType.Brush, true, (uint) map.Length, clrmap);
274 GDIPlus.CheckStatus (status);
277 Marshal.FreeHGlobal (clrmap);
282 public void SetColorKey(Color colorLow, Color colorHigh, ColorAdjustType type)
284 Status status = GDIPlus.GdipSetImageAttributesColorKeys (nativeImageAttr,
285 type, true, colorLow.ToArgb (), colorHigh.ToArgb ());
287 GDIPlus.CheckStatus (status);
291 public void SetColorMatrices(ColorMatrix newColorMatrix, ColorMatrix grayMatrix)
293 Status status = GDIPlus.GdipSetImageAttributesColorMatrix (nativeImageAttr,
294 ColorAdjustType.Default, true, newColorMatrix, grayMatrix, ColorMatrixFlag.Default);
296 GDIPlus.CheckStatus (status);
299 public void SetColorMatrices(ColorMatrix newColorMatrix, ColorMatrix grayMatrix, ColorMatrixFlag flags)
301 Status status = GDIPlus.GdipSetImageAttributesColorMatrix (nativeImageAttr,
302 ColorAdjustType.Default, true, newColorMatrix, grayMatrix, flags);
304 GDIPlus.CheckStatus (status);
307 public void SetColorMatrices(ColorMatrix newColorMatrix, ColorMatrix grayMatrix, ColorMatrixFlag mode, ColorAdjustType type)
309 Status status = GDIPlus.GdipSetImageAttributesColorMatrix (nativeImageAttr,
310 ColorAdjustType.Default, true, newColorMatrix, grayMatrix, mode);
312 GDIPlus.CheckStatus (status);
315 public void SetGamma(float gamma)
317 SetGamma (gamma, ColorAdjustType.Default);
320 public void SetGamma(float gamma, ColorAdjustType coloradjust)
322 Status status = GDIPlus.GdipSetImageAttributesGamma (nativeImageAttr, coloradjust, true,
325 GDIPlus.CheckStatus (status);
328 public void SetNoOp()
330 SetNoOp (ColorAdjustType.Default);
333 public void SetNoOp(ColorAdjustType type)
335 Status status = GDIPlus.GdipSetImageAttributesNoOp (nativeImageAttr,
338 GDIPlus.CheckStatus (status);
341 public void SetOutputChannel(ColorChannelFlag flags)
343 SetOutputChannel (flags, ColorAdjustType.Default);
346 public void SetOutputChannel(ColorChannelFlag flags, ColorAdjustType type)
348 Status status = GDIPlus.GdipSetImageAttributesOutputChannel (nativeImageAttr,
351 GDIPlus.CheckStatus (status);
354 public void SetOutputChannelColorProfile(string colorProfileFilename)
356 SetOutputChannelColorProfile (colorProfileFilename, ColorAdjustType.Default);
359 public void SetOutputChannelColorProfile(string colorProfileFilename, ColorAdjustType type)
361 Status status = GDIPlus.GdipSetImageAttributesOutputChannelColorProfile (nativeImageAttr,
362 type, true, colorProfileFilename);
364 GDIPlus.CheckStatus (status);
367 public void SetRemapTable(ColorMap[] map)
369 SetRemapTable (map, ColorAdjustType.Default);
373 public void SetRemapTable(ColorMap[] map, ColorAdjustType type)
375 GdiColorMap gdiclr = new GdiColorMap ();
376 IntPtr clrmap, lpPointer;
377 int mapsize = Marshal.SizeOf (gdiclr);
378 int size = mapsize * map.Length;
379 clrmap = lpPointer = Marshal.AllocHGlobal (size);
381 for (int i=0; i < map.Length; i++) {
382 gdiclr.from = map[i].OldColor.ToArgb();
383 gdiclr.to = map[i].NewColor.ToArgb();
385 Marshal.StructureToPtr (gdiclr, lpPointer, false);
386 lpPointer = (IntPtr) (lpPointer.ToInt64() + mapsize);
389 Status status = GDIPlus.GdipSetImageAttributesRemapTable (nativeImageAttr,
390 type, true, (uint) map.Length, clrmap);
391 GDIPlus.CheckStatus (status);
394 Marshal.FreeHGlobal (clrmap);
398 public void SetThreshold(float threshold)
400 SetThreshold (threshold, ColorAdjustType.Default);
403 public void SetThreshold(float threshold, ColorAdjustType type)
405 Status status = GDIPlus.GdipSetImageAttributesThreshold (nativeImageAttr,
408 GDIPlus.CheckStatus (status);
411 public void SetWrapMode(WrapMode mode)
413 SetWrapMode (mode, Color.Black);
417 public void SetWrapMode(WrapMode mode, Color color)
419 SetWrapMode (mode, color, false);
423 public void SetWrapMode(WrapMode mode, Color color, bool clamp)
425 Status status = GDIPlus.GdipSetImageAttributesWrapMode (nativeImageAttr, mode,
426 color.ToArgb(), clamp);
428 GDIPlus.CheckStatus (status);