[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