Skip to content

Commit 2e3ec50

Browse files
committed
(#20) Split screengrab.c
1 parent 2428ff1 commit 2e3ec50

File tree

5 files changed

+154
-151
lines changed

5 files changed

+154
-151
lines changed

CMakeLists.txt

+4-4
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ set(CMAKE_CXX_STANDARD 17)
44
project(libnut)
55

66
# Source
7-
set(SOURCE_FILES "src/main.cc" "src/deadbeef_rand.c" "src/keycode.c" "src/MMBitmap.c" "src/screengrab.c")
7+
set(SOURCE_FILES "src/main.cc" "src/deadbeef_rand.c" "src/keycode.c" "src/MMBitmap.c")
88
if (UNIX AND NOT APPLE)
9-
set(SOURCE_FILES "${SOURCE_FILES}" "src/linux/keypress.c" "src/linux/mouse.c" "src/linux/screen.c" "src/linux/xdisplay.c" "src/linux/highlightwindow.c" "src/linux/window_manager.cc")
9+
set(SOURCE_FILES "${SOURCE_FILES}" "src/linux/keypress.c" "src/linux/mouse.c" "src/linux/screen.c" "src/linux/screengrab.c" "src/linux/xdisplay.c" "src/linux/highlightwindow.c" "src/linux/window_manager.cc")
1010
elseif (UNIX AND APPLE)
11-
set(SOURCE_FILES "${SOURCE_FILES}" "src/macos/keypress.c" "src/macos/mouse.c" "src/macos/screen.c" "src/macos/highlightwindow.m" "src/macos/window_manager.mm")
11+
set(SOURCE_FILES "${SOURCE_FILES}" "src/macos/keypress.c" "src/macos/mouse.c" "src/macos/screen.c" "src/macos/screengrab.c" "src/macos/highlightwindow.m" "src/macos/window_manager.mm")
1212
elseif (WIN32)
13-
set(SOURCE_FILES "${SOURCE_FILES}" "src/win32/keypress.c" "src/win32/mouse.c" "src/win32/screen.c" "src/win32/highlightwindow.c" "src/win32/window_manager.cc")
13+
set(SOURCE_FILES "${SOURCE_FILES}" "src/win32/keypress.c" "src/win32/mouse.c" "src/win32/screen.c" "src/win32/screengrab.c" "src/win32/highlightwindow.c" "src/win32/window_manager.cc")
1414
endif()
1515
add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES} ${CMAKE_JS_SRC})
1616

src/linux/screengrab.c

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#include "../screengrab.h"
2+
#include "../endian.h"
3+
#include <stdlib.h> /* malloc() */
4+
5+
#include <X11/Xlib.h>
6+
#include <X11/Xutil.h>
7+
#include "../xdisplay.h"
8+
9+
MMBitmapRef copyMMBitmapFromDisplayInRect(MMRect rect)
10+
{
11+
MMBitmapRef bitmap;
12+
13+
Display *display = XOpenDisplay(NULL);
14+
XImage *image = XGetImage(display,
15+
XDefaultRootWindow(display),
16+
(int)rect.origin.x,
17+
(int)rect.origin.y,
18+
(unsigned int)rect.size.width,
19+
(unsigned int)rect.size.height,
20+
AllPlanes, ZPixmap);
21+
XCloseDisplay(display);
22+
if (image == NULL) return NULL;
23+
24+
bitmap = createMMBitmap((uint8_t *)image->data,
25+
rect.size.width,
26+
rect.size.height,
27+
(size_t)image->bytes_per_line,
28+
(uint8_t)image->bits_per_pixel,
29+
(uint8_t)image->bits_per_pixel / 8);
30+
image->data = NULL; /* Steal ownership of bitmap data so we don't have to
31+
* copy it. */
32+
XDestroyImage(image);
33+
34+
return bitmap;
35+
}

