Commit: a2714c9e4fcf9243a2117fbfa759972ff8c3e74f
Author: Bastien Montagne
Date:   Tue Sep 1 17:42:12 2015 +0200
Branches: master
https://developer.blender.org/rBa2714c9e4fcf9243a2117fbfa759972ff8c3e74f

RNA PreviewImage: add float pixels accessors.

Raw int pixels can be nice in some cases (much less memory used), but 
converting to/from float values
(as e.g. expected by/from Image) is not simple in py, error prone and rather 
slow.

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

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 19b5a1b..88065d2 100644
--- a/source/blender/makesrna/intern/rna_ID.c
+++ b/source/blender/makesrna/intern/rna_ID.c
@@ -484,6 +484,7 @@ static void rna_ImagePreview_size_set(PointerRNA *ptr, 
const int *values, enum e
        prv_img->flag[size] |= (PRV_CHANGED | PRV_USER_EDITED);
 }
 
+
 static int rna_ImagePreview_pixels_get_length(PointerRNA *ptr, int 
length[RNA_MAX_ARRAY_DIMENSION], enum eIconSizes size)
 {
        ID *id = ptr->id.data;
@@ -527,6 +528,70 @@ static void rna_ImagePreview_pixels_set(PointerRNA *ptr, 
const int *values, enum
        prv_img->flag[size] |= PRV_USER_EDITED;
 }
 
+
+static int rna_ImagePreview_pixels_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->w[size] * prv_img->h[size] * 4;
+
+       return length[0];
+}
+
+static void rna_ImagePreview_pixels_float_get(PointerRNA *ptr, float *values, 
enum eIconSizes size)
+{
+       ID *id = ptr->id.data;
+       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;
+       size_t i;
+
+       BLI_assert(sizeof(unsigned int) == 4);
+
+       if (id != NULL) {
+               BLI_assert(prv_img == BKE_previewimg_id_ensure(id));
+       }
+
+       BKE_previewimg_ensure(prv_img, size);
+
+       for (i = 0; i < len; i++) {
+               values[i] = data[i] * (1.0f / 255.0f);
+       }
+}
+
+static void rna_ImagePreview_pixels_float_set(PointerRNA *ptr, const float 
*values, enum eIconSizes size)
+{
+       ID *id = ptr->id.data;
+       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;
+       size_t i;
+
+       BLI_assert(sizeof(unsigned int) == 4);
+
+       if (id != NULL) {
+               BLI_assert(prv_img == BKE_previewimg_id_ensure(id));
+       }
+
+       for (i = 0; i < len; i++) {
+               data[i] = FTOCHAR(values[i]);
+       }
+       prv_img->flag[size] |= PRV_USER_EDITED;
+}
+
+
 static void rna_ImagePreview_is_image_custom_set(PointerRNA *ptr, int value)
 {
        rna_ImagePreview_is_custom_set(ptr, value, ICON_SIZE_PREVIEW);
@@ -557,6 +622,22 @@ 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_pixels_float_get_length(PointerRNA *ptr, int 
length[RNA_MAX_ARRAY_DIMENSION])
+{
+       return rna_ImagePreview_pixels_float_get_length(ptr, length, 
ICON_SIZE_PREVIEW);
+}
+
+static void rna_ImagePreview_image_pixels_float_get(PointerRNA *ptr, float 
*values)
+{
+       rna_ImagePreview_pixels_float_get(ptr, values, ICON_SIZE_PREVIEW);
+}
+
+static void rna_ImagePreview_image_pixels_float_set(PointerRNA *ptr, const 
float *values)
+{
+       rna_ImagePreview_pixels_float_set(ptr, values, ICON_SIZE_PREVIEW);
+}
+
+
 static void rna_ImagePreview_is_icon_custom_set(PointerRNA *ptr, int value)
 {
        rna_ImagePreview_is_custom_set(ptr, value, ICON_SIZE_ICON);
@@ -587,6 +668,22 @@ 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_pixels_float_get_length(PointerRNA *ptr, int 
length[RNA_MAX_ARRAY_DIMENSION])
+{
+       return rna_ImagePreview_pixels_float_get_length(ptr, length, 
ICON_SIZE_ICON);
+}
+
+static void rna_ImagePreview_icon_pixels_float_get(PointerRNA *ptr, float 
*values)
+{
+       rna_ImagePreview_pixels_float_get(ptr, values, ICON_SIZE_ICON);
+}
+
+static void rna_ImagePreview_icon_pixels_float_set(PointerRNA *ptr, const 
float *values)
+{
+       rna_ImagePreview_pixels_float_set(ptr, values, ICON_SIZE_ICON);
+}
+
+
 static int rna_ImagePreview_icon_id_get(PointerRNA *ptr)
 {
        /* Using a callback here allows us to only generate icon matching that 
preview when icon_id is requested. */
@@ -754,6 +851,15 @@ static void rna_def_image_preview(BlenderRNA *brna)
        RNA_def_property_dynamic_array_funcs(prop, 
"rna_ImagePreview_image_pixels_get_length");
        RNA_def_property_int_funcs(prop, "rna_ImagePreview_image_pixels_get", 
"rna_ImagePreview_image_pixels_set", NULL);
 
+       prop = RNA_def_property(srna, "image_pixels_float", PROP_FLOAT, 
PROP_NONE);
+       RNA_def_property_flag(prop, PROP_DYNAMIC);
+       RNA_def_property_multi_array(prop, 1, NULL);
+       RNA_def_property_ui_text(prop, "Float Image Pixels",
+                                "Image pixels components, as floats (RGBA 
concatenated values)");
+       RNA_def_property_dynamic_array_funcs(prop, 
"rna_ImagePreview_image_pixels_float_get_length");
+       RNA_def_property_float_funcs(prop, 
"rna_ImagePreview_image_pixels_float_get",
+                                    "rna_ImagePreview_image_pixels_float_set", 
NULL);
+
 
        prop = RNA_def_property(srna, "is_icon_custom", PROP_BOOLEAN, 
PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag[ICON_SIZE_ICON]", 
PRV_USER_EDITED);
@@ -773,6 +879,14 @@ static void rna_def_image_preview(BlenderRNA *brna)
        RNA_def_property_dynamic_array_funcs(prop, 
"rna_ImagePreview_icon_pixels_get_length");
        RNA_def_property_int_funcs(prop, "rna_ImagePreview_icon_pixels_get", 
"rna_ImagePreview_icon_pixels_set", NULL);
 
+       prop = RNA_def_property(srna, "icon_pixels_float", PROP_FLOAT, 
PROP_NONE);
+       RNA_def_property_flag(prop, PROP_DYNAMIC);
+       RNA_def_property_multi_array(prop, 1, NULL);
+       RNA_def_property_ui_text(prop, "Float Icon Pixels", "Icon pixels 
components, as floats (RGBA concatenated values)");
+       RNA_def_property_dynamic_array_funcs(prop, 
"rna_ImagePreview_icon_pixels_float_get_length");
+       RNA_def_property_float_funcs(prop, 
"rna_ImagePreview_icon_pixels_float_get",
+                                    "rna_ImagePreview_icon_pixels_float_set", 
NULL);
+
        prop = RNA_def_int(srna, "icon_id", 0, INT_MIN, INT_MAX, "Icon ID",
                           "Unique integer identifying this preview as an icon 
(zero means invalid)", INT_MIN, INT_MAX);
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);

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

Reply via email to