From bc291f93003b084bbea81c5dcd2611636945d9ce Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Mon, 7 Dec 2015 14:58:23 +0100 Subject: Add --raw option, making ImageMagick optional MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- .gitignore | 2 ++ DEPENDENCIES | 2 +- README | 3 +++ doc/info/scrotty.texinfo | 14 +++++++++++ doc/man/scrotty.1 | 3 +++ src/scrotty.c | 65 +++++++++++++++++++++++++++++++++++------------- 6 files changed, 71 insertions(+), 18 deletions(-) diff --git a/.gitignore b/.gitignore index c56a9f1..287b59d 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,6 @@ _/ *.dvi *.ps *.pdf +*.png +*.pnm diff --git a/DEPENDENCIES b/DEPENDENCIES index 2ec097d..ce44bd1 100644 --- a/DEPENDENCIES +++ b/DEPENDENCIES @@ -2,7 +2,7 @@ RUNTIME DEPENDENCIES: linux libc - imagemagick + imagemagick (opt-out) BUILD DEPENDENCIES: diff --git a/README b/README index 04de686..0c1cdb8 100644 --- a/README +++ b/README @@ -25,6 +25,9 @@ OPTIONS --copyright Print copyright information. + --raw + Save in PNM rather than in PNG. + --exec CMD Command to run for each saved image. diff --git a/doc/info/scrotty.texinfo b/doc/info/scrotty.texinfo index 6873546..97c1a41 100644 --- a/doc/info/scrotty.texinfo +++ b/doc/info/scrotty.texinfo @@ -93,6 +93,20 @@ Print usage information and exit. Print program name and version and exit. @item --copyright Print copyright information and exit. +@item --raw +Save the images in portable anymap format +(PNM), rather than in Portable Network +Graphics (PNG). If this option is used, +and no arguments for @command{convert} +is specified, @command{convert} will not +be used, and there will be not requirement +to have ImageMagick installed. + +PNM images are highly compressable with +@command{bzip2}. Compressed images are +comparable in size with PNG,@footnote{Usually +a few bytes in difference.} and can in +fact be smaller. @item --exec CMD Run a command for each saved image. @end table diff --git a/doc/man/scrotty.1 b/doc/man/scrotty.1 index fd48006..2339d37 100644 --- a/doc/man/scrotty.1 +++ b/doc/man/scrotty.1 @@ -35,6 +35,9 @@ Print program name and version. .B \-\-copyright Print copyright information. .TP +.B \-\-raw +Save in PNM rather than in PNG. +.TP .BR \-\-exec \ \fICMD\fP Command to run for each saved image. .SH "SPECIAL STRINGS" diff --git a/src/scrotty.c b/src/scrotty.c index 4297923..591db78 100644 --- a/src/scrotty.c +++ b/src/scrotty.c @@ -1,6 +1,6 @@ /** * scrotty — Screenshot program for Linux's TTY - * Copyright © 2014 Mattias Andrée (maandree@member.fsf.org) + * Copyright © 2014, 2015 Mattias Andrée (maandree@member.fsf.org) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -81,12 +81,14 @@ static const char* execname; /** * Arguments for `convert`, * the output file should be printed into `convert_args[2]`. + * `NULL` is `convert` shall not be used. */ -static char** convert_args; +static char** convert_args = NULL; /** - * Create an PNM-file that is sent to `convert` for convertion to a compressed format + * Create an PNM-file that is sent to `convert` for convertion + * to a compressed format, or directly to a file * * @param fbname The framebuffer device * @param width The width of the image @@ -170,7 +172,10 @@ static int save(const char* fbpath, const char* imgpath, long width, long height { int pipe_rw[2]; pid_t pid, reaped; - int saved_errno, status; + int saved_errno, status, fd; + + if (convert_args == NULL) + goto no_convert; /* Create a pipe that for sending data into the `convert` program. */ if (pipe(pipe_rw) < 0) @@ -218,6 +223,21 @@ static int save(const char* fbpath, const char* imgpath, long width, long height /* Return successfully if and only if `convert` did. */ return status == 0 ? 0 : -1; + + + /* `convert` shall not be used: */ + + no_convert: + /* Open output file. */ + if (fd = open(imgpath, O_WRONLY | O_CREAT | O_TRUNC, + S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH), fd == -1) + return -1; + + /* Save image. */ + if (save_pnm(fbpath, width, height, fd) < 0) + return saved_errno = errno, close(fd), errno = saved_errno, -1; + + return 0; } @@ -443,10 +463,13 @@ static int exec_image(char* flatten_args) * Take a screenshot of a framebuffer * * @param fbno The number of the framebuffer + * @param raw Save in PNM rather than in PNG? * @param filepattern The pattern for the filename, `NULL` for default + * @param execpattern The pattern for the command to run to + * process the image, `NULL` for default * @return Zero on success, -1 on error, 1 if the framebuffer does not exist */ -static int save_fb(int fbno, const char* filepattern, const char* execpattern) +static int save_fb(int fbno, int raw, const char* filepattern, const char* execpattern) { char fbpath[PATH_MAX]; char imgpath[PATH_MAX]; @@ -468,11 +491,11 @@ static int save_fb(int fbno, const char* filepattern, const char* execpattern) /* Get output pathname. */ if (filepattern == NULL) { - sprintf(imgpath, "fb%i.png", fbno); + sprintf(imgpath, "fb%i.%s", fbno, (raw ? "pnm" : "png")); if (access(imgpath, F_OK) == 0) for (i = 2;; i++) { - sprintf(imgpath, "fb%i.png.%i", fbno, i); + sprintf(imgpath, "fb%i.%s.%i", fbno, (raw ? "pnm" : "png"), i); if (access(imgpath, F_OK)) break; } @@ -528,6 +551,7 @@ static int print_help(void) p("\t--help Print usage information.\n"); p("\t--version Print program name and version.\n"); p("\t--copyright Print copyright information.\n"); + p("\t--raw Save in PNM rather than in PNG.\n"); p("\t--exec CMD Command to run for each saved image.\n"); p("\n"); p("SPECIAL STRINGS\n"); @@ -578,7 +602,7 @@ static int print_version(void) static int print_copyright(void) { p("scrotty -- Screenshot program for Linux's TTY\n"); - p("Copyright (C) 2014 Mattias Andrée (maandree@member.fsf.org)\n"); + p("Copyright (C) 2014, 2015 Mattias Andrée (maandree@member.fsf.org)\n"); p("\n"); p("This program is free software: you can redistribute it and/or modify\n"); p("it under the terms of the GNU General Public License as published by\n"); @@ -608,7 +632,8 @@ static int print_copyright(void) */ int main(int argc, char* argv[]) { - int fbno, r, i, dash = argc, exec = -1, help = 0, version = 0, copyright = 0, filepattern = -1; + int fbno, r, i, dash = argc, exec = -1, help = 0; + int raw = 0, version = 0, copyright = 0, filepattern = -1; static char convert_args_0[] = "convert"; static char convert_args_1[] = DEVDIR "/stdin"; static char convert_args_2[PATH_MAX]; @@ -621,6 +646,7 @@ int main(int argc, char* argv[]) if (!strcmp(argv[i], "--help")) help = 1; else if (!strcmp(argv[i], "--version")) version = 1; else if (!strcmp(argv[i], "--copyright")) copyright = 1; + else if (!strcmp(argv[i], "--raw")) raw = 1; else if (!strcmp(argv[i], "--exec")) exec = ++i; else if (!strcmp(argv[i], "--")) { @@ -643,18 +669,23 @@ int main(int argc, char* argv[]) if (copyright) return -(print_copyright()); /* Create arguments for `convert`. */ - convert_args = alloca((size_t)(4 + (argc - dash)) * sizeof(char*)); - convert_args[0] = convert_args_0; - convert_args[1] = convert_args_1; - convert_args[2] = convert_args_2; - for (i = dash; i < argc; i++) - convert_args[i - dash + 2] = argv[i]; - convert_args[3 + (argc - dash)] = NULL; + if ((!raw) || (dash < argc)) + { + convert_args = alloca((size_t)(4 + (argc - dash)) * sizeof(char*)); + convert_args[0] = convert_args_0; + convert_args[1] = convert_args_1; + convert_args[2] = convert_args_2; + for (i = dash; i < argc; i++) + convert_args[i - dash + 2] = argv[i]; + convert_args[3 + (argc - dash)] = NULL; + } /* Take a screenshot of each framebuffer. */ for (fbno = 0;; fbno++) { - r = save_fb(fbno, filepattern < 0 ? NULL : argv[filepattern], exec < 0 ? NULL : argv[exec]); + r = save_fb(fbno, raw, + (filepattern < 0 ? NULL : argv[filepattern]), + (exec < 0 ? NULL : argv[exec])); if (r < 0) return perror(execname), 1; if (r > 0) break; } -- cgit v1.2.3-70-g09d2