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

Ref T76372
This commit is contained in:
Jacques Lucke 2020-09-10 10:33:05 +02:00
parent a0f41ba8a2
commit 538817d9a8
4 changed files with 79 additions and 66 deletions

View File

@ -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);

View File

@ -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());

View File

@ -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);

View File

@ -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));