farbfeld

suckless image format with conversion tools
git clone git://git.suckless.org/farbfeld
Log | Files | Refs | README | LICENSE

commit 3d80d7237d18bdbf53e327a576b52b35b36af3ad
parent e9db1f49b75b183c8aeda321ca54aff5b436a4f6
Author: Mattias Andrée <maandree@kth.se>
Date:   Mon,  9 Jan 2017 05:23:27 +0100

Add ff2pam(1): convert farbfeld to 16-bit RGBA Portable Arbitrary Map

Laslo: Minor changes

Signed-off-by: Mattias Andrée <maandree@kth.se>

Diffstat:
MMakefile | 2+-
Aff2pam.1 | 41+++++++++++++++++++++++++++++++++++++++++
Aff2pam.c | 74++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 116 insertions(+), 1 deletion(-)

diff --git a/Makefile b/Makefile @@ -2,7 +2,7 @@ # See LICENSE file for copyright and license details include config.mk -BIN = png2ff ff2png jpg2ff ff2jpg ff2ppm +BIN = png2ff ff2png jpg2ff ff2jpg ff2pam ff2ppm SCRIPTS = 2ff SRC = ${BIN:=.c} HDR = arg.h diff --git a/ff2pam.1 b/ff2pam.1 @@ -0,0 +1,41 @@ +.Dd 2017-01-09 +.Dt FF2PAM 1 +.Os suckless.org +.Sh NAME +.Nm ff2pam +.Nd convert farbfeld to PAM +.Sh SYNOPSIS +.Nm +.Sh DESCRIPTION +.Nm +reads a +.Xr farbfeld 5 +image from stdin, converts it to a 16-bit RGBA PAM and writes the result +to stdout. +.Pp +In case of an error +.Nm +writes a diagnostic message to stderr. +.Sh EXIT STATUS +.Bl -tag -width Ds +.It 0 +Image processed successfully. +.It 1 +An error occurred. +.El +.Sh EXAMPLES +$ +.Nm +< image.ff > image.pam +.Pp +$ bunzip2 < image.ff.bz2 | +.Nm +> image.pam +.Sh SEE ALSO +.Xr 2ff 1 , +.Xr bunzip2 1 , +.Xr bzip2 1 , +.Xr png2ff 1 , +.Xr farbfeld 5 +.Sh AUTHORS +.An Mattias Andrée Aq Mt maandree@kth.se diff --git a/ff2pam.c b/ff2pam.c @@ -0,0 +1,74 @@ +/* See LICENSE file for copyright and license details. */ +#include <arpa/inet.h> + +#include <errno.h> +#include <inttypes.h> +#include <stdint.h> +#include <stdio.h> +#include <string.h> +#include <unistd.h> + +static char *argv0; + +int +main(int argc, char *argv[]) +{ + uint32_t hdr[4], width, height; + char buf[BUFSIZ]; + size_t n, t; + + argv0 = argv[0], argc--, argv++; + + if (argc) { + fprintf(stderr, "usage: %s\n", argv0); + return 1; + } + + /* header */ + if (fread(hdr, sizeof(*hdr), 4, stdin) != 4) { + fprintf(stderr, "%s: file too short\n", argv0); + return 1; + } + if (memcmp("farbfeld", hdr, sizeof("farbfeld") - 1)) { + fprintf(stderr, "%s: invalid magic value\n", argv0); + return 1; + } + width = ntohl(hdr[2]); + height = ntohl(hdr[3]); + + /* write header */ + printf("P7\n" + "WIDTH %" PRIu32 "\n" + "HEIGHT %" PRIu32 "\n" + "DEPTH 4\n" /* number of channels */ + "MAXVAL 65535\n" + "TUPLTYPE RGB_ALPHA\n" + "ENDHDR\n", + width, height); + + /* write image */ + t = (size_t)width * (size_t)height * sizeof(uint16_t) * (sizeof("RGBA") - 1); + for (; (n = fread(buf, 1, sizeof(buf) <= t ? sizeof(buf) : t, stdin)); ) { + t -= n; + fwrite(buf, 1, n, stdout); + + if (feof(stdin)) { + break; + } + if (ferror(stdin)) { + fprintf(stderr, "%s: read: %s\n", argv0, strerror(errno)); + return 1; + } + if (ferror(stdout)) { + fprintf(stderr, "%s: write: %s\n", argv0, strerror(errno)); + return 1; + } + } + + if (t > 0) { + fprintf(stderr, "%s: file too short\n", argv0); + return 1; + } + + return 0; +}