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

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to