22#include "../endian.h"
33#include <stdlib.h> /* malloc() */
44
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+
521MMBitmapRef copyMMBitmapFromDisplayInRect (MMRect rect )
622{
723 MMBitmapRef bitmap ;
@@ -10,22 +26,24 @@ MMBitmapRef copyMMBitmapFromDisplayInRect(MMRect rect)
1026 HBITMAP dib ;
1127 BITMAPINFO bi ;
1228
29+ screen = GetWindowDC (NULL ); /* Get entire screen */
30+ MMRect scaledRect = getScaledRect (rect , screen );
31+
32+ if (screen == NULL ) return NULL ;
33+
1334 /* Initialize bitmap info. */
1435 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 */
1738 bi .bmiHeader .biPlanes = 1 ;
1839 bi .bmiHeader .biBitCount = 32 ;
1940 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 );
2142 bi .bmiHeader .biXPelsPerMeter = 0 ;
2243 bi .bmiHeader .biYPelsPerMeter = 0 ;
2344 bi .bmiHeader .biClrUsed = 0 ;
2445 bi .bmiHeader .biClrImportant = 0 ;
2546
26- screen = GetDC (NULL ); /* Get entire screen */
27- if (screen == NULL ) return NULL ;
28-
2947 /* Get screen data in display device context. */
3048 dib = CreateDIBSection (screen , & bi , DIB_RGB_COLORS , & data , NULL , 0 );
3149
@@ -35,11 +53,11 @@ MMBitmapRef copyMMBitmapFromDisplayInRect(MMRect rect)
3553 !BitBlt (screenMem ,
3654 (int )0 ,
3755 (int )0 ,
38- (int )rect .size .width ,
39- (int )rect .size .height ,
56+ (int )scaledRect .size .width ,
57+ (int )scaledRect .size .height ,
4058 screen ,
41- (int )rect .origin .x ,
42- (int )rect .origin .y ,
59+ (int )scaledRect .origin .x ,
60+ (int )scaledRect .origin .y ,
4361 SRCCOPY )) {
4462
4563 /* Error copying data. */
@@ -51,9 +69,9 @@ MMBitmapRef copyMMBitmapFromDisplayInRect(MMRect rect)
5169 }
5270
5371 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 ,
5775 (uint8_t )bi .bmiHeader .biBitCount ,
5876 4 );
5977
0 commit comments