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)
8 // Sebastien Pouliot <sebastien@ximian.com>
10 // (C) 2002-4 Ximian, Inc. http://www.ximian.com
11 // Copyright (C) 2004, 2006 Novell, Inc (http://www.novell.com)
13 // Permission is hereby granted, free of charge, to any person obtaining
14 // a copy of this software and associated documentation files (the
15 // "Software"), to deal in the Software without restriction, including
16 // without limitation the rights to use, copy, modify, merge, publish,
17 // distribute, sublicense, and/or sell copies of the Software, and to
18 // permit persons to whom the Software is furnished to do so, subject to
19 // the following conditions:
21 // The above copyright notice and this permission notice shall be
22 // included in all copies or substantial portions of the Software.
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33 using System.Drawing.Drawing2D;
34 using System.Runtime.InteropServices;
36 namespace System.Drawing.Imaging {
38 [StructLayout(LayoutKind.Sequential)]
39 public sealed class ImageAttributes : ICloneable, IDisposable {
41 private IntPtr nativeImageAttr = IntPtr.Zero;
43 internal IntPtr NativeObject{
45 return nativeImageAttr;
49 internal ImageAttributes(IntPtr native)
51 nativeImageAttr = native;
54 public ImageAttributes() {
56 Status status = GDIPlus.GdipCreateImageAttributes(out nativeImageAttr);
58 if (status != Status.Ok)
59 throw new Exception ("Error calling GDIPlus.GdipCreateImageAttributes:" +status);
63 public void ClearBrushRemapTable()
65 ClearRemapTable (ColorAdjustType.Brush);
68 //Clears the color keys for all GDI+ objects
69 public void ClearColorKey()
71 ClearColorKey (ColorAdjustType.Default);
74 public void ClearColorKey(ColorAdjustType type)
76 Status status = GDIPlus.GdipSetImageAttributesColorKeys (nativeImageAttr,
79 GDIPlus.CheckStatus (status);
82 public void ClearColorMatrix()
84 ClearColorMatrix (ColorAdjustType.Default);
87 public void ClearColorMatrix (ColorAdjustType type)
89 Status status = GDIPlus.GdipSetImageAttributesColorMatrix (nativeImageAttr, type, false,
90 IntPtr.Zero, IntPtr.Zero, ColorMatrixFlag.Default);
91 GDIPlus.CheckStatus (status);
94 public void ClearGamma()
96 ClearGamma (ColorAdjustType.Default);
99 public void ClearGamma(ColorAdjustType type)
101 Status status = GDIPlus.GdipSetImageAttributesGamma (nativeImageAttr, type, false, 0);
103 GDIPlus.CheckStatus (status);
106 public void ClearNoOp()
108 ClearNoOp (ColorAdjustType.Default);
111 public void ClearNoOp(ColorAdjustType type)
113 Status status = GDIPlus.GdipSetImageAttributesNoOp (nativeImageAttr, type, false);
115 GDIPlus.CheckStatus (status);
118 public void ClearOutputChannel()
120 ClearOutputChannel (ColorAdjustType.Default);
123 public void ClearOutputChannel(ColorAdjustType type)
125 Status status = GDIPlus.GdipSetImageAttributesOutputChannel (nativeImageAttr,
126 type, false, ColorChannelFlag.ColorChannelLast);
128 GDIPlus.CheckStatus (status);
131 public void ClearOutputChannelColorProfile()
133 ClearOutputChannelColorProfile (ColorAdjustType.Default);
136 public void ClearOutputChannelColorProfile(ColorAdjustType type)
138 Status status = GDIPlus.GdipSetImageAttributesOutputChannelColorProfile (nativeImageAttr,
141 GDIPlus.CheckStatus (status);
144 public void ClearRemapTable()
146 ClearRemapTable (ColorAdjustType.Default);
149 public void ClearRemapTable(ColorAdjustType type)
151 Status status = GDIPlus.GdipSetImageAttributesRemapTable (nativeImageAttr,
152 type, false, 0, IntPtr.Zero);
154 GDIPlus.CheckStatus (status);
157 public void ClearThreshold()
159 ClearThreshold (ColorAdjustType.Default);
162 public void ClearThreshold(ColorAdjustType type)
164 Status status = GDIPlus.GdipSetImageAttributesThreshold (nativeImageAttr,
167 GDIPlus.CheckStatus (status);
170 //Sets the color keys for all GDI+ objects
171 public void SetColorKey(Color colorLow, Color colorHigh)
173 SetColorKey (colorLow, colorHigh, ColorAdjustType.Default);
176 public void SetColorMatrix (ColorMatrix colorMatrix)
178 IntPtr cm = ColorMatrix.Alloc (colorMatrix);
180 Status status = GDIPlus.GdipSetImageAttributesColorMatrix (nativeImageAttr,
181 ColorAdjustType.Default, true, cm, IntPtr.Zero, ColorMatrixFlag.Default);
182 GDIPlus.CheckStatus (status);
185 ColorMatrix.Free (cm);
189 [MonoTODO ("colorMatrixFlag is ignored in libgdiplus")]
190 public void SetColorMatrix (ColorMatrix colorMatrix, ColorMatrixFlag colorMatrixFlag)
192 IntPtr cm = ColorMatrix.Alloc (colorMatrix);
194 Status status = GDIPlus.GdipSetImageAttributesColorMatrix (nativeImageAttr,
195 ColorAdjustType.Default, true, cm, IntPtr.Zero, colorMatrixFlag);
196 GDIPlus.CheckStatus (status);
199 ColorMatrix.Free (cm);
203 [MonoTODO ("colorMatrixFlag is ignored in libgdiplus")]
204 public void SetColorMatrix (ColorMatrix colorMatrix, ColorMatrixFlag colorMatrixFlag, ColorAdjustType colorAdjustType)
206 IntPtr cm = ColorMatrix.Alloc (colorMatrix);
208 Status status = GDIPlus.GdipSetImageAttributesColorMatrix (nativeImageAttr,
209 colorAdjustType, true, cm, IntPtr.Zero, colorMatrixFlag);
210 GDIPlus.CheckStatus (status);
213 ColorMatrix.Free (cm);
217 public void Dispose()
219 if (nativeImageAttr != IntPtr.Zero) {
221 Status status = GDIPlus.GdipDisposeImageAttributes(nativeImageAttr);
222 GDIPlus.CheckStatus (status);
223 nativeImageAttr = IntPtr.Zero;
226 System.GC.SuppressFinalize (this);
234 public object Clone()
238 Status status = GDIPlus.GdipCloneImageAttributes (nativeImageAttr, out imgclone);
239 GDIPlus.CheckStatus (status);
241 return new ImageAttributes (imgclone);
244 public void GetAdjustedPalette(ColorPalette palette, ColorAdjustType type)
248 Status status = GDIPlus.GdipGetImageAttributesAdjustedPalette (nativeImageAttr,
249 out colorPalette, type);
251 palette.setFromGDIPalette (colorPalette);
252 GDIPlus.CheckStatus (status);
255 public void SetBrushRemapTable(ColorMap[] map)
257 GdiColorMap gdiclr = new GdiColorMap ();
258 IntPtr clrmap, lpPointer;
259 int mapsize = Marshal.SizeOf (gdiclr);
260 int size = mapsize * map.Length;
261 clrmap = lpPointer = Marshal.AllocHGlobal (size);
263 for (int i=0; i < map.Length; i++) {
264 gdiclr.from = map[i].OldColor.ToArgb();
265 gdiclr.to = map[i].NewColor.ToArgb();
267 Marshal.StructureToPtr (gdiclr, lpPointer, false);
268 lpPointer = (IntPtr) (lpPointer.ToInt64() + mapsize);
271 Status status = GDIPlus.GdipSetImageAttributesRemapTable (nativeImageAttr,
272 ColorAdjustType.Brush, true, (uint) map.Length, clrmap);
273 GDIPlus.CheckStatus (status);
276 Marshal.FreeHGlobal (clrmap);
281 public void SetColorKey(Color colorLow, Color colorHigh, ColorAdjustType type)
283 Status status = GDIPlus.GdipSetImageAttributesColorKeys (nativeImageAttr,
284 type, true, colorLow.ToArgb (), colorHigh.ToArgb ());
286 GDIPlus.CheckStatus (status);
290 [MonoTODO ("grayMatrix is ignored in libgdiplus")]
291 public void SetColorMatrices (ColorMatrix newColorMatrix, ColorMatrix grayMatrix)
293 IntPtr cm = ColorMatrix.Alloc (newColorMatrix);
295 IntPtr gm = ColorMatrix.Alloc (grayMatrix);
297 Status status = GDIPlus.GdipSetImageAttributesColorMatrix (nativeImageAttr,
298 ColorAdjustType.Default, true, cm, gm, ColorMatrixFlag.Default);
299 GDIPlus.CheckStatus (status);
302 ColorMatrix.Free (gm);
306 ColorMatrix.Free (cm);
310 [MonoTODO ("grayMatrix and colorMatrixFlag are ignored in libgdiplus")]
311 public void SetColorMatrices (ColorMatrix newColorMatrix, ColorMatrix grayMatrix, ColorMatrixFlag flags)
313 IntPtr cm = ColorMatrix.Alloc (newColorMatrix);
315 IntPtr gm = ColorMatrix.Alloc (grayMatrix);
317 Status status = GDIPlus.GdipSetImageAttributesColorMatrix (nativeImageAttr,
318 ColorAdjustType.Default, true, cm, gm, flags);
319 GDIPlus.CheckStatus (status);
322 ColorMatrix.Free (gm);
326 ColorMatrix.Free (cm);
330 [MonoTODO ("grayMatrix and colorMatrixFlag are ignored in libgdiplus")]
331 public void SetColorMatrices(ColorMatrix newColorMatrix, ColorMatrix grayMatrix, ColorMatrixFlag mode, ColorAdjustType type)
333 IntPtr cm = ColorMatrix.Alloc (newColorMatrix);
335 IntPtr gm = ColorMatrix.Alloc (grayMatrix);
337 Status status = GDIPlus.GdipSetImageAttributesColorMatrix (nativeImageAttr,
338 ColorAdjustType.Default, true, cm, gm, mode);
339 GDIPlus.CheckStatus (status);
342 ColorMatrix.Free (gm);
346 ColorMatrix.Free (cm);
350 public void SetGamma(float gamma)
352 SetGamma (gamma, ColorAdjustType.Default);
355 public void SetGamma(float gamma, ColorAdjustType coloradjust)
357 Status status = GDIPlus.GdipSetImageAttributesGamma (nativeImageAttr, coloradjust, true,
360 GDIPlus.CheckStatus (status);
363 public void SetNoOp()
365 SetNoOp (ColorAdjustType.Default);
368 public void SetNoOp(ColorAdjustType type)
370 Status status = GDIPlus.GdipSetImageAttributesNoOp (nativeImageAttr,
373 GDIPlus.CheckStatus (status);
376 public void SetOutputChannel(ColorChannelFlag flags)
378 SetOutputChannel (flags, ColorAdjustType.Default);
381 public void SetOutputChannel(ColorChannelFlag flags, ColorAdjustType type)
383 Status status = GDIPlus.GdipSetImageAttributesOutputChannel (nativeImageAttr,
386 GDIPlus.CheckStatus (status);
389 public void SetOutputChannelColorProfile(string colorProfileFilename)
391 SetOutputChannelColorProfile (colorProfileFilename, ColorAdjustType.Default);
394 public void SetOutputChannelColorProfile(string colorProfileFilename, ColorAdjustType type)
396 Status status = GDIPlus.GdipSetImageAttributesOutputChannelColorProfile (nativeImageAttr,
397 type, true, colorProfileFilename);
399 GDIPlus.CheckStatus (status);
402 public void SetRemapTable(ColorMap[] map)
404 SetRemapTable (map, ColorAdjustType.Default);
408 public void SetRemapTable(ColorMap[] map, ColorAdjustType type)
410 GdiColorMap gdiclr = new GdiColorMap ();
411 IntPtr clrmap, lpPointer;
412 int mapsize = Marshal.SizeOf (gdiclr);
413 int size = mapsize * map.Length;
414 clrmap = lpPointer = Marshal.AllocHGlobal (size);
416 for (int i=0; i < map.Length; i++) {
417 gdiclr.from = map[i].OldColor.ToArgb();
418 gdiclr.to = map[i].NewColor.ToArgb();
420 Marshal.StructureToPtr (gdiclr, lpPointer, false);
421 lpPointer = (IntPtr) (lpPointer.ToInt64() + mapsize);
424 Status status = GDIPlus.GdipSetImageAttributesRemapTable (nativeImageAttr,
425 type, true, (uint) map.Length, clrmap);
426 GDIPlus.CheckStatus (status);
429 Marshal.FreeHGlobal (clrmap);
433 public void SetThreshold(float threshold)
435 SetThreshold (threshold, ColorAdjustType.Default);
438 public void SetThreshold(float threshold, ColorAdjustType type)
440 Status status = GDIPlus.GdipSetImageAttributesThreshold (nativeImageAttr,
443 GDIPlus.CheckStatus (status);
446 public void SetWrapMode(WrapMode mode)
448 SetWrapMode (mode, Color.Black);
452 public void SetWrapMode(WrapMode mode, Color color)
454 SetWrapMode (mode, color, false);
458 public void SetWrapMode(WrapMode mode, Color color, bool clamp)
460 Status status = GDIPlus.GdipSetImageAttributesWrapMode (nativeImageAttr, mode,
461 color.ToArgb(), clamp);
463 GDIPlus.CheckStatus (status);