Commit: c440c22d18da3e64c2aed15a2705c79977479efc
Author: Bastien Montagne
Date:   Tue Dec 16 18:02:31 2014 +0100
Branches: asset-experiments
https://developer.blender.org/rBc440c22d18da3e64c2aed15a2705c79977479efc

RNA access to previews (image and icons).

Note since this gives python possibility to change those previews,
we add flags to PreviewImage to tag as user_defined.

TODO: replace all those shorts-used-as-bools by bitflags!

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

M       source/blender/blenkernel/BKE_icons.h
M       source/blender/blenkernel/intern/icons.c
M       source/blender/editors/interface/interface_icons.c
M       source/blender/makesdna/DNA_ID.h
M       source/blender/makesrna/RNA_access.h
M       source/blender/makesrna/intern/rna_ID.c

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

diff --git a/source/blender/blenkernel/BKE_icons.h 
b/source/blender/blenkernel/BKE_icons.h
index 9af0d96..84cd5dc 100644
--- a/source/blender/blenkernel/BKE_icons.h
+++ b/source/blender/blenkernel/BKE_icons.h
@@ -75,6 +75,9 @@ void BKE_previewimg_freefunc(void *link);
 /* free the preview image */
 void BKE_previewimg_free(struct PreviewImage **prv);
 
+/* clear the preview image or icon, but does not free it */
+void BKE_previewimg_clear(struct PreviewImage *prv, enum eIconSizes size);
+
 /* free the preview image belonging to the id */
 void BKE_previewimg_free_id(struct ID *id);
 
diff --git a/source/blender/blenkernel/intern/icons.c 
b/source/blender/blenkernel/intern/icons.c
index e442727..e68ccce 100644
--- a/source/blender/blenkernel/intern/icons.c
+++ b/source/blender/blenkernel/intern/icons.c
@@ -158,6 +158,20 @@ void BKE_previewimg_free(PreviewImage **prv)
        }
 }
 
