From 538817d9a86c446cdab7b6b2e84378e1f9b99f22 Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Thu, 10 Sep 2020 10:33:05 +0200 Subject: [PATCH] Refactor: move preview image .blend I/O to blenkernel Ref T76372 --- source/blender/blenkernel/BKE_icons.h | 5 ++ source/blender/blenkernel/intern/icons.c | 44 ++++++++++++++++ source/blender/blenloader/intern/readfile.c | 53 ++++++++------------ source/blender/blenloader/intern/writefile.c | 43 ++++------------ 4 files changed, 79 insertions(+), 66 deletions(-) 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_previews(writer, ma->preview); + BKE_previewimg_blend_write(writer, ma->preview); /* grease pencil settings */ if (ma->gp_style) { @@ -1874,7 +1851,7 @@ static void write_world(BlendWriter *writer, World *wrld, const void *id_address write_nodetree_nolib(writer, wrld->nodetree); } - write_previews(writer, wrld->preview); + BKE_previewimg_blend_write(writer, wrld->preview); } } @@ -1899,14 +1876,14 @@ static void write_light(BlendWriter *writer, Light *la, const void *id_address) write_nodetree_nolib(writer, la->nodetree); } - write_previews(writer, la->preview); + BKE_previewimg_blend_write(writer, la->preview); } } static void write_collection_nolib(BlendWriter *writer, Collection *collection) { /* Shared function for collection data-blocks and scene master collection. */ - write_previews(writer, collection->preview); + BKE_previewimg_blend_write(writer, collection->preview); LISTBASE_FOREACH (CollectionObject *, cob, &collection->gobject) { BLO_write_struct(writer, CollectionObject, cob); @@ -2251,7 +2228,7 @@ static void write_scene(BlendWriter *writer, Scene *sce, const void *id_address) write_pointcaches(writer, &(sce->rigidbody_world->shared->ptcaches)); } - write_previews(writer, sce->preview); + BKE_previewimg_blend_write(writer, sce->preview); BKE_curvemapping_curves_blend_write(writer, &sce->r.mblur_shutter_curve); LISTBASE_FOREACH (ViewLayer *, view_layer, &sce->view_layers) { @@ -2599,7 +2576,7 @@ static void write_screen(BlendWriter *writer, bScreen *screen, const void *id_ad writestruct_at_address(writer->wd, ID_SCRN, bScreen, 1, id_address, screen); BKE_id_blend_write(writer, &screen->id); - write_previews(writer, screen->preview); + BKE_previewimg_blend_write(writer, screen->preview); /* direct data */ write_area_map(writer, AREAMAP_FROM_SCREEN(screen));