# HG changeset patch # User Matti Hamalainen # Date 1481116976 -7200 # Node ID bfd933ef38b45d8ccb9355d35868324f8c9a8924 # Parent 5a1eec3c43ccf0f653e5c37b9c55996b3acf85b5 Implement some metadata support in TIFF and clean up meta data handling otherwise. diff -r 5a1eec3c43cc -r bfd933ef38b4 bpgenc.c --- a/bpgenc.c Wed Dec 07 14:04:58 2016 +0200 +++ b/bpgenc.c Wed Dec 07 15:22:56 2016 +0200 @@ -909,6 +909,43 @@ } } +void insert_md(BPGMetaData **list, BPGMetaData *node) +{ + if (*list == NULL) + { + *list = node; + node->next = NULL; + } + else + { + node->next = *list; + *list = node; + } +} + +int add_md_contents(BPGMetaData **list, const int tag, const size_t len, const void *buf) +{ + BPGMetaData *md; + + if ((md = bpg_md_alloc(tag)) == NULL) + goto err; + + if ((md->buf = malloc(len)) == NULL) + goto err; + + md->buf_len = len; + memcpy(md->buf, buf, len); + insert_md(list, md); + return 0; + +err: + bpg_md_free(md); + return -1; +} + + +#define TIFF_DEBUG + Image *read_tiff(BPGMetaData **pmd, const char *filename, BPGColorSpaceEnum color_space, int out_bit_depth, int limited_range, int premultiplied_alpha) @@ -916,16 +953,14 @@ TIFF *tif; Image *img = NULL; BPGImageFormatEnum img_format; - uint8_t *buf = NULL; - uint32_t img_width, img_height; + uint8_t *buf = NULL, *tmp_buf = NULL; + uint32_t img_width, img_height, tmp_len; int img_alpha, img_bpp; size_t img_linesize; - uint16_t img_depth, img_spp, img_sfmt, img_pconfig; + uint16_t img_depth, img_spp, img_pconfig; ColorConvertState cvt; RGBConvertFunc *convert_func; - *pmd = NULL; - // Open and read TIFF header etc. if ((tif = TIFFOpen(filename, "rb")) == NULL) { @@ -1010,6 +1045,12 @@ } } + // Get meta data + if (TIFFGetField(tif, TIFFTAG_ICCPROFILE, &tmp_len, &tmp_buf)) + add_md_contents(pmd, BPG_EXTENSION_TAG_ICCP, tmp_len, tmp_buf); + + if (TIFFGetField(tif, TIFFTAG_XMLPACKET, &tmp_len, &tmp_buf)) + add_md_contents(pmd, BPG_EXTENSION_TAG_XMP, tmp_len, tmp_buf); err: if (buf != NULL) @@ -1031,7 +1072,6 @@ int y, has_alpha, linesize, bpp; BPGImageFormatEnum format; ColorConvertState cvt_s, *cvt = &cvt_s; - BPGMetaData *md, **plast_md, *first_md; png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); @@ -1171,8 +1211,6 @@ png_read_end(png_ptr, info_ptr); /* get the ICC profile if present */ - first_md = NULL; - plast_md = &first_md; { png_charp name; int comp_type; @@ -1180,20 +1218,12 @@ png_uint_32 iccp_buf_len; if (png_get_iCCP(png_ptr, info_ptr, - &name, &comp_type, &iccp_buf, &iccp_buf_len) == - PNG_INFO_iCCP) { - md = bpg_md_alloc(BPG_EXTENSION_TAG_ICCP); - md->buf_len = iccp_buf_len; - md->buf = malloc(iccp_buf_len); - memcpy(md->buf, iccp_buf, iccp_buf_len); - *plast_md = md; - plast_md = &md->next; - } + &name, &comp_type, &iccp_buf, &iccp_buf_len) == PNG_INFO_iCCP) + add_md_contents(pmd, BPG_EXTENSION_TAG_ICCP, iccp_buf_len, iccp_buf); } png_destroy_read_struct(&png_ptr, &info_ptr, NULL); - *pmd = first_md; return img; } @@ -1303,7 +1333,6 @@ BPGImageFormatEnum format; BPGColorSpaceEnum color_space; ColorConvertState cvt_s, *cvt = &cvt_s; - BPGMetaData *first_md = NULL; uint32_t comp_hv; cinfo.err = jpeg_std_error(&jerr); @@ -1521,13 +1550,12 @@ free(buf); } - first_md = jpeg_get_metadata(cinfo.marker_list); + *pmd = jpeg_get_metadata(cinfo.marker_list); the_end: jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); - *pmd = first_md; return img; }