From a953162fd484468c019ba7186d9477736d6f25f3 Mon Sep 17 00:00:00 2001 From: X41 Date: Fri, 5 Apr 2019 15:02:45 +0200 Subject: [PATCH 1/3] added gfx_screengrab module that draws the screens top left corner on the led matrix --- src/modules/gfx_screengrab.c | 101 +++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 src/modules/gfx_screengrab.c diff --git a/src/modules/gfx_screengrab.c b/src/modules/gfx_screengrab.c new file mode 100644 index 00000000..3a59e199 --- /dev/null +++ b/src/modules/gfx_screengrab.c @@ -0,0 +1,101 @@ +// Simple screen grabber that draws the upper left corner of the screen to the display +// +// Copyright (c) 2019, X41 +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#include +#include +#include +#include +#include +#include +#include + +#define FPS 30 +#define FRAMETIME (T_SECOND / FPS) +#define FRAMES (TIME_SHORT * FPS) + +static int modno; +static int frame; +static ulong nexttick; + +int width; +int height; + +Display *display; +Window root; +XImage *image; + +unsigned long red_mask; +unsigned long green_mask; +unsigned long blue_mask; +unsigned long pixel; +unsigned char blue; +unsigned char green; +unsigned char red; + +int init(int moduleno, char* argstr) { + if (matrix_getx() < 3) + return 1; + modno = moduleno; + + // grab X11 screen + display = XOpenDisplay(NULL); + root = DefaultRootWindow(display); + XWindowAttributes gwa; + XGetWindowAttributes(display, root, &gwa); + + // use dimensions of matrix + width = matrix_getx(); + height = matrix_gety(); + + // get first frame and set up color masks + image = XGetImage(display, root, 0, 0, width, height, AllPlanes, ZPixmap); + red_mask = image->red_mask; + green_mask = image->green_mask; + blue_mask = image->blue_mask; + return 0; +} + +void reset(void) { + nexttick = udate(); +} + +int draw(int argc, char* argv[]) { + nexttick = udate() + FRAMETIME; + + image = XGetImage(display,root, 0,0 , width,height,AllPlanes, ZPixmap); + + for (int x = 0; x < width; x++){ + for (int y = 0; y < height ; y++){ + pixel = XGetPixel(image,x,y); + + blue = pixel & blue_mask; + green = (pixel & green_mask) >> 8; + red = (pixel & red_mask) >> 16; + + matrix_set(x, y, RGB(red, green, blue)); + } + } + matrix_render(); + + if (frame >= FRAMES) { frame = 0; return 1;} // end drawing + timer_add(nexttick, modno, 0, NULL); + + return 0; +} + +int deinit(void) { + return 0; +} From b67ec242b8aae88a731afc194dd05396ce45fa31 Mon Sep 17 00:00:00 2001 From: Adrian Pistol Date: Sat, 6 Apr 2019 19:13:45 +0200 Subject: [PATCH 2/3] Fix X41's code. --- src/modules/gfx_screengrab.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/modules/gfx_screengrab.c b/src/modules/gfx_screengrab.c index 3a59e199..a0e4c66c 100644 --- a/src/modules/gfx_screengrab.c +++ b/src/modules/gfx_screengrab.c @@ -1,11 +1,11 @@ // Simple screen grabber that draws the upper left corner of the screen to the display // // Copyright (c) 2019, X41 -// +// // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. -// +// // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -65,11 +66,11 @@ int init(int moduleno, char* argstr) { red_mask = image->red_mask; green_mask = image->green_mask; blue_mask = image->blue_mask; - return 0; + return 0; } void reset(void) { - nexttick = udate(); + nexttick = udate(); } int draw(int argc, char* argv[]) { @@ -89,10 +90,11 @@ int draw(int argc, char* argv[]) { } } matrix_render(); + XDestroyImage(image); if (frame >= FRAMES) { frame = 0; return 1;} // end drawing timer_add(nexttick, modno, 0, NULL); - + return 0; } From 3a7104adc7b92227bcb1dbeb7a742f4fb4bd047f Mon Sep 17 00:00:00 2001 From: Adrian Pistol Date: Sat, 6 Apr 2019 19:22:12 +0200 Subject: [PATCH 3/3] gfx_screengrab: Add -lX11. --- src/modules/gfx_screengrab.libs | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/modules/gfx_screengrab.libs diff --git a/src/modules/gfx_screengrab.libs b/src/modules/gfx_screengrab.libs new file mode 100644 index 00000000..e0f67baa --- /dev/null +++ b/src/modules/gfx_screengrab.libs @@ -0,0 +1 @@ +-lX11