[GDI32]
[reactos.git] / rosapps / templates / imagesoft / contrast.c
1 #include "precomp.h"
2
3 #define BASECOLOUR 100
4
5
6 VOID
7 AdjustContrast(HBITMAP hOrigBitmap,
8 HBITMAP hNewBitmap,
9 HWND hwnd,
10 HDC hdcMem,
11 INT RedVal,
12 INT GreenVal,
13 INT BlueVal)
14 {
15 BITMAPINFO bi;
16 BITMAP bitmap;
17 BOOL bRes;
18 DWORD Count = 0;
19 INT i, j;
20 PBYTE pBits;
21 RECT rc;
22
23 GetObject(hNewBitmap,
24 sizeof(BITMAP),
25 &bitmap);
26
27 /* Bitmap header */
28 bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
29 bi.bmiHeader.biWidth = bitmap.bmWidth;
30 bi.bmiHeader.biHeight = bitmap.bmHeight;
31 bi.bmiHeader.biPlanes = 1;
32 bi.bmiHeader.biBitCount = 32;
33 bi.bmiHeader.biCompression = BI_RGB;
34 bi.bmiHeader.biSizeImage = bitmap.bmWidth * bitmap.bmHeight * 4;
35 bi.bmiHeader.biClrUsed = 0;
36 bi.bmiHeader.biClrImportant = 0;
37
38 /* Buffer */
39 pBits = (PBYTE)HeapAlloc(ProcessHeap,
40 0,
41 bitmap.bmWidth * bitmap.bmHeight * 4);
42 if (!pBits)
43 return;
44
45 /* get the bits from the original bitmap */
46 bRes = GetDIBits(hdcMem,
47 hOrigBitmap,
48 0,
49 bitmap.bmHeight,
50 pBits,
51 &bi,
52 DIB_RGB_COLORS);
53
54 for (i = 0; i < bitmap.bmHeight; i++)
55 {
56 for (j = 0; j < bitmap.bmWidth; j++)
57 {
58 DWORD Val = 0;
59 INT b, g, r;
60
61 CopyMemory(&Val,
62 &pBits[Count],
63 4);
64
65 /* Get pixels in reverse order */
66 b = GetRValue(Val);
67 g = GetGValue(Val);
68 r = GetBValue(Val);
69
70 r = ((r - 128) * RedVal) / 100 + 128;
71 g = ((g - 128) * GreenVal) / 100 + 128;
72 b = ((b - 128) * BlueVal) / 100 + 128;
73
74 /* Red */
75 if (r > 255) r = 255;
76 else if (r < 0) r = 0;
77
78 /* Green */
79 if (g > 255) g = 255;
80 else if (g < 0) g = 0;
81
82 /* Blue */
83 if (b > 255) b = 255;
84 else if (b < 0) b = 0;
85
86 /* Store in reverse order */
87 Val = RGB(b, g, r);
88 CopyMemory(&pBits[Count],
89 &Val,
90 4);
91
92 /* RGB color take 4 bytes.The high-order byte must be zero */
93 Count += 4;
94 }
95 }
96
97 /* Set the new pixel bits */
98 SetDIBits(hdcMem,
99 hNewBitmap,
100 0,
101 bRes,
102 pBits,
103 &bi,
104 DIB_RGB_COLORS);
105
106 HeapFree(ProcessHeap,
107 0,
108 pBits);
109
110 GetClientRect(hwnd,
111 &rc);
112
113 InvalidateRect(hwnd,
114 &rc,
115 FALSE);
116 }
117
118
119 static PIMAGEADJUST
120 Cont_OnInitDialog(PIMAGEADJUST pImgAdj,
121 HWND hDlg,
122 LPARAM lParam)
123 {
124 pImgAdj = (IMAGEADJUST*) HeapAlloc(ProcessHeap,
125 0,
126 sizeof(IMAGEADJUST));
127 if (!pImgAdj)
128 return NULL;
129
130
131 pImgAdj->Info = (PMAIN_WND_INFO)lParam;
132 if (!pImgAdj->Info->ImageEditors)
133 goto fail;
134
135
136 pImgAdj->hPicPrev = GetDlgItem(hDlg, IDC_PICPREVIEW);
137 GetClientRect(pImgAdj->hPicPrev,
138 &pImgAdj->ImageRect);
139
140 /* Make a static copy of the main image */
141 pImgAdj->hBitmap = (HBITMAP) CopyImage(pImgAdj->Info->ImageEditors->hBitmap,
142 IMAGE_BITMAP,
143 pImgAdj->ImageRect.right,
144 pImgAdj->ImageRect.bottom,
145 LR_CREATEDIBSECTION);
146 if (!pImgAdj->hBitmap)
147 goto fail;
148
149 /* Make a copy which will be updated */
150 pImgAdj->hPreviewBitmap = (HBITMAP) CopyImage(pImgAdj->Info->ImageEditors->hBitmap,
151 IMAGE_BITMAP,
152 pImgAdj->ImageRect.right,
153 pImgAdj->ImageRect.bottom,
154 LR_CREATEDIBSECTION);
155 if (!pImgAdj->hPreviewBitmap)
156 goto fail;
157
158
159 pImgAdj->RedVal = pImgAdj->BlueVal = pImgAdj->GreenVal = 100;
160
161 /* setup dialog */
162 SendDlgItemMessage(hDlg,
163 IDC_BRI_FULL,
164 BM_SETCHECK,
165 BST_CHECKED,
166 0);
167 SendDlgItemMessage(hDlg,
168 IDC_BRI_TRACKBAR,
169 TBM_SETRANGE,
170 TRUE,
171 (LPARAM)MAKELONG(0, 200));
172 SendDlgItemMessage(hDlg,
173 IDC_BRI_TRACKBAR,
174 TBM_SETPOS,
175 TRUE,
176 (LPARAM)BASECOLOUR);
177 SetDlgItemText(hDlg,
178 IDC_BRI_EDIT,
179 _T("100"));
180
181 return pImgAdj;
182
183 fail:
184 HeapFree(ProcessHeap,
185 0,
186 pImgAdj);
187 return NULL;
188 }
189
190
191 static VOID
192 Cont_OnDrawItem(PIMAGEADJUST pImgAdj,
193 LPARAM lParam)
194 {
195 LPDRAWITEMSTRUCT lpDrawItem;
196 HDC hdcMem;
197
198 lpDrawItem = (LPDRAWITEMSTRUCT)lParam;
199
200 hdcMem = CreateCompatibleDC(lpDrawItem->hDC);
201
202 if(lpDrawItem->CtlID == IDC_PICPREVIEW)
203 {
204 SelectObject(hdcMem,
205 pImgAdj->hPreviewBitmap);
206
207 BitBlt(lpDrawItem->hDC,
208 pImgAdj->ImageRect.left,
209 pImgAdj->ImageRect.top,
210 pImgAdj->ImageRect.right,
211 pImgAdj->ImageRect.bottom,
212 hdcMem,
213 0,
214 0,
215 SRCCOPY);
216
217 DeleteDC(hdcMem);
218 }
219 }
220
221
222 static VOID
223 Cont_OnTrackBar(PIMAGEADJUST pImgAdj,
224 HWND hDlg)
225 {
226 HDC hdcMem;
227 DWORD TrackPos;
228
229 TrackPos = (DWORD)SendDlgItemMessage(hDlg,
230 IDC_BRI_TRACKBAR,
231 TBM_GETPOS,
232 0,
233 0);
234
235 SetDlgItemInt(hDlg,
236 IDC_BRI_EDIT,
237 TrackPos,
238 FALSE);
239
240 if (IsDlgButtonChecked(hDlg, IDC_BRI_FULL) == BST_CHECKED)
241 {
242 pImgAdj->RedVal = pImgAdj->GreenVal = pImgAdj->BlueVal = TrackPos - BASECOLOUR + 100;
243 }
244 else if (IsDlgButtonChecked(hDlg, IDC_BRI_RED) == BST_CHECKED)
245 {
246 pImgAdj->RedVal = TrackPos - BASECOLOUR + 100;
247 }
248 else if (IsDlgButtonChecked(hDlg, IDC_BRI_GREEN) == BST_CHECKED)
249 {
250 pImgAdj->GreenVal = TrackPos - BASECOLOUR + 100;
251 }
252 else if (IsDlgButtonChecked(hDlg, IDC_BRI_BLUE) == BST_CHECKED)
253 {
254 pImgAdj->BlueVal = TrackPos - BASECOLOUR + 100;
255 }
256
257 hdcMem = GetDC(pImgAdj->hPicPrev);
258
259 AdjustContrast(pImgAdj->hBitmap,
260 pImgAdj->hPreviewBitmap,
261 pImgAdj->hPicPrev,
262 hdcMem,
263 pImgAdj->RedVal,
264 pImgAdj->GreenVal,
265 pImgAdj->BlueVal);
266
267 ReleaseDC(pImgAdj->hPicPrev, hdcMem);
268 }
269
270
271 static BOOL
272 Cont_OnCommand(PIMAGEADJUST pImgAdj,
273 HWND hDlg,
274 UINT uID)
275 {
276 switch (uID)
277 {
278 case IDOK:
279 {
280 HDC hdcMem;
281
282 hdcMem = GetDC(pImgAdj->Info->ImageEditors->hSelf);
283
284 AdjustContrast(pImgAdj->Info->ImageEditors->hBitmap,
285 pImgAdj->Info->ImageEditors->hBitmap,
286 pImgAdj->Info->ImageEditors->hSelf,
287 hdcMem,
288 pImgAdj->RedVal,
289 pImgAdj->GreenVal,
290 pImgAdj->BlueVal);
291
292 ReleaseDC(pImgAdj->Info->ImageEditors->hSelf,
293 hdcMem);
294
295 EndDialog(hDlg,
296 uID);
297
298 return TRUE;
299 }
300
301 case IDCANCEL:
302 {
303 EndDialog(hDlg,
304 uID);
305 return TRUE;
306 }
307 }
308
309 return FALSE;
310 }
311
312
313 INT_PTR CALLBACK
314 ContrastProc(HWND hDlg,
315 UINT message,
316 WPARAM wParam,
317 LPARAM lParam)
318 {
319 static PIMAGEADJUST pImgAdj = NULL;
320
321 switch (message)
322 {
323 case WM_INITDIALOG:
324 {
325 pImgAdj = Cont_OnInitDialog(pImgAdj,
326 hDlg,
327 lParam);
328 if (!pImgAdj)
329 {
330 EndDialog(hDlg, -1);
331 return FALSE;
332 }
333
334 return TRUE;
335 }
336
337 case WM_DRAWITEM:
338 {
339 Cont_OnDrawItem(pImgAdj,
340 lParam);
341 return TRUE;
342 }
343
344 case WM_HSCROLL:
345 {
346 if (LOWORD(wParam) == TB_THUMBTRACK ||
347 LOWORD(wParam) == TB_ENDTRACK)
348 {
349 Cont_OnTrackBar(pImgAdj,
350 hDlg);
351 }
352
353 return TRUE;
354 }
355
356 case WM_COMMAND:
357 {
358 return Cont_OnCommand(pImgAdj,
359 hDlg,
360 LOWORD(wParam));
361 }
362
363 case WM_DESTROY:
364 {
365 if (pImgAdj)
366 {
367 if (pImgAdj->hBitmap)
368 DeleteObject(pImgAdj->hBitmap);
369 if (pImgAdj->hPreviewBitmap)
370 DeleteObject(pImgAdj->hPreviewBitmap);
371
372 HeapFree(ProcessHeap,
373 0,
374 pImgAdj);
375 }
376 }
377 }
378
379 return FALSE;
380 }