[Bf-blender-cvs] [538817d9a86] master: Refactor: move preview image .blend I/O to blenkernel

Jacques Lucke noreply at git.blender.org
Thu Sep 10 10:33:43 CEST 2020


Commit: 538817d9a86c446cdab7b6b2e84378e1f9b99f22
Author: Jacques Lucke
Date:   Thu Sep 10 10:33:05 2020 +0200
Branches: master
https://developer.blender.org/rB538817d9a86c446cdab7b6b2e84378e1f9b99f22

Refactor: move preview image .blend I/O to blenkernel

Ref T76372

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

M	source/blender/blenkernel/BKE_icons.h
M	source/blender/blenkernel/intern/icons.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/writefile.c

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

diff --git a/source/blender/blenkernel/BKE_icons.h b/source/blender/blenkernel/BKE_icons.h
index 8a4fc78eb97..e40489a80da 100644
--- a/source/blender/blenkernel/BKE_icons.h
+++ b/source/blender/blenkernel/BKE_icons.h
@@ -78,6 +78,8 @@ struct ImBuf;
 struct PreviewImage;
 struct StudioLight;
 struct bGPDlayer;
+struct BlendWriter;
+struct BlendDataReader;
 
 enum eIconSizes;
 
@@ -156,6 +158,9 @@ struct PreviewImage *BKE_previewimg_cached_thumbnail_read(const char *name,
 void BKE_previewimg_cached_release(const char *name);
 void BKE_previewimg_cached_release_pointer(struct PreviewImage *prv);
 
+void BKE_previewimg_blend_write(struct BlendWriter *writer, const struct PreviewImage *prv);
+void BKE_previewimg_blend_read(struct BlendDataReader *reader, struct PreviewImage *prv);
+
 int BKE_icon_geom_ensure(struct Icon_Geom *geom);
 struct Icon_Geom *BKE_icon_geom_from_memory(const uchar *data, size_t data_len);
 struct Icon_Geom *BKE_icon_geom_from_file(const char *filename);
diff --git a/source/blender/blenkernel/intern/icons.c b/source/blender/blenkernel/intern/icons.c
index 6f181cc74d5..01e3eef4e19 100644
--- a/source/blender/blenkernel/intern/icons.c
+++ b/source/blender/blenkernel/intern/icons.c
@@ -59,6 +59,8 @@
 #include "IMB_imbuf_types.h"
 #include "IMB_thumbs.h"
 
+#include "BLO_read_write.h"
+
 /**
  * Only allow non-managed icons to be removed (by Python for eg).
  * Previews & ID's have their own functions to remove icons.
@@ -515,6 +517,48 @@ void BKE_previewimg_ensure(PreviewImage *prv, const int size)
   }
 }
 
+void BKE_previewimg_blend_write(BlendWriter *writer, const PreviewImage *prv)
+{
+  /* Note we write previews also for undo steps. It takes up some memory,
+   * but not doing so would causes all previews to be re-rendered after
+   * undo which is too expensive. */
+
+  if (prv == NULL) {
+    return;
+  }
+
+  PreviewImage prv_copy = *prv;
+  /* don't write out large previews if not requested */
+  if (!(U.flag & USER_SAVE_PREVIEWS)) {
+    prv_copy.w[1] = 0;
+    prv_copy.h[1] = 0;
+    prv_copy.rect[1] = NULL;
+  }
+  BLO_write_struct_at_address(writer, PreviewImage, prv, &prv_copy);
+  if (prv_copy.rect[0]) {
+    BLO_write_uint32_array(writer, prv_copy.w[0] * prv_copy.h[0], prv_copy.rect[0]);
+  }
+  if (prv_copy.rect[1]) {
+    BLO_write_uint32_array(writer, prv_copy.w[1] * prv_copy.h[1], prv_copy.rect[1]);
+  }
+}
+
+void BKE_previewimg_blend_read(BlendDataReader *reader, PreviewImage *prv)
+{
+  if (prv == NULL) {
+    return;
+  }
+
+  for (int i = 0; i < NUM_ICON_SIZES; i++) {
+    if (prv->rect[i]) {
+      BLO_read_data_address(reader, &prv->rect[i]);
+    }
+    prv->gputexture[i] = NULL;
+  }
+  prv->icon_id = 0;
+  prv->tag = 0;
+}
+
 void BKE_icon_changed(const int icon_id)
 {
   BLI_assert(BLI_thread_is_main());
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 18d563cb365..93023b5e1db 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -128,6 +128,7 @@
 #include "BKE_global.h"  // for G
 #include "BKE_gpencil_modifier.h"
 #include "BKE_hair.h"
+#include "BKE_icons.h"
 #include "BKE_idprop.h"
 #include "BKE_idtype.h"
 #include "BKE_image.h"
@@ -2245,30 +2246,6 @@ static void link_glob_list(FileData *fd, ListBase *lb) /* for glob data */
 
 /** \} */
 
-/* -------------------------------------------------------------------- */
-/** \name Read Image Preview
- * \{ */
-
-static PreviewImage *direct_link_preview_image(BlendDataReader *reader, PreviewImage *old_prv)
-{
-  PreviewImage *prv = BLO_read_get_new_data_address(reader, old_prv);
-
-  if (prv) {
-    for (int i = 0; i < NUM_ICON_SIZES; i++) {
-      if (prv->rect[i]) {
-        BLO_read_data_address(reader, &prv->rect[i]);
-      }
-      prv->gputexture[i] = NULL;
-    }
-    prv->icon_id = 0;
-    prv->tag = 0;
-  }
-
-  return prv;
-}
-
-/** \} */
-
 /* -------------------------------------------------------------------- */
 /** \name Read ID
  * \{ */
@@ -3383,7 +3360,8 @@ static void direct_link_light(BlendDataReader *reader, Light *la)
     BKE_curvemapping_blend_read(reader, la->curfalloff);
   }
 