+void BKE_previewimg_clear(struct PreviewImage *prv, enum eIconSizes size)
+{
+       if (prv->rect[size]) {
+               MEM_freeN(prv->rect[size]);
+               prv->rect[size] = NULL;
+       }
+       if (prv->gputexture[size]) {
+               GPU_texture_free(prv->gputexture[size]);
+       }
+       prv->h[size] = prv->w[size] = 0;
+       prv->changed[size] = true;
+       prv->changed_timestamp[size] = 0;
+}
+
 PreviewImage *BKE_previewimg_copy(PreviewImage *prv)
 {
        PreviewImage *prv_img = NULL;
diff --git a/source/blender/editors/interface/interface_icons.c 
b/source/blender/editors/interface/interface_icons.c
index c8e884d..33e6468 100644
--- a/source/blender/editors/interface/interface_icons.c
+++ b/source/blender/editors/interface/interface_icons.c
@@ -939,6 +939,11 @@ static void icon_set_image(bContext *C, ID *id, 
PreviewImage *prv_img, enum eIco
                return;
        }
 
+       if (prv_img->user_edited[size]) {
+               /* user-edited preview, do not auto-update! */
+               return;
+       }
+
        icon_create_rect(prv_img, size);
 
        if (wait) {
diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h
index 6454370..2456b10 100644
--- a/source/blender/makesdna/DNA_ID.h
+++ b/source/blender/makesdna/DNA_ID.h
@@ -165,6 +165,8 @@ typedef struct PreviewImage {
        unsigned int h[2];
        short changed[2];
        short changed_timestamp[2];
+       short user_edited[2];  /* if user-edited, do not auto-update this 
anymore! */
+       short pad[2];
        unsigned int *rect[2];
        struct GPUTexture *gputexture[2];
 } PreviewImage;
diff --git a/source/blender/makesrna/RNA_access.h 
b/source/blender/makesrna/RNA_access.h
index f0582b3..c3b03c3 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -271,6 +271,7 @@ extern StructRNA RNA_HemiLamp;
 extern StructRNA RNA_Histogram;
 extern StructRNA RNA_HookModifier;
 extern StructRNA RNA_ID;
+extern StructRNA RNA_IDPreview;
 extern StructRNA RNA_IKParam;
 extern StructRNA RNA_Image;
 extern StructRNA RNA_ImageFormatSettings;
diff --git a/source/blender/makesrna/intern/rna_ID.c 
b/source/blender/makesrna/intern/rna_ID.c
index 51d8129..1f80083 100644
--- a/source/blender/makesrna/intern/rna_ID.c
+++ b/source/blender/makesrna/intern/rna_ID.c
@@ -34,6 +34,8 @@
 
 #include "BLI_utildefines.h"
 
+#include "BKE_icons.h"
+
 #include "RNA_access.h"
 #include "RNA_define.h"
 #include "RNA_enum_types.h"
@@ -405,6 +407,149 @@ static void rna_Library_filepath_set(PointerRNA *ptr, 
const char *value)
        BKE_library_filepath_set(lib, value);
 }
 
+/* ***** ImagePreview ***** */
+
+static void rna_IDPreview_is_custom_set(PointerRNA *ptr, int value, enum 
eIconSizes size) {
+       ID *id = (ID *)ptr->id.data;
+       PreviewImage *prv_img = (PreviewImage *)ptr->data;
+
+       BLI_assert(prv_img == BKE_previewimg_get(id));
+
+       prv_img->user_edited[size] = (short)value;
+       prv_img->changed[size] = true;
+
+       BKE_previewimg_clear(prv_img, size);
+}
+
+static void rna_IDPreview_size_get(PointerRNA *ptr, int *values, enum 
eIconSizes size)
+{
+       ID *id = (ID *)ptr->id.data;
+       PreviewImage *prv_img = (PreviewImage *)ptr->data;
+
+       BLI_assert(prv_img == BKE_previewimg_get(id));
+
+       values[0] = prv_img->w[size];
+       values[1] = prv_img->h[size];
+}
+
+static void rna_IDPreview_size_set(PointerRNA *ptr, const int *values, enum 
eIconSizes size)
+{
+       ID *id = (ID *)ptr->id.data;
+       PreviewImage *prv_img = (PreviewImage *)ptr->data;
+
+       BLI_assert(prv_img == BKE_previewimg_get(id));
+
+       BKE_previewimg_clear(prv_img, size);
+
+       prv_img->rect[size] = MEM_callocN(values[0] * values[1] * 
sizeof(unsigned int), "prv_rect");
+
+       prv_img->w[size] = values[0];
+       prv_img->h[size] = values[1];
+
+       prv_img->user_edited[size] = true;
+       prv_img->changed[size] = true;
+}
+
+static int rna_IDPreview_pixels_get_length(PointerRNA *ptr, int 
length[RNA_MAX_ARRAY_DIMENSION], enum eIconSizes size)
+{
+       ID *id = (ID *)ptr->id.data;
+       PreviewImage *prv_img = (PreviewImage *)ptr->data;
+
+       BLI_assert(prv_img == BKE_previewimg_get(id));
+
+       length[0] = prv_img->w[size] * prv_img->h[size];
+
+       return length[0];
+}
+
+static void rna_IDPreview_pixels_get(PointerRNA *ptr, int *values, enum 
eIconSizes size)
+{
+       ID *id = (ID *)ptr->id.data;
+       PreviewImage *prv_img = (PreviewImage *)ptr->data;
+
+       BLI_assert(prv_img == BKE_previewimg_get(id));
+
+       memcpy(values, prv_img->rect[size], prv_img->w[size] * prv_img->h[size] 
* sizeof(unsigned int));
+}
+
+static void rna_IDPreview_pixels_set(PointerRNA *ptr, const int *values, enum 
eIconSizes size)
+{
+       ID *id = (ID *)ptr->id.data;
+       PreviewImage *prv_img = (PreviewImage *)ptr->data;
+
+       BLI_assert(prv_img == BKE_previewimg_get(id));
+
+       memcpy(prv_img->rect[size], values, prv_img->w[size] * prv_img->h[size] 
* sizeof(unsigned int));
+       prv_img->user_edited[size] = true;
+}
+
+static void rna_IDPreview_image_is_custom_set(PointerRNA *ptr, int value) {
+       rna_IDPreview_is_custom_set(ptr, value, ICON_SIZE_PREVIEW);
+}
+
+static void rna_IDPreview_image_size_get(PointerRNA *ptr, int *values)
+{
+       rna_IDPreview_size_get(ptr, values, ICON_SIZE_PREVIEW);
+}
+
+static void rna_IDPreview_image_size_set(PointerRNA *ptr, const int *values)
+{
+       rna_IDPreview_size_set(ptr, values, ICON_SIZE_PREVIEW);
+}
+
+static int rna_IDPreview_image_pixels_get_length(PointerRNA *ptr, int 
length[RNA_MAX_ARRAY_DIMENSION])
+{
+       return rna_IDPreview_pixels_get_length(ptr, length, ICON_SIZE_PREVIEW);
+}
+
+static void rna_IDPreview_image_pixels_get(PointerRNA *ptr, int *values)
+{
+       rna_IDPreview_pixels_get(ptr, values, ICON_SIZE_PREVIEW);
+}
+
+static void rna_IDPreview_image_pixels_set(PointerRNA *ptr, const int *values)
+{
+       rna_IDPreview_pixels_set(ptr, values, ICON_SIZE_PREVIEW);
+}
+
+static void rna_IDPreview_icon_is_custom_set(PointerRNA *ptr, int value)
+{
+       rna_IDPreview_is_custom_set(ptr, value, ICON_SIZE_ICON);
+}
+
+static void rna_IDPreview_icon_size_get(PointerRNA *ptr, int *values)
+{
+       rna_IDPreview_size_get(ptr, values, ICON_SIZE_ICON);
+}
+
+static void rna_IDPreview_icon_size_set(PointerRNA *ptr, const int *values)
+{
+       rna_IDPreview_size_set(ptr, values, ICON_SIZE_ICON);
+}
+
+static int rna_IDPreview_icon_pixels_get_length(PointerRNA *ptr, int 
length[RNA_MAX_ARRAY_DIMENSION])
+{
+       return rna_IDPreview_pixels_get_length(ptr, length, ICON_SIZE_ICON);
+}
+
+static void rna_IDPreview_icon_pixels_get(PointerRNA *ptr, int *values)
+{
+       rna_IDPreview_pixels_get(ptr, values, ICON_SIZE_ICON);
+}
+
+static void rna_IDPreview_icon_pixels_set(PointerRNA *ptr, const int *values)
+{
+       rna_IDPreview_pixels_set(ptr, values, ICON_SIZE_ICON);
+}
+
+static PointerRNA rna_IDPreview_get(PointerRNA *ptr)
+{
+       ID *id = (ID *)ptr->data;
+       PreviewImage *prv_img = BKE_previewimg_get(id);
+
+       return rna_pointer_inherit_refine(ptr, &RNA_IDPreview, prv_img);
+}
+
 #else
 
 static void rna_def_ID_properties(BlenderRNA *brna)
@@ -523,6 +668,51 @@ static void rna_def_ID_materials(BlenderRNA *brna)
        RNA_def_boolean(func, "update_data", 0, "", "Update data by 
re-adjusting the material slots assigned");
 }
 
+static void rna_def_ID_preview(BlenderRNA *brna)
+{
+       StructRNA *srna;
+       PropertyRNA *prop;
+
+       srna = RNA_def_struct(brna, "IDPreview", NULL);
+       RNA_def_struct_sdna(srna, "PreviewImage");
+       RNA_def_struct_ui_text(srna, "ID Preview", "Preview image and icon of 
this ID, if available for that type");
+
+       prop = RNA_def_property(srna, "image_is_custom", PROP_BOOLEAN, 
PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, 
"user_edited[ICON_SIZE_PREVIEW]", 1);
+       RNA_def_property_boolean_funcs(prop, NULL, 
"rna_IDPreview_image_is_custom_set");
+       RNA_def_property_ui_text(prop, "Custom Image", "True if this preview 
image has been modified by py script, and is no more auto-generated by 
Blender");
+
+       prop = RNA_def_int_vector(srna, "image_size", 2, NULL, 0, 0, "Image 
Size",
+                                 "Width and height in pixels", 0, 0);
+       RNA_def_property_subtype(prop, PROP_PIXEL);
+       RNA_def_property_int_funcs(prop, "rna_IDPreview_image_size_get", 
"rna_IDPreview_image_size_set", NULL);
+
+       prop = RNA_def_property(srna, "image_pixels", PROP_INT, PROP_NONE);
+       RNA_def_property_flag(prop, PROP_DYNAMIC);
+       RNA_def_property_multi_array(prop, 1, NULL);
+       RNA_def_property_ui_text(prop, "Image Pixels", "Image pixels, as bytes 
(always RGBA 32bits)");
+       RNA_def_property_dynamic_array_funcs(prop, 
"rna_IDPreview_image_pixels_get_length");
+       RNA_def_property_int_funcs(prop, "rna_IDPreview_image_pixels_get", 
"rna_IDPreview_image_pixels_set", NULL);
+
+
+       prop = RNA_def_property(srna, "icon_is_custom", PROP_BOOLEAN, 
PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, 
"user_edited[ICON_SIZE_ICON]", 1);
+       RNA_def_property_boolean_funcs(prop, NULL, 
"rna_IDPreview_icon_is_custom_set");
+       RNA_def_property_ui_text(prop, "Custom Icon", "True if this preview 
icon has been modified by py script, and is no more auto-generated by Blender");
+
+       prop = RNA_def_int_vector(srna, "icon_size", 2, NULL, 0, 0, "Icon Size",
+                                 "Width and height in pixels", 0, 0);
+       RNA_def_property_subtype(prop, PROP_PIXEL);
+       RNA_def_property_int_funcs(prop, "rna_IDPreview_icon_size_get", 
"rna_IDPreview_icon_size_set", NULL);
+
+       prop = RNA_def_property(srna, "icon_pixels", PROP_INT, PROP_NONE);
+       RNA_def_property_flag(prop, PROP_DYNAMIC);
+       RNA_def_property_multi_array(prop, 1, NULL);
+       RNA_def_property_ui_text(prop, "Icon Pixels", "Icon pixels, as bytes 
(always RGBA 32bits)");
+       RNA_def_property_d

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to