2
2
#include "../endian.h"
3
3
#include <stdlib.h> /* malloc() */
4
4
5
- MMRect getScaledRect (MMRect input , HDC imageSource ) {
5
+ MMRect getScaledRect (MMRect input )
6
+ {
6
7
// Configure DPI awareness to fetch unscaled display size
7
8
DPI_AWARENESS_CONTEXT initialDpiAwareness = SetThreadDpiAwarenessContext (DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 );
8
9
size_t scaledDesktopWidth = (size_t )GetSystemMetrics (SM_CXSCREEN );
@@ -15,7 +16,7 @@ MMRect getScaledRect(MMRect input, HDC imageSource) {
15
16
double scaleX = (double )(desktopWidth / (double )scaledDesktopWidth );
16
17
double scaleY = (double )(desktopHeight / (double )scaledDesktopHeight );
17
18
18
- return MMRectMake (input .origin .x , input .origin .y , input .size .width * scaleX , input .size .height * scaleY );
19
+ return MMRectMake (input .origin .x , input .origin .y , input .size .width / scaleX , input .size .height / scaleY );
19
20
}
20
21
21
22
MMBitmapRef copyMMBitmapFromDisplayInRect (MMRect rect )
@@ -27,56 +28,62 @@ MMBitmapRef copyMMBitmapFromDisplayInRect(MMRect rect)
27
28
BITMAPINFO bi ;
28
29
29
30
screen = GetWindowDC (NULL ); /* Get entire screen */
30
- MMRect scaledRect = getScaledRect (rect , screen );
31
+ MMRect scaledRect = getScaledRect (rect );
31
32
32
- if (screen == NULL ) return NULL ;
33
+ if (screen == NULL ) {
34
+ return NULL ;
35
+ }
33
36
34
37
/* Initialize bitmap info. */
35
38
bi .bmiHeader .biSize = sizeof (bi .bmiHeader );
36
- bi .bmiHeader .biWidth = (long )scaledRect .size .width ;
37
- bi .bmiHeader .biHeight = - (long )scaledRect .size .height ; /* Non-cartesian, please */
38
- bi .bmiHeader .biPlanes = 1 ;
39
- bi .bmiHeader .biBitCount = 32 ;
40
- bi .bmiHeader .biCompression = BI_RGB ;
41
- bi .bmiHeader .biSizeImage = (DWORD )(4 * scaledRect .size .width * scaledRect .size .height );
39
+ bi .bmiHeader .biWidth = (long )scaledRect .size .width ;
40
+ bi .bmiHeader .biHeight = - (long )scaledRect .size .height ; /* Non-cartesian, please */
41
+ bi .bmiHeader .biPlanes = 1 ;
42
+ bi .bmiHeader .biBitCount = 32 ;
43
+ bi .bmiHeader .biCompression = BI_RGB ;
44
+ bi .bmiHeader .biSizeImage = (DWORD )(4 * scaledRect .size .width * scaledRect .size .height );
42
45
bi .bmiHeader .biXPelsPerMeter = 0 ;
43
46
bi .bmiHeader .biYPelsPerMeter = 0 ;
44
47
bi .bmiHeader .biClrUsed = 0 ;
45
48
bi .bmiHeader .biClrImportant = 0 ;
46
49
47
50
/* Get screen data in display device context. */
48
- dib = CreateDIBSection (screen , & bi , DIB_RGB_COLORS , & data , NULL , 0 );
51
+ dib = CreateDIBSection (screen , & bi , DIB_RGB_COLORS , & data , NULL , 0 );
49
52
50
53
/* Copy the data into a bitmap struct. */
51
54
if ((screenMem = CreateCompatibleDC (screen )) == NULL ||
52
55
SelectObject (screenMem , dib ) == NULL ||
53
56
!BitBlt (screenMem ,
54
- (int )0 ,
55
- (int )0 ,
56
- (int )scaledRect .size .width ,
57
- (int )scaledRect .size .height ,
58
- screen ,
59
- (int )scaledRect .origin .x ,
60
- (int )scaledRect .origin .y ,
61
- SRCCOPY )) {
62
-
57
+ (int )0 ,
58
+ (int )0 ,
59
+ (int )scaledRect .size .width ,
60
+ (int )scaledRect .size .height ,
61
+ screen ,
62
+ (int )scaledRect .origin .x ,
63
+ (int )scaledRect .origin .y ,
64
+ SRCCOPY ))
65
+ {
66
+
63
67
/* Error copying data. */
64
68
ReleaseDC (NULL , screen );
65
69
DeleteObject (dib );
66
- if (screenMem != NULL ) DeleteDC (screenMem );
70
+ if (screenMem != NULL ) {
71
+ DeleteDC (screenMem );
72
+ }
67
73
68
74
return NULL ;
69
75
}
70
76
71
77
bitmap = createMMBitmap (NULL ,
72
- scaledRect .size .width ,
73
- scaledRect .size .height ,
74
- 4 * scaledRect .size .width ,
75
- (uint8_t )bi .bmiHeader .biBitCount ,
76
- 4 );
78
+ scaledRect .size .width ,
79
+ scaledRect .size .height ,
80
+ 4 * scaledRect .size .width ,
81
+ (uint8_t )bi .bmiHeader .biBitCount ,
82
+ 4 );
77
83
78
84
/* Copy the data to our pixel buffer. */
79
- if (bitmap != NULL ) {
85
+ if (bitmap != NULL )
86
+ {
80
87
bitmap -> imageBuffer = malloc (bitmap -> bytewidth * bitmap -> height );
81
88
memcpy (bitmap -> imageBuffer , data , bitmap -> bytewidth * bitmap -> height );
82
89
}
0 commit comments