From a2714c9e4fcf9243a2117fbfa759972ff8c3e74f Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Tue, 1 Sep 2015 17:42:12 +0200 Subject: 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. --- source/blender/makesrna/intern/rna_ID.c | 114 ++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) (limited to 'source/blender/makesrna') diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c index 19b5a1b8219..88065d29a50 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); -- cgit v1.2.3