summaryrefslogtreecommitdiff
path: root/src/feh_png.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/feh_png.c')
-rw-r--r--src/feh_png.c83
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;
}