[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