[Bf-blender-cvs] [11c9702dd40] master: Fix T65902: save all modified images should not try to save .psd files

Brecht Van Lommel noreply at git.blender.org
Wed Jun 19 15:04:10 CEST 2019


Commit: 11c9702dd40f1461ee2d2c1136909a867d4f06f9
Author: Brecht Van Lommel
Date:   Wed Jun 19 14:28:54 2019 +0200
Branches: master
https://developer.blender.org/rB11c9702dd40f1461ee2d2c1136909a867d4f06f9

Fix T65902: save all modified images should not try to save .psd files

We can't save these without data loss, so don't try to do this.

===================================================================

M	source/blender/blenkernel/BKE_image.h
M	source/blender/blenkernel/intern/image.c
M	source/blender/editors/space_image/image_ops.c
M	source/blender/windowmanager/intern/wm_files.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index 00fd291d7cb..d6683509729 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -320,6 +320,8 @@ float *BKE_image_get_float_pixels_for_frame(struct Image *image, int frame);
 /* Image modifications */
 bool BKE_image_is_dirty(struct Image *image);
 void BKE_image_mark_dirty(struct Image *image, struct ImBuf *ibuf);
+bool BKE_image_buffer_format_writable(struct ImBuf *ibuf);
+bool BKE_image_is_dirty_writable(struct Image *image, bool *is_format_writable);
 
 /* Guess offset for the first frame in the sequence */
 int BKE_image_sequence_guess_offset(struct Image *image);
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index f3ef48cafa8..b90cd9f15f8 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -5075,9 +5075,10 @@ bool BKE_image_is_animated(Image *image)
 }
 
 /* Image modifications */
