Skip to content

Commit

Permalink
(#20) Split screengrab.c
Browse files Browse the repository at this point in the history
  • Loading branch information
s1hofmann committed Sep 5, 2020
1 parent 2428ff1 commit 2e3ec50
Show file tree
Hide file tree
Showing 5 changed files with 154 additions and 151 deletions.
8 changes: 4 additions & 4 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ set(CMAKE_CXX_STANDARD 17)
project(libnut)

# Source
set(SOURCE_FILES "src/main.cc" "src/deadbeef_rand.c" "src/keycode.c" "src/MMBitmap.c" "src/screengrab.c")
set(SOURCE_FILES "src/main.cc" "src/deadbeef_rand.c" "src/keycode.c" "src/MMBitmap.c")
if (UNIX AND NOT APPLE)
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")
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")
elseif (UNIX AND APPLE)
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")
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")
elseif (WIN32)
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")
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")
endif()
add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES} ${CMAKE_JS_SRC})

Expand Down
35 changes: 35 additions & 0 deletions src/linux/screengrab.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#include "../screengrab.h"
#include "../endian.h"
#include <stdlib.h> /* malloc() */

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include "../xdisplay.h"

MMBitmapRef copyMMBitmapFromDisplayInRect(MMRect rect)
{
MMBitmapRef bitmap;

Display *display = XOpenDisplay(NULL);
XImage *image = XGetImage(display,
XDefaultRootWindow(display),
(int)rect.origin.x,
(int)rect.origin.y,
(unsigned int)rect.size.width,
(unsigned int)rect.size.height,
AllPlanes, ZPixmap);
XCloseDisplay(display);
if (image == NULL) return NULL;

bitmap = createMMBitmap((uint8_t *)image->data,
rect.size.width,
rect.size.height,
(size_t)image->bytes_per_line,
(uint8_t)image->bits_per_pixel,
(uint8_t)image->bits_per_pixel / 8);
image->data = NULL; /* Steal ownership of bitmap data so we don't have to
* copy it. */
XDestroyImage(image);

return bitmap;
}
44 changes: 44 additions & 0 deletions src/macos/screengrab.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#include "../screengrab.h"
#include "../endian.h"
#include <stdlib.h> /* malloc() */

#include <ApplicationServices/ApplicationServices.h>

MMBitmapRef copyMMBitmapFromDisplayInRect(MMRect rect)
{
MMBitmapRef bitmap = NULL;
uint8_t *buffer = NULL;
size_t bufferSize = 0;

CGDirectDisplayID displayID = CGMainDisplayID();

CGImageRef image = CGDisplayCreateImageForRect(displayID,
CGRectMake(rect.origin.x,
rect.origin.y,
rect.size.width,
rect.size.height));

if (!image) { return NULL; }

CFDataRef imageData = CGDataProviderCopyData(CGImageGetDataProvider(image));

if (!imageData) { return NULL; }

bufferSize = CFDataGetLength(imageData);
buffer = malloc(bufferSize);

CFDataGetBytes(imageData, CFRangeMake(0,bufferSize), buffer);

bitmap = createMMBitmap(buffer,
CGImageGetWidth(image),
CGImageGetHeight(image),
CGImageGetBytesPerRow(image),
CGImageGetBitsPerPixel(image),
CGImageGetBitsPerPixel(image) / 8);

CFRelease(imageData);

CGImageRelease(image);

return bitmap;
}
147 changes: 0 additions & 147 deletions src/screengrab.c

This file was deleted.

71 changes: 71 additions & 0 deletions src/win32/screengrab.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
#include "../screengrab.h"
#include "../endian.h"
#include <stdlib.h> /* malloc() */

MMBitmapRef copyMMBitmapFromDisplayInRect(MMRect rect)
{
MMBitmapRef bitmap;
void *data;
HDC screen = NULL, screenMem = NULL;
HBITMAP dib;
BITMAPINFO bi;

/* 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.biPlanes = 1;
bi.bmiHeader.biBitCount = 32;
bi.bmiHeader.biCompression = BI_RGB;
bi.bmiHeader.biSizeImage = (DWORD)(4 * rect.size.width * rect.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);

/* Copy the data into a bitmap struct. */
if ((screenMem = CreateCompatibleDC(screen)) == NULL ||
SelectObject(screenMem, dib) == NULL ||
!BitBlt(screenMem,
(int)0,
(int)0,
(int)rect.size.width,
(int)rect.size.height,
screen,
rect.origin.x,
rect.origin.y,
SRCCOPY)) {

/* Error copying data. */
ReleaseDC(NULL, screen);
DeleteObject(dib);
if (screenMem != NULL) DeleteDC(screenMem);

return NULL;
}

bitmap = createMMBitmap(NULL,
rect.size.width,
rect.size.height,
4 * rect.size.width,
(uint8_t)bi.bmiHeader.biBitCount,
4);

/* Copy the data to our pixel buffer. */
if (bitmap != NULL) {
bitmap->imageBuffer = malloc(bitmap->bytewidth * bitmap->height);
memcpy(bitmap->imageBuffer, data, bitmap->bytewidth * bitmap->height);
}

ReleaseDC(NULL, screen);
DeleteObject(dib);
DeleteDC(screenMem);

return bitmap;
}

0 comments on commit 2e3ec50

Please sign in to comment.