[Bf-blender-cvs] [511467f] blend-thumbnail: Change file thumbnail into a struct (we pack pixel data after the struct).
Bastien Montagne
noreply at git.blender.org
Thu Aug 27 15:04:11 CEST 2015
Commit: 511467fd3ccab5b930f9e29d0071759723273177
Author: Bastien Montagne
Date: Thu Aug 27 14:57:43 2015 +0200
Branches: blend-thumbnail
https://developer.blender.org/rB511467fd3ccab5b930f9e29d0071759723273177
Change file thumbnail into a struct (we pack pixel data after the struct).
===================================================================
M source/blender/blenkernel/BKE_library.h
M source/blender/blenkernel/BKE_main.h
M source/blender/blenkernel/intern/library.c
M source/blender/blenloader/BLO_blend_defs.h
M source/blender/blenloader/BLO_readfile.h
M source/blender/blenloader/BLO_writefile.h
M source/blender/blenloader/intern/readfile.c
M source/blender/blenloader/intern/writefile.c
M source/blender/imbuf/intern/thumbs_blend.c
M source/blender/windowmanager/intern/wm_files.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h
index c54989f..33aa6c4 100644
--- a/source/blender/blenkernel/BKE_library.h
+++ b/source/blender/blenkernel/BKE_library.h
@@ -38,6 +38,7 @@ extern "C" {
#include "BLI_compiler_attrs.h"
+struct BlenThumbnail;
struct ListBase;
struct ID;
struct ImBuf;
@@ -88,8 +89,8 @@ void BKE_main_free(struct Main *mainvar);
void BKE_main_lock(struct Main *bmain);
void BKE_main_unlock(struct Main *bmain);
-int *BKE_main_thumbnail_from_imbuf(struct Main *bmain, struct ImBuf *img);
-struct ImBuf *BKE_main_thumbnail_to_imbuf(struct Main *bmain, int *data);
+struct BlenThumbnail *BKE_main_thumbnail_from_imbuf(struct Main *bmain, struct ImBuf *img);
+struct ImBuf *BKE_main_thumbnail_to_imbuf(struct Main *bmain, struct BlenThumbnail *data);
void BKE_main_thumbnail_create(struct Main *bmain);
void BKE_main_id_tag_idcode(struct Main *mainvar, const short type, const bool tag);
diff --git a/source/blender/blenkernel/BKE_main.h b/source/blender/blenkernel/BKE_main.h
index 0365281..9736c6d 100644
--- a/source/blender/blenkernel/BKE_main.h
+++ b/source/blender/blenkernel/BKE_main.h
@@ -50,6 +50,12 @@ struct EvaluationContext;
struct Library;
struct MainLock;
+/* Blender thumbnail, as written on file (width, height, and data as char RGBA). */
+/* We pack pixel data after that struct. */
+typedef struct BlenThumbnail {
+ int width, height;
+} BlenThumbnail;
+
typedef struct Main {
struct Main *next, *prev;
char name[1024]; /* 1024 = FILE_MAX */
@@ -59,7 +65,7 @@ typedef struct Main {
char build_hash[16]; /* hash from buildinfo */
short recovered; /* indicate the main->name (file) is the recovered one */
- int *blen_thumb; /* Blender thumbnail, as written on file (width, height, and data as char RGBA). */
+ BlenThumbnail *blen_thumb;
struct Library *curlib;
ListBase scene;
@@ -113,7 +119,7 @@ typedef struct Main {
#define BLEN_THUMB_SIZE 128
-#define BLEN_THUMB_MEMSIZE(_x, _y) ((size_t)(2 + (_x) * (_y)) * sizeof(int))
+#define BLEN_THUMB_MEMSIZE(_x, _y) (sizeof(BlenThumbnail) + (size_t)((_x) * (_y)) * sizeof(int))
#ifdef __cplusplus
}
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 7a84141..a7a6c6a 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -1178,9 +1178,9 @@ void BKE_main_unlock(struct Main *bmain)
* @param img ImBuf image to generate thumbnail data from.
* @return The generated .blend file raw thumbnail data.
*/
-int *BKE_main_thumbnail_from_imbuf(Main *bmain, ImBuf *img)
+BlenThumbnail *BKE_main_thumbnail_from_imbuf(Main *bmain, ImBuf *img)
{
- int *data = NULL;
+ BlenThumbnail *data = NULL;
if (bmain) {
MEM_SAFE_FREE(bmain->blen_thumb);
@@ -1191,9 +1191,9 @@ int *BKE_main_thumbnail_from_imbuf(Main *bmain, ImBuf *img)
data = MEM_mallocN(sz, __func__);
IMB_rect_from_float(img); /* Just in case... */
- data[0] = img->x;
- data[1] = img->y;
- memcpy(&data[2], img->rect, sz - (sizeof(*data) * 2));
+ data->width = img->x;
+ data->height = img->y;
+ memcpy(&data[1], img->rect, sz - sizeof(*data));
}
if (bmain) {
@@ -1209,7 +1209,7 @@ int *BKE_main_thumbnail_from_imbuf(Main *bmain, ImBuf *img)
* @param data Raw .blend file thumbnail data.
* @return An ImBuf from given data, or NULL if invalid.
*/
-ImBuf *BKE_main_thumbnail_to_imbuf(Main *bmain, int *data)
+ImBuf *BKE_main_thumbnail_to_imbuf(Main *bmain, BlenThumbnail *data)
{
ImBuf *img = NULL;
@@ -1220,8 +1220,8 @@ ImBuf *BKE_main_thumbnail_to_imbuf(Main *bmain, int *data)
if (data) {
/* Note: we cannot use IMB_allocFromBuffer(), since it tries to dupalloc passed buffer, which will fail
* here (we do not want to pass the first two ints!). */
- img = IMB_allocImBuf((unsigned int)data[0], (unsigned int)data[1], 32, IB_rect | IB_metadata);
- memcpy(img->rect, &data[2], sizeof(*data) * (size_t)data[0] * (size_t)data[1]);
+ img = IMB_allocImBuf((unsigned int)data->width, (unsigned int)data->height, 32, IB_rect | IB_metadata);
+ memcpy(img->rect, &data[1], BLEN_THUMB_MEMSIZE(data->width, data->height) - sizeof(*data));
}
return img;
@@ -1235,8 +1235,8 @@ void BKE_main_thumbnail_create(struct Main *bmain)
MEM_SAFE_FREE(bmain->blen_thumb);
bmain->blen_thumb = MEM_callocN(BLEN_THUMB_MEMSIZE(BLEN_THUMB_SIZE, BLEN_THUMB_SIZE), __func__);
- bmain->blen_thumb[0] = BLEN_THUMB_SIZE;
- bmain->blen_thumb[1] = BLEN_THUMB_SIZE;
+ bmain->blen_thumb->width = BLEN_THUMB_SIZE;
+ bmain->blen_thumb->height = BLEN_THUMB_SIZE;
}
/* ***************** ID ************************ */
diff --git a/source/blender/blenloader/BLO_blend_defs.h b/source/blender/blenloader/BLO_blend_defs.h
index 44f0fa9..a6b06a0 100644
--- a/source/blender/blenloader/BLO_blend_defs.h
+++ b/source/blender/blenloader/BLO_blend_defs.h
@@ -75,4 +75,6 @@ enum {
ENDB = BLEND_MAKE_ID('E', 'N', 'D', 'B'),
};
+#define BLEN_THUMB_MEMSIZE_FILE(_x, _y) (sizeof(int) * (size_t)(2 + (_x) * (_y)))
+
#endif /* __BLO_BLEND_DEFS_H__ */
diff --git a/source/blender/blenloader/BLO_readfile.h b/source/blender/blenloader/BLO_readfile.h
index 71e06a8..07872a3 100644
--- a/source/blender/blenloader/BLO_readfile.h
+++ b/source/blender/blenloader/BLO_readfile.h
@@ -36,6 +36,7 @@
extern "C" {
#endif
+struct BlenThumbnail;
struct bScreen;
struct LinkNode;
struct Main;
@@ -285,7 +286,7 @@ void BLO_update_defaults_startup_blend(struct Main *mainvar);
* @return The raw thumbnail
* (MEM-allocated, as stored in file, use BKE_main_thumbnail_to_imbuf() to convert it to ImBuf image).
*/
-int *BLO_thumbnail_from_file(const char *filepath);
+struct BlenThumbnail *BLO_thumbnail_from_file(const char *filepath);
#ifdef __cplusplus
}
diff --git a/source/blender/blenloader/BLO_writefile.h b/source/blender/blenloader/BLO_writefile.h
index 9dde2f0..86e1e07 100644
--- a/source/blender/blenloader/BLO_writefile.h
+++ b/source/blender/blenloader/BLO_writefile.h
@@ -33,11 +33,14 @@
* \brief external writefile function prototypes.
*/
+struct BlenThumbnail;
struct MemFile;
struct Main;
struct ReportList;
-extern int BLO_write_file(struct Main *mainvar, const char *filepath, int write_flags, struct ReportList *reports, const int *thumb);
+extern int BLO_write_file(
+ struct Main *mainvar, const char *filepath, int write_flags,
+ struct ReportList *reports, const struct BlenThumbnail *thumb);
extern int BLO_write_file_mem(struct Main *mainvar, struct MemFile *compare, struct MemFile *current, int write_flags);
#endif
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 9d3b24e..5b24564 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -936,7 +936,7 @@ static int *read_file_thumbnail(FileData *fd)
BLI_endian_switch_int32(&data[1]);
}
- if (bhead->len < BLEN_THUMB_MEMSIZE(data[0], data[1])) {
+ if (bhead->len < BLEN_THUMB_MEMSIZE_FILE(data[0], data[1])) {
break;
}
@@ -1352,18 +1352,23 @@ bool BLO_library_path_explode(const char *path, char *r_dir, char **r_group, cha
return true;
}
-int *BLO_thumbnail_from_file(const char *filepath)
+BlenThumbnail *BLO_thumbnail_from_file(const char *filepath)
{
FileData *fd;
- int *fd_data, *data;
+ BlenThumbnail *data;
+ int *fd_data;
fd = blo_openblenderfile_minimal(filepath);
fd_data = fd ? read_file_thumbnail(fd) : NULL;
if (fd_data) {
- const size_t data_size = BLEN_THUMB_MEMSIZE(fd_data[0], fd_data[1]);
- data = MEM_mallocN(data_size, __func__);
- memcpy(data, fd_data, data_size);
+ const size_t sz = BLEN_THUMB_MEMSIZE(fd_data[0], fd_data[1]);
+ data = MEM_mallocN(sz, __func__);
+
+ BLI_assert((sz - sizeof(*data)) == (BLEN_THUMB_MEMSIZE_FILE(fd_data[0], fd_data[1]) - (sizeof(*fd_data) * 2)));
+ data->width = fd_data[0];
+ data->height = fd_data[1];
+ memcpy(&data[1], &fd_data[2], sz - sizeof(*data));
}
else {
data = NULL;
@@ -8265,10 +8270,14 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filepath)
const int *data = read_file_thumbnail(fd);
if (data) {
- const size_t data_size = BLEN_THUMB_MEMSIZE(data[0], data[1]);
-
- bfd->main->blen_thumb = MEM_mallocN(data_size, __func__);
- memcpy(bfd->main->blen_thumb, data, data_size);
+ const size_t sz = BLEN_THUMB_MEMSIZE(data[0], data[1]);
+ bfd->main->blen_thumb = MEM_mallocN(sz, __func__);
+
+ BLI_assert((sz - sizeof(*bfd->main->blen_thumb)) ==
+ (BLEN_THUMB_MEMSIZE_FILE(data[0], data[1]) - (sizeof(*data) * 2)));
+ bfd->main->blen_thumb->width = data[0];
+ bfd->main->blen_thumb->height = data[1];
+ memcpy(&bfd->main->blen_thumb[1], &data[2], sz - sizeof(*bfd->main->blen_thumb));
}
}
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 2dfb100..7cb6913 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -3688,10 +3688,18 @@ static void write_global(WriteData *wd, int fileflags, Main *mainvar)
* second are an RGBA image (unsigned char)
* note, this uses 'TEST' since new types will segfault on file load for older blender versions.
*/
-static void write_thumb(WriteData *wd, const int *img)
+static void write_thumb(WriteData *wd, const BlenThumbnail *thumb)
{
- if (img)
- writedata(wd, TEST, (2 + img[0] * img[1]) * sizeof(int), img);
+ if (thumb) {
+ size_t sz = BLEN_THUMB_MEMSIZE_FILE(thumb->width, thumb->height);
+ int *img = alloca(sz);
+
+ BLI_assert((sz - (sizeof(*img) * 2)) == (BLEN_THUMB_MEMSIZE(thumb->width, thumb->height) - sizeof(thumb)));
+ img[0] = thumb->width;
+ img[1] = thumb->height;
+ memcpy(&img[2], &thumb[1], sz - (sizeof(*img) * 2));
+ writedata(wd, TEST, sz, img);
+ }
}
/* if MemFile * there's filesave to memory */
@@ -3699,7 +3707,7 @@ static int write_file_handle(
Main *mainvar,
WriteWrap *ww,
MemFile *compare, MemFile *current,
- int write_user_block, int write_flags, const int *thumb)
+ int write_user_block, int write_
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list