ReactOS 0.4.15-dev-7958-gcd0bb1a
stretchblt.cpp
Go to the documentation of this file.
1
2// ------------------------------------------------------------------
3// Windows 2000 Graphics API Black Book
4// Chapter 1 - Listing 1.5 (StretchBlt Zooming Demo)
5//
6// Created by Damon Chandler <dmc27@ee.cornell.edu>
7// Updates can be downloaded at: <www.coriolis.com>
8//
9// Please do not hesistate to e-mail me at dmc27@ee.cornell.edu
10// if you have any questions about this code.
11// ------------------------------------------------------------------
12
13// Modified by Aleksey Bragin (aleksey at studiocerebral.com)
14// to support non-uniform scaling, and output via sretchdibits
15// (type something in the command line to invoke this mode,
16// in future it will be source BPP)
17
18//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
19#include <windows.h>
20#include <stdio.h>
21//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
22
23
26const int ID_LISTBOX = 101;
27const int ID_LISTBOX2 = 102;
28BOOL useDIBits=FALSE; // How to display the image - via StretchDIBits
29
33const char* WndClassName = "GMainWnd";
35 LPARAM LParam);
36
37
38int APIENTRY WinMain(HINSTANCE HInstance, HINSTANCE HPrevInstance,
39 LPTSTR lpCmdLine, int nCmdShow)
40{
41 HInst = HInstance;
42 HPrevInst = HPrevInstance;
43 cmdline = lpCmdLine;
44
45 WNDCLASS wc;
46 memset(&wc, 0, sizeof(WNDCLASS));
47
50 wc.hInstance = HInstance;
52 wc.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_BTNFACE + 1);
54
55 if (RegisterClass(&wc))
56 {
57 HWND HWnd =
58 CreateWindow(WndClassName, TEXT("StretchBlt NonUniform Zooming Demo"),
61 0, 0, 675, 560,
62 NULL, NULL, HInst, NULL);
63
64 if (HWnd)
65 {
66 HListBox =
67 CreateWindowEx(WS_EX_CLIENTEDGE, "LISTBOX", "",
69 530, 5, 130, 150, HWnd,
70 reinterpret_cast<HMENU>(ID_LISTBOX),
71 HInst, NULL);
72 VListBox =
73 CreateWindowEx(WS_EX_CLIENTEDGE, "LISTBOX", "",
75 530, 5+170, 130, 150, HWnd,
76 reinterpret_cast<HMENU>(ID_LISTBOX2),
77 HInst, NULL);
78
79 if (HListBox && VListBox)
80 {
81// horizontal zoom
83 reinterpret_cast<LPARAM>("Zoom 25%"));
85 reinterpret_cast<LPARAM>("Zoom 50%"));
87 reinterpret_cast<LPARAM>("Zoom 75%"));
89 reinterpret_cast<LPARAM>("Zoom 100%"));
91 reinterpret_cast<LPARAM>("Zoom 125%"));
93 reinterpret_cast<LPARAM>("Zoom 150%"));
95 reinterpret_cast<LPARAM>("Zoom 200%"));
97 reinterpret_cast<LPARAM>("Zoom 300%"));
98// vertical zoom
100 reinterpret_cast<LPARAM>("Zoom 25%"));
102 reinterpret_cast<LPARAM>("Zoom 50%"));
104 reinterpret_cast<LPARAM>("Zoom 75%"));
106 reinterpret_cast<LPARAM>("Zoom 100%"));
108 reinterpret_cast<LPARAM>("Zoom 125%"));
110 reinterpret_cast<LPARAM>("Zoom 150%"));
112 reinterpret_cast<LPARAM>("Zoom 200%"));
114 reinterpret_cast<LPARAM>("Zoom 300%"));
115
116 }
117
118 ShowWindow(HWnd, nCmdShow);
119 UpdateWindow(HWnd);
120
121 MSG msg;
122 while (GetMessage(&msg, NULL, 0, 0))
123 {
126 }
127 }
128 }
129 return 0;
130}
131//------------------------------------------------------------------
132
133
134// image related
137char *bbits = NULL; // bitmap bits
138const char* filename = "LENA.BMP";
141
142// zooming related
143float zoom_factor_h = 0.5;
144float zoom_factor_v = 0.5;
145RECT RDest = {5, 5, 0, 0};
148
150 LPARAM LParam)
151{
152 switch (Msg)
153 {
154 case WM_CREATE:
155 {
156 // check commandline
157 if (strlen(cmdline) != 0)
158 {
159
160 useDIBits = TRUE;
161 }
162 else
164
165 // create a memory DC
167 if (HMemDC)
168 {
169 // load a bitmap from file
170 HBITMAP HBmp =
171 static_cast<HBITMAP>(
173 0, 0, LR_LOADFROMFILE)
174 );
175 if (HBmp)
176 {
177 // extract dimensions of the bitmap
178 GetObject(HBmp, sizeof(BITMAP), &bmp);
179
180 // fill the BITMAPINFO stucture for further use by StretchDIBits
182 bmInfo.bmiHeader.biWidth = bmp.bmWidth;
183 bmInfo.bmiHeader.biHeight = bmp.bmHeight;
184 bmInfo.bmiHeader.biPlanes = 1;//bmp.bmPlanes;
185 bmInfo.bmiHeader.biBitCount = bmp.bmBitsPixel;
191
192 // associate the bitmap with the memory DC
193 HOldBmp = static_cast<HBITMAP>(
195 );
196
197 if (useDIBits)
198 {
199 bbits = new char[bmp.bmHeight*bmp.bmWidthBytes*(bmp.bmBitsPixel / 8)];
200 //GetDIBits(HMemDC, HBmp, 0, bmp.bmHeight, bbits, &bmInfo, DIB_RGB_COLORS);
201
202 // Here goes a temp hack, since GetDIBits doesn't exist in ReactOS yet
203 FILE *f = fopen(filename, "rb");
204 BITMAPFILEHEADER bmpHeader;
205
206 fread(&bmpHeader, sizeof(BITMAPFILEHEADER), 1, f);
207 fread(&bmInfo, sizeof(BITMAPINFO), 1, f);
208 fseek(f, bmpHeader.bfOffBits, SEEK_SET);
209 fread(bbits, bmp.bmHeight*bmp.bmWidthBytes*(bmp.bmBitsPixel / 8), 1, f);
210
211 fclose(f);
212 }
213 }
214 }
215 }
216 case WM_COMMAND:
217 {
218 if (WParam == MAKEWPARAM(ID_LISTBOX, LBN_SELCHANGE) ||
220 {
221 switch (SNDMSG(HListBox, LB_GETCURSEL, 0, 0))
222 {
223 case ID_ZOOM25: zoom_factor_h = 0.25; break;
224 case ID_ZOOM50: zoom_factor_h = 0.50; break;
225 case ID_ZOOM75: zoom_factor_h = 0.75; break;
226 case ID_ZOOM100: zoom_factor_h = 1.00; break;
227 case ID_ZOOM125: zoom_factor_h = 1.25; break;
228 case ID_ZOOM150: zoom_factor_h = 1.50; break;
229 case ID_ZOOM200: zoom_factor_h = 2.00; break;
230 case ID_ZOOM300: zoom_factor_h = 3.00; break;
231 }
232
233 switch (SNDMSG(VListBox, LB_GETCURSEL, 0, 0))
234 {
235 case ID_ZOOM25: zoom_factor_v = 0.25; break;
236 case ID_ZOOM50: zoom_factor_v = 0.50; break;
237 case ID_ZOOM75: zoom_factor_v = 0.75; break;
238 case ID_ZOOM100: zoom_factor_v = 1.00; break;
239 case ID_ZOOM125: zoom_factor_v = 1.25; break;
240 case ID_ZOOM150: zoom_factor_v = 1.50; break;
241 case ID_ZOOM200: zoom_factor_v = 2.00; break;
242 case ID_ZOOM300: zoom_factor_v = 3.00; break;
243 }
244
245 // calculate the new width and height
246 const int new_width =
247 static_cast<int>(zoom_factor_h * bmp.bmWidth);
248 const int new_height =
249 static_cast<int>(zoom_factor_v * bmp.bmHeight);
250
251 // is zooming in?
252 bool zoom_in = (new_width > RDest.right - RDest.left);
253
254 // caculate the area that needs to be updated
255 RECT RUpdate = {
257 RDest.left + max(new_width, RDest.right - RDest.left),
258 RDest.top + max(new_height, RDest.bottom - RDest.top)
259 };
260
261 // adjust the dimenstions of the
262 // destination rectangle
263 RDest.right = RDest.left + new_width;
264 RDest.bottom = RDest.top + new_height;
265
266 // create an update region from the XOR combination
267 // of the update and destination rectangles
268 HRGN HUpdateRgn = CreateRectRgnIndirect(&RUpdate);
269 HRGN HDestRgn = CreateRectRgnIndirect(&RDest);
270 int result =
271 CombineRgn(HUpdateRgn, HUpdateRgn, HDestRgn, RGN_XOR);
272
273 // incite a repaint
274 if (result != NULLREGION && result != ERROR)
275 {
276 InvalidateRgn(HWnd, HUpdateRgn, true);
278 }
279 else if (result == NULLREGION)
280 {
281 InvalidateRect(HWnd, &RUpdate, zoom_in ? false : true);
282 }
283
284 // clean up
285 DeleteObject(HUpdateRgn);
286 DeleteObject(HDestRgn);
287 }
288 break;
289 }
290 case WM_PAINT:
291 {
292 PAINTSTRUCT ps;
293 const HDC Hdc = BeginPaint(HWnd, &ps);
294#if 0
295 try
296#endif
297 {
298 //
299 // TODO: add palette support (see Chapter 9)...
300 //
301 if (useDIBits)
302 {
303 if (RDest.right - RDest.left > 0)
304 {
305 if (zoom_factor_h < 1.0 || zoom_factor_v < 1.0)
306 {
308 }
309
310 // render the zoomed image
314 0, 0,
315 bmp.bmWidth, bmp.bmHeight,
316 bbits, &bmInfo,
318 SRCCOPY);
319 }
320 }
321 else
322 {
323 if (RDest.right - RDest.left > 0)
324 {
325
326 // use BitBlt when not zooming
327 if (zoom_factor_h == 1.0 && zoom_factor_v == 1.0)
328 {
329 BitBlt(Hdc, RDest.left, RDest.top,
332 HMemDC, 0, 0,
333 SRCCOPY);
334 }
335 else
336 {
337 if (zoom_factor_h < 1.0 || zoom_factor_v < 1.0)
338 {
340 }
341
342 // render the zoomed image
346 HMemDC, 0, 0,
347 bmp.bmWidth, bmp.bmHeight,
348 SRCCOPY);
349 }
350 }
351 }
352 }
353#if 0
354 catch (...)
355#endif
356 {
357 EndPaint(HWnd, &ps);
358 }
359 EndPaint(HWnd, &ps);
360 break;
361 }
362 case WM_DESTROY:
363 {
364 // clean up
367
368 if (bbits)
369 delete[] bbits;
370
372 return 0;
373 }
374 }
375 return DefWindowProc(HWnd, Msg, WParam, LParam);
376}
377//------------------------------------------------------------------
378
379
380
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
#define msg(x)
Definition: auth_time.c:54
struct @1632 Msg[]
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define APIENTRY
Definition: api.h:79
#define CALLBACK
Definition: compat.h:35
static VOID BitBlt(_In_ ULONG Left, _In_ ULONG Top, _In_ ULONG Width, _In_ ULONG Height, _In_reads_bytes_(Delta *Height) PUCHAR Buffer, _In_ ULONG BitsPerPixel, _In_ ULONG Delta)
Definition: common.c:57
#define BI_RGB
Definition: precomp.h:56
#define ERROR(name)
Definition: error_private.h:53
unsigned int BOOL
Definition: ntddk_ex.h:94
pKey DeleteObject()
GLfloat f
Definition: glext.h:7540
GLuint64EXT * result
Definition: glext.h:11304
_Check_return_opt_ _CRTIMP size_t __cdecl fread(_Out_writes_bytes_(_ElementSize *_Count) void *_DstBuf, _In_ size_t _ElementSize, _In_ size_t _Count, _Inout_ FILE *_File)
_Check_return_ _CRTIMP FILE *__cdecl fopen(_In_z_ const char *_Filename, _In_z_ const char *_Mode)
_Check_return_opt_ _CRTIMP int __cdecl fseek(_Inout_ FILE *_File, _In_ long _Offset, _In_ int _Origin)
_Check_return_opt_ _CRTIMP int __cdecl fclose(_Inout_ FILE *_File)
const char * filename
Definition: ioapi.h:137
#define SEEK_SET
Definition: jmemansi.c:26
#define TEXT(s)
Definition: k32.h:26
static HBITMAP
Definition: button.c:44
static HDC
Definition: imagelist.c:92
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
unsigned int UINT
Definition: ndis.h:50
#define WS_CHILD
Definition: pedump.c:617
#define WS_CAPTION
Definition: pedump.c:624
#define WS_OVERLAPPEDWINDOW
Definition: pedump.c:637
#define WS_VISIBLE
Definition: pedump.c:620
#define WS_CLIPSIBLINGS
Definition: pedump.c:618
#define LBS_NOTIFY
Definition: pedump.c:678
#define DefWindowProc
Definition: ros2win.h:31
#define memset(x, y, z)
Definition: compat.h:39
@ ID_ZOOM300
Definition: stretchblt.cpp:147
@ ID_ZOOM75
Definition: stretchblt.cpp:146
@ ID_ZOOM50
Definition: stretchblt.cpp:146
@ ID_ZOOM25
Definition: stretchblt.cpp:146
@ ID_ZOOM100
Definition: stretchblt.cpp:146
@ ID_ZOOM200
Definition: stretchblt.cpp:147
@ ID_ZOOM125
Definition: stretchblt.cpp:147
@ ID_ZOOM150
Definition: stretchblt.cpp:147
RECT RDest
Definition: stretchblt.cpp:145
const int ID_LISTBOX
Definition: stretchblt.cpp:26
const char * WndClassName
Definition: stretchblt.cpp:33
HWND HListBox
Definition: stretchblt.cpp:24
BITMAP bmp
Definition: stretchblt.cpp:135
HINSTANCE HPrevInst
Definition: stretchblt.cpp:31
HDC HMemDC
Definition: stretchblt.cpp:139
BOOL useDIBits
Definition: stretchblt.cpp:28
int APIENTRY WinMain(HINSTANCE HInstance, HINSTANCE HPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
Definition: stretchblt.cpp:38
float zoom_factor_v
Definition: stretchblt.cpp:144
BITMAPINFO bmInfo
Definition: stretchblt.cpp:136
const int ID_LISTBOX2
Definition: stretchblt.cpp:27
float zoom_factor_h
Definition: stretchblt.cpp:143
LRESULT CALLBACK MainWndProc(HWND HWnd, UINT Msg, WPARAM WParam, LPARAM LParam)
Definition: stretchblt.cpp:149
HWND VListBox
Definition: stretchblt.cpp:25
TCHAR * cmdline
Definition: stretchblt.cpp:32
HINSTANCE HInst
Definition: stretchblt.cpp:30
char * bbits
Definition: stretchblt.cpp:137
HBITMAP HOldBmp
Definition: stretchblt.cpp:140
Definition: bl.h:1331
HBRUSH hbrBackground
Definition: winuser.h:3170
HINSTANCE hInstance
Definition: winuser.h:3167
HCURSOR hCursor
Definition: winuser.h:3169
UINT style
Definition: winuser.h:3163
LPCSTR lpszClassName
Definition: winuser.h:3172
WNDPROC lpfnWndProc
Definition: winuser.h:3164
ULONG biClrImportant
Definition: precomp.h:52
USHORT biBitCount
Definition: precomp.h:46
ULONG biCompression
Definition: precomp.h:47
LONG biXPelsPerMeter
Definition: precomp.h:49
BITMAPINFOHEADER bmiHeader
Definition: wingdi.h:1476
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
#define max(a, b)
Definition: svc.c:63
#define SNDMSG
Definition: treelist.h:31
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
#define DIB_RGB_COLORS
Definition: wingdi.h:367
#define COLORONCOLOR
Definition: wingdi.h:954
#define NULLREGION
Definition: wingdi.h:361
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1539
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
int WINAPI CombineRgn(_In_opt_ HRGN hrgnDest, _In_opt_ HRGN hrgnSrc1, _In_opt_ HRGN hrgnSrc2, _In_ int fnCombineMode)
BOOL WINAPI StretchBlt(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int, _In_opt_ HDC, _In_ int, _In_ int, _In_ int, _In_ int, _In_ DWORD)
#define SRCCOPY
Definition: wingdi.h:333
#define RGN_XOR
Definition: wingdi.h:360
#define GetObject
Definition: wingdi.h:4468
HRGN WINAPI CreateRectRgnIndirect(_In_ LPCRECT)
BOOL WINAPI DeleteDC(_In_ HDC)
int WINAPI SetStretchBltMode(_In_ HDC, _In_ int)
Definition: dc.c:1366
int WINAPI StretchDIBits(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int, _In_ int, _In_ int, _In_ int, _In_ int, _In_opt_ const VOID *, _In_ const BITMAPINFO *, _In_ UINT, _In_ DWORD)
#define WM_PAINT
Definition: winuser.h:1620
#define CS_VREDRAW
Definition: winuser.h:658
#define CreateWindowEx
Definition: winuser.h:5755
#define MAKEWPARAM(l, h)
Definition: winuser.h:4009
BOOL WINAPI RedrawWindow(_In_opt_ HWND, _In_opt_ LPCRECT, _In_opt_ HRGN, _In_ UINT)
#define IMAGE_BITMAP
Definition: winuser.h:211
BOOL WINAPI TranslateMessage(_In_ const MSG *)
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
#define LR_LOADFROMFILE
Definition: winuser.h:1092
#define WM_CREATE
Definition: winuser.h:1608
__analysis_noreturn void WINAPI PostQuitMessage(_In_ int)
#define WM_COMMAND
Definition: winuser.h:1740
#define CS_HREDRAW
Definition: winuser.h:653
#define IDC_ARROW
Definition: winuser.h:687
#define CS_DBLCLKS
Definition: winuser.h:651
#define LB_ADDSTRING
Definition: winuser.h:2031
#define CreateWindow
Definition: winuser.h:5754
#define GetMessage
Definition: winuser.h:5790
BOOL WINAPI EndPaint(_In_ HWND, _In_ const PAINTSTRUCT *)
BOOL WINAPI UpdateWindow(_In_ HWND)
#define LoadCursor
Definition: winuser.h:5812
BOOL WINAPI InvalidateRgn(_In_ HWND, _In_opt_ HRGN, _In_ BOOL)
#define LoadImage
Definition: winuser.h:5815
#define LBN_SELCHANGE
Definition: winuser.h:2075
#define RegisterClass
Definition: winuser.h:5836
#define WM_DESTROY
Definition: winuser.h:1609
#define WS_EX_CLIENTEDGE
Definition: winuser.h:384
#define DispatchMessage
Definition: winuser.h:5765
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
HDC WINAPI BeginPaint(_In_ HWND, _Out_ LPPAINTSTRUCT)
#define LB_GETCURSEL
Definition: winuser.h:2039
#define RDW_NOERASE
Definition: winuser.h:1215
#define RDW_INVALIDATE
Definition: winuser.h:1214
#define COLOR_BTNFACE
Definition: winuser.h:928
HBITMAP HBmp
char TCHAR
Definition: xmlstorage.h:189
CHAR * LPTSTR
Definition: xmlstorage.h:192