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.
  *

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to