2
2
#include "../endian.h"
3
3
#include <stdlib.h> /* malloc() */
4
4
5
+ MMRect getScaledRect (MMRect input , HDC imageSource ) {
6
+ BITMAP structBitmapHeader ;
7
+ memset ( & structBitmapHeader , 0 , sizeof (BITMAP ) );
8
+
9
+ HGDIOBJ hBitmap = GetCurrentObject (imageSource , OBJ_BITMAP );
10
+ GetObject (hBitmap , sizeof (BITMAP ), & structBitmapHeader );
11
+
12
+ size_t desktopWidth = (size_t )GetSystemMetrics (SM_CXSCREEN );
13
+ size_t desktopHeight = (size_t )GetSystemMetrics (SM_CYSCREEN );
14
+
15
+ double scaleX = (double )(structBitmapHeader .bmWidth / desktopWidth );
16
+ double scaleY = (double )(structBitmapHeader .bmHeight / desktopHeight );
17
+
18
+ return MMRectMake (input .origin .x , input .origin .y , input .size .width * scaleX , input .size .height * scaleY );
19
+ }
20
+
5
21
MMBitmapRef copyMMBitmapFromDisplayInRect (MMRect rect )
6
22
{
7
23
MMBitmapRef bitmap ;
@@ -10,22 +26,24 @@ MMBitmapRef copyMMBitmapFromDisplayInRect(MMRect rect)
10
26
HBITMAP dib ;
11
27
BITMAPINFO bi ;
12
28
29
+ screen = GetWindowDC (NULL ); /* Get entire screen */
30
+ MMRect scaledRect = getScaledRect (rect , screen );
31
+
32
+ if (screen == NULL ) return NULL ;
33
+
13
34
/* Initialize bitmap info. */
14
35
bi .bmiHeader .biSize = sizeof (bi .bmiHeader );
15
- bi .bmiHeader .biWidth = (long )rect .size .width ;
16
- bi .bmiHeader .biHeight = - (long )rect .size .height ; /* Non-cartesian, please */
36
+ bi .bmiHeader .biWidth = (long )scaledRect .size .width ;
37
+ bi .bmiHeader .biHeight = - (long )scaledRect .size .height ; /* Non-cartesian, please */
17
38
bi .bmiHeader .biPlanes = 1 ;
18
39
bi .bmiHeader .biBitCount = 32 ;
19
40
bi .bmiHeader .biCompression = BI_RGB ;
20
- bi .bmiHeader .biSizeImage = (DWORD )(4 * rect .size .width * rect .size .height );
41
+ bi .bmiHeader .biSizeImage = (DWORD )(4 * scaledRect .size .width * scaledRect .size .height );
21
42
bi .bmiHeader .biXPelsPerMeter = 0 ;
22
43
bi .bmiHeader .biYPelsPerMeter = 0 ;
23
44
bi .bmiHeader .biClrUsed = 0 ;
24
45
bi .bmiHeader .biClrImportant = 0 ;
25
46
26
- screen = GetDC (NULL ); /* Get entire screen */
27
- if (screen == NULL ) return NULL ;
28
-
29
47
/* Get screen data in display device context. */
30
48
dib = CreateDIBSection (screen , & bi , DIB_RGB_COLORS , & data , NULL , 0 );
31
49
@@ -35,11 +53,11 @@ MMBitmapRef copyMMBitmapFromDisplayInRect(MMRect rect)
35
53
!BitBlt (screenMem ,
36
54
(int )0 ,
37
55
(int )0 ,
38
- (int )rect .size .width ,
39
- (int )rect .size .height ,
56
+ (int )scaledRect .size .width ,
57
+ (int )scaledRect .size .height ,
40
58
screen ,
41
- (int )rect .origin .x ,
42
- (int )rect .origin .y ,
59
+ (int )scaledRect .origin .x ,
60
+ (int )scaledRect .origin .y ,
43
61
SRCCOPY )) {
44
62
45
63
/* Error copying data. */
@@ -51,9 +69,9 @@ MMBitmapRef copyMMBitmapFromDisplayInRect(MMRect rect)
51
69
}
52
70
53
71
bitmap = createMMBitmap (NULL ,
54
- rect .size .width ,
55
- rect .size .height ,
56
- 4 * rect .size .width ,
72
+ scaledRect .size .width ,
73
+ scaledRect .size .height ,
74
+ 4 * scaledRect .size .width ,
57
75
(uint8_t )bi .bmiHeader .biBitCount ,
58
76
4 );
59
77
0 commit comments