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