-  la->preview = direct_link_preview_image(reader, la->preview);
+  BLO_read_data_address(reader, &la->preview);
+  BKE_previewimg_blend_read(reader, la->preview);
 }
 
 /** \} */
@@ -3502,7 +3480,8 @@ static void direct_link_world(BlendDataReader *reader, World *wrld)
   BLO_read_data_address(reader, &wrld->adt);
   BKE_animdata_blend_read_data(reader, wrld->adt);
 
-  wrld->preview = direct_link_preview_image(reader, wrld->preview);
+  BLO_read_data_address(reader, &wrld->preview);
+  BKE_previewimg_blend_read(reader, wrld->preview);
   BLI_listbase_clear(&wrld->gpumaterial);
 }
 
@@ -3607,7 +3586,8 @@ static void direct_link_image(BlendDataReader *reader, Image *ima)
   }
 
   BLI_listbase_clear(&ima->anims);
-  ima->preview = direct_link_preview_image(reader, ima->preview);
+  BLO_read_data_address(reader, &ima->preview);
+  BKE_previewimg_blend_read(reader, ima->preview);
   BLO_read_data_address(reader, &ima->stereo3d_format);
   LISTBASE_FOREACH (ImageTile *, tile, &ima->tiles) {
     tile->ok = IMA_OK;
@@ -3724,7 +3704,8 @@ static void direct_link_texture(BlendDataReader *reader, Tex *tex)
 
   BLO_read_data_address(reader, &tex->coba);
 
-  tex->preview = direct_link_preview_image(reader, tex->preview);
+  BLO_read_data_address(reader, &tex->preview);
+  BKE_previewimg_blend_read(reader, tex->preview);
 
   tex->iuser.ok = 1;
   tex->iuser.scene = NULL;
@@ -3759,7 +3740,9 @@ static void direct_link_material(BlendDataReader *reader, Material *ma)
 
   ma->texpaintslot = NULL;
 
-  ma->preview = direct_link_preview_image(reader, ma->preview);
+  BLO_read_data_address(reader, &ma->preview);
+  BKE_previewimg_blend_read(reader, ma->preview);
+
   BLI_listbase_clear(&ma->gpumaterial);
 
   BLO_read_data_address(reader, &ma->gp_style);
@@ -4989,7 +4972,8 @@ static void direct_link_object(BlendDataReader *reader, Object *ob)
     }
   }
 
