Cleanup: deduplicate single/multiview image packing code.

This commit is contained in:
2018-03-03 16:55:08 +01:00
parent 54f420ec46
commit 624d010fe5
2 changed files with 72 additions and 92 deletions

View File

@@ -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,

View File

@@ -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;
image_free_packedfiles(ima);
for (i = 0, iv = ima->views.first; iv; iv = iv->next, i++) {
ImBuf *ibuf = image_get_cached_ibuf_for_index_frame(ima, i, 0);
ibuf->ftype = IMB_FTYPE_PNG;
ibuf->planes = R_IMF_PLANES_RGBA;
/* 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], "");
}
IMB_saveiff(ibuf, iv->filepath, IB_rect | IB_mem);
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);
}
if (ima->source == IMA_SRC_GENERATED) {
ima->source = IMA_SRC_FILE;
ima->type = IMA_TYPE_IMAGE;
}
ima->views_format = R_IMF_VIEWS_INDIVIDUAL;
}
/* packs rect from memory as PNG */
void BKE_image_memorypack(Image *ima)
{
ImBuf *ibuf;
if (BKE_image_is_multiview(ima)) {
image_memorypack_multiview(ima);
return;
}
ibuf = image_get_cached_ibuf_for_index_frame(ima, IMA_NO_INDEX, 0);
if (ibuf == NULL)
return;
image_free_packedfiles(ima);
ibuf->ftype = IMB_FTYPE_PNG;
ibuf->planes = R_IMF_PLANES_RGBA;
IMB_saveiff(ibuf, ibuf->name, IB_rect | IB_mem);
IMB_saveiff(ibuf, filepath, IB_rect | IB_mem);
if (ibuf->encodedbuffer == NULL) {
CLOG_STR_ERROR(&LOG, "memory save for pack error");
IMB_freeImBuf(ibuf);
image_free_packedfiles(ima);
return false;
}
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, filepath);
imapf->packedfile = pf;
BLI_addtail(&ima->packedfiles, imapf);
ibuf->encodedbuffer = NULL;
ibuf->encodedsize = 0;
ibuf->userflags &= ~IB_BITMAPDIRTY;
return true;
}
/* Pack image to memory. */
bool BKE_image_memorypack(Image *ima)
{
bool ok = true;
image_free_packedfiles(ima);
if (BKE_image_is_multiview(ima)) {
/* Store each view as a separate packed files with R_IMF_VIEWS_INDIVIDUAL. */
ImageView *iv;
int i;
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) {
ok = false;
break;
}
/* 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], "");
}
ok = ok && image_memorypack_imbuf(ima, ibuf, iv->filepath);
IMB_freeImBuf(ibuf);
}
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)