[Bf-blender-cvs] [5879462] ui-preview-buttons: Initial import of part of work done on Preview stuff from asset-experiments branch.

Bastien Montagne noreply at git.blender.org
Wed Apr 15 22:21:10 CEST 2015


Commit: 5879462d99d539a6508b422733e98604fd98a678
Author: Bastien Montagne
Date:   Wed Apr 15 19:37:54 2015 +0200
Branches: ui-preview-buttons
https://developer.blender.org/rB5879462d99d539a6508b422733e98604fd98a678

Initial import of part of work done on Preview stuff from asset-experiments branch.

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

M	source/blender/blenkernel/BKE_icons.h
M	source/blender/blenkernel/intern/icons.c
M	source/blender/editors/include/UI_interface_icons.h
M	source/blender/editors/interface/interface_icons.c
M	source/blender/imbuf/intern/thumbs.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..5c4ab3c 100644
--- a/source/blender/blenkernel/BKE_icons.h
+++ b/source/blender/blenkernel/BKE_icons.h
@@ -48,6 +48,8 @@ typedef struct Icon Icon;
 struct PreviewImage;
 struct ID;
 
+enum eIconSizes;
+
 void BKE_icons_init(int first_dyn_id);
 
 /* return icon id for library object or create new icon if not found */
@@ -75,6 +77,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 d3225f3..8d9472c 100644
--- a/source/blender/blenkernel/intern/icons.c
+++ b/source/blender/blenkernel/intern/icons.c
@@ -156,6 +156,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/include/UI_interface_icons.h b/source/blender/editors/include/UI_interface_icons.h
index 9d190fa..2d4ab93 100644
--- a/source/blender/editors/include/UI_interface_icons.h
+++ b/source/blender/editors/include/UI_interface_icons.h
@@ -36,6 +36,7 @@ struct bContext;
 struct ID;
 struct PreviewImage;
 struct PointerRNA;
