ImageAttributes.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. //
  2. // System.Drawing.Imaging.ImageAttributes.cs
  3. //
  4. // Author:
  5. // Dennis Hayes ([email protected]) (stubbed out)
  6. // Jordi Mas i Hernàndez ([email protected])
  7. // Sanjay Gupta ([email protected])
  8. //
  9. // (C) 2002-4 Ximian, Inc. http://www.ximian.com
  10. //
  11. using System;
  12. using System.Drawing;
  13. using System.Drawing.Drawing2D;
  14. using System.Runtime.InteropServices;
  15. namespace System.Drawing.Imaging
  16. {
  17. /// <summary>
  18. /// Summary description for ImageAttributes.
  19. /// </summary>
  20. public sealed class ImageAttributes : ICloneable, IDisposable {
  21. private IntPtr nativeImageAttr = IntPtr.Zero;
  22. internal IntPtr NativeObject{
  23. get{
  24. return nativeImageAttr;
  25. }
  26. }
  27. internal ImageAttributes(IntPtr native)
  28. {
  29. nativeImageAttr = native;
  30. }
  31. public ImageAttributes() {
  32. Status status = GDIPlus.GdipCreateImageAttributes(out nativeImageAttr);
  33. if (status != Status.Ok)
  34. throw new Exception ("Error calling GDIPlus.GdipCreateImageAttributes:" +status);
  35. }
  36. public void ClearBrushRemapTable()
  37. {
  38. ClearRemapTable (ColorAdjustType.Brush);
  39. }
  40. //Clears the color keys for all GDI+ objects
  41. public void ClearColorKey()
  42. {
  43. ClearColorKey (ColorAdjustType.Default);
  44. }
  45. public void ClearColorKey(ColorAdjustType type)
  46. {
  47. Status status = GDIPlus.GdipSetImageAttributesColorKeys (nativeImageAttr,
  48. type, false, 0, 0);
  49. GDIPlus.CheckStatus (status);
  50. }
  51. public void ClearColorMatrix()
  52. {
  53. ClearColorMatrix (ColorAdjustType.Default);
  54. }
  55. public void ClearColorMatrix(ColorAdjustType type)
  56. {
  57. Status status = GDIPlus.GdipSetImageAttributesColorMatrix (nativeImageAttr,
  58. type, false, null, null, ColorMatrixFlag.Default);
  59. GDIPlus.CheckStatus (status);
  60. }
  61. public void ClearGamma()
  62. {
  63. ClearGamma (ColorAdjustType.Default);
  64. }
  65. public void ClearGamma(ColorAdjustType type)
  66. {
  67. Status status = GDIPlus.GdipSetImageAttributesGamma (nativeImageAttr, type, false, 0);
  68. GDIPlus.CheckStatus (status);
  69. }
  70. public void ClearNoOp()
  71. {
  72. ClearNoOp (ColorAdjustType.Default);
  73. }
  74. public void ClearNoOp(ColorAdjustType type)
  75. {
  76. Status status = GDIPlus.GdipSetImageAttributesNoOp (nativeImageAttr, type, false);
  77. GDIPlus.CheckStatus (status);
  78. }
  79. public void ClearOutputChannel()
  80. {
  81. ClearOutputChannel (ColorAdjustType.Default);
  82. }
  83. public void ClearOutputChannel(ColorAdjustType type)
  84. {
  85. Status status = GDIPlus.GdipSetImageAttributesOutputChannel (nativeImageAttr,
  86. type, false, ColorChannelFlag.ColorChannelLast);
  87. GDIPlus.CheckStatus (status);
  88. }
  89. public void ClearOutputChannelColorProfile()
  90. {
  91. ClearOutputChannelColorProfile (ColorAdjustType.Default);
  92. }
  93. public void ClearOutputChannelColorProfile(ColorAdjustType type)
  94. {
  95. Status status = GDIPlus.GdipSetImageAttributesOutputChannelColorProfile (nativeImageAttr,
  96. type, false, null);
  97. GDIPlus.CheckStatus (status);
  98. }
  99. public void ClearRemapTable()
  100. {
  101. ClearRemapTable (ColorAdjustType.Default);
  102. }
  103. public void ClearRemapTable(ColorAdjustType type)
  104. {
  105. Status status = GDIPlus.GdipSetImageAttributesRemapTable (nativeImageAttr,
  106. type, false, 0, IntPtr.Zero);
  107. GDIPlus.CheckStatus (status);
  108. }
  109. public void ClearThreshold()
  110. {
  111. ClearThreshold (ColorAdjustType.Default);
  112. }
  113. public void ClearThreshold(ColorAdjustType type)
  114. {
  115. Status status = GDIPlus.GdipSetImageAttributesThreshold (nativeImageAttr,
  116. type, false, 0);
  117. GDIPlus.CheckStatus (status);
  118. }
  119. //Sets the color keys for all GDI+ objects
  120. public void SetColorKey(Color colorLow, Color colorHigh)
  121. {
  122. Status status = GDIPlus.GdipSetImageAttributesColorKeys(nativeImageAttr,
  123. ColorAdjustType.Default, true, colorLow.ToArgb(), colorHigh.ToArgb());
  124. if (status != Status.Ok)
  125. throw new Exception ("Error calling GDIPlus.GdipSetImageAttributesColorKeys:" +status);
  126. }
  127. public void SetColorMatrix(ColorMatrix colorMatrix)
  128. {
  129. Status status = GDIPlus.GdipSetImageAttributesColorMatrix(nativeImageAttr, ColorAdjustType.Default,
  130. true, colorMatrix, (ColorMatrix)null, ColorMatrixFlag.Default);
  131. if (status != Status.Ok)
  132. throw new Exception ("Error calling GDIPlus.SetColorMatrix:" +status);
  133. }
  134. public void SetColorMatrix(ColorMatrix colorMatrix, ColorMatrixFlag colorMatrixFlag)
  135. {
  136. Status status = GDIPlus.GdipSetImageAttributesColorMatrix(nativeImageAttr, ColorAdjustType.Default,
  137. true, colorMatrix, (ColorMatrix)null, colorMatrixFlag);
  138. if (status != Status.Ok)
  139. throw new Exception ("Error calling GDIPlus.SetColorMatrix:" +status);
  140. }
  141. public void SetColorMatrix(ColorMatrix colorMatrix, ColorMatrixFlag colorMatrixFlag, ColorAdjustType colorAdjustType) {
  142. Status status = GDIPlus.GdipSetImageAttributesColorMatrix(nativeImageAttr,colorAdjustType,
  143. true, colorMatrix, (ColorMatrix)null, colorMatrixFlag);
  144. if (status != Status.Ok)
  145. throw new Exception ("Error calling GDIPlus.SetColorMatrix:" +status);
  146. }
  147. void Dispose (bool disposing)
  148. {
  149. if (!disposing) return;
  150. Status status = GDIPlus.GdipDisposeImageAttributes(nativeImageAttr);
  151. if (status != Status.Ok)
  152. throw new Exception ("Error calling GDIPlus.GdipDisposeImageAttributes:" +status);
  153. else
  154. nativeImageAttr = IntPtr.Zero;
  155. }
  156. public void Dispose()
  157. {
  158. Dispose (true);
  159. System.GC.SuppressFinalize (this);
  160. }
  161. ~ImageAttributes()
  162. {
  163. Dispose (false);
  164. }
  165. public object Clone()
  166. {
  167. IntPtr imgclone;
  168. Status status = GDIPlus.GdipCloneImageAttributes (nativeImageAttr, out imgclone);
  169. GDIPlus.CheckStatus (status);
  170. return new ImageAttributes (imgclone);
  171. }
  172. public void GetAdjustedPalette(ColorPalette palette, ColorAdjustType type)
  173. {
  174. IntPtr colorPalette;
  175. Status status = GDIPlus.GdipGetImageAttributesAdjustedPalette (nativeImageAttr,
  176. out colorPalette, type);
  177. palette.setFromGDIPalette (colorPalette);
  178. }
  179. public void SetBrushRemapTable(ColorMap[] map)
  180. {
  181. GdiColorMap gdiclr = new GdiColorMap ();
  182. IntPtr clrmap, lpPointer;
  183. int mapsize = Marshal.SizeOf (gdiclr);
  184. int size = mapsize * map.Length;
  185. clrmap = lpPointer = Marshal.AllocHGlobal (size);
  186. for (int i=0; i < map.Length; i++)
  187. {
  188. gdiclr.from = map[i].OldColor.ToArgb();
  189. gdiclr.to = map[i].NewColor.ToArgb();
  190. Marshal.StructureToPtr (gdiclr, lpPointer, false);
  191. lpPointer = (IntPtr) (lpPointer.ToInt32() + mapsize);
  192. }
  193. Status status = GDIPlus.GdipSetImageAttributesRemapTable (nativeImageAttr,
  194. ColorAdjustType.Brush, true, (uint) map.Length, clrmap);
  195. Marshal.FreeHGlobal (clrmap);
  196. GDIPlus.CheckStatus (status);
  197. }
  198. public void SetColorKey(Color colorLow, Color colorHigh, ColorAdjustType type)
  199. {
  200. Status status = GDIPlus.GdipSetImageAttributesColorKeys (nativeImageAttr,
  201. type, true, colorLow.ToArgb (), colorHigh.ToArgb ());
  202. GDIPlus.CheckStatus (status);
  203. }
  204. public void SetColorMatrices(ColorMatrix newColorMatrix, ColorMatrix grayMatrix)
  205. {
  206. Status status = GDIPlus.GdipSetImageAttributesColorMatrix (nativeImageAttr,
  207. ColorAdjustType.Default, true, newColorMatrix, grayMatrix, ColorMatrixFlag.Default);
  208. GDIPlus.CheckStatus (status);
  209. }
  210. public void SetColorMatrices(ColorMatrix newColorMatrix, ColorMatrix grayMatrix, ColorMatrixFlag flags)
  211. {
  212. Status status = GDIPlus.GdipSetImageAttributesColorMatrix (nativeImageAttr,
  213. ColorAdjustType.Default, true, newColorMatrix, grayMatrix, flags);
  214. GDIPlus.CheckStatus (status);
  215. }
  216. public void SetColorMatrices(ColorMatrix newColorMatrix, ColorMatrix grayMatrix, ColorMatrixFlag mode, ColorAdjustType type)
  217. {
  218. Status status = GDIPlus.GdipSetImageAttributesColorMatrix (nativeImageAttr,
  219. ColorAdjustType.Default, true, newColorMatrix, grayMatrix, mode);
  220. GDIPlus.CheckStatus (status);
  221. }
  222. public void SetGamma(float gamma)
  223. {
  224. SetGamma (gamma, ColorAdjustType.Default);
  225. }
  226. public void SetGamma(float gamma, ColorAdjustType coloradjust)
  227. {
  228. Status status = GDIPlus.GdipSetImageAttributesGamma (nativeImageAttr, coloradjust, true,
  229. gamma);
  230. GDIPlus.CheckStatus (status);
  231. }
  232. public void SetNoOp()
  233. {
  234. SetNoOp (ColorAdjustType.Default);
  235. }
  236. public void SetNoOp(ColorAdjustType type)
  237. {
  238. Status status = GDIPlus.GdipSetImageAttributesNoOp (nativeImageAttr,
  239. type, true);
  240. GDIPlus.CheckStatus (status);
  241. }
  242. public void SetOutputChannel(ColorChannelFlag flags)
  243. {
  244. SetOutputChannel (flags, ColorAdjustType.Default);
  245. }
  246. public void SetOutputChannel(ColorChannelFlag flags, ColorAdjustType type)
  247. {
  248. Status status = GDIPlus.GdipSetImageAttributesOutputChannel (nativeImageAttr,
  249. type, true, flags);
  250. GDIPlus.CheckStatus (status);
  251. }
  252. public void SetOutputChannelColorProfile(string colorProfileFilename)
  253. {
  254. SetOutputChannelColorProfile (colorProfileFilename, ColorAdjustType.Default);
  255. }
  256. public void SetOutputChannelColorProfile(string colorProfileFilename, ColorAdjustType type)
  257. {
  258. Status status = GDIPlus.GdipSetImageAttributesOutputChannelColorProfile (nativeImageAttr,
  259. type, true, colorProfileFilename);
  260. GDIPlus.CheckStatus (status);
  261. }
  262. public void SetRemapTable(ColorMap[] map)
  263. {
  264. SetRemapTable (map, ColorAdjustType.Default);
  265. }
  266. public void SetRemapTable(ColorMap[] map, ColorAdjustType type)
  267. {
  268. GdiColorMap gdiclr = new GdiColorMap ();
  269. IntPtr clrmap, lpPointer;
  270. int mapsize = Marshal.SizeOf (gdiclr);
  271. int size = mapsize * map.Length;
  272. clrmap = lpPointer = Marshal.AllocHGlobal (size);
  273. for (int i=0; i < map.Length; i++)
  274. {
  275. gdiclr.from = map[i].OldColor.ToArgb();
  276. gdiclr.to = map[i].NewColor.ToArgb();
  277. Marshal.StructureToPtr (gdiclr, lpPointer, false);
  278. lpPointer = (IntPtr) (lpPointer.ToInt32() + mapsize);
  279. }
  280. Status status = GDIPlus.GdipSetImageAttributesRemapTable (nativeImageAttr,
  281. type, true, (uint) map.Length, clrmap);
  282. Marshal.FreeHGlobal (clrmap);
  283. GDIPlus.CheckStatus (status);
  284. }
  285. public void SetThreshold(float threshold)
  286. {
  287. SetThreshold (threshold, ColorAdjustType.Default);
  288. }
  289. public void SetThreshold(float threshold, ColorAdjustType type)
  290. {
  291. Status status = GDIPlus.GdipSetImageAttributesThreshold (nativeImageAttr,
  292. type, true, 0);
  293. GDIPlus.CheckStatus (status);
  294. }
  295. public void SetWrapMode(WrapMode mode)
  296. {
  297. SetWrapMode (mode, Color.Black);
  298. }
  299. public void SetWrapMode(WrapMode mode, Color color)
  300. {
  301. SetWrapMode (mode, color, false);
  302. }
  303. public void SetWrapMode(WrapMode mode, Color color, bool clamp)
  304. {
  305. Status status = GDIPlus.GdipSetImageAttributesWrapMode (nativeImageAttr, mode,
  306. color.ToArgb(), clamp);
  307. GDIPlus.CheckStatus (status);
  308. }
  309. }
  310. }