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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to