diff options
Diffstat (limited to 'src/feh_png.c')
-rw-r--r-- | src/feh_png.c | 83 |
1 files changed, 39 insertions, 44 deletions
diff --git a/src/feh_png.c b/src/feh_png.c index 7654880..8f5b94d 100644 --- a/src/feh_png.c +++ b/src/feh_png.c @@ -23,56 +23,51 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include "feh_png.h" - #include <png.h> #include <stdio.h> #include <stdarg.h> +#include "feh_png.h" + #define FEH_PNG_COMPRESSION 3 -#define FEH_PNG_NUM_COMMENTS 2 /* only Thumb::URI and Thumb::MTime for now */ +#define FEH_PNG_NUM_COMMENTS 4 -gib_hash* -feh_png_read_comments(char *file) +gib_hash *feh_png_read_comments(char *file) { - gib_hash *hash = NULL; - FILE *fp; int i, sig_bytes, comments = 0; png_structp png_ptr; png_infop info_ptr; png_textp text_ptr; - - if (!(fp = fopen(file, "rb"))) - return hash; + + if (!(fp = fopen(file, "rb"))) + return NULL; if (!(sig_bytes = feh_png_file_is_png(fp))) { fclose(fp); - return hash; + return NULL; } /* initialize data structures */ png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - if (!png_ptr) - { + if (!png_ptr) { fclose(fp); - return hash; + return NULL; } info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { png_destroy_read_struct(&png_ptr, (png_infopp) NULL, (png_infopp) NULL); fclose(fp); - return hash; + return NULL; } - if (setjmp(png_ptr->jmpbuf)) - { + if (setjmp(png_jmpbuf(png_ptr))) { png_destroy_read_struct(&png_ptr, &info_ptr, NULL); fclose(fp); - return hash; + return NULL; } /* initialize reading */ @@ -81,6 +76,8 @@ feh_png_read_comments(char *file) png_read_info(png_ptr, info_ptr); + gib_hash *hash = NULL; + #ifdef PNG_TEXT_SUPPORTED png_get_text(png_ptr, info_ptr, &text_ptr, &comments); if (comments > 0) { @@ -88,7 +85,7 @@ feh_png_read_comments(char *file) for (i = 0; i < comments; i++) gib_hash_set(hash, text_ptr[i].key, estrdup(text_ptr[i].text)); } -#endif /* PNG_TEXT_SUPPORTED */ +#endif /* PNG_TEXT_SUPPORTED */ png_destroy_read_struct(&png_ptr, &info_ptr, NULL); fclose(fp); @@ -97,8 +94,7 @@ feh_png_read_comments(char *file) } /* grab image data from image and write info file with comments ... */ -int -feh_png_write_png(Imlib_Image image, char *file, ...) +int feh_png_write_png_fd(Imlib_Image image, int fd, ...) { FILE *fp; int i, w, h; @@ -113,24 +109,25 @@ feh_png_write_png(Imlib_Image image, char *file, ...) va_list args; png_text text[FEH_PNG_NUM_COMMENTS]; char *pair_key, *pair_text; -#endif /* PNG_TEXT_SUPPORTED */ +#endif /* PNG_TEXT_SUPPORTED */ - if (!(fp = fopen(file, "wb"))) + if (!(fp = fdopen(fd, "wb"))) return 0; png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - if (!png_ptr) + if (!png_ptr) { + fclose(fp); return 0; + } info_ptr = png_create_info_struct(png_ptr); - if (!info_ptr) - { + if (!info_ptr) { png_destroy_write_struct(&png_ptr, (png_infopp) NULL); + fclose(fp); return 0; } - if (setjmp(png_ptr->jmpbuf)) - { + if (setjmp(png_jmpbuf(png_ptr))) { fclose(fp); png_destroy_write_struct(&png_ptr, &info_ptr); png_destroy_info_struct(png_ptr, &info_ptr); @@ -143,14 +140,13 @@ feh_png_write_png(Imlib_Image image, char *file, ...) png_init_io(png_ptr, fp); png_set_IHDR(png_ptr, info_ptr, w, h, 8, PNG_COLOR_TYPE_RGB_ALPHA, - PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, - PNG_FILTER_TYPE_DEFAULT); + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); #ifdef WORDS_BIGENDIAN png_set_swap_alpha(png_ptr); -#else /* !WORDS_BIGENDIAN */ +#else /* !WORDS_BIGENDIAN */ png_set_bgr(png_ptr); -#endif /* WORDS_BIGENDIAN */ +#endif /* WORDS_BIGENDIAN */ sig_bit.red = 8; sig_bit.green = 8; @@ -159,25 +155,22 @@ feh_png_write_png(Imlib_Image image, char *file, ...) png_set_sBIT(png_ptr, info_ptr, &sig_bit); #ifdef PNG_TEXT_SUPPORTED - va_start(args, file); - for (i = 0; i < FEH_PNG_NUM_COMMENTS; i++) - { - if ((pair_key = va_arg(args, char *)) && - (pair_text = va_arg(args, char *))) - { + va_start(args, fd); + for (i = 0; i < FEH_PNG_NUM_COMMENTS; i++) { + if ((pair_key = va_arg(args, char *)) + && (pair_text = va_arg(args, char *))) { /* got a complete pair, add to info structure */ text[i].key = pair_key; text[i].text = pair_text; text[i].compression = PNG_TEXT_COMPRESSION_NONE; - } - else + } else break; } va_end(args); if (i > 0) png_set_text(png_ptr, info_ptr, text, i); -#endif /* PNG_TEXT_SUPPORTED */ +#endif /* PNG_TEXT_SUPPORTED */ png_set_compression_level(png_ptr, FEH_PNG_COMPRESSION); png_write_info(png_ptr, info_ptr); @@ -200,12 +193,14 @@ feh_png_write_png(Imlib_Image image, char *file, ...) } /* check PNG signature */ -int -feh_png_file_is_png(FILE *fp) +int feh_png_file_is_png(FILE * fp) { unsigned char buf[8]; - fread(buf, 1, 8, fp); + if (fread(buf, 1, 8, fp) != 8) { + return 0; + } + if (png_sig_cmp(buf, 0, 8)) { return 0; } |