[Bf-blender-cvs] [02290ec] asset-experiments: A bit crappy, but working 'ID icons' over previews.

Bastien Montagne noreply at git.blender.org
Mon Dec 15 19:56:32 CET 2014


Commit: 02290ec582b806f76d4889e4236e9289c863b6ba
Author: Bastien Montagne
Date:   Mon Dec 15 19:55:15 2014 +0100
Branches: asset-experiments
https://developer.blender.org/rB02290ec582b806f76d4889e4236e9289c863b6ba

A bit crappy, but working 'ID icons' over previews.

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

M	source/blender/editors/include/UI_interface_icons.h
M	source/blender/editors/interface/interface_icons.c
M	source/blender/editors/space_file/filelist.c
M	source/blender/imbuf/intern/thumbs.c

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

diff --git a/source/blender/editors/include/UI_interface_icons.h b/source/blender/editors/include/UI_interface_icons.h
index 4a896de..41567d1 100644
--- a/source/blender/editors/include/UI_interface_icons.h
+++ b/source/blender/editors/include/UI_interface_icons.h
@@ -79,6 +79,8 @@ int UI_iconfile_get_index(const char *filename);
 
 struct PreviewImage *UI_icon_to_preview(int icon_id);
 
+struct ImBuf *UI_icon_to_imbuf(int icon_id);
+
 int UI_rnaptr_icon_get(struct bContext *C, struct PointerRNA *ptr, int rnaicon, const bool big);
 
 #endif /*  __UI_INTERFACE_ICONS_H__ */
diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c
index 56d718f..cdefd67 100644
--- a/source/blender/editors/interface/interface_icons.c
+++ b/source/blender/editors/interface/interface_icons.c
@@ -973,6 +973,66 @@ PreviewImage *UI_icon_to_preview(int icon_id)
 	return NULL;
 }
 
