[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