[Bf-blender-cvs] [3e271f4] ui-preview-buttons: Previews: use a ghash to store previews of every path.

Bastien Montagne noreply at git.blender.org
Sat Apr 18 11:10:43 CEST 2015


Commit: 3e271f460a52bdb5fe3f53085e832755b5b82c15
Author: Bastien Montagne
Date:   Sat Apr 18 11:09:49 2015 +0200
Branches: ui-preview-buttons
https://developer.blender.org/rB3e271f460a52bdb5fe3f53085e832755b5b82c15

Previews: use a ghash to store previews of every path.

Simpler, sanier, and avoids Icons to have to own ImagePreview data even!

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

M	source/blender/blenkernel/BKE_icons.h
M	source/blender/blenkernel/intern/icons.c
M	source/blender/makesrna/intern/rna_main_api.c

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

diff --git a/source/blender/blenkernel/BKE_icons.h b/source/blender/blenkernel/BKE_icons.h
index ff3157e..58f3edf 100644
--- a/source/blender/blenkernel/BKE_icons.h
+++ b/source/blender/blenkernel/BKE_icons.h
@@ -90,7 +90,7 @@ void BKE_previewimg_free_id(struct ID *id);
 /* create a new preview image */
 struct PreviewImage *BKE_previewimg_create(void);
 
-struct PreviewImage *BKE_previewimg_thumbnail_create(const char *path, int source);
+struct PreviewImage *BKE_previewimg_thumbnail_create(const char *path, const int source, bool force_update);
 
 /* create a copy of the preview image */
 struct PreviewImage *BKE_previewimg_copy(struct PreviewImage *prv);
diff --git a/source/blender/blenkernel/intern/icons.c b/source/blender/blenkernel/intern/icons.c
index dd85565..75a1f61 100644
--- a/source/blender/blenkernel/intern/icons.c
+++ b/source/blender/blenkernel/intern/icons.c
@@ -65,6 +65,7 @@ static int gNextIconId = 1;
 
 static int gFirstIconId = 1;
 
+static GHash *gFilePreviews = NULL;
 
 static void icon_free(void *val)
 {
@@ -77,10 +78,6 @@ static void icon_free(void *val)
 		else if (icon->drawinfo) {
 			MEM_freeN(icon->drawinfo);
 		}
-		if (!icon->type && icon->obj) {
-			/* 'preview' icons own preview data too. */
-			BKE_previewimg_freefunc(icon->obj);
-		}
 		MEM_freeN(icon);
 	}
 }
@@ -113,14 +110,24 @@ void BKE_icons_init(int first_dyn_id)
 	gFirstIconId = first_dyn_id;
 
 	if (!gIcons)
-		gIcons = BLI_ghash_int_new("icons_init gh");
+		gIcons = BLI_ghash_int_new(__func__);
+
+	if (!gFilePreviews) {
+		gFilePreviews = BLI_ghash_str_new(__func__);
+	}
 }
 
 void BKE_icons_free(void)
 {
-	if (gIcons)
+	if (gIcons) {
 		BLI_ghash_free(gIcons, NULL, icon_free);
-	gIcons = NULL;
+		gIcons = NULL;
+	}
+
+	if (gFilePreviews) {
+		BLI_ghash_free(gFilePreviews, NULL, BKE_previewimg_freefunc);
+		gFilePreviews = NULL;
+	}
 }
 
 PreviewImage *BKE_previewimg_create(void)
@@ -140,39 +147,66 @@ PreviewImage *BKE_previewimg_create(void)
 /**
  * Generate a PreviewImage from given file path, using thumbnails management.
  */
