Syncs StructLayout with GdipBitmapData at bitmap.c. Bug fix
[mono.git] / mcs / class / System.Drawing / System.Drawing.Imaging / BitmapData.cs
1 //\r
2 // System.Drawing.Imaging.BitmapData.cs\r
3 //\r
4 // Author:\r
5 //   Miguel de Icaza (miguel@ximian.com\r
6 //\r
7 // (C) 2002 Ximian, Inc.  http://www.ximian.com\r
8 //\r
9 \r
10 using System;\r
11 using System.Runtime.InteropServices;\r
12 using System.IO;\r
13 \r
14 namespace System.Drawing.Imaging\r
15 {\r
16         [StructLayout(LayoutKind.Sequential)]\r
17         public sealed class BitmapData {\r
18                 internal int width, height, stride;\r
19                 internal PixelFormat pixel_format;
20                 internal bool own_scan0;
21                 internal IntPtr address;\r
22                 internal int reserved;\r
23                 private  bool bAllocated = false;\r
24                 \r
25                 ~BitmapData()\r
26                 {                       \r
27                         if (bAllocated)\r
28                                 Marshal.FreeHGlobal(address);                                           \r
29                 }\r
30                 \r
31                 internal bool Allocated {\r
32                         set {bAllocated = value;}\r
33                 }\r
34                 \r
35                 public int Height {\r
36                         get {\r
37                                 return height;\r
38                         }\r
39 \r
40                         set {\r
41                                 height = value;\r
42                         }\r
43                 }\r
44 \r
45                 public int Width {\r
46                         get {\r
47                                 return width;\r
48                         }\r
49 \r
50                         set {\r
51                                 width = value;\r
52                         }\r
53                 }\r
54 \r
55                 public PixelFormat PixelFormat {\r
56                         get {\r
57                                 \r
58                                 return pixel_format;\r
59                         }\r
60 \r
61                         set {\r
62                                 pixel_format = value;\r
63                         }\r
64                 }\r
65 \r
66                 public int Reserved {\r
67                         get {\r
68                                 return reserved;\r
69                         }\r
70 \r
71                         set {\r
72                                 reserved = value;\r
73                         }\r
74                 }\r
75 \r
76                 public IntPtr Scan0 {\r
77                         get {\r
78                                 return address;\r
79                         }\r
80 \r
81                         set {\r
82                                 \r
83                                 if (bAllocated)\r
84                                 {\r
85                                         Marshal.FreeHGlobal(address);                           \r
86                                         bAllocated = false;\r
87                                 }\r
88                                 \r
89                                 address = value;\r
90                         }\r
91                 }\r
92 \r
93                 public int Stride {\r
94                         get {\r
95                                 return stride;\r
96                         }\r
97 \r
98                         set {\r
99                                 stride = value;\r
100                         }\r
101                 }\r
102                 \r
103                 internal unsafe void swap_red_blue_bytes () \r
104                 {\r
105                         byte *start = (byte *) (void *) this.Scan0;\r
106                         int stride = this.Stride;\r
107                         for (int line = 0; line < this.Height; line++){\r
108                                 // Exchange red <=> blue bytes\r
109 //                              fixed (byte *pbuf = start) {\r
110                                         byte* curByte = start;\r
111                                         for (int i = 0; i < this.Width; i++) {\r
112                                                 byte t = *(curByte+2);\r
113                                                 *(curByte+2) = *curByte;\r
114                                                 *curByte = t;\r
115                                                 curByte += 3;\r
116                                         }\r
117 //                              }\r
118                                 start += stride;\r
119                         }\r
120                 }\r
121         }\r
122 }\r