summaryrefslogtreecommitdiff
path: root/farbfeld.5
diff options
context:
space:
mode:
Diffstat (limited to 'farbfeld.5')
-rw-r--r--farbfeld.5101
1 files changed, 73 insertions, 28 deletions
diff --git a/farbfeld.5 b/farbfeld.5
index accae57..664075d 100644
--- a/farbfeld.5
+++ b/farbfeld.5
@@ -52,72 +52,117 @@ and inherent complexity involved in handling common image formats
(PNG, JPEG, GIF,...), having to rely on bloated libraries while not being
able to focus on the task at hand for a given image processing problem.
.Sh EXAMPLES
-Below is an example for a color inverter usable in a pipeline. No external
-libraries other than libc are needed to handle the image data:
+The following code listing
+.Em invert.c
+is a ready-to-use color inverter with all necessary error handling and
+reporting. This program can be integrated into a farbfeld pipeline as
+follows:
+.Pp
+$ png2ff < image.png | invert | ff2png > image-inverted.png
+.Pp
+It shall be noted here that due to the simplicity of the format no
+external libraries are needed to handle the farbfeld image data. The
+0BSD-License gives you the freedom to throw away the license block and
+just use the code as you wish. Happy hacking!
.Bd -literal -offset left
+/*
+ * 0BSD-License
+ *
+ * (c) 2017 Laslo Hunhold <dev@frign.de>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for
+ * any purpose with or without fee is hereby granted.
+ *
+ * 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 <arpa/inet.h>
+#include <errno.h>
#include <stdint.h>
#include <stdio.h>
-#include <stdlib.h>
#include <string.h>
+#define LEN(x) (sizeof (x) / sizeof *(x))
+
+static void
+invert(uint16_t rgba[4])
+{
+ rgba[0] = UINT16_MAX - rgba[0];
+ rgba[1] = UINT16_MAX - rgba[1];
+ rgba[2] = UINT16_MAX - rgba[2];
+}
+
int
main(int argc, char *argv[])
{
- uint32_t width, height, i, j, k;
+ uint32_t hdr[4], width, height, i, j, k;
uint16_t rgba[4];
- uint8_t hdr[strlen("farbfeld") + 2 * sizeof(uint32_t)];
- if (argc > 1) {
+ /* arguments */
+ if (argc != 1) {
fprintf(stderr, "usage: %s\\n", argv[0]);
return 1;
}
- if (fread(hdr, 1, sizeof(hdr), stdin) != sizeof(hdr)) {
- fprintf(stderr, "incomplete header\\n");
- return 1;
+ /* read header */
+ if (fread(hdr, sizeof(*hdr), LEN(hdr), stdin) != LEN(hdr)) {
+ goto readerr;
}
- if (memcmp("farbfeld", hdr, strlen("farbfeld"))) {
- fprintf(stderr, "invalid magic\\n");
+ if (memcmp("farbfeld", hdr, sizeof("farbfeld") - 1)) {
+ fprintf(stderr, "%s: invalid magic value\\n", argv[0]);
return 1;
}
- width = ntohl(*((uint32_t *)(hdr + 8)));
- height = ntohl(*((uint32_t *)(hdr + 12)));
+ width = ntohl(hdr[2]);
+ height = ntohl(hdr[3]);
- if (fwrite(hdr, 1, sizeof(hdr), stdout) != sizeof(hdr)) {
- fprintf(stderr, "write error\\n");
- return 1;
+ /* write data */
+ if (fwrite(hdr, sizeof(*hdr), LEN(hdr), stdout) != 4) {
+ goto writerr;
}
for (i = 0; i < height; i++) {
for (j = 0; j < width; j++) {
- if (fread(rgba, sizeof(uint16_t), 4,
- stdin) != 4) {
- fprintf(stderr, "unexpected EOF\\n");
- return 1;
+ if (fread(rgba, sizeof(*rgba), LEN(rgba),
+ stdin) != LEN(rgba)) {
+ goto readerr;
}
for (k = 0; k < 4; k++) {
rgba[k] = ntohs(rgba[k]);
}
- /* invert colors */
- rgba[0] = 65535 - rgba[0];
- rgba[1] = 65535 - rgba[1];
- rgba[2] = 65535 - rgba[2];
+ invert(rgba);
for (k = 0; k < 4; k++) {
rgba[k] = htons(rgba[k]);
}
- if (fwrite(rgba, sizeof(uint16_t), 4,
- stdout) != 4) {
- fprintf(stderr, "write error\\n");
- return 1;
+ if (fwrite(rgba, sizeof(*rgba), LEN(rgba),
+ stdout) != LEN(rgba)) {
+ goto writerr;
}
}
}
+ /* clean up */
+ if (fclose(stdout)) {
+ fprintf(stderr, "%s: fclose: %s\\n", argv[0],
+ strerror(errno));
+ return 1;
+ }
+
return 0;
+readerr:
+ fprintf(stderr, "%s: fread: Unexpected EOF\\n", argv[0]);
+ return 1;
+writerr:
+ fprintf(stderr, "%s: fwrite: %s\\n", argv[0], strerror(errno));
+ return 1;
}
.Ed
.Sh SEE ALSO