diff options
author | Andrea Weikert <elubie@gmx.net> | 2007-09-02 21:25:03 +0400 |
---|---|---|
committer | Andrea Weikert <elubie@gmx.net> | 2007-09-02 21:25:03 +0400 |
commit | 356ab943736e8a2434a8ff5845873482597ba5e2 (patch) | |
tree | 910356ace904dc4f11f1daf15330bb0827934f5b /source/blender/blenkernel | |
parent | 22c23fb04f7f1297b971f03d69b8b04b7dd9caa4 (diff) |
== imagebrowser ==
Initial commit of imagebrowser in trunk.
BIG COMMIT!
Main changes:
* completely reworked imasel space
* creation and storage of the preview images for materials, textures, world and lamp
* thumbnails of images and movie files when browsing in the file system
* loading previews from external .blend when linking or appending
* thumbnail caching according to the Thumbnail Managing Standard: http://jens.triq.net/thumbnail-spec/
* for now just kept imasel access mostly as old imgbrowser (CTRL+F4, CTRL+F1) a bit hidden still.
* filtering of file types (images, movies, .blend, py,...)
* preliminary managing of bookmarks ('B' button to add, XKEY while bookmark active to delete)
More detailed info which will be updated here: http://wiki.blender.org/index.php/User:Elubie/PreviewImageBrowser
Places that need special review (and probably fixes):
* BLO_blendhandle_get_previews in readblenentry
* readfile.c: do_version and refactorings of do_library_append
* UI integration
TODO and known issues still:
* Accented characters do not display correctly with international fonts
* Crash was reported when browsing in directory with movie files
* Bookmark management still needs some UI work (second scrollbar?), feedback here is welcome!
Credits:
Samir Bharadwaj (samirbharadwaj@yahoo.com) for the icon images.
Many thanks to everyone who gave feedback and helped so far!
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_icons.h | 75 | ||||
-rw-r--r-- | source/blender/blenkernel/bad_level_call_stubs/stubs.c | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/icons.c | 169 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/image.c | 11 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/material.c | 5 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object.c | 7 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/texture.c | 5 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/world.c | 7 |
8 files changed, 210 insertions, 73 deletions
diff --git a/source/blender/blenkernel/BKE_icons.h b/source/blender/blenkernel/BKE_icons.h index 315c7dc7a53..737adea78be 100644 --- a/source/blender/blenkernel/BKE_icons.h +++ b/source/blender/blenkernel/BKE_icons.h @@ -1,34 +1,32 @@ /** - * $Id$ - * - * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. The Blender - * Foundation also sells licenses for use in proprietary software under - * the Blender License. See http://www.blender.org/BL/ for information - * about this. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +* +* The Original Code is Copyright (C) 2006-2007 Blender Foundation. +* All rights reserved. +* +* The Original Code is: all of this file. +* +* Contributor(s): none yet. +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ #ifndef BKE_ICONS_H #define BKE_ICONS_H @@ -44,12 +42,13 @@ struct Icon void *drawinfo; void *obj; short type; - short changed; DrawInfoFreeFP drawinfo_free; }; typedef struct Icon Icon; +struct PreviewImage; + void BKE_icons_init(int first_dyn_id); /* return icon id for library object or create new icon if not found */ @@ -71,5 +70,19 @@ void BKE_icon_changed(int icon_id); /* free all icons */ void BKE_icons_free(); +/* free the preview image */ +void BKE_previewimg_free(struct PreviewImage **prv); + +/* free the preview image belonging to the id */ +void BKE_previewimg_free_id(ID *id); + +/* create a new preview image */ +struct PreviewImage* BKE_previewimg_create() ; + +/* create a copy of the preview image */ +struct PreviewImage* BKE_previewimg_copy(struct PreviewImage *prv); + +/* retrieve existing or create new preview image */ +PreviewImage* BKE_previewimg_get(ID *id); #endif /* BKE_ICONS_H */ diff --git a/source/blender/blenkernel/bad_level_call_stubs/stubs.c b/source/blender/blenkernel/bad_level_call_stubs/stubs.c index 4521f1d1dea..04fac832cc4 100644 --- a/source/blender/blenkernel/bad_level_call_stubs/stubs.c +++ b/source/blender/blenkernel/bad_level_call_stubs/stubs.c @@ -324,3 +324,7 @@ void antialias_tagbuf(int xsize, int ysize, char *rectmove) {} void ibuf_sample(struct ImBuf *ibuf, float fx, float fy, float dx, float dy, float *result) {} void update_for_newframe() {} + +struct FileList; +void BIF_filelist_freelib(struct FileList* filelist) {}; + diff --git a/source/blender/blenkernel/intern/icons.c b/source/blender/blenkernel/intern/icons.c index ee37a4ec9f9..f144d2badd1 100644 --- a/source/blender/blenkernel/intern/icons.c +++ b/source/blender/blenkernel/intern/icons.c @@ -1,34 +1,32 @@ /** - * $Id$ - * - * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. The Blender - * Foundation also sells licenses for use in proprietary software under - * the Blender License. See http://www.blender.org/BL/ for information - * about this. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL/BL DUAL LICENSE BLOCK ***** - */ +* $Id$ +* +* ***** BEGIN GPL LICENSE BLOCK ***** +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +* +* The Original Code is Copyright (C) 2006-2007 Blender Foundation. +* All rights reserved. +* +* The Original Code is: all of this file. +* +* Contributor(s): none yet. +* +* ***** END GPL LICENSE BLOCK ***** +* +*/ #include <math.h> #include <stdlib.h> @@ -41,6 +39,11 @@ #include "MEM_guardedalloc.h" #include "DNA_ID.h" +#include "DNA_image_types.h" +#include "DNA_lamp_types.h" +#include "DNA_material_types.h" +#include "DNA_texture_types.h" +#include "DNA_world_types.h" #include "BLI_ghash.h" @@ -111,6 +114,101 @@ void BKE_icons_free() gIcons = NULL; } +struct PreviewImage* BKE_previewimg_create() +{ + PreviewImage* prv_img = NULL; + int i; + + prv_img = MEM_callocN(sizeof(PreviewImage), "img_prv"); + + for (i=0; i<PREVIEW_MIPMAPS; ++i) { + prv_img->changed[i] = 1; + } + return prv_img; +} + +void BKE_previewimg_free(PreviewImage **prv) +{ + if(prv && (*prv)) { + int i; + + for (i=0; i<PREVIEW_MIPMAPS;++i) { + if ((*prv)->rect[i]) { + MEM_freeN((*prv)->rect[i]); + (*prv)->rect[i] = NULL; + } + } + MEM_freeN((*prv)); + *prv = NULL; + } +} + +struct PreviewImage* BKE_previewimg_copy(PreviewImage *prv) +{ + PreviewImage* prv_img = NULL; + int i; + + if (prv) { + prv_img = MEM_dupallocN(prv); + for (i=0; i < PREVIEW_MIPMAPS; ++i) { + if (prv->rect[i]) { + prv_img->rect[i] = MEM_dupallocN(prv->rect[i]); + } else { + prv_img->rect[i] = NULL; + } + } + } + return prv_img; +} + +void BKE_previewimg_free_id(ID *id) +{ + if (GS(id->name) == ID_MA) { + Material *mat = (Material*)id; + BKE_previewimg_free(&mat->preview); + } else if (GS(id->name) == ID_TE) { + Tex *tex = (Tex*)id; + BKE_previewimg_free(&tex->preview); + } else if (GS(id->name) == ID_WO) { + World *wo = (World*)id; + BKE_previewimg_free(&wo->preview); + } else if (GS(id->name) == ID_LA) { + Lamp *la = (Lamp*)id; + BKE_previewimg_free(&la->preview); + } else if (GS(id->name) == ID_IM) { + Image *img = (Image*)id; + BKE_previewimg_free(&img->preview); + } +} + +PreviewImage* BKE_previewimg_get(ID *id) +{ + PreviewImage* prv_img = NULL; + + if (GS(id->name) == ID_MA) { + Material *mat = (Material*)id; + if (!mat->preview) mat->preview = BKE_previewimg_create(); + prv_img = mat->preview; + } else if (GS(id->name) == ID_TE) { + Tex *tex = (Tex*)id; + if (!tex->preview) tex->preview = BKE_previewimg_create(); + prv_img = tex->preview; + } else if (GS(id->name) == ID_WO) { + World *wo = (World*)id; + if (!wo->preview) wo->preview = BKE_previewimg_create(); + prv_img = wo->preview; + } else if (GS(id->name) == ID_LA) { + Lamp *la = (Lamp*)id; + if (!la->preview) la->preview = BKE_previewimg_create(); + prv_img = la->preview; + } else if (GS(id->name) == ID_IM) { + Image *img = (Image*)id; + if (!img->preview) img->preview = BKE_previewimg_create(); + prv_img = img->preview; + } + + return prv_img; +} void BKE_icon_changed(int id) { @@ -122,7 +220,15 @@ void BKE_icon_changed(int id) if (icon) { - icon->changed = 1; + PreviewImage *prv = BKE_previewimg_get((ID*)icon->obj); + + /* all previews changed */ + if (prv) { + int i; + for (i=0; i<PREVIEW_MIPMAPS; ++i) { + prv->changed[i] = 1; + } + } } } @@ -151,7 +257,6 @@ int BKE_icon_getid(struct ID* id) /* next two lines make sure image gets created */ new_icon->drawinfo = 0; new_icon->drawinfo_free = 0; - new_icon->changed = 1; BLI_ghash_insert(gIcons, (void *)id->icon_id, new_icon); diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 2c91c6cb0be..3a64c3504cb 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -206,13 +206,6 @@ static void image_free_buffers(Image *ima) if(ima->anim) IMB_free_anim(ima->anim); ima->anim= NULL; - if (ima->preview) { - if (ima->preview->rect) - MEM_freeN(ima->preview->rect); - MEM_freeN(ima->preview); - ima->preview = NULL; - } - if(ima->rr) { RE_FreeRenderResult(ima->rr); ima->rr= NULL; @@ -234,6 +227,10 @@ void free_image(Image *ima) } BKE_icon_delete(&ima->id); ima->id.icon_id = 0; + if (ima->preview) { + BKE_previewimg_free(&ima->preview); + } + } /* only image block itself */ diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 56b8307020a..f5f726b1745 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -90,6 +90,7 @@ void free_material(Material *ma) if(ma->ramp_col) MEM_freeN(ma->ramp_col); if(ma->ramp_spec) MEM_freeN(ma->ramp_spec); + BKE_previewimg_free(&ma->preview); BKE_icon_delete((struct ID*)ma); ma->id.icon_id = 0; @@ -159,6 +160,8 @@ void init_material(Material *ma) ma->sss_back= 1.0f; ma->mode= MA_TRACEBLE|MA_SHADBUF|MA_SHADOW|MA_RADIO|MA_RAYBIAS|MA_TANGENT_STR; + + ma->preview = NULL; } Material *add_material(char *name) @@ -196,6 +199,8 @@ Material *copy_material(Material *ma) if(ma->ramp_col) man->ramp_col= MEM_dupallocN(ma->ramp_col); if(ma->ramp_spec) man->ramp_spec= MEM_dupallocN(ma->ramp_spec); + if (ma->preview) man->preview = BKE_previewimg_copy(ma->preview); + if(ma->nodetree) { man->nodetree= ntreeCopyTree(ma->nodetree, 0); /* 0 == full new tree */ } diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 3f26501db6f..349ccda8126 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -598,7 +598,7 @@ void *add_lamp(char *name) la->area_size=la->area_sizey=la->area_sizez= 1.0; la->buffers= 1; la->buftype= LA_SHADBUF_HALFWAY; - + la->preview=NULL; return la; } @@ -619,6 +619,8 @@ Lamp *copy_lamp(Lamp *la) id_us_plus((ID *)lan->ipo); + if (la->preview) lan->preview = BKE_previewimg_copy(la->preview); + BPY_copy_scriptlink(&la->scriptlink); return lan; @@ -696,7 +698,8 @@ void free_lamp(Lamp *la) if(mtex) MEM_freeN(mtex); } la->ipo= 0; - + + BKE_previewimg_free(&la->preview); BKE_icon_delete(&la->id); la->id.icon_id = 0; } diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c index bda933802ee..d41ceb5a4b7 100644 --- a/source/blender/blenkernel/intern/texture.c +++ b/source/blender/blenkernel/intern/texture.c @@ -390,6 +390,7 @@ void free_texture(Tex *tex) free_plugin_tex(tex->plugin); if(tex->coba) MEM_freeN(tex->coba); if(tex->env) BKE_free_envmap(tex->env); + BKE_previewimg_free(&tex->preview); BKE_icon_delete((struct ID*)tex); tex->id.icon_id = 0; } @@ -462,6 +463,8 @@ void default_tex(Tex *tex) tex->iuser.fie_ima= 2; tex->iuser.ok= 1; tex->iuser.frames= 100; + + tex->preview = NULL; } /* ------------------------------------------------------------------------- */ @@ -541,6 +544,8 @@ Tex *copy_texture(Tex *tex) if(texn->coba) texn->coba= MEM_dupallocN(texn->coba); if(texn->env) texn->env= BKE_copy_envmap(texn->env); + if(tex->preview) texn->preview = BKE_previewimg_copy(tex->preview); + return texn; } diff --git a/source/blender/blenkernel/intern/world.c b/source/blender/blenkernel/intern/world.c index 612c095aac7..ce41720cb9d 100644 --- a/source/blender/blenkernel/intern/world.c +++ b/source/blender/blenkernel/intern/world.c @@ -75,6 +75,8 @@ void free_world(World *wrld) if(mtex && mtex->tex) mtex->tex->id.us--; if(mtex) MEM_freeN(mtex); } + BKE_previewimg_free(&wrld->preview); + wrld->ipo= 0; BKE_icon_delete((struct ID*)wrld); wrld->id.icon_id = 0; @@ -102,7 +104,8 @@ World *add_world(char *name) wrld->aobias= 0.05; wrld->physicsEngine= WOPHY_BULLET;//WOPHY_SUMO; Bullet by default - + wrld->preview = NULL; + return wrld; } @@ -121,6 +124,8 @@ World *copy_world(World *wrld) } } + if (wrld->preview) wrldn->preview = BKE_previewimg_copy(wrld->preview); + BPY_copy_scriptlink(&wrld->scriptlink); id_us_plus((ID *)wrldn->ipo); |