[Bf-blender-cvs] [c440c22] asset-experiments: RNA access to previews (image and icons).

Bastien Montagne noreply at git.blender.org
Tue Dec 16 18:05:21 CET 2014


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




More information about the Bf-blender-cvs mailing list