Commit: 9bf323b8ce9604dad7efe533a237b8a848a23d0f
Author: Bastien Montagne
Date:   Tue Nov 8 16:14:24 2016 +0100
Branches: multi_previews_id
https://developer.blender.org/rB9bf323b8ce9604dad7efe533a237b8a848a23d0f

Replace multi-dim array access to preview image frames by API functions.

Multi-dim array access in RNA is far (very, very far) from being
optimal, so for now let's use functions instead.

===================================================================

M       source/blender/makesrna/intern/rna_ID.c

===================================================================

diff --git a/source/blender/makesrna/intern/rna_ID.c 
b/source/blender/makesrna/intern/rna_ID.c
index b2a5489..fff094e 100644
--- a/source/blender/makesrna/intern/rna_ID.c
+++ b/source/blender/makesrna/intern/rna_ID.c
@@ -531,7 +531,7 @@ static void rna_ImagePreview_pixels_get(PointerRNA *ptr, 
int *values, enum eIcon
 
        BKE_previewimg_ensure(prv_img, size);
 
-       memcpy(values, prv_img->rect[size], prv_img->w[size] * prv_img->h[size] 
* sizeof(unsigned int));
+       memcpy(values, prv_img->rect[size], 
BKE_previewimg_get_rect_size(prv_img, size));
 }
 
 static void rna_ImagePreview_pixels_set(PointerRNA *ptr, const int *values, 
enum eIconSizes size)
@@ -543,78 +543,7 @@ static void rna_ImagePreview_pixels_set(PointerRNA *ptr, 
const int *values, enum
                BLI_assert(prv_img == BKE_previewimg_id_ensure(id));
        }
 
-       memcpy(prv_img->rect[size], values, prv_img->w[size] * prv_img->h[size] 
* sizeof(unsigned int));
-       prv_img->flag[size] |= PRV_USER_EDITED;
-}
-
-
-static int rna_ImagePreview_frames_get_length(PointerRNA *ptr, int 
length[RNA_MAX_ARRAY_DIMENSION], enum eIconSizes size)
-{
-       ID *id = ptr->id.data;
-       PreviewImage *prv_img = (PreviewImage *)ptr->data;
-
-       if (id != NULL) {
-               BLI_assert(prv_img == BKE_previewimg_id_ensure(id));
-       }
-
-       BKE_previewimg_ensure(prv_img, size);
-
-       length[0] = prv_img->num_frames ? prv_img->num_frames : 1;
-       length[1] = prv_img->w[size] * prv_img->h[size];
-
-       return length[0] * length[1];
-}
-
-static void rna_ImagePreview_frames_get(PointerRNA *ptr, int *values, enum 
eIconSizes size)
-{
-       ID *id = ptr->id.data;
-       PreviewImage *prv_img = (PreviewImage *)ptr->data;
-
-       if (prv_img->num_frames == 0) {
-               rna_ImagePreview_pixels_get(ptr, values, size);
-               return;
-       }
-
-       int i;
-       unsigned int *data;
-
-       if (id != NULL) {
-               BLI_assert(prv_img == BKE_previewimg_id_ensure(id));
-       }
-
-       BKE_previewimg_ensure(prv_img, size);
-
-       ptrdiff_t copy_stride = prv_img->w[size] * prv_img->h[size];
-       ptrdiff_t stride = copy_stride + 1;
-       size_t copy_size = copy_stride * sizeof(*prv_img->rect[size]);
-       for (i = 0, data = prv_img->rect[size]; i < prv_img->num_frames; i++, 
data += stride, values += copy_stride) {
-               memcpy(values, data, copy_size);
-       }
-}
-
-static void rna_ImagePreview_frames_set(PointerRNA *ptr, const int *values, 
enum eIconSizes size)
-{
-       ID *id = ptr->id.data;
-       PreviewImage *prv_img = (PreviewImage *)ptr->data;
-
-       if (prv_img->num_frames == 0) {
-               rna_ImagePreview_pixels_set(ptr, values, size);
-               return;
-       }
-
-       int i;
-       unsigned int *data;
-
-       if (id != NULL) {
-               BLI_assert(prv_img == BKE_previewimg_id_ensure(id));
-       }
-
-       ptrdiff_t copy_stride = prv_img->w[size] * prv_img->h[size];
-       ptrdiff_t stride = copy_stride + 1;
-       size_t copy_size = copy_stride * sizeof(*prv_img->rect[size]);
-       for (i = 0, data = prv_img->rect[size]; i < prv_img->num_frames; i++, 
data += stride, values += copy_stride) {
-               memcpy(data, values, copy_size);
-       }
+       memcpy(prv_img->rect[size], values, 
BKE_previewimg_get_rect_size(prv_img, size));
        prv_img->flag[size] |= PRV_USER_EDITED;
 }
 