-bool BKE_image_is_dirty(Image *image)
+bool BKE_image_is_dirty_writable(Image *image, bool *r_is_writable)
 {
   bool is_dirty = false;
+  bool is_writable = false;
 
   BLI_spin_lock(&image_spin);
   if (image->cache != NULL) {
@@ -5086,6 +5087,7 @@ bool BKE_image_is_dirty(Image *image)
     while (!IMB_moviecacheIter_done(iter)) {
       ImBuf *ibuf = IMB_moviecacheIter_getImBuf(iter);
       if (ibuf->userflags & IB_BITMAPDIRTY) {
+        is_writable = BKE_image_buffer_format_writable(ibuf);
         is_dirty = true;
         break;
       }
@@ -5095,14 +5097,31 @@ bool BKE_image_is_dirty(Image *image)
   }
   BLI_spin_unlock(&image_spin);
 
+  if (r_is_writable) {
+    *r_is_writable = is_writable;
+  }
+
   return is_dirty;
 }
 
+bool BKE_image_is_dirty(Image *image)
+{
+  return BKE_image_is_dirty_writable(image, NULL);
+}
+
 void BKE_image_mark_dirty(Image *UNUSED(image), ImBuf *ibuf)
 {
   ibuf->userflags |= IB_BITMAPDIRTY;
 }
 
+bool BKE_image_buffer_format_writable(ImBuf *ibuf)
+{
+  ImageFormatData im_format;
+  ImbFormatOptions options_dummy;
+  BKE_imbuf_to_image_format(&im_format, ibuf);
+  return (BKE_image_imtype_to_ftype(im_format.imtype, &options_dummy) == ibuf->ftype);
+}
+
 void BKE_image_file_format_set(Image *image, int ftype, const ImbFormatOptions *options)
 {
   BLI_spin_lock(&image_spin);
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index bdc6c394609..9eda7ffdc34 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -234,14 +234,6 @@ static bool image_not_packed_poll(bContext *C)
   return (ima && BLI_listbase_is_empty(&ima->packedfiles));
 }
 
-static bool imbuf_format_writeable(const ImBuf *ibuf)
-{
-  ImageFormatData im_format;
-  ImbFormatOptions options_dummy;
-  BKE_imbuf_to_image_format(&im_format, ibuf);
-  return (BKE_image_imtype_to_ftype(im_format.imtype, &options_dummy) == ibuf->ftype);
-}
-
 bool space_image_main_region_poll(bContext *C)
 {
   SpaceImage *sima = CTX_wm_space_image(C);
@@ -2060,7 +2052,7 @@ static bool image_file_path_saveable(bContext *C, Image *ima, ImageUser *iuser)
     else if (!BLI_file_is_writable(name)) {
       CTX_wm_operator_poll_msg_set(C, "image path can't be written to");
     }
-    else if (!imbuf_format_writeable(ibuf)) {
+    else if (!BKE_image_buffer_format_writable(ibuf)) {
       CTX_wm_operator_poll_msg_set(C, "image format is read-only");
     }
     else {
@@ -2254,9 +2246,9 @@ static bool image_should_be_saved_when_modified(Image *ima)
   return !ELEM(ima->type, IMA_TYPE_R_RESULT, IMA_TYPE_COMPOSITE);
 }
 
-static bool image_should_be_saved(Image *ima)
+static bool image_should_be_saved(Image *ima, bool *is_format_writable)
 {
-  if (BKE_image_is_dirty(ima) &&
+  if (BKE_image_is_dirty_writable(ima, is_format_writable) &&
       (ima->source == IMA_SRC_FILE || ima->source == IMA_SRC_GENERATED)) {
     return image_should_be_saved_when_modified(ima);
   }
@@ -2272,7 +2264,15 @@ static bool image_has_valid_path(Image *ima)
 
 bool ED_image_should_save_modified(const bContext *C)
 {
-  return ED_image_save_all_modified_info(C, NULL) > 0;
+  ReportList reports;
+  BKE_reports_init(&reports, RPT_STORE);
+
+  uint modified_images_count = ED_image_save_all_modified_info(C, &reports);
+  bool should_save = modified_images_count || !BLI_listbase_is_empty(&reports.list);
+
+  BKE_reports_clear(&reports);
+
+  return should_save;
 }
 
 int ED_image_save_all_modified_info(const bContext *C, ReportList *reports)
@@ -2283,7 +2283,9 @@ int ED_image_save_all_modified_info(const bContext *C, ReportList *reports)
   int num_saveable_images = 0;
 
   for (Image *ima = bmain->images.first; ima; ima = ima->id.next) {
-    if (image_should_be_saved(ima)) {
+    bool is_format_writable;
+
+    if (image_should_be_saved(ima, &is_format_writable)) {
       if (BKE_image_has_packedfile(ima) || (ima->source == IMA_SRC_GENERATED)) {
         if (ima->id.lib == NULL) {
           num_saveable_images++;
@@ -2292,10 +2294,16 @@ int ED_image_save_all_modified_info(const bContext *C, ReportList *reports)
           BKE_reportf(reports,
                       RPT_WARNING,
                       "Packed library image: %s from library %s can't be saved",
-                      ima->id.name,
+                      ima->id.name + 2,
                       ima->id.lib->name);
         }
       }
+      else if (!is_format_writable) {
+        BKE_reportf(reports,
+                    RPT_WARNING,
+                    "Image %s can't be saved automatically, must use a different file format",
+                    ima->id.name + 2);
+      }
       else {
         if (image_has_valid_path(ima)) {
           num_saveable_images++;
@@ -2313,7 +2321,7 @@ int ED_image_save_all_modified_info(const bContext *C, ReportList *reports)
           BKE_reportf(reports,
                       RPT_WARNING,
                       "Image %s can't be saved, no valid file path: %s",
-                      ima->id.name,
+                      ima->id.name + 2,
                       ima->name);
         }
       }
@@ -2332,11 +2340,13 @@ bool ED_image_save_all_modified(const bContext *C, ReportList *reports)
   bool ok = true;
 
   for (Image *ima = bmain->images.first; ima; ima = ima->id.next) {
-    if (image_should_be_saved(ima)) {
+    bool is_format_writable;
+
+    if (image_should_be_saved(ima, &is_format_writable)) {
       if (BKE_image_has_packedfile(ima) || (ima->source == IMA_SRC_GENERATED)) {
         BKE_image_memorypack(ima);
       }
-      else {
+      else if (is_format_writable) {
         if (image_has_valid_path(ima)) {
           ImageSaveOptions opts;
           Scene *scene = CTX_data_scene(C);
diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c
index 0c525d6946c..fe93e39b085 100644
--- a/source/blender/windowmanager/intern/wm_files.c
+++ b/source/blender/windowmanager/intern/wm_files.c
@@ -2949,11 +2949,9 @@ static void wm_block_file_close_save(bContext *C, void *arg_block, void *arg_dat
   UI_popup_block_close(C, win, arg_block);
 
   if (save_images_when_file_is_closed) {
-    ReportList *reports = CTX_wm_reports(C);
-    if (!ED_image_save_all_modified(C, reports)) {
+    if (!ED_image_should_save_modified(C)) {
       execute_callback = false;
     }
-    WM_report_banner_show();
   }
 
   Main *bmain = CTX_data_main(C);
@@ -3059,10 +3057,10 @@ static uiBlock *block_create__close_file_dialog(struct bContext *C, struct ARegi
                  0,
                  0,
                  "");
+  }
 
-    LISTBASE_FOREACH (Report *, report, &reports.list) {
-      uiItemL(layout, report->message, ICON_ERROR);
-    }
+  LISTBASE_FOREACH (Report *, report, &reports.list) {
+    uiItemL(layout, report->message, ICON_ERROR);
   }
 
   BKE_reports_clear(&reports);



More information about the Bf-blender-cvs mailing list