+ImBuf *UI_icon_to_imbuf(int icon_id)
+{
+	Icon *icon = BKE_icon_get(icon_id);
+	DrawInfo *di;
+	ImBuf *imbuf = NULL;
+
+	if (!icon) {
+		return imbuf;
+	}
+
+	di = (DrawInfo *)icon->drawinfo;
+	if (!di) {
+		return imbuf;
+	}
+
+	if (di->type == ICON_TYPE_VECTOR) {
+		/* vector icons use the uiBlock transformation, they are not drawn
+		 * with untransformed coordinates like the other icons */
+		/* TODO */
+	}
+	else if (di->type == ICON_TYPE_TEXTURE) {
+		ImBuf *icons = IMB_allocImBuf(icongltex.w, icongltex.h, 32, IB_rect);
+
+		glEnable(GL_TEXTURE_2D);
+		glBindTexture(GL_TEXTURE_2D, icongltex.id);
+
+		glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, icons->rect);
+
+		glBindTexture(GL_TEXTURE_2D, 0);
+		glDisable(GL_TEXTURE_2D);
+
+		imbuf = IMB_allocImBuf(di->data.texture.w, di->data.texture.h, 32, IB_rect);
+		IMB_rectcpy(imbuf, icons, 0, 0, di->data.texture.x, di->data.texture.y, di->data.texture.w, di->data.texture.h);
+
+		IMB_freeImBuf(icons);
+	}
+	else if (di->type == ICON_TYPE_BUFFER) {
+		/* it is a builtin icon */
+		IconImage *iimg = di->data.buffer.image;
+#ifndef WITH_HEADLESS
+		icon_verify_datatoc(iimg);
+#endif
+
+		if (iimg->rect) {
+			imbuf = IMB_allocImBuf(iimg->w, iimg->h, 32, IB_rect);
+			memcpy(imbuf->rect, iimg->rect, sizeof(unsigned int) * imbuf->x * imbuf->y);
+		}
+	}
+	else if (di->type == ICON_TYPE_PREVIEW) {
+		PreviewImage *pi = BKE_previewimg_get((ID *)icon->obj);
+
+		if (pi && pi->rect[ICON_SIZE_ICON]) {
+			imbuf = IMB_allocImBuf(pi->w[ICON_SIZE_ICON], pi->h[ICON_SIZE_ICON], 32, IB_rect);
+			memcpy(imbuf->rect, pi->rect[ICON_SIZE_ICON], sizeof(unsigned int) * imbuf->x * imbuf->y);
+		}
+	}
+
+	return imbuf;
+}
+
 static void icon_draw_rect(float x, float y, int w, int h, float UNUSED(aspect), int rw, int rh,
                            unsigned int *rect, float alpha, const float rgb[3], const bool is_preview)
 {
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index e143f44..c86b368 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -81,6 +81,7 @@
 #include "WM_types.h"
 
 #include "UI_resources.h"
+#include "UI_interface_icons.h"
 
 #include "filelist.h"
 
@@ -89,10 +90,13 @@ struct FileList;
 typedef struct FileImage {
 	struct FileImage *next, *prev;
 	char path[FILE_MAX];
+	char relname[FILE_MAX];
 	unsigned int flags;
+	unsigned int type;
 	int index;
 	short done;
 	ImBuf *img;
+	ImBuf *icon;
 } FileImage;
 
 typedef struct FileListFilter {
@@ -807,96 +811,100 @@ ImBuf *filelist_getimage(struct FileList *filelist, const int index)
 	return file->image;
 }
 
-ImBuf *filelist_geticon_image(struct FileList *filelist, const int index)
+static ImBuf *filelist_geticon_image_ex(const unsigned int type, const unsigned int flags, const char *relname)
 {
 	ImBuf *ibuf = NULL;
-	struct direntry *file = filelist_geticon_get_file(filelist, index);
 
-	if (file->type & S_IFDIR) {
-		if (strcmp(file->relname, "..") == 0) {
+	if (type & S_IFDIR) {
+		if (strcmp(relname, "..") == 0) {
 			ibuf = gSpecialFileImages[SPECIAL_IMG_PARENT];
 		}
-		else if (strcmp(file->relname, ".") == 0) {
+		else if (strcmp(relname, ".") == 0) {
 			ibuf = gSpecialFileImages[SPECIAL_IMG_REFRESH];
 		}
 		else {
 			ibuf = gSpecialFileImages[SPECIAL_IMG_FOLDER];
 		}
 	}
-	else {
-		ibuf = gSpecialFileImages[SPECIAL_IMG_UNKNOWNFILE];
-	}
-
-	if (file->flags & BLENDERFILE) {
+	else if (flags & (BLENDERFILE)) {
 		ibuf = gSpecialFileImages[SPECIAL_IMG_BLENDFILE];
 	}
-	else if (file->flags & (MOVIEFILE | MOVIEFILE_ICON)) {
+	else if (flags & (BLENDERLIB)) {
+		ibuf = gSpecialFileImages[SPECIAL_IMG_UNKNOWNFILE];
+	}
+	else if (flags & (MOVIEFILE | MOVIEFILE_ICON)) {
 		ibuf = gSpecialFileImages[SPECIAL_IMG_MOVIEFILE];
 	}
-	else if (file->flags & SOUNDFILE) {
+	else if (flags & SOUNDFILE) {
 		ibuf = gSpecialFileImages[SPECIAL_IMG_SOUNDFILE];
 	}
-	else if (file->flags & PYSCRIPTFILE) {
+	else if (flags & PYSCRIPTFILE) {
 		ibuf = gSpecialFileImages[SPECIAL_IMG_PYTHONFILE];
 	}
-	else if (file->flags & FTFONTFILE) {
+	else if (flags & FTFONTFILE) {
 		ibuf = gSpecialFileImages[SPECIAL_IMG_FONTFILE];
 	}
-	else if (file->flags & TEXTFILE) {
+	else if (flags & TEXTFILE) {
 		ibuf = gSpecialFileImages[SPECIAL_IMG_TEXTFILE];
 	}
-	else if (file->flags & IMAGEFILE) {
+	else if (flags & IMAGEFILE) {
 		ibuf = gSpecialFileImages[SPECIAL_IMG_LOADING];
 	}
-	else if (file->flags & BLENDERFILE_BACKUP) {
+	else if (flags & BLENDERFILE_BACKUP) {
 		ibuf = gSpecialFileImages[SPECIAL_IMG_BACKUP];
 	}
+	else {
+		ibuf = gSpecialFileImages[SPECIAL_IMG_UNKNOWNFILE];
+	}
 
 	return ibuf;
 }
 
-int filelist_geticon(struct FileList *filelist, const int index)
+ImBuf *filelist_geticon_image(struct FileList *filelist, const int index)
 {
 	struct direntry *file = filelist_geticon_get_file(filelist, index);
 
-	if (file->type & S_IFDIR) {
-		if (strcmp(file->relname, "..") == 0) {
+	return filelist_geticon_image_ex(file->type, file->flags, file->relname);
+}
+
+static int filelist_geticon_ex(const unsigned int type, const unsigned int flags, const char *path, const char *relname, const bool ignore_libdir)
+{
+	if (type & S_IFDIR && !(ignore_libdir && (flags & BLENDERLIB))) {
+		if (strcmp(relname, "..") == 0) {
 			return ICON_FILE_PARENT;
 		}
-		if (file->flags & APPLICATIONBUNDLE) {
+		if (flags & APPLICATIONBUNDLE) {
 			return ICON_UGLYPACKAGE;
 		}
-		if (file->flags & BLENDERFILE) {
+		if (flags & BLENDERFILE) {
 			return ICON_FILE_BLEND;
 		}
 		return ICON_FILE_FOLDER;
 	}
-	else if (file->flags & BLENDERFILE)
+	else if (flags & BLENDERFILE)
 		return ICON_FILE_BLEND;
-	else if (file->flags & BLENDERFILE_BACKUP)
+	else if (flags & BLENDERFILE_BACKUP)
 		return ICON_FILE_BACKUP;
-	else if (file->flags & IMAGEFILE)
+	else if (flags & IMAGEFILE)
 		return ICON_FILE_IMAGE;
-	else if (file->flags & MOVIEFILE)
+	else if (flags & MOVIEFILE)
 		return ICON_FILE_MOVIE;
-	else if (file->flags & PYSCRIPTFILE)
+	else if (flags & PYSCRIPTFILE)
 		return ICON_FILE_SCRIPT;
-	else if (file->flags & SOUNDFILE)
+	else if (flags & SOUNDFILE)
 		return ICON_FILE_SOUND;
-	else if (file->flags & FTFONTFILE)
+	else if (flags & FTFONTFILE)
 		return ICON_FILE_FONT;
-	else if (file->flags & BTXFILE)
+	else if (flags & BTXFILE)
 		return ICON_FILE_BLANK;
-	else if (file->flags & COLLADAFILE)
+	else if (flags & COLLADAFILE)
 		return ICON_FILE_BLANK;
-	else if (file->flags & TEXTFILE)
+	else if (flags & TEXTFILE)
 		return ICON_FILE_TEXT;
-	else {
-		char path[FILE_MAX_LIBEXTRA], dir[FILE_MAXDIR], *group;
+	else if (flags & BLENDERLIB) {
+		char lib[FILE_MAXDIR], *group;
 
-		BLI_join_dirfile(path, sizeof(path), filelist->dir, file->relname);
-
-		if (BLO_library_path_explode(path, dir, &group, NULL) && group) {
+		if (BLO_library_path_explode(path, lib, &group, NULL) && group) {
 			int idcode = groupname_to_code(group);
 
 			/* TODO: this should most likely be completed and moved to UI_interface_icons.h ? unless it already exists somewhere... */
@@ -957,8 +965,15 @@ int filelist_geticon(struct FileList *filelist, const int index)
 					return ICON_WORLD_DATA;
 			}
 		}
-		return ICON_FILE_BLANK;
 	}
+	return ICON_FILE_BLANK;
+}
+
+int filelist_geticon(struct FileList *filelist, const int index)
+{
+	struct direntry *file = filelist_geticon_get_file(filelist, index);
+
+	return filelist_geticon_ex(file->type, file->flags, file->path, file->relname, false);
 }
 
 struct direntry *filelist_file(struct FileList *filelist, int index)
@@ -1948,6 +1963,7 @@ int filelist_readjob_running(wmWindowManager *wm, FileList *filelist)
 
 typedef struct ThumbnailJob {
 	ListBase loadimages;
+	ImBuf *static_icons_buffers[BIFICONID_LAST];
 	const short *stop;
 	const short *do_update;
 	struct FileList *filelist;
@@ -1963,6 +1979,9 @@ static void thumbnail_joblist_free(ThumbnailJob *tj)
 		if ((limg->img) && (!limg->done)) {
 			IMB_freeImBuf(limg->img);
 		}
+		if (limg->icon) {
+			IMB_freeImBuf(limg->icon);
+		}
 	}
 	BLI_freelistN(&tj->loadimages);
 }
@@ -1982,6 +2001,16 @@ static void thumbnails_startjob(void *tjv, short *stop, short *do_update, float
 		else if (limg->flags & (BLENDERFILE | BLENDERFILE_BACKUP)) {
 			limg->img = IMB_thumb_manage(limg->path, THB_NORMAL, THB_SOURCE_BLEND);
 		}
+		else if (limg->flags & BLENDERLIB) {
+			if (!limg->img) {
+				limg->img = IMB_dupImBuf(filelist_geticon_image_ex(limg->type, limg->flags, limg->relname));
+			}
+			if (limg->img && limg->icon) {
+				IMB_rectblend(limg->img, limg->img, limg->icon, NULL, NULL, NULL, 0.0f,
+				              limg->img->x - limg->icon->x, limg->img->y - limg->icon->y, 0, 0, 0, 0,
+				              limg->icon->x, limg->icon->y, IMB_BLEND_MIX, true);
+			}
+		}
 		else if (limg->flags & MOVIEFILE) {
 			limg->img = IMB_thumb_manage(limg->path, THB_NORMAL, THB_SOURCE_MOVIE);
 			if (!limg->img) {
@@ -2030,17 +2059,48 @@ void thumbnails_start(FileList *filelist, const bContext *C)
 	wmJob *wm_job;
 	ThumbnailJob *tj;
 	int idx;
-	
+
 	/* prepare job data */
 	tj = MEM_callocN(sizeof(ThumbnailJob), "thumbnails\n");
 	tj->filelist = filelist;
 	for (idx = 0; idx < filelist->numfiles; idx++) {
-		if (!filelist->filelist[idx].image) {
-			if ((filelist->filelist[idx].flags & (IMAGE

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list