Refactor: move preview image .blend I/O to blenkernel
Ref T76372
This commit is contained in:
parent
a0f41ba8a2
commit
538817d9a8
|
@ -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);
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Reference in New Issue