-PreviewImage *BKE_previewimg_thumbnail_create(const char *path, int source)
+PreviewImage *BKE_previewimg_thumbnail_create(const char *path, const int source, bool force_update)
 {
-	PreviewImage *prv = BKE_previewimg_create();
+	PreviewImage *prv = NULL;
+	void **prv_v;
 	int icon_w, icon_h;
 
-	ImBuf *thumb = IMB_thumb_manage(path, THB_NORMAL, source);
+	prv_v = BLI_ghash_lookup_p(gFilePreviews, path);
+
+	if (prv_v) {
+		prv = *prv_v;
+		BLI_assert(prv);
+	}
+
+	if (prv && force_update) {
+		BKE_previewimg_clear(prv, ICON_SIZE_ICON);
+		BKE_previewimg_clear(prv, ICON_SIZE_PREVIEW);
+	}
+	else if (!prv) {
+		prv = BKE_previewimg_create();
+		force_update = true;
+	}
+
+	if (force_update) {
+		ImBuf *thumb = IMB_thumb_manage(path, THB_NORMAL, source);
+
+		if (thumb) {
+			prv->w[ICON_SIZE_PREVIEW] = thumb->x;
+			prv->h[ICON_SIZE_PREVIEW] = thumb->y;
+			prv->rect[ICON_SIZE_PREVIEW] = MEM_dupallocN(thumb->rect);
+			prv->flag[ICON_SIZE_PREVIEW] &= ~(CHANGED | USER_EDITED);
 
-	if (thumb) {
-		prv->w[ICON_SIZE_PREVIEW] = thumb->x;
-		prv->h[ICON_SIZE_PREVIEW] = thumb->y;
-		prv->rect[ICON_SIZE_PREVIEW] = MEM_dupallocN(thumb->rect);
-		prv->flag[ICON_SIZE_PREVIEW] &= ~CHANGED;
+			if (thumb->x > thumb->y) {
+				icon_w = ICON_RENDER_DEFAULT_HEIGHT;
+				icon_h = (thumb->y * icon_w) / thumb->x + 1;
+			}
+			else if (thumb->x < thumb->y) {
+				icon_h = ICON_RENDER_DEFAULT_HEIGHT;
+				icon_w = (thumb->x * icon_h) / thumb->y + 1;
+			}
+			else {
+				icon_w = icon_h = ICON_RENDER_DEFAULT_HEIGHT;
+			}
 
-		if (thumb->x > thumb->y) {
-			icon_w = ICON_RENDER_DEFAULT_HEIGHT;
-			icon_h = (thumb->y * icon_w) / thumb->x + 1;
+			IMB_scaleImBuf(thumb, icon_w, icon_h);
+			prv->w[ICON_SIZE_ICON] = icon_w;
+			prv->h[ICON_SIZE_ICON] = icon_h;
+			prv->rect[ICON_SIZE_ICON] = MEM_dupallocN(thumb->rect);
+			prv->flag[ICON_SIZE_ICON] &= ~(CHANGED | USER_EDITED);
+
+			IMB_freeImBuf(thumb);
 		}
-		else if (thumb->x < thumb->y) {
-			icon_h = ICON_RENDER_DEFAULT_HEIGHT;
-			icon_w = (thumb->x * icon_h) / thumb->y + 1;
+
+		if (prv_v) {
+			*prv_v = prv;
 		}
 		else {
-			icon_w = icon_h = ICON_RENDER_DEFAULT_HEIGHT;
+			BLI_ghash_insert(gFilePreviews, (void *)path, prv);
 		}
-
-		IMB_scaleImBuf(thumb, icon_w, icon_h);
-		prv->w[ICON_SIZE_ICON] = icon_w;
-		prv->h[ICON_SIZE_ICON] = icon_h;
-		prv->rect[ICON_SIZE_ICON] = MEM_dupallocN(thumb->rect);
-		prv->flag[ICON_SIZE_ICON] &= ~CHANGED;
-
-		IMB_freeImBuf(thumb);
 	}
+
 	return prv;
 }
 
@@ -358,7 +392,6 @@ int BKE_icon_id_get(struct ID *id)
 
 /**
  * Return icon id of given preview, or create new icon if not found.
- * Note it takes ownership of given peview data!
  */
 int BKE_icon_preview_get(PreviewImage *preview)
 {
diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c
index 9d1237e..3b8932e 100644
--- a/source/blender/makesrna/intern/rna_main_api.c
+++ b/source/blender/makesrna/intern/rna_main_api.c
@@ -123,13 +123,12 @@ static int rna_Main_thumbnail_ensure(const char *path, int source)
 	return thumb != NULL;
 }
 
-static PreviewImage *rna_Main_thumbnail_preview(const char *path, int source)
+static PreviewImage *rna_Main_thumbnail_preview(const char *path, int source, int force_update)
 {
-	PreviewImage *prv = BKE_previewimg_thumbnail_create(path, source);
+	PreviewImage *prv = BKE_previewimg_thumbnail_create(path, source, (force_update != 0));
+
+	BKE_icon_preview_get(prv);
 
-	if (!BKE_icon_preview_get(prv)) {
-		BKE_previewimg_free(&prv);
-	}
 	return prv;
 }
 
@@ -852,6 +851,8 @@ void RNA_api_main(StructRNA *srna)
 	RNA_def_function_ui_description(func, "Generate a Preview with icon_id from thumbnail of given file");
 	RNA_def_string_file_path(func, "path", NULL, FILE_MAX_LIBEXTRA, "", "Path of the file to ensure thumbnail from");
 	RNA_def_enum(func, "type", main_thumbtypes, THB_SOURCE_IMAGE, "", "Type of file to generate thumbnail from");
+	RNA_def_boolean(func, "force_update", false, "",
+	                "Force to re-run thumbnail manager on this path, even if its preview is already cached");
 	parm = RNA_def_pointer(func, "preview", "Preview", "", "Preview generated (None if failure)");
 	RNA_def_function_return(func, parm);




More information about the Bf-blender-cvs mailing list