[Bf-blender-cvs] [494c180] ui-preview-buttons: changes for over-allocation
Campbell Barton
noreply at git.blender.org
Sun May 10 12:31:20 CEST 2015
Commit: 494c180af9856e27a6c9ac9e7074571ad25c59bd
Author: Campbell Barton
Date: Sun May 10 20:18:53 2015 +1000
Branches: ui-preview-buttons
https://developer.blender.org/rB494c180af9856e27a6c9ac9e7074571ad25c59bd
changes for over-allocation
use more conventional `pointer + 1` to access over alloc data.
Was confusing having 2 byte trailing member of struct.
===================================================================
M source/blender/blenkernel/intern/icons.c
M source/blender/editors/render/render_preview.c
M source/blender/makesdna/DNA_ID.h
===================================================================
diff --git a/source/blender/blenkernel/intern/icons.c b/source/blender/blenkernel/intern/icons.c
index 1656869..9971afe 100644
--- a/source/blender/blenkernel/intern/icons.c
+++ b/source/blender/blenkernel/intern/icons.c
@@ -131,17 +131,15 @@ void BKE_icons_free(void)
}
}
-static PreviewImage *previewimg_create_ex(void *deferred_data, size_t deferred_data_size)
+static PreviewImage *previewimg_create_ex(size_t deferred_data_size)
{
PreviewImage *prv_img = NULL;
- size_t overalloc = (deferred_data_size > sizeof(prv_img->deferred_data)) ?
- deferred_data_size - sizeof(prv_img->deferred_data) : 0;
int i;
- prv_img = MEM_callocN(sizeof(PreviewImage) + overalloc, "img_prv");
+ prv_img = MEM_mallocN(sizeof(PreviewImage) + deferred_data_size, "img_prv");
+ memset(prv_img, 0, sizeof(*prv_img)); /* leave deferred data dirty */
- if (deferred_data) {
- memcpy(prv_img->deferred_data, deferred_data, deferred_data_size);
+ if (deferred_data_size) {
prv_img->use_deferred = true;
}
@@ -154,7 +152,7 @@ static PreviewImage *previewimg_create_ex(void *deferred_data, size_t deferred_d
PreviewImage *BKE_previewimg_create(void)
{
- return previewimg_create_ex(NULL, 0);
+ return previewimg_create_ex(0);
}
void BKE_previewimg_freefunc(void *link)
@@ -327,7 +325,8 @@ PreviewImage *BKE_previewimg_cached_thumbnail_get(
}
if (prv && force_update) {
- if (((int)prv->deferred_data[0] == source) && STREQ(&prv->deferred_data[1], path)) {
+ const char *prv_deferred_data = PRV_DEFERRED_DATA(prv);
+ if (((int)prv_deferred_data[0] == source) && STREQ(&prv_deferred_data[1], path)) {
/* If same path, no need to re-allocate preview, just clear it up. */
BKE_previewimg_clear(prv, ICON_SIZE_ICON);
BKE_previewimg_clear(prv, ICON_SIZE_PREVIEW);
@@ -339,16 +338,15 @@ PreviewImage *BKE_previewimg_cached_thumbnail_get(
if (!prv) {
/* We pack needed data for lazy loading (source type, in a single char, and path). */
- size_t defdata_size = strlen(path) + 2;
- char *defdata = MEM_mallocN(defdata_size, __func__);
+ const size_t deferred_data_size = strlen(path) + 2;
+ char *deferred_data;
- defdata[0] = (char)source;
- strcpy(&defdata[1], path);
+ prv = previewimg_create_ex(deferred_data_size);
+ deferred_data = PRV_DEFERRED_DATA(prv);
+ deferred_data[0] = source;
+ memcpy(&deferred_data[1], path, deferred_data_size - 1);
- prv = previewimg_create_ex((void *)defdata, defdata_size);
force_update = true;
-
- MEM_freeN(defdata);
}
if (force_update) {
@@ -385,8 +383,9 @@ void BKE_previewimg_ensure(PreviewImage *prv, const int size)
if (do_icon || do_preview) {
ImBuf *thumb;
- int source = (int)prv->deferred_data[0];
- char *path = &prv->deferred_data[1];
+ char *prv_deferred_data = PRV_DEFERRED_DATA(prv);
+ int source = prv_deferred_data[0];
+ char *path = &prv_deferred_data[1];
int icon_w, icon_h;
thumb = IMB_thumb_manage(path, THB_LARGE, source);
diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c
index f3302a9..26d0519 100644
--- a/source/blender/editors/render/render_preview.c
+++ b/source/blender/editors/render/render_preview.c
@@ -939,8 +939,9 @@ static void icon_preview_startjob(void *customdata, short *stop, short *do_updat
if (sp->pr_method == PR_ICON_DEFERRED) {
PreviewImage *prv = sp->owner;
ImBuf *thumb;
- int source = (int)prv->deferred_data[0];
- char *path = &prv->deferred_data[1];
+ char *deferred_data = PRV_DEFERRED_DATA(prv);
+ int source = deferred_data[0];
+ char *path = &deferred_data[1];
// printf("generating deferred %d×%d preview for %s\n", sp->sizex, sp->sizey, path);
@@ -1064,7 +1065,7 @@ static void icon_preview_startjob_all_sizes(void *customdata, short *stop, short
while (cur_size) {
PreviewImage *prv = ip->owner;
ShaderPreview *sp = MEM_callocN(sizeof(ShaderPreview), "Icon ShaderPreview");
- const bool is_render = !prv->deferred_data;
+ const bool is_render = !prv->use_deferred;
/* construct shader preview from image size and previewcustomdata */
sp->scene = ip->scene;
diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h
index 8513938..ec169d3 100644
--- a/source/blender/makesdna/DNA_ID.h
+++ b/source/blender/makesdna/DNA_ID.h
@@ -178,10 +178,13 @@ typedef struct PreviewImage {
struct GPUTexture *gputexture[2];
int icon_id; /* Used by previews outside of ID context. */
- short use_deferred; /* for now a mere bool, if we add more deferred loading methods we can switch to bitflag. */
- char deferred_data[2]; /* *must* remain the last one, used as over-allocated mem storage. */
+ char pad[3];
+ char use_deferred; /* for now a mere bool, if we add more deferred loading methods we can switch to bitflag. */
} PreviewImage;
+#define PRV_DEFERRED_DATA(prv) \
+ (CHECK_TYPE_INLINE(prv, PreviewImage *), (void *)((prv) + 1))
+
/**
* Defines for working with IDs.
*
More information about the Bf-blender-cvs
mailing list