Introduction
Introduction Statistics Contact Development Disclaimer Help
Refactor png-conversion-utilities - farbfeld - suckless image format with conve…
git clone git://git.suckless.org/farbfeld
Log
Files
Refs
README
LICENSE
---
commit da99b58226c8dbb0cf764bbc7b42b7e3a36ff292
parent a78b5dc6efaca25830c31ac17ef3ff81a493314d
Author: Laslo Hunhold <[email protected]>
Date: Wed, 12 Apr 2017 23:41:00 +0200
Refactor png-conversion-utilities
We split out the libpng-setup into a separate function, it is very very
ugly.
The code also received a general cleanup and aligns itself much better
with the general coding style and structure.
Diffstat:
M ff2png.c | 86 ++++++++++++++++-------------…
M png2ff.c | 94 ++++++++++++++++-------------…
2 files changed, 95 insertions(+), 85 deletions(-)
---
diff --git a/ff2png.c b/ff2png.c
@@ -11,73 +11,77 @@
#include "util.h"
-void
-pngerr(png_structp pngs, const char *msg)
+static void
+png_err(png_struct *pngs, const char *msg)
{
(void)pngs;
fprintf(stderr, "%s: libpng: %s\n", argv0, msg);
exit(1);
}
+static void
+png_setup_writer(png_struct **s, png_info **i, uint32_t w, uint32_t h)
+{
+ *s = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, png_err, NUL…
+ *i = png_create_info_struct(*s);
+
+ if (!*s || !*i) {
+ fprintf(stderr, "%s: failed to initialize libpng\n", argv0);
+ exit(1);
+ }
+
+ png_init_io(*s, stdout);
+ png_set_IHDR(*s, *i, w, h, 16, PNG_COLOR_TYPE_RGB_ALPHA,
+ PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE,
+ PNG_FILTER_TYPE_BASE);
+ png_write_info(*s, *i);
+}
+
+static void
+usage(void)
+{
+ fprintf(stderr, "usage: %s\n", argv0);
+ exit(1);
+}
+
int
main(int argc, char *argv[])
{
- png_structp pngs;
- png_infop pngi;
+ png_struct *pngs;
+ png_info *pngi;
size_t rowlen;
uint32_t width, height, i;
uint16_t *row;
+ /* arguments */
argv0 = argv[0], argc--, argv++;
if (argc) {
- fprintf(stderr, "usage: %s\n", argv0);
- return 1;
+ usage();
}
- read_ff_header(&width, &height);
-
- /* load png */
- pngs = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, pngerr,
- NULL);
- pngi = png_create_info_struct(pngs);
-
- if (!pngs || !pngi) {
- fprintf(stderr, "%s: failed to initialize libpng\n", argv0);
- return 1;
- }
- png_init_io(pngs, stdout);
- png_set_IHDR(pngs, pngi, width, height, 16, PNG_COLOR_TYPE_RGB_ALPHA,
- PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE,
- PNG_FILTER_TYPE_BASE);
- png_write_info(pngs, pngi);
-
- /* write rows */
- if (width > SIZE_MAX / ((sizeof("RGBA") - 1) * sizeof(uint16_t))) {
- fprintf(stderr, "%s: row length integer overflow\n", argv0);
- return 1;
- }
+ /* prepare */
+ ff_read_header(&width, &height);
+ png_setup_writer(&pngs, &pngi, width, height);
+ row = ereallocarray(NULL, width, (sizeof("RGBA") - 1) * sizeof(uint16_…
rowlen = width * (sizeof("RGBA") - 1);
- if (!(row = malloc(rowlen * sizeof(uint16_t)))) {
- fprintf(stderr, "%s: malloc: out of memory\n", argv0);
- return 1;
- }
+
+ /* write data */
for (i = 0; i < height; ++i) {
if (fread(row, sizeof(uint16_t), rowlen, stdin) != rowlen) {
- goto readerr;
+ if (ferror(stdin)) {
+ fprintf(stderr, "%s: fread: %s\n", argv0, stre…
+ } else {
+ fprintf(stderr, "%s: unexpected end of file\n"…
+ }
+ return 1;
}
png_write_row(pngs, (uint8_t *)row);
}
+
+ /* clean up */
png_write_end(pngs, NULL);
png_destroy_write_struct(&pngs, NULL);
return 0;
-readerr:
- if (ferror(stdin)) {
- fprintf(stderr, "%s: fread: %s\n", argv0, strerror(errno));
- } else {
- fprintf(stderr, "%s: unexpected end of file\n", argv0);
- }
-
- return 1;
}
diff --git a/png2ff.c b/png2ff.c
@@ -5,69 +5,75 @@
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include <png.h>
#include "util.h"
void
-pngerr(png_structp pngs, const char *msg)
+png_err(png_struct *pngs, const char *msg)
{
+ (void)pngs;
fprintf(stderr, "%s: libpng: %s\n", argv0, msg);
exit(1);
}
+void
+png_setup_reader(png_struct **s, png_info **i, uint32_t *w, uint32_t *h)
+{
+ *s = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, png_err, NULL…
+ *i = png_create_info_struct(*s);
+
+ if (!*s || !*i) {
+ fprintf(stderr, "%s: failed to initialize libpng\n", argv0);
+ exit(1);
+ }
+
+ png_init_io(*s, stdin);
+ if (png_get_valid(*s, *i, PNG_INFO_tRNS)) {
+ png_set_tRNS_to_alpha(*s);
+ }
+ png_set_add_alpha(*s, 255*257, PNG_FILLER_AFTER);
+ png_set_expand_gray_1_2_4_to_8(*s);
+ png_set_gray_to_rgb(*s);
+ png_set_packing(*s);
+ png_read_png(*s, *i, PNG_TRANSFORM_PACKING | PNG_TRANSFORM_EXPAND, NUL…
+ *w = png_get_image_width(*s, *i);
+ *h = png_get_image_height(*s, *i);
+}
+
+static void
+usage(void)
+{
+ fprintf(stderr, "usage: %s\n", argv0);
+ exit(1);
+}
+
int
main(int argc, char *argv[])
{
- png_structp pngs;
- png_infop pngi;
+ png_struct *pngs;
+ png_info *pngi;
uint32_t width, height, rowlen, r, i;
uint16_t *row;
uint8_t **pngrows;
+ /* arguments */
argv0 = argv[0], argc--, argv++;
if (argc) {
- fprintf(stderr, "usage: %s\n", argv0);
- return 1;
+ usage();
}
- /* load png */
- pngs = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, pngerr,
- NULL);
- pngi = png_create_info_struct(pngs);
-
- if (!pngs || !pngi) {
- fprintf(stderr, "%s: failed to initialize libpng\n", argv0);
- return 1;
- }
- png_init_io(pngs, stdin);
- if (png_get_valid(pngs, pngi, PNG_INFO_tRNS))
- png_set_tRNS_to_alpha(pngs);
- png_set_add_alpha(pngs, 255*257, PNG_FILLER_AFTER);
- png_set_expand_gray_1_2_4_to_8(pngs);
- png_set_gray_to_rgb(pngs);
- png_set_packing(pngs);
- png_read_png(pngs, pngi, PNG_TRANSFORM_PACKING |
- PNG_TRANSFORM_EXPAND, NULL);
- width = png_get_image_width(pngs, pngi);
- height = png_get_image_height(pngs, pngi);
- pngrows = png_get_rows(pngs, pngi);
-
- /* allocate output row buffer */
- if (width > SIZE_MAX / ((sizeof("RGBA") - 1) * sizeof(uint16_t))) {
- fprintf(stderr, "%s: row length integer overflow\n", argv0);
- return 1;
- }
+ /* prepare */
+ png_setup_reader(&pngs, &pngi, &width, &height);
+ row = ereallocarray(NULL, width, (sizeof("RGBA") - 1) * sizeof(uint16_…
rowlen = width * (sizeof("RGBA") - 1);
- if (!(row = malloc(rowlen * sizeof(uint16_t)))) {
- fprintf(stderr, "%s: malloc: out of memory\n", argv0);
- return 1;
- }
+ pngrows = png_get_rows(pngs, pngi);
/* write data */
- write_ff_header(width, height);
+ ff_write_header(width, height);
switch(png_get_bit_depth(pngs, pngi)) {
case 8:
@@ -77,7 +83,9 @@ main(int argc, char *argv[])
}
if (fwrite(row, sizeof(uint16_t), rowlen,
stdout) != rowlen) {
- goto writerr;
+ fprintf(stderr, "%s: fwrite: %s\n", argv0,
+ strerror(errno));
+ return 1;
}
}
break;
@@ -85,7 +93,9 @@ main(int argc, char *argv[])
for (r = 0; r < height; ++r) {
if (fwrite(pngrows[r], sizeof(uint16_t), rowlen,
stdout) != rowlen) {
- goto writerr;
+ fprintf(stderr, "%s: fwrite: %s\n", argv0,
+ strerror(errno));
+ return 1;
}
}
break;
@@ -94,12 +104,8 @@ main(int argc, char *argv[])
return 1;
}
+ /* clean up */
png_destroy_read_struct(&pngs, &pngi, NULL);
return 0;
-writerr:
- fprintf(stderr, "%s: fwrite: ", argv0);
- perror(NULL);
-
- return 1;
}
You are viewing proxied material from suckless.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.