+struct Scene;
 
 typedef struct IconFile {
 	struct IconFile *next, *prev;
@@ -45,11 +46,13 @@ typedef struct IconFile {
 
 #define ICON_DEFAULT_HEIGHT 16
 #define ICON_DEFAULT_WIDTH  16
+#define PREVIEW_DEFAULT_HEIGHT 128
 
 #define ICON_DEFAULT_HEIGHT_SCALE ((int)(UI_UNIT_Y * 0.8f))
 #define ICON_DEFAULT_WIDTH_SCALE  ((int)(UI_UNIT_X * 0.8f))
 
-#define PREVIEW_DEFAULT_HEIGHT 96
+#define ICON_RENDER_DEFAULT_HEIGHT 32
+#define PREVIEW_RENDER_DEFAULT_HEIGHT 128
 
 /*
  * Resizable Icons for Blender
diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c
index 679681c..94dfceb 100644
--- a/source/blender/editors/interface/interface_icons.c
+++ b/source/blender/editors/interface/interface_icons.c
@@ -904,8 +904,8 @@ void UI_icons_init(int first_dyn_id)
 static int preview_render_size(enum eIconSizes size)
 {
 	switch (size) {
-		case ICON_SIZE_ICON:    return 32;
-		case ICON_SIZE_PREVIEW: return PREVIEW_DEFAULT_HEIGHT;
+		case ICON_SIZE_ICON:    return ICON_RENDER_DEFAULT_HEIGHT;
+		case ICON_SIZE_PREVIEW: return PREVIEW_RENDER_DEFAULT_HEIGHT;
 	}
 	return 0;
 }
@@ -940,6 +940,11 @@ static void icon_set_image(
 		return;
 	}
 
+	if (prv_img->user_edited[size]) {
+		/* user-edited preview, do not auto-update! */
+		return;
+	}
+
 	icon_create_rect(prv_img, size);
 
 	if (use_job) {
diff --git a/source/blender/imbuf/intern/thumbs.c b/source/blender/imbuf/intern/thumbs.c
index 2318553..c424322 100644
--- a/source/blender/imbuf/intern/thumbs.c
+++ b/source/blender/imbuf/intern/thumbs.c
@@ -45,6 +45,8 @@
 #include "IMB_thumbs.h"
 #include "IMB_metadata.h"
 
+#include "../../editors/include/UI_interface_icons.h"
+
 #include <ctype.h>
 #include <string.h>
 #include <time.h>
@@ -309,10 +311,10 @@ static ImBuf *thumb_create_ex(
 
 	switch (size) {
 		case THB_NORMAL:
-			tsize = 128;
+			tsize = PREVIEW_RENDER_DEFAULT_HEIGHT;
 			break;
 		case THB_LARGE:
-			tsize = 256;
+			tsize = PREVIEW_RENDER_DEFAULT_HEIGHT * 2;
 			break;
 		case THB_FAIL:
 			tsize = 1;
diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h
index b51b53c..ee40b3b 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 cff9e42..0601da3 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -459,6 +459,7 @@ extern StructRNA RNA_PointLamp;
 extern StructRNA RNA_PointerProperty;
 extern StructRNA RNA_Pose;
 extern StructRNA RNA_PoseBone;
+extern StructRNA RNA_Preview;
 extern StructRNA RNA_Property;
 extern StructRNA RNA_PropertyGroup;
 extern StructRNA RNA_PropertyGroupItem;
diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c
index db25786..81353e0 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"
@@ -406,6 +408,157 @@ static void rna_Library_filepath_set(PointerRNA *ptr, const char *value)
 	BKE_library_filepath_set(lib, value);
 }
 
+/* ***** ImagePreview ***** */
+
+static void rna_Preview_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));
+	UNUSED_VARS_NDEBUG(id);
+
+	prv_img->user_edited[size] = (short)value;
+	prv_img->changed[size] = true;
+
+	BKE_previewimg_clear(prv_img, size);
+}
+
+static void rna_Preview_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));
+	UNUSED_VARS_NDEBUG(id);
+
+	values[0] = prv_img->w[size];
+	values[1] = prv_img->h[size];
+}
+
+static void rna_Preview_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));
+	UNUSED_VARS_NDEBUG(id);
+
+	BKE_previewimg_clear(prv_img, size);
+
+	if (values[0] && values[1]) {
+		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_Preview_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));
+	UNUSED_VARS_NDEBUG(id);
+
+	length[0] = prv_img->w[size] * prv_img->h[size];
+
+	return length[0];
+}
+
+static void rna_Preview_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));
+	UNUSED_VARS_NDEBUG(id);
+
+	memcpy(values, prv_img->rect[size], prv_img->w[size] * prv_img->h[size] * sizeof(unsigned int));
+}
+
+static void rna_Preview_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));
+	UNUSED_VARS_NDEBUG(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_Preview_image_is_custom_set(PointerRNA *ptr, int value) {
+	rna_Preview_is_custom_set(ptr, value, ICON_SIZE_PREVIEW);
+}
+
+static void rna_Preview_image_size_get(PointerRNA *ptr, int *values)
+{
+	rna_Preview_size_get(ptr, values, ICON_SIZE_PREVIEW);
+}
+
+static void rna_Preview_image_size_set(PointerRNA *ptr, const int *values)
+{
+	rna_Preview_size_set(ptr, values, ICON_SIZE_PREVIEW);
+}
+
+static int rna_Preview_image_pixels_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
+{
+	return rna_Preview_pixels_get_length(ptr, length, ICON_SIZE_PREVIEW);
+}
+
+static void rna_Preview_image_pixels_get(PointerRNA *ptr, int *values)
+{
+	rna_Preview_pixels_get(ptr, values, ICON_SIZE_PREVIEW);
+}
+
+static void rna_Preview_image_pixels_set(PointerRNA *ptr, const int *values)
+{
+	rna_Preview_pixels_set(ptr, values, ICON_SIZE_PREVIEW);
+}
+
+static void rna_Preview_icon_is_custom_set(PointerRNA *ptr, int value)
+{
+	rna_Preview_is_custom_set(ptr, value, ICON_SIZE_ICON);
+}
+
+static void rna_Preview_icon_size_get(PointerRNA *ptr, int *values)
+{
+	rna_Preview_size_get(ptr, values, ICON_SIZE_ICON);
+}
+
+static void rna_Preview_icon_size_set(PointerRNA *ptr, const int *values)
+{
+	rna_Preview_size_set(ptr, values, ICON_SIZE_ICON);
+}
+
+static int rna_Preview_icon_pixels_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
+{
+	return rna_Preview_pixels_get_length(ptr, length, ICON_SIZE_ICON);
+}
+
+static void rna_Preview_icon_pixels_get(PointerRNA *ptr, int *values)
+{
+	rna_Preview_pixels_get(ptr, values, ICON_SIZE_ICON);
+}
+
+static void rna_Preview_icon_pixels_set(PointerRNA *ptr, const int *values)
+{
+	rna_Preview_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_Preview, prv_img);
+}
+
 #else
 
 static void rna_def_ID_properties(BlenderRNA *brna)
@@ -524,6 +677,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_preview(BlenderRNA *brna)
+{
+	StructRNA *srna;
+	PropertyRNA *prop;
+
+	srna = RNA_def_struct(brna, "Preview", NULL);
+	RNA_def_struct_sdna(srna, "PreviewImage");
+	RNA

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list