Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Eisel <julian@blender.org>2020-12-12 01:49:13 +0300
committerJulian Eisel <julian@blender.org>2020-12-14 14:16:59 +0300
commit812ea9184221a8ca5785528bebc3ef342a8ecfb4 (patch)
tree9ff927244bbb1fae38bfe6edce77895795fe4f6e /source/blender/blenkernel/intern/icons.c
parent6f7ced77e3e8ecdf32d3345fcde7021e8a3dd56c (diff)
UI/Assets: Operator to load custom preview images for data-blocks
No automatic preview generation will ever be good enough to cover all cases well. So custom preview images are a must for a preview driven data-block selection - like for asset browsing. The operator simply allows selecting an image file, which will then be read and copied into the data-blocks preview (resized if necessary). There's no UI for this currently and the operator won't be available in the search menu yet. It will later once the Asset Browser UI is merged. Reviewed as part of https://developer.blender.org/D9719. Reviewed by: Bastien Montagne, Brecht Van Lommel
Diffstat (limited to 'source/blender/blenkernel/intern/icons.c')
-rw-r--r--source/blender/blenkernel/intern/icons.c77
1 files changed, 52 insertions, 25 deletions
diff --git a/source/blender/blenkernel/intern/icons.c b/source/blender/blenkernel/intern/icons.c
index eec9013d067..58b4a8ce315 100644
--- a/source/blender/blenkernel/intern/icons.c
+++ b/source/blender/blenkernel/intern/icons.c
@@ -230,6 +230,20 @@ static PreviewImage *previewimg_create_ex(size_t deferred_data_size)
return prv_img;
}
+static PreviewImage *previewimg_deferred_create(const char *path, int source)
+{
+ /* We pack needed data for lazy loading (source type, in a single char, and path). */
+ const size_t deferred_data_size = strlen(path) + 2;
+ char *deferred_data;
+
+ PreviewImage *prv = previewimg_create_ex(deferred_data_size);
+ deferred_data = (char *)PRV_DEFERRED_DATA(prv);
+ deferred_data[0] = source;
+ memcpy(&deferred_data[1], path, deferred_data_size - 1);
+
+ return prv;
+}
+
PreviewImage *BKE_previewimg_create(void)
{
return previewimg_create_ex(0);
@@ -364,6 +378,42 @@ PreviewImage *BKE_previewimg_id_ensure(ID *id)
return NULL;
}
+void BKE_previewimg_deferred_release(PreviewImage *prv)
+{
+ if (prv) {
+ if (prv->tag & PRV_TAG_DEFFERED_RENDERING) {
+ /* We cannot delete the preview while it is being loaded in another thread... */
+ prv->tag |= PRV_TAG_DEFFERED_DELETE;
+ return;
+ }
+ if (prv->icon_id) {
+ BKE_icon_delete(prv->icon_id);
+ }
+ BKE_previewimg_freefunc(prv);
+ }
+}
+
+void BKE_previewimg_id_custom_set(ID *id, const char *path)
+{
+ PreviewImage **prv = BKE_previewimg_id_get_p(id);
+
+ /* Thumbnail previews must use the deferred pipeline. But we force them to be immediately
+ * generated here still. */
+
+ if (*prv) {
+ BKE_previewimg_deferred_release(*prv);
+ }
+ *prv = previewimg_deferred_create(path, THB_SOURCE_IMAGE);
+
+ /* Can't lazy-render the preview on access. ID previews are saved to files and we want them to be
+ * there in time. Not only if something happened to have accessed it meanwhile. */
+ for (int i = 0; i < NUM_ICON_SIZES; i++) {
+ BKE_previewimg_ensure(*prv, i);
+ /* Prevent auto-updates. */
+ (*prv)->flag[i] |= PRV_USER_EDITED;
+ }
+}
+
PreviewImage *BKE_previewimg_cached_get(const char *name)
{
return BLI_ghash_lookup(gCachedPreviews, name);
@@ -417,15 +467,7 @@ PreviewImage *BKE_previewimg_cached_thumbnail_read(const char *name,
}
if (!prv) {
- /* We pack needed data for lazy loading (source type, in a single char, and path). */
- const size_t deferred_data_size = strlen(path) + 2;
- char *deferred_data;
-
- prv = previewimg_create_ex(deferred_data_size);
- deferred_data = PRV_DEFERRED_DATA(prv);
- deferred_data[0] = source;
- memcpy(&deferred_data[1], path, deferred_data_size - 1);
-
+ previewimg_deferred_create(path, source);
force_update = true;
}
@@ -441,26 +483,11 @@ PreviewImage *BKE_previewimg_cached_thumbnail_read(const char *name,
return prv;
}
-void BKE_previewimg_cached_release_pointer(PreviewImage *prv)
-{
- if (prv) {
- if (prv->tag & PRV_TAG_DEFFERED_RENDERING) {
- /* We cannot delete the preview while it is being loaded in another thread... */
- prv->tag |= PRV_TAG_DEFFERED_DELETE;
- return;
- }
- if (prv->icon_id) {
- BKE_icon_delete(prv->icon_id);
- }
- BKE_previewimg_freefunc(prv);
- }
-}
-
void BKE_previewimg_cached_release(const char *name)
{
PreviewImage *prv = BLI_ghash_popkey(gCachedPreviews, name, MEM_freeN);
- BKE_previewimg_cached_release_pointer(prv);
+ BKE_previewimg_deferred_release(prv);
}
/**