22#include "../endian.h"
33#include <stdlib.h> /* malloc() */
44
5- MMRect getScaledRect (MMRect input , HDC imageSource ) {
5+ MMRect getScaledRect (MMRect input )
6+ {
67 // Configure DPI awareness to fetch unscaled display size
78 DPI_AWARENESS_CONTEXT initialDpiAwareness = SetThreadDpiAwarenessContext (DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 );
89 size_t scaledDesktopWidth = (size_t )GetSystemMetrics (SM_CXSCREEN );
@@ -15,7 +16,7 @@ MMRect getScaledRect(MMRect input, HDC imageSource) {
1516 double scaleX = (double )(desktopWidth / (double )scaledDesktopWidth );
1617 double scaleY = (double )(desktopHeight / (double )scaledDesktopHeight );
1718
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 );
1920}
2021
2122MMBitmapRef copyMMBitmapFromDisplayInRect (MMRect rect )
@@ -27,56 +28,62 @@ MMBitmapRef copyMMBitmapFromDisplayInRect(MMRect rect)
2728 BITMAPINFO bi ;
2829
2930 screen = GetWindowDC (NULL ); /* Get entire screen */
30- MMRect scaledRect = getScaledRect (rect , screen );
31+ MMRect scaledRect = getScaledRect (rect );
3132
32- if (screen == NULL ) return NULL ;
33+ if (screen == NULL ) {
34+ return NULL ;
35+ }
3336
3437 /* Initialize bitmap info. */
3538 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 );
4245 bi .bmiHeader .biXPelsPerMeter = 0 ;
4346 bi .bmiHeader .biYPelsPerMeter = 0 ;
4447 bi .bmiHeader .biClrUsed = 0 ;
4548 bi .bmiHeader .biClrImportant = 0 ;
4649
4750 /* 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 );
4952
5053 /* Copy the data into a bitmap struct. */
5154 if ((screenMem = CreateCompatibleDC (screen )) == NULL ||
5255 SelectObject (screenMem , dib ) == NULL ||
5356 !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+
6367 /* Error copying data. */
6468 ReleaseDC (NULL , screen );
6569 DeleteObject (dib );
66- if (screenMem != NULL ) DeleteDC (screenMem );
70+ if (screenMem != NULL ) {
71+ DeleteDC (screenMem );
72+ }
6773
6874 return NULL ;
6975 }
7076
7177 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 );
7783
7884 /* Copy the data to our pixel buffer. */
79- if (bitmap != NULL ) {
85+ if (bitmap != NULL )
86+ {
8087 bitmap -> imageBuffer = malloc (bitmap -> bytewidth * bitmap -> height );
8188 memcpy (bitmap -> imageBuffer , data , bitmap -> bytewidth * bitmap -> height );
8289 }
0 commit comments