Skip to content

Commit 8580f27

Browse files
committed
(#92) Fix application of scale factor when calculating actual image sizes for screen grabs
1 parent 4452a8d commit 8580f27

File tree

1 file changed

+34
-27
lines changed

1 file changed

+34
-27
lines changed

src/win32/screengrab.c

+34-27
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
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

2122
MMBitmapRef 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

Comments
 (0)