src/macos/screengrab.c

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#include "../screengrab.h"
2+
#include "../endian.h"
3+
#include <stdlib.h> /* malloc() */
4+
5+
#include <ApplicationServices/ApplicationServices.h>
6+
7+
MMBitmapRef copyMMBitmapFromDisplayInRect(MMRect rect)
8+
{
9+
MMBitmapRef bitmap = NULL;
10+
uint8_t *buffer = NULL;
11+
size_t bufferSize = 0;
12+
13+
CGDirectDisplayID displayID = CGMainDisplayID();
14+
15+
CGImageRef image = CGDisplayCreateImageForRect(displayID,
16+
CGRectMake(rect.origin.x,
17+
rect.origin.y,
18+
rect.size.width,
19+
rect.size.height));
20+
21+
if (!image) { return NULL; }
22+
23+
CFDataRef imageData = CGDataProviderCopyData(CGImageGetDataProvider(image));
24+
25+
if (!imageData) { return NULL; }
26+
27+
bufferSize = CFDataGetLength(imageData);
28+
buffer = malloc(bufferSize);
29+
30+
CFDataGetBytes(imageData, CFRangeMake(0,bufferSize), buffer);
31+
32+
bitmap = createMMBitmap(buffer,
33+
CGImageGetWidth(image),
34+
CGImageGetHeight(image),
35+
CGImageGetBytesPerRow(image),
36+
CGImageGetBitsPerPixel(image),
37+
CGImageGetBitsPerPixel(image) / 8);
38+
39+
CFRelease(imageData);
40+
41+
CGImageRelease(image);
42+
43+
return bitmap;
44+
}

src/screengrab.c

-147
This file was deleted.

src/win32/screengrab.c

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#include "../screengrab.h"
2+
#include "../endian.h"
3+
#include <stdlib.h> /* malloc() */
4+
5+
MMBitmapRef copyMMBitmapFromDisplayInRect(MMRect rect)
6+
{
7+
MMBitmapRef bitmap;
8+
void *data;
9+
HDC screen = NULL, screenMem = NULL;
10+
HBITMAP dib;
11+
BITMAPINFO bi;
12+
13+
/* Initialize bitmap info. */
14+
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 */
17+
bi.bmiHeader.biPlanes = 1;
18+
bi.bmiHeader.biBitCount = 32;
19+
bi.bmiHeader.biCompression = BI_RGB;
20+
bi.bmiHeader.biSizeImage = (DWORD)(4 * rect.size.width * rect.size.height);
21+
bi.bmiHeader.biXPelsPerMeter = 0;
22+
bi.bmiHeader.biYPelsPerMeter = 0;
23+
bi.bmiHeader.biClrUsed = 0;
24+
bi.bmiHeader.biClrImportant = 0;
25+
26+
screen = GetDC(NULL); /* Get entire screen */
27+
if (screen == NULL) return NULL;
28+
29+
/* Get screen data in display device context. */
30+
dib = CreateDIBSection(screen, &bi, DIB_RGB_COLORS, &data, NULL, 0);
31+
32+
/* Copy the data into a bitmap struct. */
33+
if ((screenMem = CreateCompatibleDC(screen)) == NULL ||
34+
SelectObject(screenMem, dib) == NULL ||
35+
!BitBlt(screenMem,
36+
(int)0,
37+
(int)0,
38+
(int)rect.size.width,
39+
(int)rect.size.height,
40+
screen,
41+
rect.origin.x,
42+
rect.origin.y,
43+
SRCCOPY)) {
44+
45+
/* Error copying data. */
46+
ReleaseDC(NULL, screen);
47+
DeleteObject(dib);
48+
if (screenMem != NULL) DeleteDC(screenMem);
49+
50+
return NULL;
51+
}
52+
53+
bitmap = createMMBitmap(NULL,
54+
rect.size.width,
55+
rect.size.height,
56+
4 * rect.size.width,
57+
(uint8_t)bi.bmiHeader.biBitCount,
58+
4);
59+
60+
/* Copy the data to our pixel buffer. */
61+
if (bitmap != NULL) {
62+
bitmap->imageBuffer = malloc(bitmap->bytewidth * bitmap->height);
63+
memcpy(bitmap->imageBuffer, data, bitmap->bytewidth * bitmap->height);
64+
}
65+
66+
ReleaseDC(NULL, screen);
67+
DeleteObject(dib);
68+
DeleteDC(screenMem);
69+
70+
return bitmap;
71+
}

0 commit comments

Comments
 (0)