@@ -633,7 +562,7 @@ static int rna_ImagePreview_pixels_float_get_length(
 
        BKE_previewimg_ensure(prv_img, size);
 
-       length[0] = prv_img->w[size] * prv_img->h[size] * 4;
+       length[0] = BKE_previewimg_get_rect_size(prv_img, size);  /* / 
sizeof(*prv_img->rect[size]) * 4 */
 
        return length[0];
 }
@@ -644,7 +573,7 @@ static void rna_ImagePreview_pixels_float_get(PointerRNA 
*ptr, float *values, en
        PreviewImage *prv_img = (PreviewImage *)ptr->data;
 
        unsigned char *data = (unsigned char *)prv_img->rect[size];
-       const size_t len = prv_img->w[size] * prv_img->h[size] * 4;
+       const size_t len = BKE_previewimg_get_rect_size(prv_img, size);
        size_t i;
 
        BLI_assert(sizeof(unsigned int) == 4);
@@ -666,7 +595,7 @@ static void rna_ImagePreview_pixels_float_set(PointerRNA 
*ptr, const float *valu
        PreviewImage *prv_img = (PreviewImage *)ptr->data;
 
        unsigned char *data = (unsigned char *)prv_img->rect[size];
-       const size_t len = prv_img->w[size] * prv_img->h[size] * 4;
+       const size_t len = BKE_previewimg_get_rect_size(prv_img, size);
        size_t i;
 
        BLI_assert(sizeof(unsigned int) == 4);
@@ -681,84 +610,6 @@ static void rna_ImagePreview_pixels_float_set(PointerRNA 
*ptr, const float *valu
        prv_img->flag[size] |= PRV_USER_EDITED;
 }
 
-static int rna_ImagePreview_frames_float_get_length(PointerRNA *ptr, int 
length[RNA_MAX_ARRAY_DIMENSION], enum eIconSizes size)
-{
-       ID *id = ptr->id.data;
-       PreviewImage *prv_img = (PreviewImage *)ptr->data;
-
-       BLI_assert(sizeof(unsigned int) == 4);
-
-       if (id != NULL) {
-               BLI_assert(prv_img == BKE_previewimg_id_ensure(id));
-       }
-
-       BKE_previewimg_ensure(prv_img, size);
-
-       length[0] = prv_img->num_frames ? prv_img->num_frames : 1;
-       length[1] = prv_img->w[size] * prv_img->h[size] * 4;
-
-       return length[0] * length[1];
-}
-
-static void rna_ImagePreview_frames_float_get(PointerRNA *ptr, float *values, 
enum eIconSizes size)
-{
-       ID *id = ptr->id.data;
-       PreviewImage *prv_img = (PreviewImage *)ptr->data;
-
-       BLI_assert(sizeof(unsigned int) == 4);
-
-       if (prv_img->num_frames == 0) {
-               rna_ImagePreview_pixels_float_get(ptr, values, size);
-               return;
-       }
-
-       if (id != NULL) {
-               BLI_assert(prv_img == BKE_previewimg_id_ensure(id));
-       }
-
-       BKE_previewimg_ensure(prv_img, size);
-
-       int i;
-       unsigned char *data = (unsigned char *)prv_img->rect[size];
-       ptrdiff_t copy_stride = prv_img->w[size] * prv_img->h[size] * 4;
-       ptrdiff_t stride = copy_stride + 4;
-       for (i = 0; i < prv_img->num_frames; i++, data += stride, values += 
copy_stride) {
-               size_t j;
-               for (j = 0; j < copy_stride; j++) {
-                       values[j] = data[j] * (1.0f / 255.0f);
-               }
-       }
-}
-
-static void rna_ImagePreview_frames_float_set(PointerRNA *ptr, const float 
*values, enum eIconSizes size)
-{
-       ID *id = ptr->id.data;
-       PreviewImage *prv_img = (PreviewImage *)ptr->data;
-
-       BLI_assert(sizeof(unsigned int) == 4);
-
-       if (prv_img->num_frames == 0) {
-               rna_ImagePreview_pixels_float_set(ptr, values, size);
-               return;
-       }
-
-       if (id != NULL) {
-               BLI_assert(prv_img == BKE_previewimg_id_ensure(id));
-       }
-
-       int i;
-       unsigned char *data = (unsigned char *)prv_img->rect[size];
-       ptrdiff_t copy_stride = prv_img->w[size] * prv_img->h[size] * 4;
-       ptrdiff_t stride = copy_stride + 4;
-       for (i = 0; i < prv_img->num_frames; i++, data += stride, values += 
copy_stride) {
-               size_t j;
-               for (j = 0; j < copy_stride; j++) {
-                       data[j] = FTOCHAR(values[j]);
-               }
-       }
-       prv_img->flag[size] |= PRV_USER_EDITED;
-}
-
 
 static void rna_ImagePreview_is_image_custom_set(PointerRNA *ptr, int value)
 {
@@ -790,21 +641,6 @@ static void rna_ImagePreview_image_pixels_set(PointerRNA 
*ptr, const int *values
        rna_ImagePreview_pixels_set(ptr, values, ICON_SIZE_PREVIEW);
 }
 
-static int rna_ImagePreview_image_frames_get_length(PointerRNA *ptr, int 
length[RNA_MAX_ARRAY_DIMENSION])
-{
-       return rna_ImagePreview_frames_get_length(ptr, length, 
ICON_SIZE_PREVIEW);
-}
-
-static void rna_ImagePreview_image_frames_get(PointerRNA *ptr, int *values)
-{
-       rna_ImagePreview_frames_get(ptr, values, ICON_SIZE_PREVIEW);
-}
-
-static void rna_ImagePreview_image_frames_set(PointerRNA *ptr, const int 
*values)
-{
-       rna_ImagePreview_frames_set(ptr, values, ICON_SIZE_PREVIEW);
-}
-
 static int rna_ImagePreview_image_pixels_float_get_length(PointerRNA *ptr, int 
length[RNA_MAX_ARRAY_DIMENSION])
 {
        return rna_ImagePreview_pixels_float_get_length(ptr, length, 
ICON_SIZE_PREVIEW);
@@ -820,21 +656,6 @@ static void 
rna_ImagePreview_image_pixels_float_set(PointerRNA *ptr, const float
        rna_ImagePreview_pixels_float_set(ptr, values, ICON_SIZE_PREVIEW);
 }
 
-static int rna_ImagePreview_image_frames_float_get_length(PointerRNA *ptr, int 
length[RNA_MAX_ARRAY_DIMENSION])
-{
-       return rna_ImagePreview_frames_float_get_length(ptr, length, 
ICON_SIZE_PREVIEW);
-}
-
-static void rna_ImagePreview_image_frames_float_get(PointerRNA *ptr, float 
*values)
-{
-       rna_ImagePreview_frames_float_get(ptr, values, ICON_SIZE_PREVIEW);
-}
-
-static void rna_ImagePreview_image_frames_float_set(PointerRNA *ptr, const 
float *values)
-{
-       rna_ImagePreview_frames_float_set(ptr, values, ICON_SIZE_PREVIEW);
-}
-
 
 static void rna_ImagePreview_is_icon_custom_set(PointerRNA *ptr, int value)
 {
@@ -866,63 +687,184 @@ static void rna_ImagePreview_icon_pixels_set(PointerRNA 
*ptr, const int *values)
        rna_ImagePreview_pixels_set(ptr, values, ICON_SIZE_ICON);
 }
 
-static int rna_ImagePreview_icon_frames_get_length(PointerRNA *ptr, int 
length[RNA_MAX_ARRAY_DIMENSION])
+static int rna_ImagePreview_icon_pixels_float_get_length(PointerRNA *ptr, int 
length[RNA_MAX_ARRAY_DIMENSION])
 {
-       return rna_ImagePreview_frames_get_length(ptr, length, ICON_SIZE_ICON);
+       return rna_ImagePreview_pixels_float_get_length(ptr, length, 
ICON_SIZE_ICON);
 }
 
-static void rna_ImagePreview_icon_frames_get(PointerRNA *ptr, int *values)
+static void rna_ImagePreview_icon_pixels_float_get(PointerRNA *ptr, float 
*values)
 {
-       rna_ImagePreview_frames_get(ptr, values, ICON_SIZE_ICON);
+       rna_ImagePreview_pixels_float_get(ptr, values, ICON_SIZE_ICON);
 }
 
-static void rna_ImagePreview_icon_frames_set(PointerRNA *ptr, const int 
*values)
+static void rna_ImagePreview_icon_pixels_float_set(PointerRNA *ptr, const 
float *values)
 {
-       rna_ImagePreview_frames_set(ptr, values, ICON_SIZE_ICON);
+       rna_ImagePreview_pixels_float_set(ptr, values, ICON_SIZE_ICON);
 }
 
-static int rna_ImagePreview_icon_pixels_float_get_length(PointerRNA *ptr, int 
length[RNA_MAX_ARRAY_DIMENSION])
+
+static int rna_ImagePreview_icon_id_get(PointerRNA *ptr)
 {
-       return rna_ImagePreview_pixels_float_get_length(ptr, length, 
ICON_SIZE_ICON);
+       /* Using a callback here allows us to only generate icon matching that 
preview when icon_id is requested. */
+       return BKE_icon_preview_ensure(ptr->id.data, (PreviewImage 
*)(ptr->data));
 }
 
-static void rna_ImagePreview_icon_pixels_float_get(PointerRNA *ptr, float 
*values)
+
+static void rna_ImagePreview_icon_reload(PreviewImage *prv)
 {
-       rna_ImagePreview_pixels_float_get(ptr, values, ICON_SIZE_ICON);
+       /* will lazy load on next use, but only in case icon is not 
user-modified! */
+       if (!(prv->flag[ICON_SIZE_ICON] & PRV_USER_EDITED) && 
!(prv->flag[ICON_SIZE_PREVIEW] & PRV_USER_EDITED)) {
+               BKE_previ

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to