Cleanup: deduplicate single/multiview image packing code.
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Sat, 3 Mar 2018 15:55:08 +0000 (16:55 +0100)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Thu, 18 Apr 2019 17:42:20 +0000 (19:42 +0200)
source/blender/blenkernel/BKE_image.h
source/blender/blenkernel/intern/image.c

index 7a80679..28886a5 100644 (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,
index 75df0fa..49d0440 100644 (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;
+  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)