summaryrefslogtreecommitdiffstats
path: root/src/loadpng.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/loadpng.c')
-rw-r--r--src/loadpng.c131
1 files changed, 64 insertions, 67 deletions
diff --git a/src/loadpng.c b/src/loadpng.c
index fce5066..ed12886 100644
--- a/src/loadpng.c
+++ b/src/loadpng.c
@@ -10,95 +10,92 @@
#include <assert.h>
#include <png.h>
-static_assert(sizeof(png_byte) == sizeof( ((ql_raster_image_t *)0)->data[0]), "Code relies on png_byte being compatible with ql_raster_image_t data ");
+static_assert(sizeof(png_byte) == sizeof(((ql_raster_image_t *) 0)->data[0]),
+ "Code relies on png_byte being compatible with ql_raster_image_t data ");
ql_raster_image_t *loadpng(const char *path)
{
- ql_raster_image_t *ret = NULL;
+ ql_raster_image_t *ret = NULL;
- if (!path)
- goto out;
+ if (!path)
+ goto out;
- FILE *f = fopen(path, "rb");
- if (!f)
- goto out;
+ FILE *f = fopen(path, "rb");
+ if (!f)
+ goto out;
- uint8_t header[8];
- if (fread(header, 1, sizeof(header), f) != 8)
- goto close_out;
+ uint8_t header[8];
+ if (fread(header, 1, sizeof(header), f) != 8)
+ goto close_out;
- if (!png_check_sig(header, sizeof(header)))
- goto close_out;
+ if (!png_check_sig(header, sizeof(header)))
+ goto close_out;
- png_infop info_ptr = NULL, end_ptr = NULL;
- png_structp png_ptr =
- png_create_read_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
- if (!png_ptr)
- goto close_out;
+ png_infop info_ptr = NULL, end_ptr = NULL;
+ png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
+ if (!png_ptr)
+ goto close_out;
- info_ptr = png_create_info_struct(png_ptr);
- if (!info_ptr)
- goto destroy_read_out;
+ info_ptr = png_create_info_struct(png_ptr);
+ if (!info_ptr)
+ goto destroy_read_out;
- end_ptr = png_create_info_struct(png_ptr);
- if (!end_ptr)
- goto destroy_read_out;
+ end_ptr = png_create_info_struct(png_ptr);
+ if (!end_ptr)
+ goto destroy_read_out;
- if (setjmp(png_jmpbuf(png_ptr)))
- goto destroy_read_out;
+ if (setjmp(png_jmpbuf(png_ptr)))
+ goto destroy_read_out;
- png_init_io(png_ptr, f);
- png_set_sig_bytes(png_ptr, sizeof(header));
+ png_init_io(png_ptr, f);
+ png_set_sig_bytes(png_ptr, sizeof(header));
- png_read_info(png_ptr, info_ptr);
+ png_read_info(png_ptr, info_ptr);
- png_uint_32 width, height;
- int bit_depth, color_type;
- png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth,
- &color_type, NULL, NULL, NULL);
+ png_uint_32 width, height;
+ int bit_depth, color_type;
+ png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, NULL, NULL, NULL);
- if (color_type & PNG_COLOR_MASK_ALPHA)
- png_set_strip_alpha(png_ptr);
- if (color_type & (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_PALETTE))
- png_set_rgb_to_gray_fixed(png_ptr, 1, -1, -1); // force into grayscale
- if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
- png_set_expand_gray_1_2_4_to_8(png_ptr); // get us a known output format
+ if (color_type & PNG_COLOR_MASK_ALPHA)
+ png_set_strip_alpha(png_ptr);
+ if (color_type & (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_PALETTE))
+ png_set_rgb_to_gray_fixed(png_ptr, 1, -1, -1); // force into grayscale
+ if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
+ png_set_expand_gray_1_2_4_to_8(png_ptr); // get us a known output format
- png_read_update_info(png_ptr, info_ptr);
+ png_read_update_info(png_ptr, info_ptr);
- png_bytepp row_ptrs = calloc(height, sizeof(png_bytep));
- if (!row_ptrs)
- goto destroy_read_out;
+ png_bytepp row_ptrs = calloc(height, sizeof(png_bytep));
+ if (!row_ptrs)
+ goto destroy_read_out;
- const unsigned row_bytes = width * sizeof(png_byte);
- ql_raster_image_t *img =
- calloc(1, sizeof(ql_raster_image_t) + height * row_bytes);
- if (!img)
- goto free_image_out;
+ const unsigned row_bytes = width * sizeof(png_byte);
+ ql_raster_image_t *img = calloc(1, sizeof(ql_raster_image_t) + height * row_bytes);
+ if (!img)
+ goto free_image_out;
- if (setjmp(png_jmpbuf(png_ptr)))
- goto free_image_out;
+ if (setjmp(png_jmpbuf(png_ptr)))
+ goto free_image_out;
- for (png_uint_32 i = 0; i < height; ++i)
- row_ptrs[i] = (png_bytep)(img->data + (i * row_bytes));
+ for (png_uint_32 i = 0; i < height; ++i)
+ row_ptrs[i] = (png_bytep) (img->data + (i * row_bytes));
- png_read_image(png_ptr, row_ptrs);
- png_read_end(png_ptr, end_ptr);
+ png_read_image(png_ptr, row_ptrs);
+ png_read_end(png_ptr, end_ptr);
- img->height = height;
- img->width = width;
+ img->height = height;
+ img->width = width;
- ret = img;
- img = NULL; // don't free it, we're returning it now
+ ret = img;
+ img = NULL; // don't free it, we're returning it now
-free_image_out:
- free(img);
- free(row_ptrs);
-destroy_read_out:
- png_destroy_read_struct(
- &png_ptr, info_ptr ? &info_ptr : NULL, end_ptr ? &end_ptr : NULL);
-close_out:
- fclose(f);
-out:
- return ret;
+ free_image_out:
+ free(img);
+ free(row_ptrs);
+ destroy_read_out:
+ png_destroy_read_struct(&png_ptr, info_ptr ? &info_ptr : NULL, end_ptr ? &end_ptr : NULL);
+ close_out:
+ fclose(f);
+ out:
+ return ret;
}