diff --git a/src/win32/screengrab.c b/src/win32/screengrab.c index 92ca250..049a0fa 100644 --- a/src/win32/screengrab.c +++ b/src/win32/screengrab.c @@ -2,6 +2,22 @@ #include "../endian.h" #include /* malloc() */ +MMRect getScaledRect(MMRect input, HDC imageSource) { + BITMAP structBitmapHeader; + memset( &structBitmapHeader, 0, sizeof(BITMAP) ); + + HGDIOBJ hBitmap = GetCurrentObject(imageSource, OBJ_BITMAP); + GetObject(hBitmap, sizeof(BITMAP), &structBitmapHeader); + + size_t desktopWidth = (size_t)GetSystemMetrics(SM_CXSCREEN); + size_t desktopHeight = (size_t)GetSystemMetrics(SM_CYSCREEN); + + double scaleX = (double)(structBitmapHeader.bmWidth / desktopWidth); + double scaleY = (double)(structBitmapHeader.bmHeight / desktopHeight); + + return MMRectMake(input.origin.x, input.origin.y, input.size.width * scaleX, input.size.height * scaleY); +} + MMBitmapRef copyMMBitmapFromDisplayInRect(MMRect rect) { MMBitmapRef bitmap; @@ -10,22 +26,24 @@ MMBitmapRef copyMMBitmapFromDisplayInRect(MMRect rect) HBITMAP dib; BITMAPINFO bi; + screen = GetWindowDC(NULL); /* Get entire screen */ + MMRect scaledRect = getScaledRect(rect, screen); + + if (screen == NULL) return NULL; + /* Initialize bitmap info. */ bi.bmiHeader.biSize = sizeof(bi.bmiHeader); - bi.bmiHeader.biWidth = (long)rect.size.width; - bi.bmiHeader.biHeight = -(long)rect.size.height; /* Non-cartesian, please */ + bi.bmiHeader.biWidth = (long)scaledRect.size.width; + bi.bmiHeader.biHeight = -(long)scaledRect.size.height; /* Non-cartesian, please */ bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biBitCount = 32; bi.bmiHeader.biCompression = BI_RGB; - bi.bmiHeader.biSizeImage = (DWORD)(4 * rect.size.width * rect.size.height); + bi.bmiHeader.biSizeImage = (DWORD)(4 * scaledRect.size.width * scaledRect.size.height); bi.bmiHeader.biXPelsPerMeter = 0; bi.bmiHeader.biYPelsPerMeter = 0; bi.bmiHeader.biClrUsed = 0; bi.bmiHeader.biClrImportant = 0; - screen = GetDC(NULL); /* Get entire screen */ - if (screen == NULL) return NULL; - /* Get screen data in display device context. */ dib = CreateDIBSection(screen, &bi, DIB_RGB_COLORS, &data, NULL, 0); @@ -35,11 +53,11 @@ MMBitmapRef copyMMBitmapFromDisplayInRect(MMRect rect) !BitBlt(screenMem, (int)0, (int)0, - (int)rect.size.width, - (int)rect.size.height, + (int)scaledRect.size.width, + (int)scaledRect.size.height, screen, - (int)rect.origin.x, - (int)rect.origin.y, + (int)scaledRect.origin.x, + (int)scaledRect.origin.y, SRCCOPY)) { /* Error copying data. */ @@ -51,9 +69,9 @@ MMBitmapRef copyMMBitmapFromDisplayInRect(MMRect rect) } bitmap = createMMBitmap(NULL, - rect.size.width, - rect.size.height, - 4 * rect.size.width, + scaledRect.size.width, + scaledRect.size.height, + 4 * scaledRect.size.width, (uint8_t)bi.bmiHeader.biBitCount, 4);