-  ob->preview = direct_link_preview_image(reader, ob->preview);
+  BLO_read_data_address(reader, &ob->preview);
+  BKE_previewimg_blend_read(reader, ob->preview);
 }
 
 static void direct_link_view_settings(BlendDataReader *reader,
@@ -5131,7 +5115,8 @@ static void direct_link_collection(BlendDataReader *reader, Collection *collecti
   BLO_read_list(reader, &collection->gobject);
   BLO_read_list(reader, &collection->children);
 
-  collection->preview = direct_link_preview_image(reader, collection->preview);
+  BLO_read_data_address(reader, &collection->preview);
+  BKE_previewimg_blend_read(reader, collection->preview);
 
   collection->flag &= ~COLLECTION_HAS_OBJECT_CACHE;
   collection->tag = 0;
@@ -5843,7 +5828,8 @@ static void direct_link_scene(BlendDataReader *reader, Scene *sce)
     }
   }
 
-  sce->preview = direct_link_preview_image(reader, sce->preview);
+  BLO_read_data_address(reader, &sce->preview);
+  BKE_previewimg_blend_read(reader, sce->preview);
 
   BKE_curvemapping_blend_read(reader, &sce->r.mblur_shutter_curve);
 
@@ -7147,7 +7133,8 @@ static bool direct_link_screen(BlendDataReader *reader, bScreen *screen)
   screen->context = NULL;
   screen->active_region = NULL;
 
-  screen->preview = direct_link_preview_image(reader, screen->preview);
+  BLO_read_data_address(reader, &screen->preview);
+  BKE_previewimg_blend_read(reader, screen->preview);
 
   if (!direct_link_area_map(reader, AREAMAP_FROM_SCREEN(screen))) {
     printf("Error reading Screen %s... removing it.\n", screen->id.name + 2);
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 7b089ec0f8f..fbd73e20648 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -166,6 +166,7 @@
 #include "BKE_fcurve_driver.h"
 #include "BKE_global.h"  // for G
 #include "BKE_gpencil_modifier.h"
+#include "BKE_icons.h"
 #include "BKE_idprop.h"
 #include "BKE_idtype.h"
 #include "BKE_layer.h"
@@ -659,30 +660,6 @@ static void writelist_id(WriteData *wd, int filecode, const char *structname, co
  * These functions are used by blender's .blend system for file saving/loading.
  * \{ */
 
-static void write_previews(BlendWriter *writer, const PreviewImage *prv_orig)
-{
-  /* Note we write previews also for undo steps. It takes up some memory,
-   * but not doing so would causes all previews to be re-rendered after
-   * undo which is too expensive. */
-  if (prv_orig) {
-    PreviewImage prv = *prv_orig;
-
-    /* don't write out large previews if not requested */
-    if (!(U.flag & USER_SAVE_PREVIEWS)) {
-      prv.w[1] = 0;
-      prv.h[1] = 0;
-      prv.rect[1] = NULL;
-    }
-    BLO_write_struct_at_address(writer, PreviewImage, prv_orig, &prv);
-    if (prv.rect[0]) {
-      BLO_write_uint32_array(writer, prv.w[0] * prv.h[0], prv.rect[0]);
-    }
-    if (prv.rect[1]) {
-      BLO_write_uint32_array(writer, prv.w[1] * prv.h[1], prv.rect[1]);
-    }
-  }
-}
-
 static void write_action(BlendWriter *writer, bAction *act, const void *id_address)
 {
   if (act->id.us > 0 || BLO_write_is_undo(writer)) {
@@ -1622,7 +1599,7 @@ static void write_object(BlendWriter *writer, Object *ob, const void *id_address
 
     BLO_write_struct_list(writer, LinkData, &ob->pc_ids);
 
-    write_previews(writer, ob->preview);
+    BKE_previewimg_blend_write(writer, ob->preview);
   }
 }
 
@@ -1783,7 +1760,7 @@ static void write_image(BlendWriter *writer, Image *ima, const void *id_address)
       }
     }
 
-    write_previews(writer, ima->preview);
+    BKE_previewimg_blend_write(writer, ima->preview);
 
     LISTBASE_FOREACH (ImageView *, iv, &ima->views) {
       BLO_write_struct(writer, ImageView, iv);
@@ -1820,7 +1797,7 @@ static void write_texture(BlendWriter *writer, Tex *tex, const void *id_address)
       write_nodetree_nolib(writer, tex->nodetree);
     }
 
-    write_previews(writer, tex->preview);
+    BKE_previewimg_blend_write(writer, tex->preview);
   }
 }
 
@@ -1845,7 +1822,7 @@ static void write_material(BlendWriter *writer, Material *ma, const void *id_add
       write_nodetree_nolib(writer, ma->nodetree);
     }
 
-    write

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list