diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-03-03 18:55:08 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2019-04-18 20:42:20 +0300 |
commit | 624d010fe50496a4d28e2f61d7cb831dd24f549b (patch) | |
tree | 67d192b574c93a0df0f231cbfe7b7a03ec39b602 | |
parent | 54f420ec4641854f8e254576b314b3d150b643ce (diff) |
Cleanup: deduplicate single/multiview image packing code.
-rw-r--r-- | source/blender/blenkernel/BKE_image.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/image.c | 138 |
2 files changed, 60 insertions, 80 deletions
diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h index 7a806796527..28886a5a195 100644 --- a/source/blender/blenkernel/BKE_image.h +++ b/source/blender/blenkernel/BKE_image.h @@ -294,7 +294,7 @@ void BKE_image_free_anim_ibufs(struct Image *ima, int except_frame); /* does all images with type MOVIE or SEQUENCE */ void BKE_image_all_free_anim_ibufs(struct Main *bmain, int except_frame); -void BKE_image_memorypack(struct Image *ima); +bool BKE_image_memorypack(struct Image *ima); void BKE_image_packfiles(struct ReportList *reports, struct Image *ima, const char *basepath); void BKE_image_packfiles_from_mem(struct ReportList *reports, struct Image *ima, diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 75df0fa6aaa..49d0440b207 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -720,109 +720,89 @@ Image *BKE_image_add_from_imbuf(Main *bmain, ImBuf *ibuf, const char *name) return ima; } -/* packs rects from memory as PNG - * convert multiview images to R_IMF_VIEWS_INDIVIDUAL - */ -static void image_memorypack_multiview(Image *ima) +/* Pack image buffer to memory as PNG. */ +static bool image_memorypack_imbuf(Image *ima, ImBuf *ibuf, const char *filepath) { - ImageView *iv; - int i; + ibuf->ftype = IMB_FTYPE_PNG; + ibuf->planes = R_IMF_PLANES_RGBA; - image_free_packedfiles(ima); + IMB_saveiff(ibuf, filepath, IB_rect | IB_mem); - for (i = 0, iv = ima->views.first; iv; iv = iv->next, i++) { - ImBuf *ibuf = image_get_cached_ibuf_for_index_frame(ima, i, 0); + if (ibuf->encodedbuffer == NULL) { + CLOG_STR_ERROR(&LOG, "memory save for pack error"); + IMB_freeImBuf(ibuf); + image_free_packedfiles(ima); + return false; + } - ibuf->ftype = IMB_FTYPE_PNG; - ibuf->planes = R_IMF_PLANES_RGBA; + ImagePackedFile *imapf; + PackedFile *pf = MEM_callocN(sizeof(*pf), "PackedFile"); - /* if the image was a R_IMF_VIEWS_STEREO_3D we force _L, _R suffices */ - if (ima->views_format == R_IMF_VIEWS_STEREO_3D) { - const char *suffix[2] = {STEREO_LEFT_SUFFIX, STEREO_RIGHT_SUFFIX}; - BLI_path_suffix(iv->filepath, FILE_MAX, suffix[i], ""); - } + pf->data = ibuf->encodedbuffer; + pf->size = ibuf->encodedsize; - IMB_saveiff(ibuf, iv->filepath, IB_rect | IB_mem); + imapf = MEM_mallocN(sizeof(ImagePackedFile), "Image PackedFile"); + STRNCPY(imapf->filepath, filepath); + imapf->packedfile = pf; + BLI_addtail(&ima->packedfiles, imapf); - if (ibuf->encodedbuffer == NULL) { - CLOG_STR_ERROR(&LOG, "memory save for pack error"); - IMB_freeImBuf(ibuf); - image_free_packedfiles(ima); - return; - } - else { - ImagePackedFile *imapf; - PackedFile *pf = MEM_callocN(sizeof(*pf), "PackedFile"); - - pf->data = ibuf->encodedbuffer; - pf->size = ibuf->encodedsize; - - imapf = MEM_mallocN(sizeof(ImagePackedFile), "Image PackedFile"); - STRNCPY(imapf->filepath, iv->filepath); - imapf->packedfile = pf; - BLI_addtail(&ima->packedfiles, imapf); - - ibuf->encodedbuffer = NULL; - ibuf->encodedsize = 0; - ibuf->userflags &= ~IB_BITMAPDIRTY; - } - IMB_freeImBuf(ibuf); - } + ibuf->encodedbuffer = NULL; + ibuf->encodedsize = 0; + ibuf->userflags &= ~IB_BITMAPDIRTY; - if (ima->source == IMA_SRC_GENERATED) { - ima->source = IMA_SRC_FILE; - ima->type = IMA_TYPE_IMAGE; - } - ima->views_format = R_IMF_VIEWS_INDIVIDUAL; + return true; } -/* packs rect from memory as PNG */ -void BKE_image_memorypack(Image *ima) +/* Pack image to memory. */ +bool BKE_image_memorypack(Image *ima) { - ImBuf *ibuf; + bool ok = true; + + image_free_packedfiles(ima); if (BKE_image_is_multiview(ima)) { - image_memorypack_multiview(ima); - return; - } + /* Store each view as a separate packed files with R_IMF_VIEWS_INDIVIDUAL. */ + ImageView *iv; + int i; - ibuf = image_get_cached_ibuf_for_index_frame(ima, IMA_NO_INDEX, 0); + for (i = 0, iv = ima->views.first; iv; iv = iv->next, i++) { + ImBuf *ibuf = image_get_cached_ibuf_for_index_frame(ima, i, 0); - if (ibuf == NULL) - return; + if (!ibuf) { + ok = false; + break; + } - image_free_packedfiles(ima); + /* if the image was a R_IMF_VIEWS_STEREO_3D we force _L, _R suffices */ + if (ima->views_format == R_IMF_VIEWS_STEREO_3D) { + const char *suffix[2] = {STEREO_LEFT_SUFFIX, STEREO_RIGHT_SUFFIX}; + BLI_path_suffix(iv->filepath, FILE_MAX, suffix[i], ""); + } - ibuf->ftype = IMB_FTYPE_PNG; - ibuf->planes = R_IMF_PLANES_RGBA; + ok = ok && image_memorypack_imbuf(ima, ibuf, iv->filepath); + IMB_freeImBuf(ibuf); + } - IMB_saveiff(ibuf, ibuf->name, IB_rect | IB_mem); - if (ibuf->encodedbuffer == NULL) { - CLOG_STR_ERROR(&LOG, "memory save for pack error"); + ima->views_format = R_IMF_VIEWS_INDIVIDUAL; } else { - ImagePackedFile *imapf; - PackedFile *pf = MEM_callocN(sizeof(*pf), "PackedFile"); + ImBuf *ibuf = image_get_cached_ibuf_for_index_frame(ima, IMA_NO_INDEX, 0); - pf->data = ibuf->encodedbuffer; - pf->size = ibuf->encodedsize; - - imapf = MEM_mallocN(sizeof(ImagePackedFile), "Image PackedFile"); - STRNCPY(imapf->filepath, ima->name); - imapf->packedfile = pf; - BLI_addtail(&ima->packedfiles, imapf); - - ibuf->encodedbuffer = NULL; - ibuf->encodedsize = 0; - ibuf->userflags &= ~IB_BITMAPDIRTY; - - if (ima->source == IMA_SRC_GENERATED) { - ima->source = IMA_SRC_FILE; - ima->type = IMA_TYPE_IMAGE; + if (ibuf) { + ok = ok && image_memorypack_imbuf(ima, ibuf, ibuf->name); + IMB_freeImBuf(ibuf); + } + else { + ok = false; } } - IMB_freeImBuf(ibuf); + if (ok && ima->source == IMA_SRC_GENERATED) { + ima->source = IMA_SRC_FILE; + ima->type = IMA_TYPE_IMAGE; + } + + return ok; } void BKE_image_packfiles(ReportList *reports, Image *ima, const char *basepath) |