Skip to content

Commit 5fef58c

Browse files
authored
Merge pull request #59 from nut-tree/feature/183/windows_high_dpi
(nut-tree/nut.js/183) Determine scale factor ifor high DPI displays i…
2 parents bed9851 + 7af9574 commit 5fef58c

File tree

1 file changed

+31
-13
lines changed

1 file changed

+31
-13
lines changed

Diff for: src/win32/screengrab.c

+31-13
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,22 @@
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+
521
MMBitmapRef 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

Comments
 (0)