initial screenshot attempt
[imager-screenshot.git] / scwin32.c
1 #include "imext.h"\r
2 #include <windows.h>\r
3 #include <string.h>\r
4 \r
5 i_img *\r
6 imss_win32(unsigned hwnd_u, int include_decor) {\r
7   HWND hwnd = (HWND)hwnd_u;\r
8   HDC wdc, bmdc;\r
9   RECT rect;\r
10   HBITMAP work_bmp, old_dc_bmp;\r
11   int width, height;\r
12   BITMAPINFO bmi;\r
13   unsigned char *di_bits;\r
14   i_img *result = NULL;\r
15 \r
16   i_clear_error();\r
17 \r
18   if (!hwnd)\r
19     hwnd = GetDesktopWindow();\r
20 \r
21   if (include_decor) {\r
22     wdc = GetWindowDC(hwnd);\r
23     GetWindowRect(hwnd, &rect);\r
24   }\r
25   else {\r
26     wdc = GetDC(hwnd);\r
27     GetClientRect(hwnd, &rect);\r
28   }\r
29   if (!wdc) {\r
30     i_push_error(0, "Cannot get window DC - invalid hwnd?");\r
31     return NULL;\r
32   }\r
33 \r
34   width = rect.right - rect.left;\r
35   height = rect.bottom - rect.top;\r
36   work_bmp = CreateCompatibleBitmap(wdc, width, height);\r
37   bmdc = CreateCompatibleDC(wdc);\r
38   old_dc_bmp = SelectObject(bmdc, work_bmp);\r
39   BitBlt(bmdc, 0, 0, width, height, wdc, 0, 0, SRCCOPY);\r
40 \r
41   /* make a dib */\r
42   memset(&bmi, 0, sizeof(bmi));\r
43   bmi.bmiHeader.biSize = sizeof(bmi);\r
44   bmi.bmiHeader.biWidth = width;\r
45   bmi.bmiHeader.biHeight = -height;\r
46   bmi.bmiHeader.biPlanes = 1;\r
47   bmi.bmiHeader.biBitCount = 32;\r
48   bmi.bmiHeader.biCompression = BI_RGB;\r
49 \r
50   di_bits = mymalloc(4 * width * height);\r
51   if (GetDIBits(bmdc, work_bmp, 0, height, di_bits, &bmi, DIB_RGB_COLORS)) {\r
52     i_color *line = mymalloc(sizeof(i_color) * width);\r
53     i_color *cp;\r
54     int x, y;\r
55     unsigned char *ch_pp = di_bits;\r
56     result = i_img_8_new(width, height, 3);\r
57 \r
58     for (y = 0; y < height; ++y) {\r
59       cp = line;\r
60       for (x = 0; x < width; ++x) {\r
61         cp->rgb.b = *ch_pp++;\r
62         cp->rgb.g = *ch_pp++;\r
63         cp->rgb.r = *ch_pp++;\r
64         ch_pp++;\r
65         cp++;\r
66       }\r
67       i_plin(result, 0, width, y, line);\r
68     }\r
69     myfree(line);\r
70   }\r
71 \r
72   /* clean up */\r
73   myfree(di_bits);\r
74   SelectObject(bmdc, old_dc_bmp);\r
75   DeleteDC(bmdc);\r
76   DeleteObject(work_bmp);\r
77   ReleaseDC(hwnd, wdc);\r
78 \r
79   return result;\r
80 }\r