Introduction
Introduction Statistics Contact Development Disclaimer Help
xscreenshot improvements, thanks sin and frign! - xscreenshot - screen capture …
git clone git://git.codemadness.org/xscreenshot
Log
Files
Refs
README
LICENSE
---
commit d027bcf68df72a92e3b0f6d2b7b97e73e736f4ed
parent 82ccf27dff05c70fe7c0bcde466edb9a36aa0314
Author: Hiltjo Posthuma <[email protected]>
Date: Mon, 28 Jul 2014 15:21:28 +0000
xscreenshot improvements, thanks sin and frign!
- use imagefile tools for conversion, don't depend on libpng anymore
directly.
- use XGetPixel to get pixel values.
- update documentation accordingly.
Signed-off-by: Hiltjo Posthuma <[email protected]>
Diffstat:
M LICENSE | 2 ++
M README | 15 ++++++++++-----
M TODO | 2 --
M config.mk | 2 +-
M xscreenshot.c | 105 ++++++++---------------------…
5 files changed, 38 insertions(+), 88 deletions(-)
---
diff --git a/LICENSE b/LICENSE
@@ -1,6 +1,8 @@
MIT/X Consortium License
(c) 2014 Hiltjo Posthuma <[email protected]>
+(c) 2014 sin <[email protected]>
+(c) 2014 Laslo Hunhold <[email protected]>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
diff --git a/README b/README
@@ -7,22 +7,27 @@ xscreenshot is a simple screenshot utility. It writes image d…
Dependencies
------------
-- libpng
- libX11
+Optional dependencies
+---------------------
+
+- To convert imagefile data you can use if2png from:
+ http://git.2f30.org/imagefile
+
Compile
-------
-run make or:
-
-cc xscreenshot.c -o xscreenshot -lX11 -lpng
+$ make
+# make install
Usage
-----
-xscreenshot [winid] > file.png
+xscreenshot [winid] > file.if
+if2png < file.if > file.png
Known issues
diff --git a/TODO b/TODO
@@ -1,3 +1 @@
-[ ] I might have missed a few cases of color conversion (convertrow_*).
[ ] better multi-monitor support.
-[ ] write a "if" output: http://git.2f30.org/imagefile/.
diff --git a/config.mk b/config.mk
@@ -8,7 +8,7 @@ MANPREFIX = ${PREFIX}/share/man
# includes and libs
INCS =
-LIBS = -lc -lpng -lX11
+LIBS = -lc -lX11
# debug
CFLAGS = -O0 -g -std=c99 -Wall -Wextra -pedantic \
diff --git a/xscreenshot.c b/xscreenshot.c
@@ -8,8 +8,7 @@
#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
-
-#include <png.h>
+#include <arpa/inet.h>
static void
die(const char *s) {
@@ -17,82 +16,6 @@ die(const char *s) {
exit(EXIT_FAILURE);
}
-/* LSBFirst: BGRA -> RGBA */
-static void
-convertrow_lsb(unsigned char *drow, unsigned char *srow, XImage *img) {
- int sx, dx;
-
- for(sx = 0, dx = 0; dx < img->bytes_per_line - 4; sx += 4) {
- drow[dx++] = srow[sx + 2]; /* B -> R */
- drow[dx++] = srow[sx + 1]; /* G -> G */
- drow[dx++] = srow[sx]; /* R -> B */
- if(img->depth == 32)
- drow[dx++] = srow[sx + 3]; /* A -> A */
- else
- drow[dx++] = 255;
- }
-}
-
-/* MSBFirst: ARGB -> RGBA */
-static void
-convertrow_msb(unsigned char *drow, unsigned char *srow, XImage *img) {
- int sx, dx;
-
- for(sx = 0, dx = 0; dx < img->bytes_per_line - 4; sx += 4) {
- drow[dx++] = srow[sx + 1]; /* G -> R */
- drow[dx++] = srow[sx + 2]; /* B -> G */
- drow[dx++] = srow[sx + 3]; /* A -> B */
- if(img->depth == 32)
- drow[dx++] = srow[sx]; /* R -> A */
- else
- drow[dx++] = 255;
- }
-}
-
-static void
-pngstdout(XImage *img)
-{
- png_structp png_struct_p;
- png_infop png_info_p;
- void (*convert)(unsigned char *, unsigned char *, XImage *);
- unsigned char *drow = NULL, *srow;
- int h;
-
- png_struct_p = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NU…
- NULL);
- png_info_p = png_create_info_struct(png_struct_p);
-
- if(!png_struct_p || !png_info_p || setjmp(png_jmpbuf(png_struct_p)))
- die("failed to initialize libpng");
-
- png_init_io(png_struct_p, stdout);
- png_set_IHDR(png_struct_p, png_info_p, img->width, img->height, 8,
- PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE,
- PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
- png_write_info(png_struct_p, png_info_p);
-
- srow = (unsigned char *)img->data;
- drow = calloc(1, img->width * 4); /* output RGBA */
- if(!drow)
- die("Can't calloc");
-
- if(img->byte_order == LSBFirst)
- convert = convertrow_lsb;
- else
- convert = convertrow_msb;
-
- for(h = 0; h < img->height; h++) {
- convert(drow, srow, img);
- srow += img->bytes_per_line;
- png_write_row(png_struct_p, drow);
- }
- png_write_end(png_struct_p, NULL);
-
- free(drow);
- png_free_data(png_struct_p, png_info_p, PNG_FREE_ALL, -1);
- png_destroy_write_struct(&png_struct_p, NULL);
-}
-
static void
usage(void)
{
@@ -108,12 +31,15 @@ main(int argc, char *argv[])
Display *dpy;
Window win;
XWindowAttributes attr;
+ uint32_t tmp, pix;
+ uint8_t rgba[4] = {0, 0, 0, 255};
+ int w, h;
dpy = XOpenDisplay(NULL);
if(!dpy)
die("Can't XOpenDisplay");
- /* win */
+ /* identify window */
if(argc > 1) {
if(strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "-v") == 0)
usage();
@@ -133,7 +59,26 @@ main(int argc, char *argv[])
XCloseDisplay(dpy);
if(!img)
die("Can't XGetImage");
- pngstdout(img);
+
+ /* write header with big endian width and height-values */
+ fprintf(stdout, "imagefile");
+ tmp = htonl(img->width);
+ fwrite(&tmp, sizeof(uint32_t), 1, stdout);
+ tmp = htonl(img->height);
+ fwrite(&tmp, sizeof(uint32_t), 1, stdout);
+
+ /* write pixels */
+ for(h = 0; h < img->height; ++h) {
+ for(w = 0; w < img->width; ++w) {
+ pix = XGetPixel(img, w, h);
+ rgba[0] = (pix & img->red_mask) >> 16;
+ rgba[1] = (pix & img->green_mask) >> 8;
+ rgba[2] = (pix & img->blue_mask) >> 0;
+ if(fwrite(&rgba, sizeof(uint8_t), 4, stdout) != 4)
+ die("fwrite() failed");
+ }
+ }
+
XDestroyImage(img);
return EXIT_SUCCESS;
You are viewing proxied material from codemadness.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.