== 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!
This commit is contained in:
Andrea Weikert 2007-09-02 17:25:03 +00:00
parent 22c23fb04f
commit 356ab94373
72 changed files with 5916 additions and 2699 deletions

@ -382,12 +382,18 @@
<File
RelativePath="..\..\..\source\blender\imbuf\intern\imageprocess.c">
</File>
<File
RelativePath="..\..\..\source\blender\imbuf\intern\imginfo.c">
</File>
<File
RelativePath="..\..\..\source\blender\imbuf\intern\iris.c">
</File>
<File
RelativePath="..\..\..\source\blender\imbuf\intern\jpeg.c">
</File>
<File
RelativePath="..\..\..\source\blender\imbuf\intern\md5.c">
</File>
<File
RelativePath="..\..\..\source\blender\imbuf\intern\openexr\openexr_api.cpp">
</File>
@ -418,6 +424,9 @@
<File
RelativePath="..\..\..\source\blender\imbuf\intern\targa.c">
</File>
<File
RelativePath="..\..\..\source\blender\imbuf\intern\thumbs.c">
</File>
<File
RelativePath="..\..\..\source\blender\imbuf\intern\tiff.c">
</File>
@ -533,6 +542,9 @@
<File
RelativePath="..\..\..\source\blender\imbuf\IMB_imbuf_types.h">
</File>
<File
RelativePath="..\..\..\source\blender\imbuf\intern\IMB_imginfo.h">
</File>
<File
RelativePath="..\..\..\source\blender\imbuf\intern\IMB_iris.h">
</File>
@ -548,6 +560,9 @@
<File
RelativePath="..\..\..\source\blender\imbuf\intern\IMB_targa.h">
</File>
<File
RelativePath="..\..\..\source\blender\imbuf\IMB_thumbs.h">
</File>
<File
RelativePath="..\..\..\source\blender\imbuf\intern\IMB_tiff.h">
</File>

@ -328,12 +328,18 @@
<File
RelativePath="..\..\..\source\blender\src\eventdebug.c">
</File>
<File
RelativePath="..\..\..\source\blender\src\filelist.c">
</File>
<File
RelativePath="..\..\..\source\blender\src\filesel.c">
</File>
<File
RelativePath="..\..\..\source\blender\src\fluidsim.c">
</File>
<File
RelativePath="..\..\..\source\blender\src\fsmenu.c">
</File>
<File
RelativePath="..\..\..\source\blender\src\ghostwinlay.c">
</File>
@ -463,6 +469,9 @@
<File
RelativePath="..\..\..\source\blender\src\previewrender.c">
</File>
<File
RelativePath="..\..\..\source\blender\src\prvicons.c">
</File>
<File
RelativePath="..\..\..\source\blender\src\renderwin.c">
</File>
@ -680,6 +689,9 @@
<File
RelativePath="..\..\..\source\blender\include\BIF_editview.h">
</File>
<File
RelativePath="..\..\..\source\blender\include\BIF_filelist.h">
</File>
<File
RelativePath="..\..\..\source\blender\include\BIF_fsmenu.h">
</File>

BIN
release/datafiles/prvicons Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

@ -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 */

@ -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) {};

@ -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);

@ -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 */

@ -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 */
}

@ -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;
}

@ -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;
}

@ -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);

@ -217,6 +217,11 @@ int BLI_streq(char *a, char *b);
*/
int BLI_strcaseeq(char *a, char *b);
/* in util.c */
#ifdef WITH_ICONV
void BLI_string_to_utf8(char *original, char *utf_8, char *code);
#endif
/**
* Read a file as ASCII lines. An empty list is
* returned if the file cannot be opened or read.

@ -52,6 +52,8 @@ struct header{
typedef unsigned int mode_t;
#endif
struct ImBuf;
struct direntry{
char *string;
mode_t type;
@ -68,6 +70,7 @@ struct direntry{
char extra[16];
void *poin;
int nr;
struct ImBuf *image;
};
struct dirlink

@ -1491,6 +1491,38 @@ int BLI_strncasecmp(const char *s1, const char *s2, int n) {
return 0;
}
#ifdef WITH_ICONV
#include "iconv.h"
#include "localcharset.h"
void BLI_string_to_utf8(char *original, char *utf_8, char *code)
{
size_t inbytesleft=strlen(original);
size_t outbytesleft=512;
size_t rv=0;
iconv_t cd;
if (NULL == code) {
code = locale_charset();
}
cd=iconv_open("UTF-8", code);
if (cd == (iconv_t)(-1)) {
printf("iconv_open Error");
*utf_8='\0';
return ;
}
rv=iconv(cd, &original, &inbytesleft, &utf_8, &outbytesleft);
if (rv == (size_t) -1) {
printf("iconv Error\n");
return ;
}
*utf_8 = '\0';
iconv_close(cd);
}
#endif // WITH_ICONV
void BLI_timestr(double time, char *str)
{
/* format 00:00:00.00 (hr:min:sec) string has to be 12 long */

@ -38,12 +38,15 @@ extern "C" {
#endif
struct SpaceFile;
struct SpaceImaSel;
struct FileList;
struct LinkNode;
struct Main;
struct UserDef;
struct bScreen;
struct Scene;
struct MemFile;
struct direntry;
typedef struct BlendHandle BlendHandle;
@ -191,6 +194,21 @@ BLO_blendhandle_get_datablock_names(
BlendHandle *bh,
int ofblocktype);
/**
* Gets the previews of all the datablocks in a file
* of a certain type (ie. All the scene names in
* a file).
*
* @param bh The blendhandle to access.
* @param ofblocktype The type of names to get.
* @return A BLI_linklist of PreviewImage. The PreviewImage links
* should be freed with malloc.
*/
struct LinkNode*
BLO_blendhandle_get_previews(
BlendHandle *bh,
int ofblocktype);
/**
* Gets the names of all the datablock groups in a
* file. (ie. file contains Scene, Mesh, and Lamp
@ -219,6 +237,7 @@ BLO_blendhandle_close(
char *BLO_gethome(void);
int BLO_has_bfile_extension(char *str);
void BLO_library_append(struct SpaceFile *sfile, char *dir, int idcode);
void BLO_library_append_(BlendHandle **libfiledata, struct direntry* filelist, int totfile, char *dir, char* file, short flag, int idcode);
void BLO_script_library_append(BlendHandle *bh, char *dir, char *name, int idcode, short flag, struct Scene *scene);
BlendFileData* blo_read_blendafterruntime(int file, int actualsize, BlendReadError *error_r);

@ -50,6 +50,7 @@
#include "DNA_space_types.h"
#include "DNA_userdef_types.h"
#include "DNA_ID.h"
#include "DNA_material_types.h"
#include "BKE_utildefines.h" // for ENDB
@ -61,6 +62,7 @@
#include "BLO_undofile.h"
#include "readfile.h"
#include "genfile.h"
#include "BLO_readblenfile.h"
@ -218,6 +220,70 @@ LinkNode *BLO_blendhandle_get_datablock_names(BlendHandle *bh, int ofblocktype)
return names;
}
LinkNode *BLO_blendhandle_get_previews(BlendHandle *bh, int ofblocktype)
{
FileData *fd= (FileData*) bh;
LinkNode *previews= NULL;
BHead *bhead;
int looking=0;
int npreviews = 0;
PreviewImage* prv = NULL;
PreviewImage* new_prv = NULL;
for (bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead)) {
if (bhead->code==ofblocktype) {
ID *id= (ID*) (bhead+1);
if (GS(id->name) == ID_MA) {
new_prv = MEM_callocN(sizeof(PreviewImage), "newpreview");
BLI_linklist_prepend(&previews, new_prv);
looking = 1;
}
} else if (bhead->code==DATA) {
if (looking) {
if (bhead->SDNAnr == dna_findstruct_nr(fd->filesdna, "PreviewImage") ) {
prv = (PreviewImage*) (bhead+1);
npreviews = 0;
memcpy(new_prv, prv, sizeof(PreviewImage));
if (prv->rect[0]) {
unsigned int *rect = NULL;
int rectlen = 0;
new_prv->rect[0] = MEM_callocN(new_prv->w[0]*new_prv->h[0]*sizeof(unsigned int), "prvrect");
bhead= blo_nextbhead(fd, bhead);
rect = (unsigned int*)(bhead+1);
rectlen = new_prv->w[0]*new_prv->h[0]*sizeof(unsigned int);
memcpy(new_prv->rect[0], rect, bhead->len);
} else {
new_prv->rect[0] = NULL;
}
if (prv->rect[1]) {
unsigned int *rect = NULL;
int rectlen = 0;
new_prv->rect[1] = MEM_callocN(new_prv->w[1]*new_prv->h[1]*sizeof(unsigned int), "prvrect");
bhead= blo_nextbhead(fd, bhead);
rect = (unsigned int*)(bhead+1);
rectlen = new_prv->w[1]*new_prv->h[1]*sizeof(unsigned int);
memcpy(new_prv->rect[1], rect, bhead->len);
} else {
new_prv->rect[1] = NULL;
}
}
}
} else if (bhead->code==ENDB) {
break;
} else if (bhead->code==DATA) {
/* DATA blocks between IDBlock and Preview */
} else {
looking = 0;
new_prv = NULL;
prv = NULL;
}
}
return previews;
}
LinkNode *BLO_blendhandle_get_linkable_groups(BlendHandle *bh)
{
FileData *fd= (FileData*) bh;

@ -137,6 +137,7 @@
#include "BKE_idprop.h"
#include "BIF_butspace.h" // badlevel, for do_versions, patching event codes
#include "BIF_filelist.h" // badlevel too, where to move this? - elubie
#include "BIF_previewrender.h" // bedlelvel, for struct RenderInfo
#include "BLO_readfile.h"
#include "BLO_undofile.h"
@ -1541,7 +1542,12 @@ static PreviewImage *direct_link_preview_image(FileData *fd, PreviewImage *old_p
PreviewImage *prv= newdataadr(fd, old_prv);
if (prv) {
prv->rect = newdataadr(fd, prv->rect);
int i;
for (i=0; i < PREVIEW_MIPMAPS; ++i) {
if (prv->rect[i]) {
prv->rect[i] = newdataadr(fd, prv->rect[i]);
}
}
}
return prv;
@ -1911,6 +1917,7 @@ static void direct_link_lamp(FileData *fd, Lamp *la)
for(a=0; a<MAX_MTEX; a++) {
la->mtex[a]= newdataadr(fd, la->mtex[a]);
}
la->preview = direct_link_preview_image(fd, la->preview);
}
/* ************ READ keys ***************** */
@ -2058,6 +2065,7 @@ static void direct_link_world(FileData *fd, World *wrld)
for(a=0; a<MAX_MTEX; a++) {
wrld->mtex[a]= newdataadr(fd, wrld->mtex[a]);
}
wrld->preview = direct_link_preview_image(fd, wrld->preview);
}
@ -2367,6 +2375,8 @@ static void direct_link_texture(FileData *fd, Tex *tex)
memset(tex->env->cube, 0, 6*sizeof(void *));
tex->env->ok= 0;
}
tex->preview = direct_link_preview_image(fd, tex->preview);
tex->iuser.ok= 1;
}
@ -2424,6 +2434,8 @@ static void direct_link_material(FileData *fd, Material *ma)
ma->nodetree= newdataadr(fd, ma->nodetree);
if(ma->nodetree)
direct_link_nodetree(fd, ma->nodetree);
ma->preview = direct_link_preview_image(fd, ma->preview);
}
/* ************ READ MESH ***************** */
@ -3448,7 +3460,13 @@ static void lib_link_screen(FileData *fd, Main *main)
sfile->pupmenu= NULL;
}
else if(sl->spacetype==SPACE_IMASEL) {
check_imasel_copy((SpaceImaSel *)sl);
SpaceImaSel *simasel= (SpaceImaSel *)sl;
simasel->files = NULL;
simasel->returnfunc= NULL;
simasel->menup= NULL;
simasel->pupmenu= NULL;
simasel->img= NULL;
}
else if(sl->spacetype==SPACE_ACTION) {
SpaceAction *saction= (SpaceAction *)sl;
@ -3618,7 +3636,10 @@ void lib_link_screen_restore(Main *newmain, Scene *curscene)
sfile->libfiledata= 0;
}
else if(sl->spacetype==SPACE_IMASEL) {
;
SpaceImaSel *simasel= (SpaceImaSel *)sl;
if (simasel->files) {
BIF_filelist_freelib(simasel->files);
}
}
else if(sl->spacetype==SPACE_ACTION) {
SpaceAction *saction= (SpaceAction *)sl;
@ -6481,6 +6502,62 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
Mesh *me;
for(me=main->mesh.first; me; me=me->id.next)
customdata_version_243(me);
}
}
if (main->versionfile < 244) {
bScreen *sc;
Image* ima;
/* repair preview from 242 */
for(ima= main->image.first; ima; ima= ima->id.next) {
ima->preview = NULL;
}
/* repair imasel space - completely reworked */
for(sc= main->screen.first; sc; sc= sc->id.next) {
ScrArea *sa;
sa= sc->areabase.first;
while(sa) {
SpaceLink *sl;
for (sl= sa->spacedata.first; sl; sl= sl->next) {
if(sl->spacetype==SPACE_IMASEL) {
SpaceImaSel *simasel= (SpaceImaSel*) sl;
simasel->blockscale= 0.7;
/* view 2D */
simasel->v2d.tot.xmin= -10.0;
simasel->v2d.tot.ymin= -10.0;
simasel->v2d.tot.xmax= (float)sa->winx + 10.0f;
simasel->v2d.tot.ymax= (float)sa->winy + 10.0f;
simasel->v2d.cur.xmin= 0.0;
simasel->v2d.cur.ymin= 0.0;
simasel->v2d.cur.xmax= (float)sa->winx;
simasel->v2d.cur.ymax= (float)sa->winy;
simasel->v2d.min[0]= 1.0;
simasel->v2d.min[1]= 1.0;
simasel->v2d.max[0]= 32000.0f;
simasel->v2d.max[1]= 32000.0f;
simasel->v2d.minzoom= 0.5f;
simasel->v2d.maxzoom= 1.21f;
simasel->v2d.scroll= 0;
simasel->v2d.keepaspect= 1;
simasel->v2d.keepzoom= 1;
simasel->v2d.keeptot= 0;
simasel->prv_h = 96;
simasel->prv_w = 96;
simasel->flag = 7; /* ??? elubie */
strcpy (simasel->dir, U.textudir); /* TON */
strcpy (simasel->file, "");
simasel->returnfunc = 0;
simasel->title[0] = 0;
}
}
sa = sa->next;
}
}
}
if(main->versionfile <= 244) {
@ -7550,8 +7627,8 @@ static void append_id_part(FileData *fd, Main *mainvar, ID *id, ID **id_r)
/* common routine to append/link something from a library */
static Library* library_append( Scene *scene, SpaceFile *sfile, char *dir, int idcode,
int totsel, FileData *fd)
static Library* library_append( Scene *scene, char* file, char *dir, int idcode,
int totsel, FileData *fd, struct direntry* filelist, int totfile, short flag)
{
Main *mainl;
Library *curlib;
@ -7567,13 +7644,13 @@ static Library* library_append( Scene *scene, SpaceFile *sfile, char *dir, int i
curlib= mainl->curlib;
if(totsel==0) {
append_named_part(fd, mainl, scene, sfile->file, idcode, sfile->flag);
append_named_part(fd, mainl, scene, file, idcode, flag);
}
else {
int a;
for(a=0; a<sfile->totfile; a++) {
if(sfile->filelist[a].flags & ACTIVE) {
append_named_part(fd, mainl, scene, sfile->filelist[a].relname, idcode, sfile->flag);
for(a=0; a<totfile; a++) {
if(filelist[a].flags & ACTIVE) {
append_named_part(fd, mainl, scene, filelist[a].relname, idcode, flag);
}
}
}
@ -7584,7 +7661,7 @@ static Library* library_append( Scene *scene, SpaceFile *sfile, char *dir, int i
/* do this when expand found other libs */
read_libraries(fd, &fd->mainlist);
if(sfile->flag & FILE_STRINGCODE) {
if(flag & FILE_STRINGCODE) {
/* use the full path, this could have been read by other library even */
BLI_strncpy(mainl->curlib->name, mainl->curlib->filename, sizeof(mainl->curlib->name));
@ -7601,7 +7678,7 @@ static Library* library_append( Scene *scene, SpaceFile *sfile, char *dir, int i
/* give a base to loose objects. If group append, do it for objects too */
if(idcode==ID_GR)
give_base_to_objects(scene, &(G.main->object), (sfile->flag & FILE_LINK)?NULL:curlib);
give_base_to_objects(scene, &(G.main->object), (flag & FILE_LINK)?NULL:curlib);
else
give_base_to_objects(scene, &(G.main->object), NULL);
@ -7612,8 +7689,7 @@ static Library* library_append( Scene *scene, SpaceFile *sfile, char *dir, int i
/* patch to prevent switch_endian happens twice */
if(fd->flags & FD_FLAGS_SWITCH_ENDIAN) {
blo_freefiledata( fd );
sfile->libfiledata= 0;
}
}
return curlib;
}
@ -7626,16 +7702,8 @@ static Library* library_append( Scene *scene, SpaceFile *sfile, char *dir, int i
void BLO_script_library_append(BlendHandle *bh, char *dir, char *name,
int idcode, short flag, Scene *scene )
{
SpaceFile sfile;
/* build a minimal "fake" SpaceFile object */
sfile.flag = flag;
sfile.totfile = 0;
strcpy(sfile.file, name);
/* try to append the requested object */
library_append( scene, &sfile, dir, idcode, 0, (FileData *)bh );
library_append( scene, name, dir, idcode, 0, (FileData *)bh, NULL, 0, flag );
/* do we need to do this? */
DAG_scene_sort(G.scene);
@ -7645,26 +7713,31 @@ void BLO_script_library_append(BlendHandle *bh, char *dir, char *name,
/* dir is a full path */
void BLO_library_append(SpaceFile *sfile, char *dir, int idcode)
{
FileData *fd= (FileData*) sfile->libfiledata;
BLO_library_append_(&sfile->libfiledata, sfile->filelist, sfile->totfile, dir, sfile->file, sfile->flag, idcode);
}
void BLO_library_append_(BlendHandle** libfiledata, struct direntry* filelist, int totfile, char *dir, char* file, short flag, int idcode)
{
FileData *fd= (FileData*) (*libfiledata);
Library *curlib;
Base *centerbase;
Object *ob;
int a, totsel=0;
/* are there files selected? */
for(a=0; a<sfile->totfile; a++) {
if(sfile->filelist[a].flags & ACTIVE) {
for(a=0; a<totfile; a++) {
if(filelist[a].flags & ACTIVE) {
totsel++;
}
}
if(totsel==0) {
/* is the indicated file in the filelist? */
if(sfile->file[0]) {
for(a=0; a<sfile->totfile; a++) {
if( strcmp(sfile->filelist[a].relname, sfile->file)==0) break;
if(file[0]) {
for(a=0; a<totfile; a++) {
if( strcmp(filelist[a].relname, file)==0) break;
}
if(a==sfile->totfile) {
if(a==totfile) {
error("Wrong indicated name");
return;
}
@ -7676,13 +7749,18 @@ void BLO_library_append(SpaceFile *sfile, char *dir, int idcode)
}
/* now we have or selected, or an indicated file */
if(sfile->flag & FILE_AUTOSELECT) scene_deselect_all(G.scene);
if(flag & FILE_AUTOSELECT) scene_deselect_all(G.scene);
curlib = library_append( G.scene, sfile, dir, idcode, totsel, fd );
curlib = library_append( G.scene, file, dir, idcode, totsel, fd, filelist, totfile,flag );
/* patch to prevent switch_endian happens twice */
if(fd->flags & FD_FLAGS_SWITCH_ENDIAN) {
(*libfiledata)= 0;
}
/* when not linking (appending)... */
if((sfile->flag & FILE_LINK)==0) {
if(sfile->flag & FILE_ATCURSOR) {
if((flag & FILE_LINK)==0) {
if(flag & FILE_ATCURSOR) {
float *curs, centerloc[3], vec[3], min[3], max[3];
int count= 0;

@ -1222,6 +1222,31 @@ static void write_lattices(WriteData *wd, ListBase *idbase)
}
}
static void write_previews(WriteData *wd, PreviewImage *prv)
{
if (prv) {
short w = prv->w[1];
short h = prv->h[1];
unsigned int *rect = prv->rect[1];
/* don't write out large previews if not requested */
if (!(U.flag & USER_SAVE_PREVIEWS) ) {
prv->w[1] = 0;
prv->h[1] = 0;
prv->rect[1] = NULL;
}
writestruct(wd, DATA, "PreviewImage", 1, prv);
if (prv->rect[0]) writedata(wd, DATA, prv->w[0]*prv->h[0]*sizeof(unsigned int), prv->rect[0]);
if (prv->rect[1]) writedata(wd, DATA, prv->w[1]*prv->h[1]*sizeof(unsigned int), prv->rect[1]);
/* restore preview, we still want to keep it in memory even if not saved to file */
if (!(U.flag & USER_SAVE_PREVIEWS) ) {
prv->w[1] = w;
prv->h[1] = h;
prv->rect[1] = rect;
}
}
}
static void write_images(WriteData *wd, ListBase *idbase)
{
Image *ima;
@ -1241,12 +1266,9 @@ static void write_images(WriteData *wd, ListBase *idbase)
writedata(wd, DATA, pf->size, pf->data);
}
if (ima->preview) {
PreviewImage *prv = ima->preview;
writestruct(wd, DATA, "PreviewImage", 1, prv);
writedata(wd, DATA, prv->w*prv->h*sizeof(unsigned int), prv->rect);
write_previews(wd, ima->preview);
}
}
ima= ima->id.next;
}
/* flush helps the compression for undo-save */
@ -1268,6 +1290,8 @@ static void write_textures(WriteData *wd, ListBase *idbase)
if(tex->plugin) writestruct(wd, DATA, "PluginTex", 1, tex->plugin);
if(tex->coba) writestruct(wd, DATA, "ColorBand", 1, tex->coba);
if(tex->env) writestruct(wd, DATA, "EnvMap", 1, tex->env);
write_previews(wd, tex->preview);
}
tex= tex->id.next;
}
@ -1307,6 +1331,8 @@ static void write_materials(WriteData *wd, ListBase *idbase)
writestruct(wd, DATA, "bNodeTree", 1, ma->nodetree);
write_nodetree(wd, ma->nodetree);
}
write_previews(wd, ma->preview);
}
ma= ma->id.next;
}
@ -1329,6 +1355,9 @@ static void write_worlds(WriteData *wd, ListBase *idbase)
}
write_scriptlink(wd, &wrld->scriptlink);
write_previews(wd, wrld->preview);
}
wrld= wrld->id.next;
}
@ -1352,6 +1381,9 @@ static void write_lamps(WriteData *wd, ListBase *idbase)
}
write_scriptlink(wd, &la->scriptlink);
write_previews(wd, la->preview);
}
la= la->id.next;
}

@ -277,6 +277,13 @@ int IMB_anim_get_preseek(struct anim * anim);
struct ImBuf * IMB_anim_absolute(struct anim * anim, int position);
/**
*
* @attention Defined in anim.c
* fetches a define previewframe, usually half way into the movie
*/
struct ImBuf * IMB_anim_previewframe(struct anim * anim);
/**
*
* @attention Defined in anim.c

@ -56,6 +56,8 @@
struct _AviMovie;
struct Mdec;
struct ImgInfo;
#define IB_MIPMAP_LEVELS 10
/**
@ -103,6 +105,7 @@ typedef struct ImBuf {
float dither; /**< random dither value, for conversion from float -> byte rect */
struct MEM_CacheLimiterHandle_s * c_handle; /**< handle for cache limiter */
struct ImgInfo * img_info;
int refcounter; /**< Refcounter for multiple users */
int index; /**< reference index for ImBuf lists */
@ -148,6 +151,7 @@ typedef enum {
#define IB_rectfloat (1 << 15)
#define IB_zbuffloat (1 << 16)
#define IB_multilayer (1 << 17)
#define IB_imginfo (1 << 18)
/*
* The bit flag is stored in the ImBuf.ftype variable.

@ -0,0 +1,73 @@
/**
* $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) 2007 Blender Foundation
* All rights reserved.
*
* The Original Code is: all of this file.
*
* Contributor(s): Andrea Weikert.
*
* ***** END GPL LICENSE BLOCK *****
*/
#ifndef _IMB_THUMBS_H
#define _IMB_THUMBS_H
#ifdef __cplusplus
extern "C" {
#endif
struct ImBuf;
/** Thumbnail creation and retrieval according to the 'Thumbnail Management Standard'
* supported by Gimp, Gnome (Nautilus), KDE etc.
* Reference: http://jens.triq.net/thumbnail-spec/index.html
*/
typedef enum ThumbSize {
THB_NORMAL,
THB_LARGE,
THB_FAIL
} ThumbSize;
typedef enum ThumbSource {
THB_SOURCE_IMAGE,
THB_SOURCE_MOVIE
} ThumbSource;
// IB_imginfo
/* create thumbnail for file and returns new imbuf for thumbnail */
ImBuf* IMB_thumb_create(const char* dir, const char* file, ThumbSize size, ThumbSource source);
/* read thumbnail for file and returns new imbuf for thumbnail */
ImBuf* IMB_thumb_read(const char* dir, const char* file, ThumbSize size);
/* delete all thumbs for the file */
void IMB_thumb_delete(const char* dir, const char* file, ThumbSize size);
/* return the state of the thumb, needed to determine how to manage the thumb */
ImBuf* IMB_thumb_manage(const char* dir, const char* file, ThumbSize size, ThumbSource source);
#endif /* _IMB_THUMBS_H */

@ -0,0 +1,78 @@
/**
* $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) 2005 Blender Foundation
* All rights reserved.
*
* The Original Code is: all of this file.
*
* Contributor(s): Austin Benesh. Ton Roosendaal.
*
* ***** END GPL LICENSE BLOCK *****
*/
#ifndef _IMB_IMGINFO_H
#define _IMB_IMGINFO_H
#ifdef __cplusplus
extern "C" {
#endif
struct ImBuf;
typedef struct ImgInfo {
struct ImgInfo *next, *prev;
char* key;
char* value;
int len;
} ImgInfo;
/** The imginfo is a list of key/value pairs (both char*) that can me
saved in the header of several image formats.
Apart from some common keys like
'Software' and 'Description' (png standard) we'll use keys within the
Blender namespace, so should be called 'Blender::StampInfo' or 'Blender::FrameNum'
etc...
*/
/* free blender ImgInfo struct */
void IMB_imginfo_free(struct ImBuf* img);
/** read the field from the image info into the field
* @param img - the ImBuf that contains the image data
* @param key - the key of the field
* @param value - the data in the field, first one found with key is returned,
memory has to be allocated by user.
* @param len - length of value buffer allocated by user.
* @return - 1 (true) if ImageInfo present and value for the key found, 0 (false) otherwise
*/
int IMB_imginfo_get_field(struct ImBuf* img, const char* key, char* value, int len);
/** set user data in the ImgInfo struct, which has to be allocated with IMB_imginfo_create
* before calling this function.
* @param img - the ImBuf that contains the image data
* @param key - the key of the field
* @param value - the data to be written to the field. zero terminated string
* @return - 1 (true) if ImageInfo present, 0 (false) otherwise
*/
int IMB_imginfo_add_field(struct ImBuf* img, const char* key, const char* field);
#endif /* _IMB_IMGINFO_H */

@ -43,6 +43,7 @@
#include "IMB_divers.h"
#include "IMB_allocimbuf.h"
#include "IMB_imginfo.h"
#include "MEM_CacheLimiterC-Api.h"
static unsigned int dfltcmap[16] = {
@ -163,6 +164,7 @@ void IMB_freeImBuf(struct ImBuf * ibuf)
IMB_freecmapImBuf(ibuf);
freeencodedbufferImBuf(ibuf);
IMB_cache_limiter_unmanage(ibuf);
IMB_imginfo_free(ibuf);
MEM_freeN(ibuf);
}
}
@ -476,6 +478,9 @@ struct ImBuf *IMB_dupImBuf(struct ImBuf *ibuf1)
tbuf.mall = ibuf2->mall;
tbuf.c_handle = 0;
// for now don't duplicate image info
tbuf.img_info = 0;
*ibuf2 = tbuf;
if (ibuf1->cmap){

@ -819,6 +819,18 @@ static struct ImBuf * anim_getnew(struct anim * anim) {
return(ibuf);
}
struct ImBuf * IMB_anim_previewframe(struct anim * anim) {
struct ImBuf * ibuf = 0;
int position = 0;
ibuf = IMB_anim_absolute(anim, 0);
if (ibuf) {
IMB_freeImBuf(ibuf);
position = anim->duration / 2;
ibuf = IMB_anim_absolute(anim, position);
}
return ibuf;
}
struct ImBuf * IMB_anim_absolute(struct anim * anim, int position) {
struct ImBuf * ibuf = 0;

@ -0,0 +1,108 @@
/**
* $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) 2005 Blender Foundation
* All rights reserved.
*
* The Original Code is: all of this file.
*
* Contributor(s): Austin Benesh. Ton Roosendaal.
*
* ***** END GPL LICENSE BLOCK *****
*/
#include <stdlib.h>
#include <string.h>
#include "BLI_blenlib.h"
#include "MEM_guardedalloc.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
#include "IMB_imginfo.h"
void IMB_imginfo_free(struct ImBuf* img)
{
ImgInfo *info;
if (!img)
return;
if (!img->img_info) {
return;
}
info = img->img_info;
while (info) {
ImgInfo* next = info->next;
MEM_freeN(info->key);
MEM_freeN(info->value);
MEM_freeN(info);
info = next;
}
}
int IMB_imginfo_get_field(struct ImBuf* img, const char* key, char* field, int len)
{
ImgInfo *info;
int retval = 0;
if (!img)
return 0;
if (!img->img_info) {
return 0;
}
info = img->img_info;
while (info) {
if (strcmp(key, info->key) == 0) {
BLI_strncpy(field, info->value, len);
retval = 1;
break;
}
info = info->next;
}
return retval;
}
int IMB_imginfo_add_field(struct ImBuf* img, const char* key, const char* field)
{
ImgInfo *info;
ImgInfo *last;
if (!img)
return 0;
if (!img->img_info) {
img->img_info = MEM_callocN(sizeof(ImgInfo), "ImgInfo");
info = img->img_info;
} else {
info = img->img_info;
last = info;
while (info) {
last = info;
info = info->next;
}
info = MEM_callocN(sizeof(ImgInfo), "ImgInfo");
last->next = info;
}
info->key = BLI_strdup(key);
info->value = BLI_strdup(field);
return 1;
}

@ -0,0 +1,360 @@
/* md5.c - Functions to compute MD5 message digest of files or memory blocks
according to the definition of MD5 in RFC 1321 from April 1992.
Copyright (C) 1995 Software Foundation, Inc.
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, 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., 675 Mass Ave, Cambridge, MA 02139, USA. */
/* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>. */
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <sys/types.h>
# include <stdlib.h>
# include <string.h>
#include "md5.h"
#ifdef WORDS_BIGENDIAN
# define SWAP(n) \
(((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
#else
# define SWAP(n) (n)
#endif
/* This array contains the bytes used to pad the buffer to the next
64-byte boundary. (RFC 1321, 3.1: Step 1) */
static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
/* Initialize structure containing state of computation.
(RFC 1321, 3.3: Step 3) */
void
md5_init_ctx (ctx)
struct md5_ctx *ctx;
{
ctx->A = 0x67452301;
ctx->B = 0xefcdab89;
ctx->C = 0x98badcfe;
ctx->D = 0x10325476;
}
/* Put result from CTX in first 16 bytes following RESBUF. The result must
be in little endian byte order. */
void *
md5_read_ctx (ctx, resbuf)
const struct md5_ctx *ctx;
void *resbuf;
{
((md5_uint32 *) resbuf)[0] = SWAP (ctx->A);
((md5_uint32 *) resbuf)[1] = SWAP (ctx->B);
((md5_uint32 *) resbuf)[2] = SWAP (ctx->C);
((md5_uint32 *) resbuf)[3] = SWAP (ctx->D);
return resbuf;
}
/* Compute MD5 message digest for bytes read from STREAM. The
resulting message digest number will be written into the 16 bytes
beginning at RESBLOCK. */
int
md5_stream (stream, resblock)
FILE *stream;
void *resblock;
{
/* Important: BLOCKSIZE must be a multiple of 64. */
#define BLOCKSIZE 4096
struct md5_ctx ctx;
md5_uint32 len[2];
char buffer[BLOCKSIZE + 72];
size_t pad, sum;
/* Initialize the computation context. */
md5_init_ctx (&ctx);
len[0] = 0;
len[1] = 0;
/* Iterate over full file contents. */
while (1)
{
/* We read the file in blocks of BLOCKSIZE bytes. One call of the
computation function processes the whole buffer so that with the
next round of the loop another block can be read. */
size_t n;
sum = 0;
/* Read block. Take care for partial reads. */
do
{
n = fread (buffer, 1, BLOCKSIZE - sum, stream);
sum += n;
}
while (sum < BLOCKSIZE && n != 0);
if (n == 0 && ferror (stream))
return 1;
/* RFC 1321 specifies the possible length of the file up to 2^64 bits.
Here we only compute the number of bytes. Do a double word
increment. */
len[0] += sum;
if (len[0] < sum)
++len[1];
/* If end of file is reached, end the loop. */
if (n == 0)
break;
/* Process buffer with BLOCKSIZE bytes. Note that
BLOCKSIZE % 64 == 0
*/
md5_process_block (buffer, BLOCKSIZE, &ctx);
}
/* We can copy 64 byte because the buffer is always big enough. FILLBUF
contains the needed bits. */
memcpy (&buffer[sum], fillbuf, 64);
/* Compute amount of padding bytes needed. Alignment is done to
(N + PAD) % 64 == 56
There is always at least one byte padded. I.e. even the alignment
is correctly aligned 64 padding bytes are added. */
pad = sum & 63;
pad = pad >= 56 ? 64 + 56 - pad : 56 - pad;
/* Put the 64-bit file length in *bits* at the end of the buffer. */
*(md5_uint32 *) &buffer[sum + pad] = SWAP (len[0] << 3);
*(md5_uint32 *) &buffer[sum + pad + 4] = SWAP ((len[1] << 3)
| (len[0] >> 29));
/* Process last bytes. */
md5_process_block (buffer, sum + pad + 8, &ctx);
/* Construct result in desired memory. */
md5_read_ctx (&ctx, resblock);
return 0;
}
/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
result is always in little endian byte order, so that a byte-wise
output yields to the wanted ASCII representation of the message
digest. */
void *
md5_buffer (buffer, len, resblock)
const char *buffer;
size_t len;
void *resblock;
{
struct md5_ctx ctx;
char restbuf[64 + 72];
size_t blocks = len & ~63;
size_t pad, rest;
/* Initialize the computation context. */
md5_init_ctx (&ctx);
/* Process whole buffer but last len % 64 bytes. */
md5_process_block (buffer, blocks, &ctx);
/* REST bytes are not processed yet. */
rest = len - blocks;
/* Copy to own buffer. */
memcpy (restbuf, &buffer[blocks], rest);
/* Append needed fill bytes at end of buffer. We can copy 64 byte
because the buffer is always big enough. */
memcpy (&restbuf[rest], fillbuf, 64);
/* PAD bytes are used for padding to correct alignment. Note that
always at least one byte is padded. */
pad = rest >= 56 ? 64 + 56 - rest : 56 - rest;
/* Put length of buffer in *bits* in last eight bytes. */
*(md5_uint32 *) &restbuf[rest + pad] = (md5_uint32) SWAP (len << 3);
*(md5_uint32 *) &restbuf[rest + pad + 4] = (md5_uint32) SWAP (len >> 29);
/* Process last bytes. */
md5_process_block (restbuf, rest + pad + 8, &ctx);
/* Put result in desired memory area. */
return md5_read_ctx (&ctx, resblock);
}
/* These are the four functions used in the four steps of the MD5 algorithm
and defined in the RFC 1321. The first function is a little bit optimized
(as found in Colin Plumbs public domain implementation). */
/* #define FF(b, c, d) ((b & c) | (~b & d)) */
#define FF(b, c, d) (d ^ (b & (c ^ d)))
#define FG(b, c, d) FF (d, b, c)
#define FH(b, c, d) (b ^ c ^ d)
#define FI(b, c, d) (c ^ (b | ~d))
/* Process LEN bytes of BUFFER, accumulating context into CTX.
It is assumed that LEN % 64 == 0. */
void
md5_process_block (buffer, len, ctx)
const void *buffer;
size_t len;
struct md5_ctx *ctx;
{
md5_uint32 correct_words[16];
const md5_uint32 *words = buffer;
size_t nwords = len / sizeof (md5_uint32);
const md5_uint32 *endp = words + nwords;
md5_uint32 A = ctx->A;
md5_uint32 B = ctx->B;
md5_uint32 C = ctx->C;
md5_uint32 D = ctx->D;
/* Process all bytes in the buffer with 64 bytes in each round of
the loop. */
while (words < endp)
{
md5_uint32 *cwp = correct_words;
md5_uint32 A_save = A;
md5_uint32 B_save = B;
md5_uint32 C_save = C;
md5_uint32 D_save = D;
/* First round: using the given function, the context and a constant
the next context is computed. Because the algorithms processing
unit is a 32-bit word and it is determined to work on words in
little endian byte order we perhaps have to change the byte order
before the computation. To reduce the work for the next steps
we store the swapped words in the array CORRECT_WORDS. */
#define OP(a, b, c, d, s, T) \
do \
{ \
a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T; \
++words; \
CYCLIC (a, s); \
a += b; \
} \
while (0)
/* It is unfortunate that C does not provide an operator for
cyclic rotation. Hope the C compiler is smart enough. */
#define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s)))
/* Before we start, one word to the strange constants.
They are defined in RFC 1321 as
T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
*/
/* Round 1. */
OP (A, B, C, D, 7, 0xd76aa478);
OP (D, A, B, C, 12, 0xe8c7b756);
OP (C, D, A, B, 17, 0x242070db);
OP (B, C, D, A, 22, 0xc1bdceee);
OP (A, B, C, D, 7, 0xf57c0faf);
OP (D, A, B, C, 12, 0x4787c62a);
OP (C, D, A, B, 17, 0xa8304613);
OP (B, C, D, A, 22, 0xfd469501);
OP (A, B, C, D, 7, 0x698098d8);
OP (D, A, B, C, 12, 0x8b44f7af);
OP (C, D, A, B, 17, 0xffff5bb1);
OP (B, C, D, A, 22, 0x895cd7be);
OP (A, B, C, D, 7, 0x6b901122);
OP (D, A, B, C, 12, 0xfd987193);
OP (C, D, A, B, 17, 0xa679438e);
OP (B, C, D, A, 22, 0x49b40821);
/* For the second to fourth round we have the possibly swapped words
in CORRECT_WORDS. Redefine the macro to take an additional first
argument specifying the function to use. */
#undef OP
#define OP(f, a, b, c, d, k, s, T) \
do \
{ \
a += f (b, c, d) + correct_words[k] + T; \
CYCLIC (a, s); \
a += b; \
} \
while (0)
/* Round 2. */
OP (FG, A, B, C, D, 1, 5, 0xf61e2562);
OP (FG, D, A, B, C, 6, 9, 0xc040b340);
OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa);
OP (FG, A, B, C, D, 5, 5, 0xd62f105d);
OP (FG, D, A, B, C, 10, 9, 0x02441453);
OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8);
OP (FG, A, B, C, D, 9, 5, 0x21e1cde6);
OP (FG, D, A, B, C, 14, 9, 0xc33707d6);
OP (FG, C, D, A, B, 3, 14, 0xf4d50d87);
OP (FG, B, C, D, A, 8, 20, 0x455a14ed);
OP (FG, A, B, C, D, 13, 5, 0xa9e3e905);
OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8);
OP (FG, C, D, A, B, 7, 14, 0x676f02d9);
OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
/* Round 3. */
OP (FH, A, B, C, D, 5, 4, 0xfffa3942);
OP (FH, D, A, B, C, 8, 11, 0x8771f681);
OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
OP (FH, A, B, C, D, 1, 4, 0xa4beea44);
OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9);
OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60);
OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
OP (FH, A, B, C, D, 13, 4, 0x289b7ec6);
OP (FH, D, A, B, C, 0, 11, 0xeaa127fa);
OP (FH, C, D, A, B, 3, 16, 0xd4ef3085);
OP (FH, B, C, D, A, 6, 23, 0x04881d05);
OP (FH, A, B, C, D, 9, 4, 0xd9d4d039);
OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
OP (FH, B, C, D, A, 2, 23, 0xc4ac5665);
/* Round 4. */
OP (FI, A, B, C, D, 0, 6, 0xf4292244);
OP (FI, D, A, B, C, 7, 10, 0x432aff97);
OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
OP (FI, B, C, D, A, 5, 21, 0xfc93a039);
OP (FI, A, B, C, D, 12, 6, 0x655b59c3);
OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92);
OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
OP (FI, B, C, D, A, 1, 21, 0x85845dd1);
OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f);
OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
OP (FI, C, D, A, B, 6, 15, 0xa3014314);
OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
OP (FI, A, B, C, D, 4, 6, 0xf7537e82);
OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb);
OP (FI, B, C, D, A, 9, 21, 0xeb86d391);
/* Add the starting values of the context. */
A += A_save;
B += B_save;
C += C_save;
D += D_save;
}
/* Put checksum in context given as argument. */
ctx->A = A;
ctx->B = B;
ctx->C = C;
ctx->D = D;
}

@ -0,0 +1,115 @@
/* md5.h - Declaration of functions and data types used for MD5 sum
computing library functions.
Copyright (C) 1995 Free Software Foundation, Inc.
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, 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. */
#ifndef _MD5_H
#define _MD5_H
#include <stdio.h>
#if defined HAVE_LIMITS_H || _LIBC
# include <limits.h>
#endif
/* The following contortions are an attempt to use the C preprocessor
to determine an unsigned integral type that is 32 bits wide. An
alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
doing that would require that the configure script compile and *run*
the resulting executable. Locally running cross-compiled executables
is usually not possible. */
#if defined __STDC__ && __STDC__
# define UINT_MAX_32_BITS 4294967295U
#else
# define UINT_MAX_32_BITS 0xFFFFFFFF
#endif
/* If UINT_MAX isn't defined, assume it's a 32-bit type.
This should be valid for all systems GNU cares about because
that doesn't include 16-bit systems, and only modern systems
(that certainly have <limits.h>) have 64+-bit integral types. */
#ifndef UINT_MAX
# define UINT_MAX UINT_MAX_32_BITS
#endif
#if UINT_MAX == UINT_MAX_32_BITS
typedef unsigned int md5_uint32;
#else
# if USHRT_MAX == UINT_MAX_32_BITS
typedef unsigned short md5_uint32;
# else
# if ULONG_MAX == UINT_MAX_32_BITS
typedef unsigned long md5_uint32;
# else
/* The following line is intended to evoke an error.
Using #error is not portable enough. */
"Cannot determine unsigned 32-bit data type."
# endif
# endif
#endif
#undef __P
#if defined (__STDC__) && __STDC__
#define __P(x) x
#else
#define __P(x) ()
#endif
/* Structure to save state of computation between the single steps. */
struct md5_ctx
{
md5_uint32 A;
md5_uint32 B;
md5_uint32 C;
md5_uint32 D;
};
/*
* The following three functions are build up the low level used in
* the functions `md5_stream' and `md5_buffer'.
*/
/* Initialize structure containing state of computation.
(RFC 1321, 3.3: Step 3) */
void md5_init_ctx __P ((struct md5_ctx *ctx));
/* Starting with the result of former calls of this function (or the
initialzation function update the context for the next LEN bytes
starting at BUFFER.
It is necessary that LEN is a multiple of 64!!! */
void md5_process_block __P ((const void *buffer, size_t len,
struct md5_ctx *ctx));
/* Put result from CTX in first 16 bytes following RESBUF. The result is
always in little endian byte order, so that a byte-wise output yields
to the wanted ASCII representation of the message digest. */
void *md5_read_ctx __P ((const struct md5_ctx *ctx, void *resbuf));
/* Compute MD5 message digest for bytes read from STREAM. The
resulting message digest number will be written into the 16 bytes
beginning at RESBLOCK. */
int md5_stream __P ((FILE *stream, void *resblock));
/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
result is always in little endian byte order, so that a byte-wise
output yields to the wanted ASCII representation of the message
digest. */
void *md5_buffer __P ((const char *buffer, size_t len, void *resblock));
#endif

@ -43,6 +43,7 @@
#include "IMB_allocimbuf.h"
#include "IMB_cmap.h"
#include "IMB_imginfo.h"
#include "IMB_png.h"
typedef struct PNGReadStruct {
@ -100,6 +101,7 @@ short imb_savepng(struct ImBuf *ibuf, char *name, int flags)
{
png_structp png_ptr;
png_infop info_ptr;
unsigned char *pixels = 0;
unsigned char *from, *to;
png_bytepp row_pointers = 0;
@ -219,6 +221,33 @@ short imb_savepng(struct ImBuf *ibuf, char *name, int flags)
PNG_COMPRESSION_TYPE_DEFAULT,
PNG_FILTER_TYPE_DEFAULT);
/* image text info */
if (ibuf->img_info) {
png_text* imginfo;
ImgInfo* iptr;
int num_text = 0;
iptr = ibuf->img_info;
while (iptr) {
num_text++;
iptr = iptr->next;
}
imginfo = MEM_callocN(num_text*sizeof(png_text), "png_imginfo");
iptr = ibuf->img_info;
num_text = 0;
while (iptr) {
imginfo[num_text].compression = PNG_TEXT_COMPRESSION_NONE;
imginfo[num_text].key = iptr->key;
imginfo[num_text].text = iptr->value;
num_text++;
iptr = iptr->next;
}
png_set_text(png_ptr, info_ptr, imginfo, num_text);
MEM_freeN(imginfo);
}
// write the file header information
png_write_info(png_ptr, info_ptr);
@ -409,6 +438,15 @@ struct ImBuf *imb_loadpng(unsigned char *mem, int size, int flags)
break;
}
if (flags & IB_imginfo) {
png_text* text_chunks;
int count = png_get_text(png_ptr, info_ptr, &text_chunks, NULL);
for(i = 0; i < count; i++) {
IMB_imginfo_add_field(ibuf, text_chunks[i].key, text_chunks[i].text);
ibuf->flags |= IB_imginfo;
}
}
png_read_end(png_ptr, info_ptr);
}

@ -0,0 +1,457 @@
/**
* $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) 2007 Blender Foundation
* All rights reserved.
*
* The Original Code is: all of this file.
*
* Contributor(s): Andrea Weikert.
*
* ***** END GPL LICENSE BLOCK *****
*/
#include "BKE_global.h"
#include "BKE_utildefines.h"
#include "BLI_blenlib.h"
#include "MEM_guardedalloc.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
#include "IMB_thumbs.h"
#include "IMB_imginfo.h"
#include "md5.h"
#ifdef WIN32
#include <windows.h> /* need to include windows.h so _WIN32_IE is defined */
#ifndef _WIN32_IE
#define _WIN32_IE 0x0400 /* minimal requirements for SHGetSpecialFolderPath on MINGW MSVC has this defined already */
#endif
#include <shlobj.h> /* for SHGetSpecialFolderPath, has to be done before BLI_winstuff because 'near' is disabled through BLI_windstuff */
#include "BLI_winstuff.h"
#include <process.h> /* getpid */
#else
#include <unistd.h>
#endif
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#define URI_MAX FILE_MAX*3 + 8
static int get_thumb_dir( char* dir , ThumbSize size)
{
char* home;
#ifdef WIN32
/* yes, applications shouldn't store data there, but so does GIMP :)*/
SHGetSpecialFolderPath(0, dir, CSIDL_PROFILE, 0);
#else
home = getenv("HOME");
if (!home) return 0;
BLI_strncpy(dir, home, FILE_MAX);
#endif
switch(size) {
case THB_NORMAL:
strcat(dir, "/.thumbnails/normal");
break;
case THB_LARGE:
strcat(dir, "/.thumbnails/large");
break;
case THB_FAIL:
strcat(dir, "/.thumbnails/fail/blender");
break;
default:
return 0; /* unknown size */
}
BLI_cleanup_dir(G.sce, dir);
return 1;
}
/** ----- begin of adapted code from glib ---
* The following code is adapted from function g_escape_uri_string from the gnome glib
* Source: http://svn.gnome.org/viewcvs/glib/trunk/glib/gconvert.c?view=markup
* released under the Gnu General Public License.
*/
typedef enum {
UNSAFE_ALL = 0x1, /* Escape all unsafe characters */
UNSAFE_ALLOW_PLUS = 0x2, /* Allows '+' */
UNSAFE_PATH = 0x8, /* Allows '/', '&', '=', ':', '@', '+', '$' and ',' */
UNSAFE_HOST = 0x10, /* Allows '/' and ':' and '@' */
UNSAFE_SLASHES = 0x20 /* Allows all characters except for '/' and '%' */
} UnsafeCharacterSet;
static const unsigned char acceptable[96] = {
/* A table of the ASCII chars from space (32) to DEL (127) */
/* ! " # $ % & ' ( ) * + , - . / */
0x00,0x3F,0x20,0x20,0x28,0x00,0x2C,0x3F,0x3F,0x3F,0x3F,0x2A,0x28,0x3F,0x3F,0x1C,
/* 0 1 2 3 4 5 6 7 8 9 : ; < = > ? */
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x38,0x20,0x20,0x2C,0x20,0x20,
/* @ A B C D E F G H I J K L M N O */
0x38,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
/* P Q R S T U V W X Y Z [ \ ] ^ _ */
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x20,0x20,0x20,0x20,0x3F,
/* ` a b c d e f g h i j k l m n o */
0x20,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
/* p q r s t u v w x y z { | } ~ DEL */
0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x20,0x20,0x20,0x3F,0x20
};
static const char hex[16] = "0123456789abcdef";
/* Note: This escape function works on file: URIs, but if you want to
* escape something else, please read RFC-2396 */
void escape_uri_string (const char *string, char* escaped_string, int len,UnsafeCharacterSet mask)
{
#define ACCEPTABLE(a) ((a)>=32 && (a)<128 && (acceptable[(a)-32] & use_mask))
const char *p;
char *q;
int c;
UnsafeCharacterSet use_mask;
use_mask = mask;
for (q = escaped_string, p = string; (*p != '\0') && len; p++) {
c = (unsigned char) *p;
len--;
if (!ACCEPTABLE (c)) {
*q++ = '%'; /* means hex coming */
*q++ = hex[c >> 4];
*q++ = hex[c & 15];
} else {
*q++ = *p;
}
}
*q = '\0';
}
void to_hex_char(char* hexbytes, const unsigned char* bytes, int len)
{
const unsigned char *p;
char *q;
for (q = hexbytes, p = bytes; len; p++) {
const unsigned char c = (unsigned char) *p;
len--;
*q++ = hex[c >> 4];
*q++ = hex[c & 15];
}
}
/** ----- end of adapted code from glib --- */
static int uri_from_filename( const char *dir, const char *file, char *uri )
{
char orig_uri[URI_MAX];
const char* dirstart = dir;
#ifdef WIN32
{
char vol[3];
BLI_strncpy(orig_uri, "file:///", FILE_MAX);
if (strlen(dir) < 2 && dir[1] != ':') {
/* not a correct absolute path */
return 0;
}
/* on windows, using always uppercase drive/volume letter in uri */
vol[0] = toupper(dir[0]);
vol[1] = ':';
vol[2] = '\0';
strcat(orig_uri, vol);
dirstart += 2;
}
#else
BLI_strncpy(orig_uri, "file://", FILE_MAX);
#endif
strcat(orig_uri, dirstart);
strcat(orig_uri, file);
BLI_char_switch(orig_uri, '\\', '/');
#ifdef WITH_ICONV
{
escape_uri_string(orig_uri, uri_utf8, FILE_MAX*3+8, UNSAFE_PATH);
BLI_string_to_utf8(uri_utf8, uri, NULL);
char uri_utf8[FILE_MAX*3+8];
}
#else
escape_uri_string(orig_uri, uri, FILE_MAX*3+8, UNSAFE_PATH);
#endif
return 1;
}
static void thumbname_from_uri(const char* uri, char* thumb)
{
char hexdigest[33];
unsigned char digest[16];
md5_buffer( uri, strlen(uri), digest);
hexdigest[0] = '\0';
to_hex_char(hexdigest, digest, 16);
hexdigest[32] = '\0';
sprintf(thumb, "%s.png", hexdigest);
}
static int thumbpath_from_uri(const char* uri, char* path, ThumbSize size)
{
char tmppath[FILE_MAX];
int rv = 0;
if (get_thumb_dir(tmppath, size)) {
char thumb[40];
thumbname_from_uri(uri, thumb);
BLI_snprintf(path, FILE_MAX, "%s%s", tmppath, thumb);
rv = 1;
}
return rv;
}
/* create thumbnail for file and returns new imbuf for thumbnail */
ImBuf* IMB_thumb_create(const char* dir, const char* file, ThumbSize size, ThumbSource source)
{
ImBuf *img = 0;
char uri[URI_MAX];
char desc[URI_MAX+22];
char tpath[FILE_MAX];
char tdir[FILE_MAX];
char wdir[FILE_MAX];
char temp[FILE_MAX];
char mtime[40];
char cwidth[40];
char cheight[40];
char thumb[40];
short tsize = 128;
short ex, ey;
float scaledx, scaledy;
struct stat info;
switch(size) {
case THB_NORMAL:
tsize = 128;
break;
case THB_LARGE:
tsize = 256;
break;
case THB_FAIL:
tsize = 0;
break;
default:
return 0; /* unknown size */
}
uri_from_filename(dir, file,uri);
thumbname_from_uri(uri, thumb);
if (get_thumb_dir(tdir, size)) {
BLI_snprintf(tpath, FILE_MAX, "%s%s", tdir, thumb);
thumb[8] = '\0'; /* shorten for tempname, not needed anymore */
BLI_snprintf(temp, FILE_MAX, "%sblender_%d_%s.png", tdir, abs(getpid()), thumb);
if (strncmp(thumb, dir, strlen(dir)) == 0) {
return NULL;
}
if (size == THB_FAIL) {
img = IMB_allocImBuf(0,0,32, IB_rect | IB_imginfo, 0);
if (!img) return 0;
} else {
if (THB_SOURCE_IMAGE == source) {
BLI_getwdN(wdir);
chdir(dir);
img = IMB_loadiffname(file, IB_rect);
stat(file, &info);
sprintf(mtime, "%ld", info.st_mtime);
sprintf(cwidth, "%d", img->x);
sprintf(cheight, "%d", img->y);
chdir(wdir);
} else if (THB_SOURCE_MOVIE == source) {
struct anim * anim = NULL;
BLI_getwdN(wdir);
chdir(dir);
anim = IMB_open_anim(file, IB_rect | IB_imginfo);
if (anim != NULL) {
img = IMB_anim_absolute(anim, 0);
if (img == NULL) {
printf("not an anim; %s\n", file);
} else {
IMB_freeImBuf(img);
img = IMB_anim_previewframe(anim);
}
IMB_free_anim(anim);
}
stat(file, &info);
sprintf(mtime, "%ld", info.st_mtime);
chdir(wdir);
}
if (!img) return 0;
if (img->x > img->y) {
scaledx = (float)tsize;
scaledy = ( (float)img->y/(float)img->x )*tsize;
}
else {
scaledy = (float)tsize;
scaledx = ( (float)img->x/(float)img->y )*tsize;
}
ex = (short)scaledx;
ey = (short)scaledy;
IMB_scaleImBuf(img, ex, ey);
}
sprintf(desc, "Thumbnail for %s", uri);
IMB_imginfo_add_field(img, "Description", desc);
IMB_imginfo_add_field(img, "Software", "Blender");
IMB_imginfo_add_field(img, "Thumb::URI", uri);
IMB_imginfo_add_field(img, "Thumb::MTime", mtime);
if (THB_SOURCE_IMAGE == source) {
IMB_imginfo_add_field(img, "Thumb::Image::Width", cwidth);
IMB_imginfo_add_field(img, "Thumb::Image::Height", cheight);
}
img->ftype = PNG;
img->depth = 32;
if (IMB_saveiff(img, temp, IB_rect | IB_imginfo)) {
#ifndef WIN32
chmod(temp, S_IRUSR | S_IWUSR);
#endif
BLI_rename(temp, tpath);
}
return img;
}
return img;
}
/* read thumbnail for file and returns new imbuf for thumbnail */
ImBuf* IMB_thumb_read(const char* dir, const char* file, ThumbSize size)
{
char thumb[FILE_MAX];
char uri[FILE_MAX*3+8];
ImBuf *img = 0;
if (!uri_from_filename(dir, file,uri)) {
return NULL;
}
if (thumbpath_from_uri(uri, thumb, size)) {
img = IMB_loadiffname(thumb, IB_rect | IB_imginfo);
}
return img;
}
/* delete all thumbs for the file */
void IMB_thumb_delete(const char* dir, const char* file, ThumbSize size)
{
char thumb[FILE_MAX];
char uri[FILE_MAX*3+8];
if (!uri_from_filename(dir, file,uri)) {
return;
}
if (thumbpath_from_uri(uri, thumb, size)) {
if (strncmp(thumb, dir, strlen(dir)) == 0) {
return;
}
if (BLI_exists(thumb)) {
BLI_delete(thumb, 0, 0);
}
}
}
/* create the thumb if necessary and manage failed and old thumbs */
ImBuf* IMB_thumb_manage(const char* dir, const char* file, ThumbSize size, ThumbSource source)
{
char path[FILE_MAX];
char thumb[FILE_MAX];
char uri[FILE_MAX*3+8];
struct stat st;
ImBuf* img = NULL;
BLI_join_dirfile(path, dir, file);
if (stat(path, &st)) {
return NULL;
}
if (!uri_from_filename(dir, file,uri)) {
return NULL;
}
if (thumbpath_from_uri(uri, thumb, THB_FAIL)) {
/* failure thumb exists, don't try recreating */
if (BLI_exists(thumb)) {
return NULL;
}
}
if (thumbpath_from_uri(uri, thumb, size)) {
if (strncmp(thumb, dir, strlen(dir)) == 0) {
img = IMB_loadiffname(path, IB_rect);
} else {
img = IMB_loadiffname(thumb, IB_rect | IB_imginfo);
if (img) {
char mtime[40];
if (!IMB_imginfo_get_field(img, "Thumb::MTime", mtime, 40)) {
/* illegal thumb, forget it! */
IMB_freeImBuf(img);
img = 0;
} else {
time_t t = atol(mtime);
if (st.st_mtime != t) {
/* recreate all thumbs */
IMB_freeImBuf(img);
img = 0;
IMB_thumb_delete(dir, file, THB_NORMAL);
IMB_thumb_delete(dir, file, THB_LARGE);
IMB_thumb_delete(dir, file, THB_FAIL);
img = IMB_thumb_create(dir, file, size, source);
if(!img){
/* thumb creation failed, write fail thumb */
img = IMB_thumb_create(dir, file, THB_FAIL, source);
if (img) {
/* we don't need failed thumb anymore */
IMB_freeImBuf(img);
img = 0;
}
}
}
}
} else {
img = IMB_thumb_create(dir, file, size, source);
if(!img){
/* thumb creation failed, write fail thumb */
img = IMB_thumb_create(dir, file, THB_FAIL, source);
if (img) {
/* we don't need failed thumb anymore */
IMB_freeImBuf(img);
img = 0;
}
}
}
}
}
return img;
}

@ -0,0 +1,87 @@
/**
* $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. 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) 2007 Blender Foundation.
* All rights reserved.
*
* The Original Code is: all of this file.
*
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
*/
#ifndef BIF_FILELIST_H
#define BIF_FILELIST_H
#ifdef __cplusplus
extern "C" {
#endif
struct FileList;
struct direntry;
struct BlendHandle;
struct FileList * BIF_filelist_new();
void BIF_filelist_init_icons();
void BIF_filelist_free_icons();
struct FileList * BIF_filelist_copy(struct FileList* filelist);
int BIF_filelist_find(struct FileList* filelist, char *file);
void BIF_filelist_free(struct FileList* filelist);
void BIF_filelist_freelib(struct FileList* filelist);
void BIF_filelist_sort(struct FileList* filelist, short sort);
int BIF_filelist_numfiles(struct FileList* filelist);
const char * BIF_filelist_dir(struct FileList* filelist);
void BIF_filelist_setdir(struct FileList* filelist, const char *dir);
void BIF_filelist_appenddir(struct FileList* filelist, const char *relname);
struct direntry * BIF_filelist_file(struct FileList* filelist, int index);
void BIF_filelist_hidedot(struct FileList* filelist, short hide);
void BIF_filelist_setfilter(struct FileList* filelist, unsigned int filter);
void BIF_filelist_filter(struct FileList* filelist);
void BIF_filelist_swapselect(struct FileList* filelist);
void BIF_filelist_imgsize(struct FileList* filelist, short w, short h);
void BIF_filelist_loadimage(struct FileList* filelist, int index);
struct ImBuf * BIF_filelist_getimage(struct FileList* filelist, int index);
void BIF_filelist_readdir(struct FileList* filelist);
int BIF_filelist_empty(struct FileList* filelist);
void BIF_filelist_parent(struct FileList* filelist);
void BIF_filelist_setfiletypes(struct FileList* filelist, short has_quicktime);
int BIF_filelist_islibrary (struct FileList* filelist, char* dir, char* group);
void BIF_filelist_from_main(struct FileList* filelist);
void BIF_filelist_from_library(struct FileList* filelist);
void BIF_filelist_append_library(struct FileList* filelist, char *dir, char* file, short flag, int idcode);
void BIF_filelist_settype(struct FileList* filelist, int type);
short BIF_filelist_gettype(struct FileList* filelist);
void BIF_filelist_setipotype(struct FileList* filelist, short ipotype);
void BIF_filelist_hasfunc(struct FileList* filelist, int has_func);
struct BlendHandle *BIF_filelist_lib(struct FileList* filelist);
int BIF_groupname_to_code(char *group); /* TODO: where should this go */
#ifdef __cplusplus
}
#endif
#endif

@ -55,17 +55,20 @@ char* fsmenu_build_menu (void);
/** Append a seperator to the FSMenu, inserts always follow the
* last seperator.
*/
void fsmenu_append_seperator (void);
void fsmenu_append_separator (void);
/** Inserts a new fsmenu entry with the given @a path.
* Duplicate entries are not added.
* @param sorted Should entry be inserted in sorted order?
*/
void fsmenu_insert_entry (char *path, int sorted);
void fsmenu_insert_entry (char *path, int sorted, short save);
/** Removes the fsmenu entry at the given @a index. */
void fsmenu_remove_entry (int index);
/** saves the 'favourites' to the specified file */
void fsmenu_write_file(const char *filename);
/** Free's all the memory associated with the fsmenu */
void fsmenu_free (void);

@ -33,28 +33,19 @@
#define BIF_IMASEL_H
struct SpaceImaSel;
struct OneSelectableIma;
struct ScrArea;
struct ImaDir;
void imadir_parent(struct SpaceImaSel *simasel);
int bitset(int l, int bit);
void free_sel_ima(struct OneSelectableIma *firstima);
void write_new_pib(struct SpaceImaSel *simasel);
void free_ima_dir(struct ImaDir *firstdir);
void check_for_pib(struct SpaceImaSel *simasel);
void clear_ima_dir(struct SpaceImaSel *simasel);
void check_ima_dir_name(char *dir);
int get_ima_dir(char *dirname, int dtype, int *td, struct ImaDir **first);
void get_next_image(struct SpaceImaSel *simasel);
void get_file_info(struct SpaceImaSel *simasel);
void get_pib_file(struct SpaceImaSel *simasel);
void change_imadir(struct SpaceImaSel *simasel);
void check_imasel_copy(struct SpaceImaSel *simasel);
void free_imasel(struct SpaceImaSel *simasel);
void clever_numbuts_imasel(void);
void activate_imageselect(int type, char *title, char *file, void (*func)(char *));
void activate_imageselect_menu(int type, char *title, char *file, char *pupmenu, short *menup, void (*func)(char *));
void activate_imageselect_args(int type, char *title, char *file, void (*func)(char *, void *, void *), void *arg1, void *arg2);
void activate_databrowse_imasel(struct ID *id, int idcode, int fromcode, int retval, short *menup, void (*func)(unsigned short));
/*
void activate_databrowse_imasel_args(struct ID *id, int idcode, int fromcode, short *menup, void (*func)(char *, void *, void *), void *arg1, void *arg2);
*/
#endif

@ -48,6 +48,7 @@ typedef struct IconFile {
#define ICON_DEFAULT_HEIGHT 16
#define PREVIEW_DEFAULT_HEIGHT 96
/*
Resizable Icons for Blender
@ -57,6 +58,8 @@ int BIF_icon_get_width(int icon_id);
int BIF_icon_get_height(int icon_id);
void BIF_icon_draw(float x, float y, int icon_id);
void BIF_icon_draw_preview(float x, float y, int icon_id, int nocreate);
void BIF_icon_draw_aspect(float x, float y, int icon_id, float aspect);
void BIF_icon_draw_aspect_blended(float x, float y, int icon_id, float aspect, int shade);
void BIF_icons_free();

@ -164,7 +164,7 @@ typedef enum {
ICON_FACESEL_DEHLT,
ICON_FACESEL_HLT,
ICON_EDIT_DEHLT,
ICON_BLANK19,
ICON_BOOKMARKS,
ICON_BLANK20,
ICON_BLANK21,
ICON_BLANK22,

@ -75,6 +75,9 @@ struct SpaceOops;
/* sequence handler codes */
#define SEQ_HANDLER_PROPERTIES 60
/* imasel handler codes */
#define IMASEL_HANDLER_IMAGE 70
/* theme codes */
#define B_ADD_THEME 3301
#define B_DEL_THEME 3302

@ -33,27 +33,28 @@
#ifndef BSE_DRAWIMASEL_H
#define BSE_DRAWIMASEL_H
/* button events */
#define B_FS_FILENAME 1
#define B_FS_DIRNAME 2
#define B_FS_DIR_MENU 3
#define B_FS_PARDIR 4
#define B_FS_LOAD 5
#define B_FS_CANCEL 6
#define B_FS_LIBNAME 7
#define B_FS_BOOKMARK 8
/* ui geometry */
#define IMASEL_BUTTONS_HEIGHT 60
#define TILE_BORDER_X 8
#define TILE_BORDER_Y 8
struct ScrArea;
struct SpaceImaSel;
void viewgate(short sx, short sy, short ex, short ey);
void areaview (void);
void calc_hilite(struct SpaceImaSel *simasel);
void make_sima_area(struct SpaceImaSel *simasel);
void draw_sima_area(struct SpaceImaSel *simasel);
void select_ima_files(struct SpaceImaSel *simasel);
void move_imadir_sli(struct SpaceImaSel *simasel);
void move_imafile_sli(struct SpaceImaSel *simasel);
void ima_select_all(struct SpaceImaSel *simasel);
void pibplay(struct SpaceImaSel *simasel);
void drawimaselspace(struct ScrArea *sa, void *spacedata);
/* void calc_hilite(SpaceImaSel *simasel); */
/* void ima_select_all(SpaceImaSel *simasel); */
/* void move_imadir_sli(SpaceImaSel *simasel); */
/* void move_imafile_sli(SpaceImaSel *simasel); */
/* void pibplay(SpaceImaSel *simasel); */
/* void select_ima_files(SpaceImaSel *simasel); */
void calc_imasel_rcts(SpaceImaSel *simasel, int winx, int winy);
void do_imasel_buttonevents(short event, SpaceImaSel *simasel);
#endif /* BSE_DRAWIMASEL_H */

@ -53,8 +53,6 @@ void activate_fileselect(int type, char *title, char *file, void (*func)(char *)
void activate_fileselect_menu(int type, char *title, char *file, char *pupmenu, short *menup, void (*func)(char *));
void activate_fileselect_args(int type, char *title, char *file, void (*func)(char *, void *, void *), void *arg1, void *arg2);
void activate_imageselect(int type, char *title, char *file, void (*func)(char *));
void activate_databrowse(struct ID *id, int idcode, int fromcode, int retval, short *menup, void (*func)(unsigned short));
void activate_databrowse_args(struct ID *id, int idcode, int fromcode, short *menup, void (*func)(char *, void *, void *), void *arg1, void *arg2);

@ -344,7 +344,10 @@
#define B_CONTEXT_SWITCH 406
/* IMASEL: 450 */
/* in imasel.h */
/* in imasel.h - not any more - elubie */
#define B_SORTIMASELLIST 451
#define B_RELOADIMASELDIR 452
#define B_FILTERIMASELDIR 453
/* TEXT: 500 */
#define B_TEXTBROWSE 501

@ -44,6 +44,9 @@ extern char datatoc_Bfs[];
extern int datatoc_blenderbuttons_size;
extern char datatoc_blenderbuttons[];
extern int datatoc_prvicons_size;
extern char datatoc_prvicons[];
extern int datatoc_Bfont_size;
extern char datatoc_Bfont[];

@ -230,7 +230,7 @@ extern void ui_draw_but(uiBut *but);
extern void ui_rasterpos_safe(float x, float y, float aspect);
extern void ui_draw_tria_icon(float x, float y, float aspect, char dir);
extern void ui_draw_anti_x(float x1, float y1, float x2, float y2);
extern void ui_dropshadow(rctf *rct, float radius, float aspect, int select);
#endif

@ -120,6 +120,18 @@ typedef struct Library {
struct Library *parent; /* for outliner, showing dependency */
} Library;
#define PREVIEW_MIPMAPS 2
#define PREVIEW_MIPMAP_ZERO 0
#define PREVIEW_MIPMAP_LARGE 1
typedef struct PreviewImage {
unsigned int w[2];
unsigned int h[2];
short changed[2];
short pad0, pad1;
unsigned int * rect[2];
} PreviewImage;
/**
* Defines for working with IDs.
*

@ -41,11 +41,6 @@ struct anim;
struct ImBuf;
struct RenderResult;
typedef struct PreviewImage {
unsigned int w;
unsigned int h;
unsigned int * rect;
} PreviewImage;
/* ImageUser is in Texture, in Nodes, Background Image, Image Window, .... */
/* should be used in conjunction with an ID * to Image. */

@ -79,6 +79,9 @@ typedef struct Lamp {
struct MTex *mtex[10];
struct Ipo *ipo;
/* preview */
struct PreviewImage *preview;
ScriptLink scriptlink;
} Lamp;

@ -105,7 +105,8 @@ typedef struct Material {
struct bNodeTree *nodetree;
struct Ipo *ipo;
struct Group *group; /* light group */
struct PreviewImage * preview;
/* dynamic properties */
float friction, fh, reflect;
float fhdist, xyfrict;

@ -52,6 +52,7 @@ struct BlendHandle;
struct RenderInfo;
struct bNodeTree;
struct uiBlock;
struct FileList;
/**
* The base structure all the other spaces
@ -336,89 +337,63 @@ typedef struct SpaceNode {
#define SNODE_DO_PREVIEW 1
#define SNODE_BACKDRAW 2
#
#
typedef struct OneSelectableIma {
int header;
int ibuf_type;
struct ImBuf *pict;
struct OneSelectableIma *next;
struct OneSelectableIma *prev;
short cmap, image, draw_me, rt;
short sx, sy, ex, ey, dw, dh;
short selectable, selected;
int mtime, disksize;
char file_name[64];
short orgx, orgy, orgd, anim; /* same as ibuf->x...*/
char dummy[4]; /* 128 */
char pict_rect[3968]; /* 4096 (RECT = 64 * 62) */
} OneSelectableIma;
#
#
typedef struct ImaDir {
struct ImaDir *next, *prev;
int selected, hilite;
int type, size;
int mtime;
char name[100];
} ImaDir;
typedef struct SpaceImaSel {
SpaceLink *next, *prev;
int spacetype;
float blockscale;
struct ScrArea *area;
char title[28];
int fase;
short mode, subfase;
short mouse_move_redraw, imafase;
short mx, my;
short dirsli, dirsli_lines;
short dirsli_sx, dirsli_ey , dirsli_ex, dirsli_h;
short imasli, fileselmenuitem;
short imasli_sx, imasli_ey , imasli_ex, imasli_h;
short dssx, dssy, dsex, dsey;
short desx, desy, deex, deey;
short fssx, fssy, fsex, fsey;
short dsdh, fsdh;
short fesx, fesy, feex, feey;
short infsx, infsy, infex, infey;
short dnsx, dnsy, dnw, dnh;
short fnsx, fnsy, fnw, fnh;
short blockhandler[8];
char fole[128], dor[128];
char file[128], dir[128];
ImaDir *firstdir, *firstfile;
int topdir, totaldirs, hilite;
int topfile, totalfiles;
float image_slider;
float slider_height;
float slider_space;
short topima, totalima;
short curimax, curimay;
OneSelectableIma *first_sel_ima;
OneSelectableIma *hilite_ima;
short total_selected, ima_redraw;
int pad2;
struct ImBuf *cmap;
View2D v2d;
/* Also fucked. Needs to change so things compile, but breaks sdna
* ... */
/* void (*returnfunc)(void); */
void (*returnfunc)(char*);
void *arg1;
struct FileList *files;
/* specific stuff for drawing */
char title[24];
char dir[160];
char file[80];
short type, menu, flag, sort;
void *curfont;
int active_file;
int numtilesx;
int numtilesy;
int selstate;
struct rcti viewrect;
struct rcti bookmarkrect;
float scrollpos; /* current position of scrollhandle */
float scrollheight; /* height of the scrollhandle */
float scrollarea; /* scroll region, scrollpos is from 0 to scrollarea */
float aspect;
unsigned short retval; /* event */
short ipotype;
short filter;
short active_bookmark;
short pad, pad1;
/* view settings */
short prv_w;
short prv_h;
/* one day we'll add unions to dna */
void (*returnfunc)(char *);
void (*returnfunc_event)(unsigned short);
void (*returnfunc_args)(char *, void *, void *);
void *arg1, *arg2;
short *menup; /* pointer to menu result or ID browsing */
char *pupmenu; /* optional menu in header */
struct ImBuf *img;
} SpaceImaSel;
@ -447,7 +422,7 @@ typedef struct SpaceImaSel {
#define FILE_MAIN 2
#define FILE_LOADFONT 3
/* sfile->flag */
/* sfile->flag and simasel->flag */
#define FILE_SHOWSHORT 1
#define FILE_STRINGCODE 2
#define FILE_LINK 4
@ -456,6 +431,8 @@ typedef struct SpaceImaSel {
#define FILE_ACTIVELAY 32
#define FILE_ATCURSOR 64
#define FILE_SYNCPOSE 128
#define FILE_FILTER 256
#define FILE_BOOKMARKS 512
/* sfile->sort */
#define FILE_SORTALPHA 0
@ -472,6 +449,9 @@ typedef struct SpaceImaSel {
#define PYSCRIPTFILE 64
#define FTFONTFILE 128
#define SOUNDFILE 256
#define TEXTFILE 512
#define MOVIEFILE_ICON 1024 /* movie file that preview can't load */
#define FOLDERFILE 2048 /* represents folders for filtering */
#define SCROLLH 16 /* height scrollbar */
#define SCROLLB 16 /* width scrollbar */

@ -44,6 +44,7 @@ struct EnvMap;
struct Object;
struct Tex;
struct Image;
struct PreviewImage;
struct ImBuf;
typedef struct MTex {
@ -171,7 +172,7 @@ typedef struct Tex {
struct PluginTex *plugin;
struct ColorBand *coba;
struct EnvMap *env;
struct PreviewImage * preview;
} Tex;

@ -205,6 +205,7 @@ extern UserDef U; /* from usiblender.c !!!! */
#define USER_NONUMPAD 8192
#define USER_LMOUSESELECT 16384
#define USER_FILECOMPRESS 32768
#define USER_SAVE_PREVIEWS 65536
/* viewzom */
#define USER_ZOOM_CONT 0

@ -108,6 +108,9 @@ typedef struct World {
struct Ipo *ipo;
struct MTex *mtex[10];
/* previews */
struct PreviewImage *preview;
ScriptLink scriptlink;
} World;

@ -40,6 +40,7 @@
#include "BKE_scene.h" /* scene_find_camera() */
#include "BPI_script.h"
#include "BIF_mywindow.h"
#include "BIF_imasel.h"
#include "BSE_headerbuttons.h"
#include "BSE_filesel.h"
#include "BIF_editmesh.h" /* for undo_push_mesh() */

@ -244,6 +244,7 @@ static OSErr QT_get_frameIndexes(struct anim *anim)
TimeValue nextTime = 0;
TimeValue startPoint;
TimeValue tmpstartPoint;
long sampleCount = 0;
startPoint = -1;
@ -254,12 +255,12 @@ static OSErr QT_get_frameIndexes(struct anim *anim)
anim->qtime->framecount = 0;
while(tmpstartPoint != -1) {
nextTime = 0;
GetMovieNextInterestingTime(anim->qtime->movie, nextTimeMediaSample, 1, &media, tmpstartPoint, 0, &nextTime, NULL);
tmpstartPoint = nextTime;
anim->qtime->framecount ++;
}
sampleCount = GetMediaSampleCount(anim->qtime->theMedia);
anErr = GetMoviesError();
if (anErr != noErr) return anErr;
anim->qtime->framecount = sampleCount;
anim->qtime->frameIndex = (TimeValue *) MEM_callocN(sizeof(TimeValue) * anim->qtime->framecount, "qtframeindex");
//rewind
@ -403,6 +404,7 @@ int startquicktime (struct anim *anim)
char *qtname;
Str255 dst;
#endif
short depth = 0;
anim->qtime = MEM_callocN (sizeof(QuicktimeMovie),"animqt");
anim->qtime->have_gw = FALSE;
@ -483,6 +485,9 @@ int startquicktime (struct anim *anim)
anim->qtime->offscreenGWorld,
GetGWorldDevice(anim->qtime->offscreenGWorld));
SetMoviePlayHints(anim->qtime->movie, hintsHighQuality, hintsHighQuality);
// sets Media and Track!
depth = GetFirstVideoTrackPixelDepth(anim);
QT_get_frameIndexes(anim);
}
@ -491,7 +496,7 @@ int startquicktime (struct anim *anim)
LockPixels(anim->qtime->offscreenPixMap);
//fill blender's anim struct
anim->qtime->depth = GetFirstVideoTrackPixelDepth(anim);
anim->qtime->depth = depth;
anim->duration = anim->qtime->framecount;
anim->params = 0;

@ -61,6 +61,7 @@
#include "BIF_graphics.h"
#include "BIF_glutil.h"
#include "BIF_interface.h"
#include "BIF_imasel.h"
#include "BIF_keyval.h"
#include "BIF_mainqueue.h"
#include "BIF_mywindow.h"

@ -94,6 +94,7 @@
#include "BIF_mywindow.h"
#include "BIF_space.h"
#include "BIF_glutil.h"
#include "BIF_imasel.h"
#include "BIF_interface.h"
#include "BIF_toolbox.h"
#include "BIF_space.h"
@ -876,7 +877,12 @@ static void image_load_fs_cb(void *ima_pp_v, void *iuser_v)
#else
else name = U.textudir;
#endif
activate_fileselect_args(FILE_SPECIAL, "SELECT IMAGE", name, load_image_cb, ima_pp_v, iuser_v);
if (G.qual & LR_CTRLKEY) {
activate_imageselect_args(FILE_SPECIAL, "SELECT IMAGE", name, load_image_cb, ima_pp_v, iuser_v);
}
else {
activate_fileselect_args(FILE_SPECIAL, "SELECT IMAGE", name, load_image_cb, ima_pp_v, iuser_v);
}
}
/* 5 layer button callbacks... */

File diff suppressed because it is too large Load Diff

@ -1773,37 +1773,6 @@ static void draw_nodespace_back(ScrArea *sa, SpaceNode *snode)
}
}
static void nodeshadow(rctf *rct, float radius, float aspect, int select)
{
float rad;
float a;
char alpha= 2;
glEnable(GL_BLEND);
if(radius > (rct->ymax-rct->ymin-10.0f)/2.0f)
rad= (rct->ymax-rct->ymin-10.0f)/2.0f;
else
rad= radius;
if(select) a= 10.0f*aspect; else a= 7.0f*aspect;
for(; a>0.0f; a-=aspect) {
/* alpha ranges from 2 to 20 or so */
glColor4ub(0, 0, 0, alpha);
alpha+= 2;
gl_round_box(GL_POLYGON, rct->xmin - a, rct->ymin - a, rct->xmax + a, rct->ymax-10.0f + a, rad+a);
}
/* outline emphasis */
glEnable( GL_LINE_SMOOTH );
glColor4ub(0, 0, 0, 100);
gl_round_box(GL_LINE_LOOP, rct->xmin-0.5f, rct->ymin-0.5f, rct->xmax+0.5f, rct->ymax+0.5f, radius);
glDisable( GL_LINE_SMOOTH );
glDisable(GL_BLEND);
}
/* nice AA filled circle */
static void socket_circle_draw(float x, float y, float size, int type, int select)
{
@ -2148,7 +2117,7 @@ static void node_draw_basis(ScrArea *sa, SpaceNode *snode, bNode *node)
int ofs, color_id= node_get_colorid(node);
uiSetRoundBox(15-4);
nodeshadow(rct, BASIS_RAD, snode->aspect, node->flag & SELECT);
ui_dropshadow(rct, BASIS_RAD, snode->aspect, node->flag & SELECT);
/* header */
if(color_id==TH_NODE)
@ -2352,7 +2321,7 @@ void node_draw_hidden(SpaceNode *snode, bNode *node)
/* shadow */
uiSetRoundBox(15);
nodeshadow(rct, hiddenrad, snode->aspect, node->flag & SELECT);
ui_dropshadow(rct, hiddenrad, snode->aspect, node->flag & SELECT);
/* body */
BIF_ThemeColor(color_id);

File diff suppressed because it is too large Load Diff

@ -358,6 +358,11 @@ void areawinset(short win)
G.v2d= &snode->v2d;
}
break;
case SPACE_IMASEL:
{
SpaceImaSel *simasel= curarea->spacedata.first;
G.v2d= &simasel->v2d;
}
default:
break;
}

@ -79,6 +79,7 @@
#include "BIF_gl.h"
#include "BIF_glutil.h"
#include "BIF_imasel.h"
#include "BIF_interface.h"
#include "BIF_drawimage.h"
#include "BIF_editview.h"

File diff suppressed because it is too large Load Diff

@ -86,6 +86,7 @@
#include "BKE_utildefines.h"
#include "BIF_editview.h"
#include "BIF_filelist.h"
#include "BIF_gl.h"
#include "BIF_interface.h"
#include "BIF_language.h"
@ -116,7 +117,7 @@
#endif
#if defined WIN32 || defined __BeOS
int fnmatch(const char *pattern, const char *string, int flags)
static int fnmatch(const char *pattern, const char *string, int flags)
{
return 0;
}
@ -170,155 +171,6 @@ static float pixels_to_ofs;
static char otherdir[FILE_MAX];
static ScrArea *otherarea;
/* FSMENU HANDLING */
/* FSMenuEntry's without paths indicate seperators */
typedef struct _FSMenuEntry FSMenuEntry;
struct _FSMenuEntry {
FSMenuEntry *next;
char *path;
};
static FSMenuEntry *fsmenu= 0;
int fsmenu_get_nentries(void)
{
FSMenuEntry *fsme;
int count= 0;
for (fsme= fsmenu; fsme; fsme= fsme->next)
count++;
return count;
}
int fsmenu_is_entry_a_seperator(int idx)
{
FSMenuEntry *fsme;
for (fsme= fsmenu; fsme && idx; fsme= fsme->next)
idx--;
return (fsme && !fsme->path)?1:0;
}
char *fsmenu_get_entry(int idx)
{
FSMenuEntry *fsme;
for (fsme= fsmenu; fsme && idx; fsme= fsme->next)
idx--;
return fsme?fsme->path:NULL;
}
char *fsmenu_build_menu(void)
{
DynStr *ds= BLI_dynstr_new();
FSMenuEntry *fsme;
char *menustr;
for (fsme= fsmenu; fsme; fsme= fsme->next) {
if (!fsme->path) {
/* clean consecutive seperators and ignore trailing ones */
if (fsme->next) {
if (fsme->next->path) {
BLI_dynstr_append(ds, "%l|");
} else {
FSMenuEntry *next= fsme->next;
fsme->next= next->next;
MEM_freeN(next);
}
}
} else {
BLI_dynstr_append(ds, fsme->path);
if (fsme->next) BLI_dynstr_append(ds, "|");
}
}
menustr= BLI_dynstr_get_cstring(ds);
BLI_dynstr_free(ds);
return menustr;
}
static FSMenuEntry *fsmenu_get_last_separator(void)
{
FSMenuEntry *fsme, *lsep=NULL;
for (fsme= fsmenu; fsme; fsme= fsme->next)
if (!fsme->path)
lsep= fsme;
return lsep;
}
void fsmenu_insert_entry(char *path, int sorted)
{
FSMenuEntry *prev= fsmenu_get_last_separator();
FSMenuEntry *fsme= prev?prev->next:fsmenu;
for (; fsme; prev= fsme, fsme= fsme->next) {
if (fsme->path) {
if (BLI_streq(path, fsme->path)) {
return;
} else if (sorted && strcmp(path, fsme->path)<0) {
break;
}
}
}
fsme= MEM_mallocN(sizeof(*fsme), "fsme");
fsme->path= BLI_strdup(path);
if (prev) {
fsme->next= prev->next;
prev->next= fsme;
} else {
fsme->next= fsmenu;
fsmenu= fsme;
}
}
void fsmenu_append_seperator(void)
{
if (fsmenu) {
FSMenuEntry *fsme= fsmenu;
while (fsme->next) fsme= fsme->next;
fsme->next= MEM_mallocN(sizeof(*fsme), "fsme");
fsme->next->next= NULL;
fsme->next->path= NULL;
}
}
void fsmenu_remove_entry(int idx)
{
FSMenuEntry *prev= NULL, *fsme= fsmenu;
for (fsme= fsmenu; fsme && idx; prev= fsme, fsme= fsme->next)
if (fsme->path)
idx--;
if (fsme) {
if (prev) {
prev->next= fsme->next;
} else {
fsmenu= fsme->next;
}
MEM_freeN(fsme->path);
MEM_freeN(fsme);
}
}
void fsmenu_free(void)
{
FSMenuEntry *fsme= fsmenu;
while (fsme) {
FSMenuEntry *n= fsme->next;
if (fsme->path) MEM_freeN(fsme->path);
MEM_freeN(fsme);
fsme= n;
}
}
/* ******************* SORT ******************* */
static int compare_name(const void *a1, const void *a2)
@ -1399,41 +1251,6 @@ void activate_fileselect_args(int type, char *title, char *file, void (*func)(ch
activate_fileselect_(type, title, file, NULL, NULL, NULL, NULL, func, arg1, arg2);
}
void activate_imageselect(int type, char *title, char *file, void (*func)(char *))
{
SpaceImaSel *simasel;
char dir[FILE_MAX], name[FILE_MAX];
if(curarea==NULL) return;
if(curarea->win==0) return;
newspace(curarea, SPACE_IMASEL);
/* sometimes double, when area is already SPACE_FILE with a different file name */
addqueue(curarea->headwin, CHANGED, 1);
addqueue(curarea->win, CHANGED, 1);
name[2]= 0;
BLI_strncpy(name, file, sizeof(name));
simasel= curarea->spacedata.first;
simasel->returnfunc= func;
if(BLI_convertstringcode(name, G.sce, G.scene->r.cfra)) simasel->mode |= IMS_STRINGCODE;
else simasel->mode &= ~IMS_STRINGCODE;
BLI_split_dirfile(name, dir, simasel->file);
BLI_cleanup_dir(G.sce, simasel->dir);
if(strcmp(dir, simasel->dir)!=0) simasel->fase= 0;
BLI_strncpy(simasel->dir, dir, sizeof(simasel->dir));
BLI_strncpy(simasel->title, title, sizeof(simasel->title));
/* filetoname= 1; */
}
void activate_databrowse(ID *id, int idcode, int fromcode, int retval, short *menup, void (*func)(unsigned short))
{
ListBase *lb;
@ -1603,7 +1420,7 @@ static void filesel_execute(SpaceFile *sfile)
allqueue(REDRAWALL, 1);
}
else if(filesel_has_func(sfile)) {
fsmenu_insert_entry(sfile->dir, 1);
fsmenu_insert_entry(sfile->dir, 1, 0);
if(sfile->type==FILE_MAIN) { /* DATABROWSE */
if (sfile->menup) { /* with value pointing to ID block index */
@ -2017,7 +1834,7 @@ void winqreadfilespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
strcat(sfile->dir, sfile->filelist[act].relname);
strcat(sfile->dir,"/");
BLI_cleanup_dir(G.sce, sfile->dir);
freefilelist(sfile);
freefilelist(sfile);
sfile->ofs= 0;
do_draw= 1;
}

260
source/blender/src/fsmenu.c Normal file

@ -0,0 +1,260 @@
/**
* $Id: fsmenu.c 11698 2007-08-19 12:22:51Z elubie $
*
* ***** 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 *****
*/
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "MEM_guardedalloc.h"
#include "BMF_Api.h"
#include "BLI_blenlib.h"
#include "BLI_linklist.h"
#include "BLI_dynstr.h"
#include "BIF_usiblender.h"
#include "BIF_fsmenu.h" /* include ourselves */
/* FSMENU HANDLING */
/* FSMenuEntry's without paths indicate seperators */
typedef struct _FSMenuEntry FSMenuEntry;
struct _FSMenuEntry {
FSMenuEntry *next;
char *path;
short save;
};
static FSMenuEntry *fsmenu= 0;
int fsmenu_get_nentries(void)
{
FSMenuEntry *fsme;
int count= 0;
for (fsme= fsmenu; fsme; fsme= fsme->next)
count++;
return count;
}
int fsmenu_is_entry_a_seperator(int idx)
{
FSMenuEntry *fsme;
for (fsme= fsmenu; fsme && idx; fsme= fsme->next)
idx--;
return (fsme && !fsme->path)?1:0;
}
char *fsmenu_get_entry(int idx)
{
FSMenuEntry *fsme;
for (fsme= fsmenu; fsme && idx; fsme= fsme->next)
idx--;
return fsme?fsme->path:NULL;
}
char *fsmenu_build_menu(void)
{
DynStr *ds= BLI_dynstr_new();
FSMenuEntry *fsme;
char *menustr;
for (fsme= fsmenu; fsme; fsme= fsme->next) {
if (!fsme->path) {
/* clean consecutive seperators and ignore trailing ones */
if (fsme->next) {
if (fsme->next->path) {
BLI_dynstr_append(ds, "%l|");
} else {
FSMenuEntry *next= fsme->next;
fsme->next= next->next;
MEM_freeN(next);
}
}
} else {
if (fsme->save) {
BLI_dynstr_append(ds, "o ");
} else {
BLI_dynstr_append(ds, " ");
}
BLI_dynstr_append(ds, fsme->path);
if (fsme->next) BLI_dynstr_append(ds, "|");
}
}
menustr= BLI_dynstr_get_cstring(ds);
BLI_dynstr_free(ds);
return menustr;
}
static FSMenuEntry *fsmenu_get_last_separator(void)
{
FSMenuEntry *fsme, *lsep=NULL;
for (fsme= fsmenu; fsme; fsme= fsme->next)
if (!fsme->path)
lsep= fsme;
return lsep;
}
static FSMenuEntry *fsmenu_get_first_separator(void)
{
FSMenuEntry *fsme, *lsep=NULL;
for (fsme= fsmenu; fsme; fsme= fsme->next)
if (!fsme->path) {
lsep= fsme;
break;
}
return lsep;
}
void fsmenu_insert_entry(char *path, int sorted, short save)
{
FSMenuEntry *prev;
FSMenuEntry *fsme;
if (save) {
prev = fsmenu_get_first_separator();
} else {
prev = fsmenu_get_last_separator();
}
fsme= prev?prev->next:fsmenu;
for (; fsme; prev= fsme, fsme= fsme->next) {
if (fsme->path) {
if (BLI_streq(path, fsme->path)) {
return;
} else if (sorted && strcmp(path, fsme->path)<0) {
break;
}
} else {
// if we're bookmarking this, file should come
// before the last separator, only automatically added
// current dir go after the last sep.
if (save) {
break;
}
}
}
fsme= MEM_mallocN(sizeof(*fsme), "fsme");
fsme->path= BLI_strdup(path);
fsme->save = save;
if (prev) {
fsme->next= prev->next;
prev->next= fsme;
} else {
fsme->next= fsmenu;
fsmenu= fsme;
}
}
void fsmenu_append_separator(void)
{
if (fsmenu) {
FSMenuEntry *fsme= fsmenu;
while (fsme->next) fsme= fsme->next;
fsme->next= MEM_mallocN(sizeof(*fsme), "fsme");
fsme->next->next= NULL;
fsme->next->path= NULL;
}
}
void fsmenu_remove_entry(int idx)
{
FSMenuEntry *prev= NULL, *fsme= fsmenu;
for (fsme= fsmenu; fsme && idx; prev= fsme, fsme= fsme->next)
idx--;
if (fsme) {
if (prev) {
prev->next= fsme->next;
} else {
fsmenu= fsme->next;
if (fsme->save) {
if (prev) {
prev->next= fsme->next;
} else {
fsmenu= fsme->next;
}
// you should only be able to remove entries that were
// not added by default
if (fsme->path) {
MEM_freeN(fsme->path);
}
MEM_freeN(fsme);
}
}
}
}
void fsmenu_write_file(const char *filename)
{
FSMenuEntry *fsme= fsmenu;
FILE *fp = fopen(filename, "w");
if (!fp) return;
for (fsme= fsmenu; fsme; fsme= fsme->next) {
if (fsme->path && fsme->save) {
fprintf(fp, "%s\n", fsme->path);
}
}
fclose(fp);
}
void fsmenu_free(void)
{
FSMenuEntry *fsme= fsmenu;
while (fsme) {
FSMenuEntry *n= fsme->next;
if (fsme->path) MEM_freeN(fsme->path);
MEM_freeN(fsme);
fsme= n;
}
}

@ -50,6 +50,11 @@
#include "BIF_glutil.h"
#include "BIF_mywindow.h"
#ifndef GL_CLAMP_TO_EDGE
#define GL_CLAMP_TO_EDGE 0x812F
#endif
/* Invert line handling */
#define glToggle(mode, onoff) (((onoff)?glEnable:glDisable)(mode))
@ -263,10 +268,17 @@ void glaDrawPixelsTex(float x, float y, int img_w, int img_h, int format, void *
int nsubparts_x= (img_w+(tex_w-1))/tex_w;
int nsubparts_y= (img_h+(tex_h-1))/tex_h;
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
/* Specify the color outside this function, and tex will modulate it.
* This is useful for changing alpha without using glPixelTransferf()
*/
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glPixelStorei(GL_UNPACK_ROW_LENGTH, img_w);
glBindTexture(GL_TEXTURE_2D, texid);
/* don't want nasty border artifacts */
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
for (subpart_y=0; subpart_y<nsubparts_y; subpart_y++) {
for (subpart_x=0; subpart_x<nsubparts_x; subpart_x++) {
int subpart_w= (subpart_x==nsubparts_x-1)?(img_w-subpart_x*tex_w):tex_w;
@ -278,17 +290,16 @@ void glaDrawPixelsTex(float x, float y, int img_w, int img_h, int format, void *
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, subpart_w, subpart_h, GL_RGBA, GL_FLOAT, &f_rect[(subpart_y*tex_w)*img_w*4 + (subpart_x*tex_w)*4]);
else
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, subpart_w, subpart_h, GL_RGBA, GL_UNSIGNED_BYTE, &uc_rect[(subpart_y*tex_w)*img_w*4 + (subpart_x*tex_w)*4]);
glColor3ub(255, 255, 255);
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2f(rast_x, rast_y);
glTexCoord2f((float) subpart_w/tex_w, 0);
glTexCoord2f((float) (subpart_w-1)/tex_w, 0);
glVertex2f(rast_x+subpart_w*xzoom, rast_y);
glTexCoord2f((float) subpart_w/tex_w, (float) subpart_h/tex_h);
glTexCoord2f((float) (subpart_w-1)/tex_w, (float) subpart_h/tex_h);
glVertex2f(rast_x+subpart_w*xzoom, rast_y+subpart_h*yzoom);
glTexCoord2f(0, (float) subpart_h/tex_h);

@ -49,7 +49,9 @@
#include "DNA_ID.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
#include "DNA_userdef_types.h"
#include "BIF_filelist.h"
#include "BIF_gl.h"
#include "BIF_imasel.h"
#include "BIF_interface.h"
@ -65,26 +67,30 @@
void do_imasel_buttons(short event)
{
SpaceImaSel *simasel;
char name[256];
simasel= curarea->spacedata.first;
if(curarea->win==0) return;
switch(event) {
case B_IMASELHOME:
case B_SORTIMASELLIST:
BIF_filelist_sort(simasel->files, simasel->sort);
scrarea_queue_winredraw(curarea);
break;
case B_IMASELREMOVEBIP:
if(bitset(simasel->fase, IMS_FOUND_BIP)){
strcpy(name, simasel->dir);
strcat(name, ".Bpib");
remove(name);
simasel->fase &= ~ IMS_FOUND_BIP;
case B_RELOADIMASELDIR:
BIF_filelist_free(simasel->files);
scrarea_queue_winredraw(curarea);
break;
case B_FILTERIMASELDIR:
if (simasel->flag & FILE_FILTER) {
BIF_filelist_setfilter(simasel->files,simasel->filter);
BIF_filelist_filter(simasel->files);
scrarea_queue_winredraw(curarea);
} else {
BIF_filelist_setfilter(simasel->files,0);
BIF_filelist_filter(simasel->files);
scrarea_queue_winredraw(curarea);
}
break;
}
@ -94,9 +100,9 @@ void imasel_buttons(void)
{
SpaceImaSel *simasel;
uiBlock *block;
short xco;
short xco, xcotitle;
char naam[256];
simasel= curarea->spacedata.first;
sprintf(naam, "header %d", curarea->headwin);
@ -117,26 +123,76 @@ void imasel_buttons(void)
if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco,0,XIC,YIC, 0, 0, 0, 0, 0, "");
else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco,0,XIC,YIC, 0, 0, 0, 0, 0, "");
/* SORT TYPE */
xco+=XIC;
if (simasel->title){
xco+=25;
glRasterPos2i(xco, 4);
BMF_DrawString(G.font, simasel->title);
xco+=BMF_GetStringWidth(G.fonts, simasel->title);
xco+=25;
}
uiBlockBeginAlign(block);
uiDefIconBut(block, BUT, B_IMASELREMOVEBIP, ICON_BPIBFOLDER_X, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "");/* remove */
uiDefIconButS(block, TOG|BIT|0, B_REDR, ICON_BPIBFOLDERGREY, xco+=XIC,0,XIC,YIC, &simasel->mode, 0, 0, 0, 0, "Toggles display of directory information");/* dir */
uiDefIconButS(block, TOG|BIT|1, B_REDR, ICON_INFO, xco+=XIC,0,XIC,YIC, &simasel->mode, 0, 0, 0, 0, "Toggles display of selected image information");/* info */
uiDefIconButS(block, TOG|BIT|2, B_REDR, ICON_IMAGE_COL, xco+=XIC,0,XIC,YIC, &simasel->mode, 0, 0, 0, 0, "");/* image */
uiDefIconButS(block, TOG|BIT|3, B_REDR, ICON_MAGNIFY, xco+=XIC,0,XIC,YIC, &simasel->mode, 0, 0, 0, 0, "Toggles magnified view of thumbnail of images under mouse pointer");/* magnify */
uiDefIconButS(block, ROW, B_SORTIMASELLIST, ICON_SORTALPHA, xco+=XIC,0,XIC,YIC, &simasel->sort, 1.0, 0.0, 0, 0, "Sorts files alphabetically");
uiDefIconButS(block, ROW, B_SORTIMASELLIST, ICON_SORTBYEXT, xco+=XIC,0,XIC,YIC, &simasel->sort, 1.0, 3.0, 0, 0, "Sorts files by extension");
uiDefIconButS(block, ROW, B_SORTIMASELLIST, ICON_SORTTIME, xco+=XIC,0,XIC,YIC, &simasel->sort, 1.0, 1.0, 0, 0, "Sorts files by time");
uiDefIconButS(block, ROW, B_SORTIMASELLIST, ICON_SORTSIZE, xco+=XIC,0,XIC,YIC, &simasel->sort, 1.0, 2.0, 0, 0, "Sorts files by size");
uiBlockEndAlign(block);
cpack(0x0);
xco+=XIC+10;
uiDefIconButBitS(block, TOG, FILE_BOOKMARKS, B_RELOADIMASELDIR, ICON_BOOKMARKS,xco+=XIC,0,XIC,YIC, &simasel->flag, 0, 0, 0, 0, "Toggles Bookmarks on/off");
xco+=XIC+10;
xcotitle= xco;
xco+= BIF_GetStringWidth(G.font, simasel->title, (U.transopts & USER_TR_BUTTONS));
if(simasel->pupmenu && simasel->menup) {
uiDefButS(block, MENU, B_NOP, simasel->pupmenu, xco+10,0,90,20, simasel->menup, 0, 0, 0, 0, "");
xco+= 100;
}
uiBlockBeginAlign(block);
uiDefIconButBitS(block, TOG, FILE_HIDE_DOT, B_RELOADIMASELDIR, ICON_GHOST,xco+=XIC,0,XIC,YIC, &simasel->flag, 0, 0, 0, 0, "Hides dot files");
uiBlockEndAlign(block);
xco+=20;
uiDefIconButBitS(block, TOG, FILE_FILTER, B_FILTERIMASELDIR, ICON_SORTBYEXT,xco+=XIC,0,XIC,YIC, &simasel->flag, 0, 0, 0, 0, "Filter files");
if (simasel->flag & FILE_FILTER) {
xco+=4;
uiBlockBeginAlign(block);
uiDefIconButBitS(block, TOG, IMAGEFILE, B_FILTERIMASELDIR, ICON_IMAGE_COL,xco+=XIC,0,XIC,YIC, &simasel->filter, 0, 0, 0, 0, "Show images");
uiDefIconButBitS(block, TOG, BLENDERFILE, B_FILTERIMASELDIR, ICON_BLENDER,xco+=XIC,0,XIC,YIC, &simasel->filter, 0, 0, 0, 0, "Show .blend files");
uiDefIconButBitS(block, TOG, MOVIEFILE, B_FILTERIMASELDIR, ICON_SEQUENCE,xco+=XIC,0,XIC,YIC, &simasel->filter, 0, 0, 0, 0, "Show movies");
uiDefIconButBitS(block, TOG, PYSCRIPTFILE, B_FILTERIMASELDIR, ICON_PYTHON,xco+=XIC,0,XIC,YIC, &simasel->filter, 0, 0, 0, 0, "Show python scripts");
uiDefIconButBitS(block, TOG, FTFONTFILE, B_FILTERIMASELDIR, ICON_SYNTAX,xco+=XIC,0,XIC,YIC, &simasel->filter, 0, 0, 0, 0, "Show fonts");
uiDefIconButBitS(block, TOG, SOUNDFILE, B_FILTERIMASELDIR, ICON_SOUND,xco+=XIC,0,XIC,YIC, &simasel->filter, 0, 0, 0, 0, "Show sound files");
uiDefIconButBitS(block, TOG, TEXTFILE, B_FILTERIMASELDIR, ICON_TEXT,xco+=XIC,0,XIC,YIC, &simasel->filter, 0, 0, 0, 0, "Show text files");
uiDefIconButBitS(block, TOG, FOLDERFILE, B_FILTERIMASELDIR, ICON_FILESEL,xco+=XIC,0,XIC,YIC, &simasel->filter, 0, 0, 0, 0, "Show folders");
uiBlockEndAlign(block);
}
uiDefButBitS(block, TOG, FILE_STRINGCODE, 0, "Relative Paths", xco+=XIC+20,0,100,YIC, &simasel->flag, 0, 0, 0, 0, "Makes sure returned paths are relative to the current .blend file");
xco+=90;
if(simasel->type==FILE_LOADLIB) {
uiBlockBeginAlign(block);
uiDefButBitS(block, TOGN, FILE_LINK, B_REDR, "Append", xco+=XIC,0,100,YIC, &simasel->flag, 0, 0, 0, 0, "Copies selected data into current project");
uiDefButBitS(block, TOG, FILE_LINK, B_REDR, "Link", xco+=100,0,100,YIC, &simasel->flag, 0, 0, 0, 0, "Creates a link to selected data from current project");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
uiDefButBitS(block, TOG, FILE_AUTOSELECT, B_REDR, "Autosel", xco+=125,0,65,YIC, &simasel->flag, 0, 0, 0, 0, "Autoselect imported objects");
uiDefButBitS(block, TOG, FILE_ACTIVELAY, B_REDR, "Active Layer", xco+=65,0,80,YIC, &simasel->flag, 0, 0, 0, 0, "Append object(s) in active layer");
uiDefButBitS(block, TOG, FILE_ATCURSOR, B_REDR, "At Cursor", xco+=80,0,65,YIC, &simasel->flag, 0, 0, 0, 0, "Append object(s) at cursor, use centroid if more than one object is selected");
uiBlockEndAlign(block);
xco+= 100; // scroll
} else if(simasel->type==FILE_BLENDER) {
uiDefButBitI(block, TOGN, G_FILE_NO_UI, B_REDR, "Load UI", xco+=XIC,0,80,YIC, &G.fileflags, 0, 0, 0, 0, "Load the UI setup as well as the scene data");
xco+= 100; // scroll
}
glRasterPos2f((float)xcotitle, 5.0);
BIF_RasterPos((float)xcotitle, 5.0); // stupid texture fonts
BIF_ThemeColor(TH_TEXT);
BIF_DrawString(uiBlockGetCurFont(block), simasel->title, (U.transopts & USER_TR_BUTTONS));
/* always do as last */
curarea->headbutlen= xco+2*XIC;
uiDrawBlock(block);
}
}

@ -105,6 +105,7 @@
#include "BSE_editipo.h"
#include "BSE_filesel.h"
#include "BIF_imasel.h"
#include "BSE_headerbuttons.h"
#include "BSE_node.h"
#include "BSE_sequence.h"
@ -839,6 +840,9 @@ static void do_info_filemenu(void *arg, int event)
case 6: /* save image */
BIF_save_rendered_image_fs();
break;
case 7:
activate_imageselect(FILE_LOADLIB, "Load Library", G.lib, 0);
break;
case 22: /* save runtime */
activate_fileselect(FILE_SPECIAL, "Save Runtime", "", write_runtime_check);
break;
@ -991,6 +995,7 @@ static uiBlock *info_filemenu(void *arg_unused)
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Append or Link|Shift F1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Append or Link (Image Browser)|Ctrl F1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
uiDefIconTextBlockBut(block, info_file_importmenu, NULL, ICON_RIGHTARROW_THIN, "Import", 0, yco-=20, menuwidth, 19, "");
uiDefIconTextBlockBut(block, info_file_exportmenu, NULL, ICON_RIGHTARROW_THIN, "Export", 0, yco-=20, menuwidth, 19, "");

@ -709,7 +709,12 @@ void do_global_buttons(unsigned short event)
else return;
if(*menunr== -2) {
activate_databrowse((ID *)lockpoin, ID_MA, 0, B_MATBROWSE, menunr, do_global_buttons);
if(G.qual & LR_CTRLKEY) {
activate_databrowse_imasel((ID *)lockpoin, ID_MA, 0, B_MATBROWSE, menunr, do_global_buttons);
}
else {
activate_databrowse((ID *)lockpoin, ID_MA, 0, B_MATBROWSE, menunr, do_global_buttons);
}
return;
}

@ -57,864 +57,29 @@
#include "BKE_global.h"
#include "BIF_imasel.h"
#include "BIF_filelist.h"
#include "BIF_space.h"
#include "BIF_screen.h"
#include "blendef.h"
#include "mydevice.h"
#ifndef WIN32
#include <dirent.h>
#endif
#include <sys/stat.h>
#include "datatoc.h"
/* locals */
void longtochar(char *des, unsigned int *src, int size);
void chartolong(unsigned int *des, char *src, int size);
int dir_compare(const void *a1, const void *a2);
void issort( int te, ImaDir **firstentry);
int ima_compare(const void *a1, const void *a2);
void imsort(OneSelectableIma **firstentry);
void append_pib(SpaceImaSel *simasel, OneSelectableIma *ima);
void add_ima(int who, SpaceImaSel *simasel, ImaDir *direntry);
/* implementation */
int bitset(int l, int bit)
{ return (( l & bit) == bit); }
void longtochar(char *des, unsigned int *src, int size)
{ int i;for (i = 0; i<size; i++){ des[i] = src[i] & 0xFF; }}
void chartolong(unsigned int *des, char *src, int size)
{ int i;for (i = 0; i<size; i++){ des[i] = src[i]; }}
int dir_compare(const void *a1, const void *a2)
{
ImaDir **in1, **in2;
ImaDir *use1, *use2;
in1= (ImaDir **)a1;
in2= (ImaDir **)a2;
use1 = *in1;
use2 = *in2;
return BLI_strcasecmp(use1->name, use2->name);
}
void issort( int te, ImaDir **firstentry)
{
ImaDir **sort;
ImaDir *use;
int i = 0;
sort = MEM_mallocN(te * sizeof(void *), "dir Sorteer temp");
use = *firstentry;
while (use){
sort[i++] = use;
use = use->next;
}
qsort (sort, te, sizeof(void *), dir_compare);
*firstentry = sort[0];
use = *firstentry;
for (i=0; i<te; i++){
if (i != 0) use->prev = sort[i-1]; else use->prev = 0;
if (i != te-1) use->next = sort[i+1]; else use->next = 0;
use = use->next;
}
MEM_freeN(sort);
}
int ima_compare(const void *a1, const void *a2)
{
OneSelectableIma **in1, **in2;
OneSelectableIma *use1, *use2;
in1= (OneSelectableIma **)a1;
in2= (OneSelectableIma **)a2;
use1 = *in1; use2 = *in2;
return BLI_strcasecmp(use1->file_name, use2->file_name);
}
void imsort(OneSelectableIma **firstentry)
{
OneSelectableIma **sort;
OneSelectableIma *use;
int tot = 0, i = 0;
use = *firstentry;
while (use){
tot++;
use = use->next;
}
if (tot){
sort = MEM_mallocN(tot * sizeof(void *), "Sorteer imsort temp");
use = *firstentry;
while (use){
sort[i++] = use;
use = use->next;
}
qsort (sort, tot, sizeof(void *), ima_compare);
*firstentry = sort[0];
use = *firstentry;
for (i=0; i<tot; i++){
if (i != 0) use->prev = sort[i-1]; else use->prev = 0;
if (i != tot-1) use->next = sort[i+1]; else use->next = 0;
use = use->next;
}
MEM_freeN(sort);
}
}
static int write_msb_int(int fd, int i) {
unsigned int ui= (unsigned int) i;
unsigned char buf[4];
buf[0]= (ui>>24)&0xFF;
buf[1]= (ui>>16)&0xFF;
buf[2]= (ui>>8)&0xFF;
buf[3]= (ui>>0)&0xFF;
return write(fd, buf, 4);
}
static int write_msb_short(int fd, short s) {
unsigned short us= (unsigned short) s;
unsigned char buf[2];
buf[0]= (us>>8)&0xFF;
buf[1]= (us>>0)&0xFF;
return write(fd, buf, 2);
}
static int read_msb_int(int fd, int *i_r) {
unsigned char buf[4];
int rcount= read(fd, buf, 4);
if (i_r)
*i_r= (buf[0]<<24)|(buf[1]<<16)|(buf[2]<<8)|(buf[3]<<0);
return rcount;
}
static int read_msb_short(int fd, short *s_r) {
unsigned char buf[2];
int rcount= read(fd, buf, 2);
if (s_r)
*s_r= (buf[0]<<8)|(buf[1]<<0);
return rcount;
}
void append_pib(SpaceImaSel *simasel, OneSelectableIma *ima)
{
int file;
char name[FILE_MAXDIR+FILE_MAXFILE];
if ( bitset (simasel->fase, IMS_WRITE_NO_BIP)) return;
strcpy(name, simasel->dir);
strcat(name, ".Bpib");
file = open(name, O_BINARY|O_APPEND | O_RDWR | O_CREAT, 0666);
if (file == -1) {
/* printf("Could not write .Bpib file in dir %s\n", simasel->dir); */
simasel->fase |= IMS_WRITE_NO_BIP;
return;
}
lseek(file, 0, SEEK_END);
write(file, "BIP2", 4);
write_msb_int(file, ima->ibuf_type);
write_msb_int(file, 0);
write_msb_int(file, 0);
write_msb_int(file, 0);
write_msb_short(file, ima->cmap);
write_msb_short(file, ima->image);
write_msb_short(file, ima->draw_me);
write_msb_short(file, ima->rt);
write_msb_short(file, ima->sx);
write_msb_short(file, ima->sy);
write_msb_short(file, ima->ex);
write_msb_short(file, ima->ey);
write_msb_short(file, ima->dw);
write_msb_short(file, ima->dh);
write_msb_short(file, ima->selectable);
write_msb_short(file, ima->selected);
write_msb_int(file, ima->mtime);
write_msb_int(file, ima->disksize);
write(file, ima->file_name, 64);
write_msb_short(file, ima->orgx);
write_msb_short(file, ima->orgy);
write_msb_short(file, ima->orgd);
write_msb_short(file, ima->anim);
write_msb_int(file, 0); /* pad to 128 boundary */
write(file, ima->pict_rect, 3968);
close(file);
}
void write_new_pib(SpaceImaSel *simasel)
{
OneSelectableIma *ima;
char name[FILE_MAXDIR+FILE_MAXFILE];
strcpy(name, simasel->dir);
strcat(name, ".Bpib");
remove(name);
ima = simasel->first_sel_ima;
while (ima) {
append_pib(simasel, ima);
ima = ima->next;
}
}
void free_ima_dir(ImaDir *firstdir)
{
ImaDir *n;
while(firstdir){
n = firstdir->next;
MEM_freeN(firstdir);
firstdir = n;
}
}
void free_sel_ima(OneSelectableIma *firstima)
{
OneSelectableIma *n;
while(firstima){
if (firstima->pict) {
IMB_freeImBuf(firstima->pict);
}
n = firstima->next;
MEM_freeN(firstima);
firstima = n;
}
}
void check_for_pib(SpaceImaSel *simasel)
{
ImaDir *direntry;
direntry = simasel->firstfile;
while(direntry){
if ((strlen(direntry->name) > 4) && (0==strcmp(direntry->name, ".Bpib")) ){
simasel->fase |= IMS_FOUND_BIP;
direntry = 0;
}else{
direntry = direntry->next;
}
}
}
void clear_ima_dir(SpaceImaSel *simasel)
{
if(simasel->first_sel_ima) free_sel_ima(simasel->first_sel_ima);
if(simasel->firstdir) free_ima_dir(simasel->firstdir);
if(simasel->firstfile) free_ima_dir(simasel->firstfile);
simasel->first_sel_ima = 0;
simasel->firstdir = 0;
simasel->firstfile = 0;
simasel->totaldirs = 0;
simasel->totalfiles = 0;
simasel->totalima = 0;
simasel->topdir = -1;
simasel->topfile = -1;
simasel->topima = 0;
simasel->image_slider = 0.0;
simasel->slider_height = 0.0;
simasel->slider_space = 0.0;
simasel->hilite = -1;
simasel->curimax = 0;
simasel->curimay = 0;
simasel->total_selected = 0;
simasel->fase = 0;
simasel->subfase = 0;
simasel->imafase = 0;
simasel->ima_redraw = 0;
}
int get_ima_dir(char *dirname, int dtype, int *td, ImaDir **first)
{
DIR *dirp;
struct dirent *dep;
struct ImaDir *temp;
struct ImaDir *dnext = NULL, *fnext;
struct stat status;
char olddir[FILE_MAXDIR+FILE_MAXFILE];
char getdirname[FILE_MAXDIR+FILE_MAXFILE];
int /* i=0, */ tot=0;
int isdir;
if(!BLI_getwdN(olddir)) return -1;
if (chdir(dirname) == -1) return(-1);
strcpy(getdirname, ".");
dirp = (DIR *) opendir(getdirname);
if (dirp == NULL) return (-1);
waitcursor(1);
while((dep = (struct dirent*) readdir(dirp)) != NULL){
strcpy(getdirname, dirname);
strcat(getdirname,dep->d_name);
stat(getdirname, &status);
isdir = S_ISDIR(status.st_mode);
if ( ((dtype == IMS_DIR) && isdir) || ((dtype == IMS_FILE) && !isdir)){
/* yes, searching for this type */
tot++;
if (tot == 1){
dnext = MEM_callocN(sizeof(struct ImaDir), "get first");
*first = dnext;
dnext->prev = 0;
dnext->next = 0;
}else{
fnext = MEM_callocN(sizeof(struct ImaDir), "get nextdir");
dnext->next = fnext;
temp = dnext;
dnext = fnext;
dnext ->prev = temp;
dnext ->next = 0;
}
dnext->type = dtype;
dnext->selected = 0;
dnext->hilite = 0;
dnext->mtime = status.st_ctime;
dnext->size = (int)status.st_size;
strcpy(dnext->name, dep->d_name);
}
}
closedir(dirp);
if (tot) issort(tot, first);
waitcursor(0);
*td = tot;
chdir (olddir);
return (tot);
}
void imadir_parent(SpaceImaSel *simasel)
{
#ifdef WIN32
if (strlen(simasel->dir) > 1){
simasel->dir[strlen(simasel->dir)-1] = 0;
while(simasel->dir[strlen(simasel->dir)-1] != '\\'){
if(strlen(simasel->dir)==0) break;
simasel->dir[strlen(simasel->dir)-1] = 0;
}
}
#else
if (strlen(simasel->dir) > 1){
simasel->dir[strlen(simasel->dir)-1] = 0;
while(simasel->dir[strlen(simasel->dir)-1] != '/') {
if(strlen(simasel->dir)==0) break;
simasel->dir[strlen(simasel->dir)-1] = 0;
}
}
#endif
}
void get_next_image(SpaceImaSel *simasel)
{
OneSelectableIma * ima;
ImBuf * ibuf;
struct anim * anim;
int i = 0, size;
char name[FILE_MAXDIR+FILE_MAXFILE];
ima = simasel->first_sel_ima;
if (ima == 0){
simasel->imafase = 0;
simasel->fase |= IMS_KNOW_IMA;
simasel->fase &= ~IMS_DOTHE_IMA;
return;
}
if (simasel->imafase > simasel->totalima){
simasel->imafase = 0;
simasel->fase &= ~IMS_DOTHE_IMA;
simasel->fase |= IMS_KNOW_IMA;
}
ima = simasel->first_sel_ima;
i = 0;
while(i < simasel->imafase){
if ((ima) && (ima->next)) ima = ima->next;
i++;
}
if (ima->image == 0) {
if (ima->anim == 1) {
/* open movie, get len, get middle picture */
strcpy(name, simasel->dir);
strcat(name, ima->file_name);
anim = IMB_open_anim(name, IB_rect);
if (anim == 0) {
// ibuf= IMB_loadiffmem((int*)datatoc_cmovie_tga, IB_rect);
ibuf= IMB_ibImageFromMemory((int *)datatoc_cmovie_tga, datatoc_cmovie_tga_size, IB_rect);
}
else{
int animlen;
ibuf = IMB_anim_nextpic(anim);
IMB_freeImBuf(ibuf);
animlen= IMB_anim_get_duration(anim);
ibuf = IMB_anim_absolute(anim, animlen / 2);
if(ibuf) {
//get icon dimensions for movie
ima->orgx = ibuf->x;
ima->orgy = ibuf->y;
// ima->orgd = ibuf->depth;
if (ima->orgx > ima->orgy){
ima->dw = 64;
ima->dh = (short)(62 * ((float)ima->orgy / (float)ima->orgx));
}else{
ima->dw = (short)(64 * ((float)ima->orgx / (float)ima->orgy));
ima->dh = 62;
}
}
IMB_free_anim(anim);
}
}
else {
strcpy(name, simasel->dir);
strcat(name, ima->file_name);
ibuf = IMB_loadiffname(name, IB_rect);
if(ibuf && ibuf->zbuf) IMB_freezbufImBuf(ibuf);
}
if (ibuf){
if (ima->dw < 4) ima->dw = 4;
if (ima->dh < 4) ima->dh = 4;
IMB_scaleImBuf(ibuf, ima->dw, ima->dh);
/* the whole cmap system is wacko */
if (G.order==B_ENDIAN)
IMB_convert_rgba_to_abgr(ibuf);
ibuf->mincol = 0;
ibuf->maxcol = 256;
ibuf->cbits = 5;
ibuf->depth = 8;
IMB_freecmapImBuf(ibuf);
ibuf->cmap = simasel->cmap->cmap;
IMB_converttocmap(ibuf);
/* copy ibuf->rect to ima->pict_rect */
size = ima->dw * ima->dh; if (size > 3968) size = 3968;
longtochar(ima->pict_rect, ibuf->rect, size);
IMB_applycmap(ibuf);
IMB_convert_rgba_to_abgr(ibuf);
if (ima->pict) IMB_freeImBuf(ima->pict);
ima->pict = ibuf;
ibuf = 0;
ima->cmap = 1;
ima->image = 1;
append_pib(simasel, ima);
}
}
simasel->ima_redraw++;
simasel->imafase ++;
if (simasel->imafase == simasel->totalima){
simasel->imafase = 0;
simasel->fase &= ~IMS_DOTHE_IMA;
simasel->fase |= IMS_KNOW_IMA;
}
}
void add_ima(int who, SpaceImaSel *simasel, ImaDir *direntry)
{
OneSelectableIma *ima, *prev_ima;
ImBuf *ibuf;
char name[FILE_MAXDIR+FILE_MAXFILE];
strcpy(name , simasel->dir);
strcat(name , direntry->name);
prev_ima = simasel->first_sel_ima;
while((prev_ima)&&(prev_ima->next)){
prev_ima = prev_ima->next;
}
ima = MEM_callocN(sizeof(OneSelectableIma), "OSIbip");
if (direntry->type == IMS_IMA){
/* Picture is an Image */
ibuf = IMB_loadiffname(name, IB_test);
if (ibuf){
ima->anim = 0;
ima->pict = ibuf;
ima->ibuf_type= ibuf->ftype;
ima->orgx = ibuf->x;
ima->orgy = ibuf->y;
ima->orgd = ibuf->depth;
ima->dw = 64;
ima->dh = 51;
ima->cmap = 0;
ima->image = 0;
if (ima->orgx > ima->orgy){
ima->dw = 64;
ima->dh = (short)(62 * ((float)ima->orgy / (float)ima->orgx));
}else{
ima->dw = (short)(64 * ((float)ima->orgx / (float)ima->orgy));
ima->dh = 62;
}
}else{
printf("%s image with no imbuf ???\n", name);
}
ibuf = 0;
}else{
/* Picture is an Animation */
ima->pict = 0;
ima->anim = 1;
ima->ibuf_type= 0;
ima->orgx = 64;
ima->orgy = 51;
ima->orgd = 24;
ima->dw = 64;
ima->dh = 51;
ima->cmap = 0;
ima->image = 0;
}
strcpy(name, direntry->name); name[63] = 0;
strcpy(ima->file_name, name);
ima->disksize = (int)direntry->size;
ima->mtime = (int)direntry->mtime;
ima->next = 0;
ima->prev = prev_ima;
if (prev_ima) {
prev_ima->next = ima;
}else{
simasel->first_sel_ima = ima;
}
simasel->ima_redraw++;
simasel->totalima++;
}
void get_file_info(SpaceImaSel *simasel)
{
OneSelectableIma *prev_ima;
ImaDir *direntry;
char name[FILE_MAXDIR+FILE_MAXFILE];
int i = 0;
if (!simasel->firstfile){
simasel->subfase = 0;
simasel->fase |= IMS_KNOW_INF;
simasel->fase &= ~IMS_DOTHE_INF;
return;
}
if (simasel->subfase > simasel->totalfiles){
simasel->subfase = 0;
simasel->fase |= IMS_KNOW_INF;
simasel->fase &= ~IMS_DOTHE_INF;
}
direntry = simasel->firstfile;
while(i < simasel->subfase){
direntry = direntry->next;
i++;
}
prev_ima = simasel->first_sel_ima;
while((prev_ima)&&(prev_ima->next)){
prev_ima = prev_ima->next;
}
strcpy(name , simasel->dir);
strcat(name , direntry->name);
if(direntry->name[0] == '.') {
direntry->type = IMS_NOIMA;
} else {
if (IMB_ispic(name)) {
direntry->type = IMS_IMA;
}else{
if (IMB_isanim(name)) {
direntry->type = IMS_ANIM;
}else{
direntry->type = IMS_NOIMA;
}
}
}
if (direntry->type != IMS_NOIMA){
add_ima(1, simasel, direntry);
}
simasel->subfase++;
if (simasel->subfase == simasel->totalfiles){
simasel->subfase = 0;
simasel->fase |= IMS_KNOW_INF;
simasel->fase &= ~IMS_DOTHE_INF;
}
}
/* Note: the thumbnails are saved in ABGR format in the .Bpib
cache file */
void get_pib_file(SpaceImaSel *simasel)
{
ImaDir *direntry, *prev_dir, *next_dir;
OneSelectableIma *ima, *prev_ima;
int flen;
int dl, file, first, trd=0, rd, size, found, ima_added = 0;
char name[FILE_MAXDIR+FILE_MAXFILE];
if (bitset(simasel->fase , IMS_KNOW_BIP)) return;
waitcursor(1);
strcpy(name, simasel->dir);
strcat(name, ".Bpib");
file = open(name, O_BINARY|O_RDONLY);
flen = BLI_filesize(file);
simasel->totalima = 0;
prev_ima = 0;
first = 1;
trd = 0;
while(trd < flen){
char header[5];
ima = MEM_callocN(sizeof(OneSelectableIma), "Ima");
rd= 0;
rd+= read(file, header, 4);
rd+= read_msb_int(file, &ima->ibuf_type);
rd+= read_msb_int(file, NULL);
rd+= read_msb_int(file, NULL);
rd+= read_msb_int(file, NULL);
rd+= read_msb_short(file, &ima->cmap);
rd+= read_msb_short(file, &ima->image);
rd+= read_msb_short(file, &ima->draw_me);
rd+= read_msb_short(file, &ima->rt);
rd+= read_msb_short(file, &ima->sx);
rd+= read_msb_short(file, &ima->sy);
rd+= read_msb_short(file, &ima->ex);
rd+= read_msb_short(file, &ima->ey);
rd+= read_msb_short(file, &ima->dw);
rd+= read_msb_short(file, &ima->dh);
rd+= read_msb_short(file, &ima->selectable);
rd+= read_msb_short(file, &ima->selected);
rd+= read_msb_int(file, &ima->mtime);
rd+= read_msb_int(file, &ima->disksize);
rd+= read(file, ima->file_name, 64);
rd+= read_msb_short(file, &ima->orgx);
rd+= read_msb_short(file, &ima->orgy);
rd+= read_msb_short(file, &ima->orgd);
rd+= read_msb_short(file, &ima->anim);
rd+= read_msb_int(file, NULL);
rd+= read(file, ima->pict_rect, 3968);
found = 0;
if (rd != sizeof(OneSelectableIma) || memcmp(header, "BIP2", 4)!=0) {
printf("Error in Bpib file\n");
strcpy(name, simasel->dir);
strcat(name, ".Bpib");
dl = remove(name);
if (dl == 0) printf("corrupt Bpib file removed\n");
trd = flen;
} else {
/* find matching direntry (if possible) */
for (direntry= simasel->firstfile; direntry; direntry= direntry->next)
if (BLI_streq(direntry->name, ima->file_name))
break;
if (direntry) {
if (direntry->mtime == ima->mtime) {
/* ima found and same, load pic */
size = ima->dw * ima->dh;
if (size > 3968) size = 3968;
if (size) {
ima->pict = IMB_allocImBuf(ima->dw, ima->dh, 24, IB_rect | IB_cmap, 0);
chartolong(ima->pict->rect, ima->pict_rect, size);
ima->pict->cmap = simasel->cmap->cmap;
ima->pict->maxcol = 256;
IMB_applycmap(ima->pict);
IMB_convert_rgba_to_abgr(ima->pict);
}
ima->selected = 0;
ima->selectable = 0;
if(prev_ima) prev_ima->next = ima;
ima->next = 0;
ima->prev = prev_ima;
prev_ima = ima;
if (first){ first = 0;simasel->first_sel_ima = ima; }
simasel->totalima++;
found = 1;
}
/* remove direntry */
prev_dir = direntry->prev;
next_dir = direntry->next;
if(prev_dir) prev_dir->next = next_dir;
if(next_dir) next_dir->prev = prev_dir;
MEM_freeN(direntry);
}
}
if (!found) MEM_freeN(ima);
trd+=rd;
}
close(file);
direntry = simasel->firstfile;
while(direntry){
strcpy(name , simasel->dir);
strcat(name , direntry->name);
if (IMB_ispic(name)) {
direntry->type = IMS_IMA;
}else{
if (IMB_isanim(name)) {
direntry->type = IMS_ANIM;
}else{
direntry->type = IMS_NOIMA;
}
}
if (direntry->type != IMS_NOIMA){
prev_ima = simasel->first_sel_ima;
while((prev_ima)&&(prev_ima->next)){
prev_ima = prev_ima->next;
}
add_ima(2, simasel, direntry);
ima_added = 1;
}
direntry = direntry->next;
}
imsort(&simasel->first_sel_ima);
simasel->fase |= IMS_KNOW_BIP;
simasel->fase |= IMS_KNOW_INF;
simasel->fase |= IMS_KNOW_IMA;
if (ima_added){
simasel->fase |= IMS_DOTHE_IMA;
simasel->fase &= ~IMS_KNOW_IMA;
addafterqueue(curarea->win, AFTERIMASELGET, 1);
}else{
write_new_pib(simasel);
}
waitcursor(0);
}
void change_imadir(SpaceImaSel *simasel)
{
ImaDir *direntry;
int i;
direntry = simasel->firstdir;
for (i=0; i<simasel->hilite; i++){
direntry = direntry->next;
}
if(direntry==NULL);
else if (direntry->name[0] != '.'){
strcat(simasel->dir, direntry->name);
strcat(simasel->dir, "/");
}
else {
if (direntry->name[1] == '.'){
imadir_parent(simasel);
}
}
clear_ima_dir(simasel);
}
void check_imasel_copy(SpaceImaSel *simasel)
{
/* WATCH IT: also used when reading blender file */
/* initialize stuff, malloc, etc */
simasel->first_sel_ima = 0;
simasel->hilite_ima = 0;
simasel->firstdir = 0;
simasel->firstfile = 0;
simasel->cmap = 0;
clear_ima_dir(simasel);
// simasel->cmap= IMB_loadiffmem((int*)datatoc_cmap_tga, IB_rect|IB_cmap);
simasel->cmap= IMB_ibImageFromMemory((int *)datatoc_cmap_tga, datatoc_cmap_tga_size, IB_rect|IB_cmap);
}
void free_imasel(SpaceImaSel *simasel)
{
/* do not free imasel itself */
clear_ima_dir(simasel);
IMB_freeImBuf(simasel->cmap);
if(simasel->files) {
BIF_filelist_freelib(simasel->files);
BIF_filelist_free(simasel->files);
MEM_freeN(simasel->files);
simasel->files = NULL;
}
if (simasel->img) {
IMB_freeImBuf(simasel->img);
}
if(simasel->pupmenu) {
MEM_freeN(simasel->pupmenu);
simasel->pupmenu = NULL;
}
}

@ -2431,3 +2431,33 @@ void ui_draw_but(uiBut *but)
}
}
void ui_dropshadow(rctf *rct, float radius, float aspect, int select)
{
float rad;
float a;
char alpha= 2;
glEnable(GL_BLEND);
if(radius > (rct->ymax-rct->ymin-10.0f)/2.0f)
rad= (rct->ymax-rct->ymin-10.0f)/2.0f;
else
rad= radius;
if(select) a= 12.0f*aspect; else a= 12.0f*aspect;
for(; a>0.0f; a-=aspect) {
/* alpha ranges from 2 to 20 or so */
glColor4ub(0, 0, 0, alpha);
alpha+= 2;
gl_round_box(GL_POLYGON, rct->xmin - a, rct->ymin - a, rct->xmax + a, rct->ymax-10.0f + a, rad+a);
}
/* outline emphasis */
glEnable( GL_LINE_SMOOTH );
glColor4ub(0, 0, 0, 100);
gl_round_box(GL_LINE_LOOP, rct->xmin-0.5f, rct->ymin-0.5f, rct->xmax+0.5f, rct->ymax+0.5f, radius);
glDisable( GL_LINE_SMOOTH );
glDisable(GL_BLEND);
}

@ -90,11 +90,6 @@
#include "datatoc.h"
#include "mydevice.h"
/* OpenGL textures have to be size 2n+2 x 2m+2 for some n,m */
/* choose ICON_RENDERSIZE accordingly */
#define ICON_RENDERSIZE 32
#define ICON_MIPMAPS 8
#define ICON_IMAGE_W 512
#define ICON_IMAGE_H 256
@ -105,52 +100,60 @@
#define ICON_GRID_W 15
#define ICON_GRID_H 16
typedef struct IconImage {
int w;
int h;
unsigned int *rect;
} IconImage;
typedef struct DrawInfo {
int w;
int h;
int rw;
int rh;
VectorDrawFunc drawFunc; /* If drawFunc is defined then it is a vector icon, otherwise use rect */
float aspect;
unsigned int *rect;
VectorDrawFunc drawFunc; /* If drawFunc is defined then it is a vector icon, otherwise use rect */
IconImage* icon;
} DrawInfo;
/* ******************* STATIC LOCAL VARS ******************* */
/* static here to cache results of icon directory scan, so it's not
* scanning the filesystem each time the menu is drawn */
static struct ListBase iconfilelist = {0, 0};
static int preview_render_size(int miplevel);
/* **************************************************** */
static void def_internal_icon(ImBuf *bbuf, int icon_id, int xofs, int yofs)
{
Icon *new_icon = NULL;
IconImage *iimg = NULL;
DrawInfo *di;
int y = 0;
new_icon = MEM_callocN(sizeof(Icon), "texicon");
new_icon->obj = 0; /* icon is not for library object */
new_icon->type = 0;
new_icon->changed = 0;
new_icon->type = 0;
di = MEM_callocN(sizeof(DrawInfo), "drawinfo");
di->drawFunc = 0;
di->w = ICON_DEFAULT_HEIGHT;
di->h = ICON_DEFAULT_HEIGHT;
di->rw = ICON_DEFAULT_HEIGHT;
di->rh = ICON_DEFAULT_HEIGHT;
di->aspect = 1.0f;
di->rect = MEM_mallocN(ICON_DEFAULT_HEIGHT*ICON_DEFAULT_HEIGHT*sizeof(unsigned int), "icon_rect");
iimg = MEM_mallocN(sizeof(IconImage), "icon_img");
iimg->rect = MEM_mallocN(ICON_DEFAULT_HEIGHT*ICON_DEFAULT_HEIGHT*sizeof(unsigned int), "icon_rect");
iimg->w = ICON_DEFAULT_HEIGHT;
iimg->h = ICON_DEFAULT_HEIGHT;
/* Here we store the rect in the icon - same as before */
for (y=0; y<ICON_DEFAULT_HEIGHT; y++) {
memcpy(&di->rect[y*ICON_DEFAULT_HEIGHT], &bbuf->rect[(y+yofs)*512+xofs], ICON_DEFAULT_HEIGHT*sizeof(int));
memcpy(&iimg->rect[y*ICON_DEFAULT_HEIGHT], &bbuf->rect[(y+yofs)*512+xofs], ICON_DEFAULT_HEIGHT*sizeof(int));
}
di->icon = iimg;
new_icon->drawinfo_free = BIF_icons_free_drawinfo;
new_icon->drawinfo = di;
@ -166,17 +169,14 @@ static void def_internal_vicon( int icon_id, VectorDrawFunc drawFunc)
new_icon->obj = 0; /* icon is not for library object */
new_icon->type = 0;
new_icon->changed = 0;
di = MEM_callocN(sizeof(DrawInfo), "drawinfo");
di->drawFunc =drawFunc;
di->w = ICON_DEFAULT_HEIGHT;
di->h = ICON_DEFAULT_HEIGHT;
di->rw = ICON_DEFAULT_HEIGHT;
di->rh = ICON_DEFAULT_HEIGHT;
di->aspect = 1.0f;
di->rect = NULL;
di->icon = NULL;
new_icon->drawinfo_free = 0;
new_icon->drawinfo = di;
@ -693,7 +693,10 @@ void BIF_icons_free_drawinfo(void *drawinfo)
if (di)
{
MEM_freeN(di->rect);
if (di->icon) {
MEM_freeN(di->icon->rect);
MEM_freeN(di->icon);
}
MEM_freeN(di);
}
}
@ -705,11 +708,9 @@ static DrawInfo *icon_create_drawinfo()
di = MEM_callocN(sizeof(DrawInfo), "di_icon");
di->drawFunc = 0;
di->w = 16;
di->h = 16;
di->rw = ICON_RENDERSIZE;
di->rh = ICON_RENDERSIZE;
di->rect = 0;
di->w = ICON_DEFAULT_HEIGHT;
di->h = ICON_DEFAULT_HEIGHT;
di->icon = NULL;
di->aspect = 1.0f;
return di;
@ -771,7 +772,7 @@ void BIF_icons_init(int first_dyn_id)
init_internal_icons();
}
static void icon_copy_rect(ImBuf *ibuf, RenderInfo *ri)
static void icon_copy_rect(ImBuf *ibuf, unsigned int w, unsigned int h, unsigned int *rect)
{
struct ImBuf *ima;
unsigned int *drect, *srect;
@ -789,19 +790,19 @@ static void icon_copy_rect(ImBuf *ibuf, RenderInfo *ri)
return;
if (ima->x > ima->y) {
scaledx = (float)ri->pr_rectx;
scaledy = ( (float)ima->y/(float)ima->x )*(float)ri->pr_rectx;
scaledx = (float)w;
scaledy = ( (float)ima->y/(float)ima->x )*(float)w;
}
else {
scaledx = ( (float)ima->x/(float)ima->y )*(float)ri->pr_recty;
scaledy = (float)ri->pr_recty;
scaledx = ( (float)ima->x/(float)ima->y )*(float)h;
scaledy = (float)h;
}
ex = (short)scaledx;
ey = (short)scaledy;
dx = (ri->pr_rectx - ex) / 2;
dy = (ri->pr_recty - ey) / 2;
dx = (w - ex) / 2;
dy = (h - ey) / 2;
IMB_scalefastImBuf(ima, ex, ey);
@ -810,61 +811,66 @@ static void icon_copy_rect(ImBuf *ibuf, RenderInfo *ri)
IMB_rect_from_float(ima);
srect = ima->rect;
drect = ri->rect;
drect = rect;
drect+= dy*ri->pr_rectx+dx;
drect+= dy*w+dx;
for (;ey > 0; ey--){
memcpy(drect,srect, ex * sizeof(int));
drect += ri->pr_rectx;
drect += w;
srect += ima->x;
}
IMB_freeImBuf(ima);
}
/* create single icon from jpg, png etc. */
static void icon_from_image(Image *img, RenderInfo *ri)
static void icon_create_mipmap(struct PreviewImage* prv_img, int miplevel)
{
unsigned int pr_size = ri->pr_rectx*ri->pr_recty*sizeof(unsigned int);
unsigned int size = preview_render_size(miplevel);
if (!prv_img) {
printf("Error: requested preview image does not exist");
}
if (!prv_img->rect[miplevel]) {
prv_img->w[miplevel] = size;
prv_img->h[miplevel] = size;
prv_img->changed[miplevel] = 1;
prv_img->rect[miplevel] = MEM_callocN(size*size*sizeof(unsigned int), "prv_rect");
}
}
/* create single icon from jpg, png etc. */
static void icon_from_image(Image *img, int miplevel)
{
unsigned int pr_size;
short image_loaded = 0;
struct ImBuf* ibuf=NULL;
PreviewImage* pi;
/* img->ok is zero when Image cannot load */
if (img==NULL || img->ok==0)
return;
if (!ri->rect) {
ri->rect= MEM_callocN(pr_size, "butsrect");
memset(ri->rect, 0x00, pr_size);
/* elubie: this needs to be changed: here image is always loaded if not
already there. Very expensive for large images. Need to find a way to
only get existing ibuf */
ibuf = BKE_image_get_ibuf(img, NULL);
if(ibuf==NULL || ibuf->rect==NULL) {
return;
}
/* we only load image if there's no preview saved already ...
always loading and reducing images is too expensive */
/* new rule: never read images, so icons get created while user works,
not always on first use of a menu */
if(!img->preview) {
ImBuf *ibuf;
if(img->ok!=IMA_OK_LOADED) {
return;
}
ibuf= BKE_image_get_ibuf(img, NULL);
icon_copy_rect(ibuf, ri);
/* now copy the created preview to the DNA struct to be saved in file */
img->preview = MEM_callocN(sizeof(PreviewImage), "img_prv");
if (img->preview) {
printf("created image prv\n");
img->preview->w = ri->pr_rectx;
img->preview->h = ri->pr_recty;
img->preview->rect = MEM_callocN(pr_size, "prv_rect");
memcpy(img->preview->rect, ri->rect, pr_size);
}
}
else {
unsigned int img_prv_size = img->preview->w*img->preview->h*sizeof(unsigned int);
if (!img->preview->rect || img_prv_size != pr_size) {
printf("Missing preview or wrong preview size!\n");
return;
}
memcpy(ri->rect, img->preview->rect, pr_size);
pi = BKE_previewimg_get((ID*)img);
if(!pi) {
printf("preview image could'nt be allocated");
return;
}
/* we can only create the preview rect here, since loading possibly deallocated
old preview */
icon_create_mipmap(pi, miplevel);
pr_size = img->preview->w[miplevel]*img->preview->h[miplevel]*sizeof(unsigned int);
image_loaded = 1;
icon_copy_rect(ibuf, img->preview->w[miplevel], img->preview->h[miplevel], img->preview->rect[miplevel]);
}
static void set_alpha(char* cp, int sizex, int sizey, char alpha)
@ -879,27 +885,36 @@ static void set_alpha(char* cp, int sizex, int sizey, char alpha)
/* only called when icon has changed */
/* only call with valid pointer from BIF_icon_draw */
static void icon_set_image(ID *id, DrawInfo *di)
static void icon_set_image(ID *id, DrawInfo *di, PreviewImage* prv_img, int miplevel)
{
RenderInfo ri;
if (!di) return;
if (!di->rect)
di->rect = MEM_callocN(di->rw*di->rh*sizeof(unsigned int), "laprevrect");
unsigned int pr_size = 0;
ri.curtile= 0;
ri.tottile= 0;
ri.rect = NULL;
ri.pr_rectx = di->rw;
ri.pr_recty = di->rh;
if (!di) return;
if (!prv_img) {
printf("No preview image for this ID: %s\n", id->name);
return;
}
/* no drawing (see last parameter doDraw, just calculate preview image
- hopefully small enough to be fast */
if (GS(id->name) == ID_IM)
icon_from_image((struct Image*)id, &ri);
else {
icon_from_image((struct Image*)id, miplevel);
else {
/* create the preview rect */
icon_create_mipmap(prv_img, miplevel);
ri.curtile= 0;
ri.tottile= 0;
ri.rect = NULL;
ri.pr_rectx = prv_img->w[miplevel];
ri.pr_recty = prv_img->h[miplevel];
pr_size = ri.pr_rectx*ri.pr_recty*sizeof(unsigned int);
BIF_previewrender(id, &ri, NULL, PR_ICON_RENDER);
/* world is rendered with alpha=0, so it wasn't displayed
this could be render option for sky to, for later */
if (GS(id->name) == ID_WO) {
@ -909,25 +924,74 @@ static void icon_set_image(ID *id, DrawInfo *di)
Material* mat = (Material*)id;
if (mat->mode & MA_HALO) {
set_alpha( (char*) ri.rect, ri.pr_rectx, ri.pr_recty, 255);
}
}
}
}
/* and copy the image into the icon */
if (ri.rect) {
memcpy(di->rect, ri.rect,di->rw*di->rh*sizeof(unsigned int));
if (ri.rect) {
memcpy(prv_img->rect[miplevel], ri.rect, pr_size);
/* and clean up */
MEM_freeN(ri.rect);
ri.rect = 0;
/* and clean up */
MEM_freeN(ri.rect);
ri.rect = 0;
}
}
}
void BIF_icon_draw_aspect(float x, float y, int icon_id, float aspect)
static void icon_draw_rect(float x, float y, int w, int h, float aspect, int rw, int rh, unsigned int *rect)
{
ui_rasterpos_safe(x, y, aspect);
if(w<1 || h<1) {
printf("what the heck!\n");
}
/* rect contains image in 'rendersize', we only scale if needed */
else if(rw!=w && rh!=h) {
ImBuf *ima;
if(w>2000 || h>2000) { /* something has gone wrong! */
printf("insane icon size w=%d h=%d\n",w,h);
return;
}
/* first allocate imbuf for scaling and copy preview into it */
ima = IMB_allocImBuf(rw, rh, 32, IB_rect, 0);
memcpy(ima->rect, rect, rw*rh*sizeof(unsigned int));
/* scale it */
IMB_scaleImBuf(ima, w, h);
glDrawPixels(w, h, GL_RGBA, GL_UNSIGNED_BYTE, ima->rect);
IMB_freeImBuf(ima);
}
else
glDrawPixels(w, h, GL_RGBA, GL_UNSIGNED_BYTE, rect);
}
/* Render size for preview images at level miplevel */
static int preview_render_size(int miplevel)
{
switch (miplevel) {
case 0: return 32;
case 1: return PREVIEW_DEFAULT_HEIGHT;
}
return 0;
}
/* Drawing size for preview images at level miplevel */
static int preview_size(int miplevel)
{
switch (miplevel) {
case 0: return ICON_DEFAULT_HEIGHT;
case 1: return PREVIEW_DEFAULT_HEIGHT;
}
return 0;
}
static void icon_draw_mipmap(float x, float y, int icon_id, float aspect, int miplevel, int nocreate)
{
Icon *icon = NULL;
DrawInfo *di = NULL;
int draw_size = preview_size(miplevel);
icon = BKE_icon_get(icon_id);
if (!icon) {
@ -939,65 +1003,61 @@ void BIF_icon_draw_aspect(float x, float y, int icon_id, float aspect)
if (!di) {
di = icon_create_drawinfo();
icon->changed = 1;
icon->drawinfo = di;
icon->drawinfo_free = BIF_icons_free_drawinfo;
}
di->aspect = aspect;
/* scale width and height according to aspect */
di->w = (int)(ICON_DEFAULT_HEIGHT/di->aspect + 0.5f);
di->h = (int)(ICON_DEFAULT_HEIGHT/di->aspect + 0.5f);
di->w = (int)(draw_size/di->aspect + 0.5f);
di->h = (int)(draw_size/di->aspect + 0.5f);
if (di->drawFunc) {
/* vector icons use the uiBlock transformation, they are not drawn
with untransformed coordinates like the other icons */
di->drawFunc(x, y, ICON_DEFAULT_HEIGHT, ICON_DEFAULT_HEIGHT, 1.0f);
}
else if (di->icon) {
/* it is a builtin icon */
if (!di->icon->rect) return; /* something has gone wrong! */
icon_draw_rect(x,y,di->w, di->h, di->aspect, di->icon->w, di->icon->h, di->icon->rect);
}
else {
if (icon->changed) /* changed only ever set by dynamic icons */
{
waitcursor(1);
icon_set_image((ID*)icon->obj, icon->drawinfo);
icon->changed = 0;
waitcursor(0);
}
if (!di->rect) return; /* something has gone wrong! */
ui_rasterpos_safe(x, y, di->aspect);
if(di->w<1 || di->h<1) {
printf("what the heck!\n");
}
/* di->rect contains image in 'rendersize', we only scale if needed */
else if(di->rw!=di->w && di->rh!=di->h) {
ImBuf *ima;
if(di->w>2000 || di->h>2000) { /* something has gone wrong! */
printf("insane icon size di->w %d di->h %d\n",di->w,di->h);
return;
PreviewImage* pi = BKE_previewimg_get((ID*)icon->obj);
if (pi) {
if (!nocreate && pi->changed[miplevel]) /* changed only ever set by dynamic icons */
{
waitcursor(1);
/* create the preview rect if necessary */
icon_set_image((ID*)icon->obj, icon->drawinfo, pi, miplevel);
pi->changed[miplevel] = 0;
waitcursor(0);
}
/* first allocate imbuf for scaling and copy preview into it */
ima = IMB_allocImBuf(di->rw, di->rh, 32, IB_rect, 0);
memcpy(ima->rect, di->rect, di->rw*di->rh*sizeof(unsigned int));
/* scale it */
IMB_scaleImBuf(ima, di->w, di->h);
glDrawPixels(di->w, di->h, GL_RGBA, GL_UNSIGNED_BYTE, ima->rect);
if (!pi->rect[miplevel]) return; /* something has gone wrong! */
IMB_freeImBuf(ima);
icon_draw_rect(x,y,di->w, di->h, di->aspect, pi->w[miplevel], pi->h[miplevel], pi->rect[miplevel]);
}
else
glDrawPixels(di->w, di->h, GL_RGBA, GL_UNSIGNED_BYTE, di->rect);
}
}
void BIF_icon_draw_aspect(float x, float y, int icon_id, float aspect)
{
icon_draw_mipmap(x,y,icon_id, aspect, PREVIEW_MIPMAP_ZERO, 0);
}
void BIF_icon_draw(float x, float y, int icon_id)
{
BIF_icon_draw_aspect(x, y, icon_id, 1.0f);
}
void BIF_icon_draw_preview(float x, float y, int icon_id, int nocreate)
{
icon_draw_mipmap(x,y,icon_id, 1.0f, PREVIEW_MIPMAP_LARGE, nocreate);
}
void BIF_icon_draw_aspect_blended(float x, float y, int icon_id, float aspect, int shade)
{

@ -0,0 +1,436 @@
/* DataToC output of file <prvicons> */
int datatoc_prvicons_size= 13732;
char datatoc_prvicons[]= {
137, 80, 78, 71,
13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0,192, 0, 0, 0,192, 8, 6, 0, 0, 0, 82,220,108, 7, 0, 0, 0,
6, 98, 75, 71, 68, 0, 0, 0, 0, 0, 0,249, 67,187,127, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 11, 19, 0, 0, 11, 19, 1,
0,154,156, 24, 0, 0, 0, 7,116, 73, 77, 69, 7,215, 8, 27, 17, 57, 33, 43,142, 73,203, 0, 0, 0, 29,116, 69, 88,116, 67,
111,109,109,101,110,116, 0, 67,114,101, 97,116,101,100, 32,119,105,116,104, 32, 84,104,101, 32, 71, 73, 77, 80,239,100, 37,110,
0, 0, 32, 0, 73, 68, 65, 84,120,218,237,125,121,124, 84,213,249,254,115,238,189, 51,147,201,158, 12, 73, 72,216, 3,200, 98,
88, 69, 66, 38, 65, 16, 20,165, 40,213,162, 32, 45,138,203, 79,176,223, 42,180,110, 72,235,190, 97, 91, 91, 21,181,149,182, 90,
20, 42, 10, 66, 80,164, 34, 59,146, 5,194, 30, 18, 8, 75, 2,201,144,144,201, 62, 73,102,189,247,158,243,251, 35,235, 36, 51,
217,200,100, 38,229, 62,159,207,124,146,123,239,153, 59,207, 61,247,125,207,121,223,247,156,243, 30, 64,129, 2, 5, 10, 20, 40,
80,160, 64,129, 2, 5, 10, 20, 40, 80,160, 64,129, 2, 5, 10, 20, 40, 80,160, 64,129, 2, 5, 10, 20, 40, 80,160, 64,129, 2,
5, 10, 20, 40, 80,160, 64,129, 2, 5, 10, 20, 40, 80,160, 64,129, 2, 5, 10, 20, 40, 80,160, 64,129, 2, 5, 10, 20, 40, 80,
160, 64,129, 2, 5, 10, 20, 40, 80,160, 64,129, 2, 5, 10, 20, 40, 80,160, 64,129, 2, 5, 10, 20, 40, 80,160, 64,129, 2, 5,
10, 20, 40, 80,160, 64,129, 2, 5, 10, 20, 40, 80,160, 64,129, 2, 5, 10, 20, 40, 80,160, 64,129, 2, 5, 10, 20, 40, 80,160,
64,129, 2, 5, 10, 20, 40, 80,160, 64,129, 2, 5, 10, 20, 40, 80,160, 64,129, 2, 5, 10, 20, 40, 80,208, 18, 36, 41, 41,105,
180, 32, 8,143, 16, 66, 72,119,223,156, 49, 22, 46,203,242,112,198,216,203, 41, 41, 41,251, 60,241, 0,189,157,191, 2,239, 43,
192, 61, 49, 49, 49, 27,230,204,153,227,215,157, 55,206,206,206,198,169, 83,167, 16, 25, 25, 9,131,193, 64, 37, 73,154,150,146,
146,146,226, 1, 5,232,213,252, 21,120, 23, 2, 0, 68, 71, 71,219, 23, 46, 92,216,109, 2,180,105,211, 38, 24, 12, 6, 60,250,
232,163,224, 56, 14, 7, 15, 30,228, 50, 51, 51, 15, 36, 38, 38, 38,164,166,166,102,116,247, 67,244,118,254, 10,188, 7,174,187,
111, 40, 73, 18,214,175, 95,143, 5, 11, 22,160,111,223,190,240,247,247, 71, 98, 98, 34,226,226,226, 56,149, 74,149,174,215,235,
39,250,114,133,244,118,254, 10,188,172, 0, 6,131, 1,193,193,193,136,136,136,128, 32, 8,208,106,181,208,106,181,208,235,245,
24, 57,114, 36,167, 86,171, 51,244,122,125,156,175, 86, 72,111,231,175,192,203, 10, 80, 88, 88, 8,157, 78,215,120,172,209,104,
26,133, 40, 49, 49, 17,195,135, 15,231,213,106,245,137,132,132,132, 27,124,177, 66,122, 59,127, 5, 94, 86,128,192,192, 64, 88,
173, 86,167,115,254,254,254,141,159,164,164, 36,196,198,198, 10,126,126,126, 89,122,189, 62,214,215, 42,164,183,243, 87,224,101,
5,208,233,116, 48,153, 76,173,206, 55,180,162, 90,173, 22, 73, 73, 73, 24, 56,112,160, 74,163,209,156,213,235,245, 3,124,169,
66,122, 59,127, 5,157,131,208,221, 55,140,138,138, 66, 77, 77, 13,172, 86, 43,180, 90, 45, 0,160,170,170, 10,165,165,165, 40,
47, 47, 71,105,105, 41, 44, 22, 11, 6, 15, 30, 12, 81, 20,213, 87,175, 94, 61,175,215,235,135,164,165,165, 21,251, 66,133,244,
118,254, 10,188,172, 0,106,181, 26,227,199,143, 71, 78, 78, 14,116, 58, 29, 14, 28, 56,128,130,130, 2,196,198,198, 34, 42, 42,
10, 67,135, 14, 5,207,243, 72, 77, 77,133,209,104,132, 40,138,126, 26,141, 38, 79,175,215, 15, 74, 75, 75, 43,245,118,133,244,
118,254, 10,188,172, 0, 0, 48,109,218, 52,124,250,233,167, 16, 69, 17,143, 63,254, 56,102,206,156, 9,181, 90,237, 84,102,209,
162, 69, 48,153, 76, 88,183,110, 29,182,108,217,162,165,148,190, 9,224, 9, 0,204,219,149,210,219,249, 43,240,162, 15, 0, 0,
9, 9, 9, 8, 12, 12,196, 71, 31,125,132,217,179,103,183, 18,158, 6,132,132,132,224,201, 39,159,132, 70,163, 97, 86,171,117,
108,104,104,104,127, 0,196,219,149,210,219,249, 43,240,178, 2, 4, 5, 5, 97,205,154, 53,136,137,137,233, 80,249, 33, 67,134,
72, 86,171,213,204,243,252,253,190, 32, 64,189,157,191, 2, 47, 43, 0, 0, 8, 66,199,173, 43, 63, 63, 63, 70, 41,149, 24, 99,
26, 95, 17,160,222,206, 95,129,151, 21,160,139,144,123,121,125,202,138, 72, 41, 10,208, 37, 16, 66,100, 66, 72,175, 21,160,222,
206,255,122,133,208, 19, 63, 98,178,216,193, 24,131, 74,224, 17,160, 81,185,109, 61, 25, 99, 50,122,111, 20,165,183,243, 87, 20,
192, 19,200, 45,174,194,152,103, 62, 5, 0, 68,135, 5,226,252,234, 37,224,185,122, 51,153, 81, 56,142,252, 11,183, 71, 92,225,
39,223, 22, 56, 50, 88,173,213,234, 99,111,136,134, 64,254, 25,249,155,244,139,158,230,166, 82,185, 85, 70,136,162,216,217, 30,
128, 2,160,138, 15,160, 40,128, 19, 62, 63,112,186,241,255,171,149,181,248,241,100, 30,126, 54,113, 40, 0,128,154,174,192,126,
124, 61,146,194,192, 35, 76, 51, 28,192,112, 0,183, 17,137,255,216,155,194,223,145,235, 45,148,132, 1,104, 48,129,148, 30, 64,
241, 1,234,109, 2,202,240,159,159,178,157,206,125,113, 32,171,241,127, 90,118,190,213,119, 24, 80, 30,190, 60,165,192,155,194,
223,197,251, 80,197, 9, 86, 20,192, 9, 59, 79, 93,194,213, 42, 51,180,234,166,142,230,135, 19,121, 40,173,182,212, 41, 72,217,
5,184,208,128, 19,189,169, 2,155, 41, 1,173,247, 1, 20, 40, 10,224,220,218,191,255,240, 76, 52, 44, 89, 23,101,138, 13, 41,
103,234, 36,166,212,101, 15,112,220,215, 43, 77, 20, 69,167, 15, 0, 13,165, 20, 0,244, 0,120, 69,172, 20, 5, 64,105,181, 5,
255, 61,158,139, 65, 17, 33, 88,116, 75, 28,102,196, 13,106,230, 23,100,213,247, 0, 46, 20,128,178,227,189,173, 18, 25, 99, 0,
16, 7,160, 76,241, 1, 20, 39, 24, 0,176, 33,229, 12, 68,153,226,161,105, 55,130, 16,224,161,105, 99,176,231,116, 62, 0,224,
236,149,114,100,100,102, 97,148,189,166,213,247,204,140,157, 0,128,146,143,167, 7,242,212, 54, 7,192, 72, 70,137,131,227,113,
90,148,232,145,168,223, 30, 54,250,168, 2,252, 4,160, 90, 17, 41,165, 7,104,108,229, 57, 66,240,224,180,186,229,179,115, 39,
13, 67, 88, 64, 83,226,134,181,123, 91,155,250,162,204, 44,187,114,228, 75,229,171,227,159,225,101, 91, 49, 24,190, 2,195,171,
132,176,183, 25,101,219, 4,142,228, 85,172, 78, 88,234,139, 21,233,112, 56,202, 25, 99,134,122,103, 88,193,245,172, 0, 71,115,
139,113,246, 74, 57,102,142, 25,132,254,225, 65, 0, 0,141,138,199,130,196, 81,141,101, 54,159, 42,133, 85,118, 54,151,171,172,
180,224, 23,113,170,117, 0,121, 23, 64,128,139, 91,251, 51,176, 79,202, 62, 72, 88,229,131,117, 25, 98,179,217,250,195,247,166,
151, 40,232,105, 5, 88,187,191, 46,246,191,120,250, 24,167,243, 15, 79,111, 74,166, 80,227, 96,216, 86,230, 60,219, 82, 23,192,
15, 35,192,130,246,238, 79, 8,123,166,236,189, 41,163,188, 85,105, 42,149,170, 85, 40,149, 16, 2, 74,169, 77, 81,128,235, 92,
1, 44,118, 17,223,164,159,131, 46, 72,139,187,110, 26,234,116,109,236,160, 72,140, 27, 28,217,228, 39, 24, 7, 57,147, 33, 16,
24, 96, 7,240, 79, 2,242, 75, 2,242, 75, 6, 28,112, 37,131,132,195,115,222,170,180,102,209,159, 70,225,231, 56, 14, 42,149,
234, 40,234,162, 64,202,104,240,245,170, 0, 91,143, 92, 64,181,213,142, 7, 18, 71, 65, 45,180,142, 8, 62,220,172, 87, 72,175,
14,199,101, 91,147,165, 67, 41,236,162,204,238,214, 45, 59,180, 36,124, 89,250,134,240,101,233, 27,116, 21,126,183, 1,200,105,
221, 13,224,198,107, 17, 96, 15, 33,166,222, 7, 96, 0, 84,138,120, 93,135, 10,208, 16,251, 95, 60,205,117,238,168,249,250,145,
240, 19,184,250,232, 9,193,134,226,129,141,215, 14, 92, 52,255, 43,250,119,135,247, 56,201,249,171,251, 37, 66, 88,178,139,216,
139, 79,229,229,169,207,205, 43,212,127, 72,125,221,106, 20, 17,187,142, 20,224, 82,137, 9, 7,207, 26, 48, 49, 54, 10,113, 3,
35, 92,150, 9, 11,240,195, 93,195,154,150, 24,126,109, 28, 8,153, 17, 88, 37, 88, 95,218,102,220,233, 70,188,170, 92,156,243,
243,149, 74,164,148,130, 82, 10, 73,146, 56, 0, 13,221,139, 31,234,204, 57, 5, 62,140,110, 29, 7,248,226, 64, 22, 24, 3,146,
70, 14, 64,102,126,137,219,114, 19,131, 42,241, 13,234, 82,142, 92,117,248, 97,127,101, 36, 2,107, 11, 47, 24,107, 36,171,171,
242,140,161,159,139,211, 62,149,129,161,190, 7, 16,209, 52, 16,102, 82,196,235, 58, 82, 0,202, 24,214,255, 84,103,254,172,254,
239, 81,172,254,239,209, 54, 74,107,157,142, 54, 24, 7,226, 94,114,165,202,221,130, 18, 2, 50,136,181, 30, 96,205,242, 86,165,
53, 68,128,154,251, 18,140, 49,112, 28, 39,214,215,169,168,136,214,117,166, 0,187, 78, 93, 70, 97, 69, 45,166,142, 26,128,219,
199, 14,118, 95, 80,118,192,126,116, 45, 14,155,194,177,187, 50, 10, 0,240, 99,121, 95,220,168,209, 88, 40,165,173,166, 19,151,
175,142, 15,102, 96,183,182,234, 21, 0,175,231,234, 87,169, 84, 78, 74,192,113,156, 67, 49,123,174, 83, 5,104,112,126, 95,186,
79,143,164,145,253,221,150,147,138, 78,192,106, 60,143,139,186, 64,236, 62, 86,167, 0, 14,198,225, 44, 63,108, 24, 33, 57,178,
11,211,226, 9,198, 16,220,178,195,225,101,124,233, 11, 21,216,208, 27,168, 84, 42,155, 90,173,110,112,128, 21, 92, 79, 78,112,
121,141, 21,219,143,231, 98, 72,100, 8, 18, 71,244,111,219, 84,170,159, 1, 58,204,191, 22, 55, 7, 87, 52,158, 63, 45,247, 31,
76,235,167, 84, 54,160,236,195,201, 51, 24,195, 75, 46,140,162, 45, 97,191, 59,116,217,135,236,255, 82, 65, 16,120, 40, 19,225,
174,207, 30,224,171,212,179,112, 72, 50, 22,221,114, 35,218,219,169,171,249, 26,128, 95, 70,229,227, 72,117, 56, 0, 32,207, 22,
36,124,241,127,250, 79,110,139,170,120,141,112, 40,231, 25,110,167, 12,207,160,117, 40,209,194,113,228, 89, 95,170, 68,158,231,
3,120,158,175, 97,140, 29,135, 50, 23,232,250,235, 1,214,238, 63, 13,142, 16, 44,186,165,253,125, 35,154,175, 2,251,121, 68,
33,252, 57,169,241,120,111,109,255, 49, 60,193, 55, 28,195, 62, 6,252,158,180, 22,126, 10, 66, 30, 14,123, 50, 45,223,199,234,
145, 17, 66,168, 39, 54,234, 83,224,163, 61, 64, 65, 89, 53,118,158,186,132,242, 26, 43,178, 13,101,232, 23, 30,136, 31, 79,230,
1, 0,126, 54,113, 40, 98,194, 2, 91, 75,137,100, 3,173, 42, 64,165,164,198,119,165,117,243,128, 6,105, 45, 56,107,174, 51,
241,183,148,246,199,232,128,186, 25,197,183,134,149, 96,160,159,197,201,125, 32,192,178,240,167,210, 55,249, 82, 5,138,162,216,
16, 2,149, 91,154,112, 10,254,135, 21, 32,203, 80,134,101,159,237,110, 60, 46,172,168,109, 60, 30,214, 55,204,165, 2,208,242,
92,128, 81, 20,219,253,240,252,197,113,173,174, 87, 75,170,198,243,159,141,202,104,174, 0, 57,132,224,255,133, 63,117, 40,181,
59, 5,247, 90,215, 6, 55, 68,128, 24, 99,168,239, 1, 20, 5,184, 94, 20, 32,126, 88, 52,118,252, 97,190,203,107, 99, 7,185,
30, 5,230,130,251, 65, 59,247, 3,140,112,200,216, 62,185,166,222,129,228,177,230,235, 31,109,135,207,228,173, 11, 12,208,156,
126,112, 28, 25, 30,161,178, 15, 25, 27,100,178, 1,200, 97,132,238,235,243, 84,198, 94, 79,181,222,157, 77,141, 34, 73, 82,171,
180,137,132, 16, 48,198,168, 44,203, 65,138, 72, 93, 39, 10,160, 11,210,226,150,209,157,219, 28,133,104, 67, 33,104, 39, 32, 4,
192,173,131,155,206,127,191,245, 59, 57,220,116,225, 66,126,102,254,174, 63,236, 48,125,212,147,209,148,206, 78,140,115,151, 51,
84,201, 12,119, 29, 59,193,221,132,222, 46, 64,138, 2,244,214, 30,192,100, 50, 9, 25, 25,222,219,255,217,100, 50,241,132, 16,
42,203,178,220,197,239,247,106,254, 10,188,171, 0,198,226,226,226, 83,171, 86,173,226,237,118,123, 52, 99, 76,141,186,176, 30,
234, 77, 17,214,204, 36, 97,132,144,198,255, 91, 94,115,119,189,197,189, 90,150,101,178, 44,203,146, 36,149,212, 59,145,157, 53,
127,122, 59,127, 5, 94, 68,243,184, 53,167,211,233,150, 3,232,139,166, 44,103, 50, 99, 76, 34,132,200,140, 49,153, 16, 34, 53,
59, 71,155, 93,107, 56, 47, 19, 66,164,250, 4, 81,114,195, 53, 66,136, 76, 41,149, 90, 28,203, 13,118, 51,165, 84,146,101, 89,
98,140, 89,204,102,243,149,174,154,115,189,156,191, 2, 47, 43, 0, 9, 12, 12,140,230, 56, 78, 77, 8, 97,245, 19,189, 26, 91,
185,134, 86,176,249,113,125,232,143, 1,128,195,225,112,106, 65, 9, 33,172,217,167,161, 44, 44, 22,139,211, 61, 56,142, 99,132,
16, 86, 89, 89,201,234,133,182,171, 51, 41,123, 59,127, 5, 94, 86, 0, 87,199, 29, 5,243,209,231,233,109,252, 21,244,180,192,
36, 37, 37,141, 22, 4,225, 17, 79, 12,227, 51,198,194,101, 89, 30,206, 24,123, 57, 37, 37,101,159, 39, 30, 64,225,175,240,191,
86, 5,184, 39, 38, 38,102,195,156, 57,115,186,117,137, 97,118,118, 54, 78,157, 58,133,200,200, 72, 24, 12, 6, 42, 73,210,180,
148,148,148, 20, 15,188, 0,133,191,194,255,154,162, 64,136,142,142,182, 47, 92,184,176,219, 30, 96,211,166, 77, 48, 24, 12,120,
244,209, 71,193,113, 28, 14, 30, 60,200,101,102,102, 30, 72, 76, 76, 76, 72, 77, 77,237,246,120,165,194, 95,225,223, 85,116,251,
64,152, 36, 73, 88,191,126, 61, 22, 44, 88,128,190,125,251,194,223,223, 31,137,137,137,136,139,139,227, 84, 42, 85,186, 94,175,
159,232,203, 54,161,194,255,250,226,223,237, 10, 96, 48, 24, 16, 28, 28,140,136,136, 8, 8,130, 0,173, 86, 11,173, 86, 11,189,
94,143,145, 35, 71,114,106,181, 58, 67,175,215,199,249,234, 11, 80,248, 95, 95,252,187, 93, 1, 10, 11, 11,161,211,233, 26,143,
53, 26, 77,227, 67, 36, 38, 38, 98,248,240,225,188, 90,173, 62,145,144,144,112,131, 47,190, 0,133,255,245,197,191,219, 21, 32,
48, 48, 16, 86,171,115,118, 19,127,127,255,198, 79, 82, 82, 18, 98, 99, 99, 5, 63, 63,191, 44,189, 94, 31,235,107, 47, 64,225,
127,125,241,239,118, 5,208,233,116, 48,153, 90,167,196,105,208, 98,173, 86,139,164,164, 36, 12, 28, 56, 80,165,209,104,206,234,
245,250, 1,190,244, 2, 20,254,215, 23,255,110,223, 32, 35, 42, 42, 10, 53, 53, 53,176, 90,173,208,106,235,242,255, 84, 85, 85,
161,180,180, 20,229,229,229, 40, 45, 45,133,197, 98,193,224,193,131, 33,138,162,250,234,213,171,231,245,122,253,144,180,180,180,
98, 95,120, 1, 10,255,235,139,127,183, 43,128, 90,173,198,248,241,227,145,147,147, 3,157, 78,135, 3, 7, 14,160,160,160, 0,
177,177,177,136,138,138,194,208,161, 67,193,243, 60, 82, 83, 83, 97, 52, 26, 33,138,162,159, 70,163,201,211,235,245,131,210,210,
210,188,158,237, 77,225,127,125,241,247,200, 22, 73,211,166, 77,195,167,159,126, 10, 81, 20,241,248,227,143, 99,230,204,153, 80,
171,213, 78,101, 22, 45, 90, 4,147,201,132,117,235,214, 97,203,150, 45, 90, 74,233,155, 0,158,128, 15, 76, 75, 80,248, 95, 63,
252, 61,178, 32, 38, 33, 33, 1,129,129,129,248,232,163,143, 48,123,246,108,183,171,168, 66, 66, 66,240,228,147, 79, 66,163,209,
48,171,213, 58, 54, 52, 52,180, 63,124, 32,177, 84, 75,254, 45, 43, 95,225,255,191,195,223, 35, 10, 16, 20, 20,132, 53,107,214,
32, 38, 38, 6,207, 62,251, 44,102,204,152, 1,135,195,225,182,252,144, 33, 67, 36,171,213,106,230,121,254,126, 95,120, 1,205,
249,119, 4,189,141,191,217, 46,225, 82,105, 45,142, 95,174,192,190, 51,197,136,136,155, 70, 73,212, 40,191,136,184,169,207,196,
175,248, 79,191,235,169,254, 61,182, 75,164, 32, 8,248,252,243,207,177,122,245,106, 0, 64,114,114, 50, 22, 44,112,189,251,145,
159,159, 31,163,148, 74,140, 49, 13,124, 36,181,160,187, 94,171, 55,243, 63,122,169, 2,155, 50, 12,200, 41, 50,129,202, 82, 99,
90,119, 22, 54,158, 15,157, 50,118,124, 8,165,227, 41,149,151, 37,190,240,245, 22,202,196,215,210,255,184,232,244,255,122,253,
11,158,124,136, 63,252,225, 15, 0,128,216,216, 88,124,241,197, 23,110, 21,160, 25,122,251,146, 66,159,229,127,185,204,140, 55,
191,205,134,192, 1, 49, 33, 26, 20,148,137, 96,148,130,177, 86, 31, 2, 70,231,129,146, 95, 76,126,118,253,188,140,119, 23, 37,
119,250,189,111,248, 9, 89, 5,158,245,167,191,121,246, 94,168,120,238,154,235,223, 99, 10, 80, 84, 84,132,146,146, 18,188,249,
230,155,120,238,185,231,176,120,241,226, 54,203,247,246,172, 10,190,206,255, 68,126, 37, 24,163,120,235,254, 9, 24, 17, 29,140,
63,109, 59,141,189, 89, 69, 96, 13,189, 64,227, 95,214,112, 76, 64,233, 59, 0, 58,173, 0,207,220, 61, 25, 14,201,179, 85,209,
82,248,187, 90,255, 30, 83,128,236,236,108, 68, 68, 68,224,217,103,159, 5, 33, 4,185,185,185, 46,115,234, 52,215,222,250,165,
136,189,117,113,138, 79,243, 63, 83,104, 2,165, 20, 2, 87,103, 33,168, 56, 82,215, 3,180,248,180, 80,130, 27,110, 90,178,198,
255,216, 63,150, 90, 58,243, 91, 57,133,229, 40,175,181, 94, 51,103,209, 97,119,235, 59,206, 26, 59, 24, 92,253, 18, 4,187,221,
14, 89,150, 57, 89,150,213, 0, 66,208,118,126,214,234,230,215, 59,164, 0,159,237,205,196,165,146,206,109,120,146,157,150,138,
232, 81,147,240,202,198, 84, 72, 14, 59,206,156,191,136, 87,190, 78, 1,199,183,222, 56,239, 80, 77, 8, 95, 54,112,234, 72,235,
0,149, 86, 8, 31, 20, 13,144,118,133, 72, 82,227,143,248,114,101,165, 15,245, 0,180,190, 98,125, 50, 63,168, 67,148,193, 40,
195,138, 47,143,162, 95,152, 22, 57,133,149,117, 2,207, 24, 24,163,160,204,165, 57, 4,217, 95,173, 6,208, 41, 5,200, 51, 86,
33,191,172,250,154, 57,239, 92,247, 49,210,183,111,236, 72, 81, 53,128, 59,235, 63,111,183, 83,246, 70, 0,103, 58,165, 0,250,
17,253,220,238,249,229, 14, 17, 86, 3,138,250,248,225,238, 73,195,240,233, 71,239, 33,208,223, 31, 63,143, 31,225,186,194, 82,
183,211, 98, 83,126,161,228, 96,167,164,240,129,223, 18,158,111, 63,197, 96,165,214,210, 93,194, 65,171, 12,224, 66, 59, 54,162,
110, 50,153, 96,179,217, 16, 21, 21,213,252, 52, 67, 83, 94, 32, 31,237,193,234, 4,221,108,151,113,174,200,214, 36,244,148,130,
82,230,214, 20, 2,215,249, 64,225,162, 91,110,236, 22,198,166, 67,201, 72,175,139,242, 32, 34,194,181,252,157, 57,115, 6,181,
181,181, 13,141, 80, 25, 99, 44,215,205,237, 70, 1,173,246,153,232,152, 2,140,236,167,235,188, 61, 80, 58, 4, 63, 92,202, 65,
148,202,129, 13,159,125,130, 25, 51,102, 96,242,176,104,151,101,163, 84, 14,234, 95,109, 40,179,150,151, 95,172,201,220,123, 8,
61,156, 98,220,113, 98, 61,184,136, 17, 80,199,253,162,221,178, 85, 85, 85,152, 59,119, 46,118,239,222,221,242,165, 80, 95,115,
130, 25, 99, 16,229, 58,125, 92,126,199, 72,136,242, 8,103,253,100,117,255, 63,248,167,173,204, 14,129,184, 50,133, 0,128, 93,
125,186, 97,177,139, 68,162,255, 42,181,247,187,203,255,189, 27, 39, 47,151, 92,187,227,158, 86,183, 59, 46, 55,106, 6,248,113,
83,157,174,237,122,105, 1,212, 2,143,105,211,166, 33, 61, 61, 29, 0,160,209,104,126,176,217,108, 15,187,145,159, 61, 0,102,
244,152, 15, 48, 96,192, 0, 28, 59,118, 12,219,183,111,135,205,102,195,252,249,243,219,109,136,235,109,104,175,180,142,246,148,
15, 64, 56, 30,170,209, 63,111,183,244,217,179,103,113,199, 29,119, 96,231,206,157,232,211,167,143, 15,240,119,150,233,140,188,
10,164,158, 47, 65, 70, 94, 57,204, 86, 7, 40,149, 91,181,240, 78,231,160, 34, 13, 38, 80, 75, 83,232,181,159, 93,137, 4,112,
174,241, 25,175,254,238, 44,152,188,140,196,172,118,155,175,245,131, 71,110,235,150,103,121,222,122, 18,239,103,236,192,138,123,
226,241,240,195,191,236,136,194,119,186,225,236,144, 2, 56, 36, 25,148,117,174,103, 55,219,108,216,187,119, 47,100, 89, 70,100,
100, 36,102,205,254, 25,108,162,228, 38,118, 72, 64,121, 1,208,104, 57,220,189,212, 15,186,232,246, 31,100,237, 43,246,142,248,
10,157, 81, 2,219, 79,127, 5, 8, 15,213,168,187,218, 45,157,149,149,133, 59,239,188, 19, 59,119, 54,238,236,234, 19, 81,160,
79,246,229,226,199,204,162, 38, 97,111, 33,216, 77, 2,206,156,237,125, 23,166, 80,235, 42,162, 28,152,116, 35,152,252, 29, 51,
44, 25, 72, 6,252,163,194, 21,135,175,211,114, 96,232, 6, 31,224,104,110,221,252,182, 31, 79, 94, 66,217,119,206, 43, 33,127,
119,215,205,224,185, 86,238,150,103, 20,224,181, 77,169,157,138,235, 58,204,213, 72, 91,243, 18, 26, 50, 5, 14,152,181, 24,143,
253, 99,143,251, 22,181, 50, 92, 85, 26, 59,123,170, 72, 84,163, 4, 77,240, 47, 96,110,223,142,150, 22,190,189, 24, 27, 96,236,
238,158,192,118,224,207, 0,199, 67, 53, 98,118,187,165, 51, 51, 51, 49,123,246,108, 76,154, 52, 9,245,137,182,188,170, 0, 57,
87,107,240,227,233,171,237, 10,182,187,191,172,222,236,113, 45,252, 18,192,228,186, 15,149, 2,192,228,223, 0,120,195,165, 73,
27,226,223, 24,161,185, 22,204,152, 53, 27, 67, 6, 13, 68,220,164,201,232, 31, 17,210, 34,232,224,218,138,104,227,118, 31, 3,
216, 6,160,184,211, 10,240,214,194, 91, 58, 69,124,225,194,133,176, 86,214,217,128, 43, 86,172,192, 27,111,188,209,102,249,167,
159,126,218,177,235,232,174, 93,165,165,165,187, 42, 42, 42,190,132, 87,183, 25, 98,176,237,255, 35, 8,199, 67, 24, 62,171,221,
210, 39, 78,156, 64, 97, 97,161, 42, 40, 40,136,247,182, 15,176,247,140,177, 93,193,102, 45,206, 57,149,173,239, 33,154,161,118,
214,232,138, 64, 48, 9,160,178,179, 18, 48,233,255,220, 41,192,164,161,125, 33,201,215,254, 10,111, 31, 59, 8,192,189, 46,175,
185, 81,176,182, 26,206, 45, 93,238, 1, 58,131, 77,155, 54, 97,243,230,205, 0,128,233,211,167, 99,220,184,113, 29, 14, 35,250,
130, 13, 93,223,213,195,186,247,109,104, 9, 15, 97,216,204,118,139,151,148,148,112, 85, 85, 85, 51,181, 90,237, 78,111,210, 46,
40, 51,183, 22,108, 39,211,135,181,109, 10, 81,218,232, 24,215,139,211, 14, 63, 34,198,131,214, 11,190,179, 18,244,101,185,247,
69, 76, 93, 92,236,210, 98,200,204,247,236, 72,240,182, 23,230, 65, 45,240, 61,227, 3,116, 20, 70,163, 17,203,150, 45, 3, 0,
60,245,212, 83, 88,190,124, 57,222,127,255,125,220,119,223,125,237, 9,191,207,216,208, 78, 74,176,231, 13,104, 57, 30, 66,236,
244,246,205, 62,135, 35, 66,146,164, 21, 0, 54,163,110,176,165,199, 81,108,178,180, 22,236, 86,145,157, 54, 76, 32,103, 63,239,
220,188,201,149,175,129,138, 59,235, 91,252,230, 38, 80,195,255,195, 93,241,248,243,131,183,122,235,173,121, 70, 1, 58, 58, 16,
182,229,253,151, 80, 94, 94,142,126,195,227,224, 55,241,110,124,188,247, 44, 54,126,247, 3, 28, 3, 39, 35,172,175,251, 73,134,
233, 53,193, 66,241,128, 91, 38, 89, 7,106,116, 66,112,244, 77, 62, 51, 16,198, 40,172,187, 95,131,246,118, 30,194,144,169,237,
215, 62,165, 35,234,237,204,159, 1, 48,247,228,155,183,139, 50,202,170,173,109, 10, 56, 24,197,168,126, 97, 24, 30, 19, 10,127,
53, 95,175, 36, 12,187,247,236,145, 10,140,101,217, 18,175,189,164, 14, 31,144, 77,128,172,111,127,115,246,252,128, 80,219, 23,
96, 82,180,139,214, 31,245,102,209, 48, 87,202,254,238,119, 25, 56, 95, 84,225,209,231,253,248,241, 89,174,230, 2,121, 70, 1,
166,223, 56, 16,147,134, 58,218,142,138,156, 58,129, 11,199,211,160,235, 19,129,127,253,123, 45, 34,162,250,226,245,149,207,162,
164, 32, 23,255,120,254, 33, 68,247,235,143, 71,150, 62,137, 95, 44, 92,212,186,235, 78,219, 78, 75,170, 46, 94,144,236, 72,167,
129,186,253,224, 85,237, 63,136, 40,246,140,128, 81, 25,214, 93,175, 64,123,199, 27, 16, 6, 37,118,228, 27,183,212, 43,193, 28,
0,214,158, 82, 0,158, 35, 0, 99,110,109,252,176, 64, 53,126, 63,111, 18,110, 30, 80, 14, 34, 93, 6, 88,211,134,246, 55,251,
149, 18,201, 94,174,234, 19, 74,252, 71, 13,171,138, 38,160,119,130, 74,227, 65,101,190,141,214, 31, 96, 82,128, 43, 5, 88,144,
56, 10, 86,187,103,115, 4, 11,174, 7,232,152, 71, 20, 32, 54, 42,180,221, 50, 23,143,213,201,227,250,117, 95, 96,230,228,177,
88,191,126, 61,190,251,230,171,198,235, 87, 11,175,224,237,151, 95,192,200,193, 49,120,224,129, 7,156,190,219, 71, 37,202, 1,
181, 87, 75,106,141,198,139,181,153,123, 79,194,215,246,218,165, 18,172, 59, 95,134,118,214,155, 0, 58, 52, 71,253, 86, 0,223,
1,184, 27,128,173, 39, 40, 10, 60,135,240, 0, 21, 74, 76, 98, 43, 27,159,128,225,181, 7,166, 96, 92,216, 15,224,106,178, 90,
125, 87, 63, 30, 60, 88,232,104, 80,121,180,139, 86, 30,173,148,160, 73, 17,114, 80, 55,247,198, 9,102,155, 3,213, 86,199,255,
142, 9,212, 17,148,151,151, 35, 52, 52, 20, 51,103,214, 57,141,111,189,245, 22,198,141, 27,135,249,243,231, 35, 47, 47, 15, 35,
71,142,196, 59,239,188,131, 23, 95,124,177,149, 2, 52,115, 96,124,119, 54,168, 44,194,150,242, 30,144,240,118, 71,191,113, 27,
128,135, 0,252,163,167, 40,246, 13,209,194, 88, 89,219,202,244,153,114, 67, 20,198, 70, 21,128,171,205,114,209,102,182, 16,112,
87,166,142,203,243, 50, 64,165,179, 0,166,180,188,229,206, 83,151,112,161,216,179,214,233,196, 33, 81, 16,122,202, 4,170,181,
57,218, 13,107,197, 12, 28,140, 81,163,111, 68,149,217,134,146, 18, 35,114,115,115,241,205,214,239, 16, 63, 37, 1,143, 62,180,
8,171,222,125, 15, 34, 5,126,191,226, 57,100,229, 92, 64,255, 1, 77,115,111,236,148, 16, 89,229,175,146, 2,250,248,225,230,
135, 67,161, 13,110,255, 65,198,163, 26,175,190,218, 99, 61, 5,231,175,131,118,206,187, 40, 55,117,184,151,125,191, 39,133, 31,
0,134, 68, 4,226,100, 94, 73,171,112,231,232, 1,225, 32,226,233,214,214, 66, 91,173, 60,117,161, 4,206,231,175,144,184,148,
226,164,164,164, 86, 60,150,253,108,146,119,226, 22,158,138, 2,253,101,219, 17,100, 27,218, 14,107,201, 14, 59, 78, 95,184,132,
37,107,118,128,202, 18,180, 33, 58,124,145, 85,131,245, 57,251,144,117,165, 2, 75,214,236,128,100,139, 0, 39,168,240,252,231,
59, 17, 24,209,228, 20,103, 85,135,169,138, 7,207,184,205, 65,212, 99, 4, 77,224, 67, 29,114,130, 79, 9, 75, 0,148,244,152,
240,207,253, 0, 92,232, 64,192,148,223, 81,225,255, 93, 79, 11,192,188,248,193,248,238, 72, 30,100,217, 57,220, 25,232,167, 2,
161,181, 78,206,125,199, 90,249,230,202,209,226, 26,240, 23,119, 60,126,253,207,157, 56,158,231,217, 44, 43, 7,223,248, 85,171,
48,168,199,122,128, 87,238,239,144,243,135,249,199, 55,227, 47,247,223,132, 1, 3, 6,224, 29,249, 34,180,154, 34, 44, 95,190,
28,203,243,247,225,165,135,146,224,231,231,135, 81,127, 95,129,109,111, 62, 1,190,217,180,232,103,158, 57,232,216,115,108, 79,
178,209,104,252,161,188,188,124,191, 47,249, 0, 78,194,223, 49,124,224, 13,225, 7,128,200, 16, 45,102,143, 31,128,173,135,115,
157, 28, 96,231, 9,112,157,106,229, 91, 40,135,220,240,106, 74,219,234,221,254,254,248, 44,175,188,171,102,251,187,245,188, 15,
0, 0,127,255,251,223,241,252,243,207,227,239,127,255, 59, 94,120,225, 5, 36, 39, 39, 67,146, 36,140, 27, 55, 14,199,143, 31,
71,126,126, 62,238,184,227, 14, 39,225,111,230,189,203,148, 82,159,154, 78,220, 89,225,231,121,254, 27, 89,150,127,231, 77,206,
191,190, 35, 14,126, 42, 14, 7, 78, 27, 80, 92, 89, 11, 6, 82, 63,106, 74, 1, 38,186,108,229,101, 81, 6,152, 36, 19, 34, 83,
14, 50,117,171, 4,117, 14,253, 81, 0,207,146,184, 84,183,211,209,119,158,186,132, 18,147,197,163,207,185, 48,105,116,171,185,
64,245, 38, 16,243,154, 2,232,116, 58,188,248,226,139, 88,185,114, 37,238,186,235, 46,220,123,111,221, 48,246,152, 49, 99,240,
250,235,175,227,198, 27,111,196,154, 53,107,220,105, 47,245,165,129,176,206, 10,127, 80, 80,208, 17,149, 74,245, 65, 69, 69,133,
87,121,171, 4, 14, 75,102,197, 97,201,172, 22, 9,148, 77,123, 1, 42,186, 52,117,254,181, 45,216,158,113,228,196,231,209, 97,
214,159, 94,249, 77,255,227, 42,158,177,102,189,193,121, 18,119,176, 83, 61,178, 40, 83,183, 19, 31,123,101, 20,232,147,157, 39,
144,107,172,234, 56,139,209,183,227,131,173, 7,241,202,223,214,163,232, 66, 54,170,203,141,144, 28,118,140,184,255,183,120,225,
203,159, 90,219,115,213, 33,234, 43, 3,111,157,105, 25,172, 29, 42,248,135,221,215,145, 69, 85, 18, 52,175, 99,211,211, 21,190,
32,252,227,198,141,147, 36, 73,218, 89, 88, 88,232, 91,225,219, 22,161,220,186, 86,189,181,169,179,244,238, 18,205,210,187,162,
150,128,201, 75, 90,181,254, 96, 97, 0,170, 58,243, 83,115, 38, 14,245,150, 19,236, 25, 19,104,214,184, 33,168,181,117, 50,174,
123,155,243, 62, 6, 75, 23,221,143,135,166,141,113, 89,180,228,200,143, 82, 85,213,197,147,146,168, 74,113, 12,158,156, 5,194,
117,224, 65,170,107,125, 65,248,151, 45, 91, 6,198,152, 99,223,190,125, 62,190,168, 95,114,107, 2, 57, 69,129, 84,209,102, 16,
129,192,122,222,191,203,102, 88, 39,157,224,221, 47, 63,128, 32,173,218,119,123,128,142, 12,132,181,135, 49,163, 70, 96,236,160,
72,151,215,250,168, 68, 57,168,182,176,168,186,176,240,172,249,232,182,147,222,242, 3,186, 34,252,239,190,251, 46,158,121,230,
25,230,107, 38, 92,235,214,145, 7,105, 48,129,220,216,248,148,105,109, 92,236,218, 0, 16, 14,184,176,160, 22,142, 66,127, 0,
246, 78,251,130, 94,114,130,225,205,129,176,230, 56,113,226, 4,190,252,242, 75, 76,157, 58, 21,115,231,206, 5, 0, 12, 29, 58,
20,178, 44,187,114,128, 27, 39,195,213, 59,193,232, 77,194,239, 43,252,219, 85, 0,213, 96,192,156,222,102,180,135, 48,137,135,
92, 13,112, 26, 64,174, 38, 0, 78,146,184, 84,171,175, 61,203,246,237,219, 81, 88, 88, 8, 0, 40, 46,110,234,105, 40,165, 19,
209,148, 31,116, 63,128,156, 30, 87, 0, 74, 41,230,205,155,135, 43, 87,174,224,227,143, 63,198,241,227,199, 49,114,228, 72,132,
132,132,192,106,181, 34, 48, 48,208,149,237,230, 85, 39,152,248,247,233,178,240,251, 2,255, 14,189,151,192, 89,224, 44,135, 64,
172,103, 93,155, 64,160, 32,128, 10,231,127,110, 7, 56, 6, 38,137, 0,150,250,226,179,172, 94,189, 26,251,246,237,115, 37,123,
115, 80, 55, 7, 11, 0, 30,243,138, 2,212,214,214,226,202,149, 43,141,202,208,208,226, 23, 23, 23, 67, 20, 69,119, 17, 32, 48,
198,168,220,176,132,172,135,161,185,249, 49,128,227, 59, 84,182, 95,191,126, 78,194,239, 11,252, 59,166,229, 42, 72, 81,175,131,
51,167,129,171, 88, 7, 98,191,220,220,209,109,214, 26,201,118, 64,126, 15,192,123, 36, 46,213,228,139,143,242,231, 63,255, 25,
149,149, 77, 83, 45,254,246,183,191,217, 14, 31, 62,188,174,180,180, 52, 77, 20,197,252,250, 7,202,233,200,189,186, 93, 1,130,
131,131,113,251,237,183, 35, 59, 59, 27,159,127,254, 57,134, 15, 31,142,140,140, 12, 24,141, 70,132,133,133,185,127, 63,222,204,
172,214, 65,225, 7,220,231,172,236, 29,153,237, 8,104, 64, 34,104, 64, 34, 32, 87,129, 56, 10, 64, 28, 6,108,217,188,209,158,
151,119,225,115,115,109,229, 87, 99,134, 9, 63,205,127,250,156, 79, 63,199,216,177, 99,157,142,183,109,219, 38,231,230,230, 94,
48,155,205,135, 76, 38,211,185,206,248,144, 30,241, 1, 54,110,220,136,215, 94,123, 13,159,125,246, 25,190,255,254,123,232,116,
58,124,240,193, 7,237,125,173, 87,167, 70,236,117,252,249, 80, 48,109, 40,152,118, 44, 82,206,236,147,246,239,207, 62, 87, 80,
80,126,165,170,170,138, 94, 79,245, 47, 0,128,201,100, 18, 50, 50,186,119,255,228,150,171,192, 78,158, 60,233,182,172,201,100,
226, 9, 33, 93, 54, 33, 60,193,191,147,191,175,240,239,165,252, 5, 0,198,226,226,226, 83,171, 86,173,226,237,118,123, 52, 99,
76, 13,128,213, 71, 54, 88,179, 15,234,207, 55,254,223,242,154,187,235, 45,238,213,178, 44,147,101, 89,150, 36,169,164, 62,189,
96,103, 67,160, 10,127,133,127,151,249, 55, 31,114,229,116, 58,221,114, 0,125,209,148,229, 76,102,140, 73,132, 16,153, 49, 38,
19, 66,164,102,231,104,179,107, 13,231,101, 66,136, 84,191,184, 93,110,184, 70, 8,145, 41,165, 82,139, 99,185,193,110,166,148,
74,178, 44, 75,140, 49,139,217,108,190,210, 85, 75, 94,225,175,240,239, 44,255,230, 10, 64, 2, 3, 3,163, 57,142, 83, 19, 66,
152, 74,165,130, 40,138,141, 90,214,160,133,205,143,235, 67,127, 12, 0, 28, 14,135,147, 6, 19, 66, 88,179, 79, 67, 89, 88, 44,
22,167,123,112, 28,199, 8, 33,172,178,178,146,213, 87, 90, 87,215,210, 41,252, 21,254,157,230, 79,218, 57,238, 40,124,101, 6,
167,194, 95,225,223, 35,132,187, 5, 73, 73, 73, 2,128,217, 28,199,221,247,211, 79, 63, 45,238,109, 97, 7,133, 63,144,148,148,
52, 90, 16,132, 71, 8, 33,221, 46, 75,140,177,112, 89,150,135, 51,198, 94, 78, 73, 73,217,231,137, 58, 16,186,169, 34,251, 1,
40, 79, 73, 73,177,117,176,252,120,181, 90,189,132, 49,246, 43,157, 78,199,149,149,149, 9, 0, 22,123, 81, 16, 20,254, 93,231,
127, 67,100,100,228,147,115,230,204,241,235,206,103,202,206,206,198,169, 83,167, 16, 25, 25, 9,131,193,176, 59, 41, 41,105, 90,
74, 74, 74,138,207, 40, 64, 82, 82, 82, 8,128,121, 90,173,246,215, 14,135, 99,188, 32, 8, 59,146,146,146,230,166,164,164, 48,
55,229, 35, 57,142,123, 80,173, 86,255,159, 32, 8, 81,241,241,241,154, 73,147, 38, 9, 90,173, 22,111,190,249,166,205, 11, 66,
163,240,239, 38,254,209,209,209,246,133, 11, 23,118,155, 2,108,218,180, 9, 6,131, 1,143, 62,250, 40, 56,142,195,193,131, 7,
185,204,204,204, 3,137,137,137, 9,169,169,169, 25, 94, 83,128,164,164, 36, 53,128,217,126,126,126, 75,101, 89,158, 62,108,216,
48, 41, 62, 62, 62,104,232,208,161, 88,179,102,205,173, 37, 37, 37,239, 2,120,166, 69,249,185, 90,173,246, 73, 73,146,226,227,
226,226,104,124,124,188,255,224,193,131, 27, 38,144,193,106,181,246,164,208, 40,252,189,200,191, 35,144, 36, 9,235,215,175,199,
210,165, 75, 17, 22, 22,134,218,218, 90, 36, 38, 38,130, 82,202,101,101,101,165,235,245,250,155,211,210,210,142,247,152, 2, 36,
37, 37, 17, 0, 73, 26,141,230, 49, 74,233,188,190,125,251,202, 83,166, 76, 9,137,139,139,131,159, 95,147,210, 63,246,216, 99,
1,239,189,247,222, 19,183,220,114, 75, 14,165,244,148, 70,163, 89, 74, 41,157, 31, 19, 19, 67, 19, 18, 18,130,227,226,226,160,
82,169,188, 97, 30, 40,252,189,200,191,179, 48, 24, 12, 8, 14, 14,110,220,124, 68,171,213, 66,150,101,232,245,122, 72,146,196,
229,228,228,100,232,245,250,241,105,105,105, 89, 30, 85,128,122,231,102, 49,199,113,143, 6, 6, 6,170,227,227,227, 3, 38, 76,
152,192,135,132,132,184, 44,239,239,239,143, 37, 75,150,248,175, 94,189,250, 35,173, 86,235,152, 50,101,138,118,226,196,137,124,
104,104,104,183, 85,206,244,233,211,251,216,237,118,154,158,158, 94,209, 1,193, 81,248,123,145,127, 87, 81, 88, 88, 8,157,174,
105, 71, 34,141, 70, 3, 89,150, 33,203, 50, 18, 19, 19, 33,203, 50,127,225,194,133, 19, 9, 9, 9, 55,166,167,167,159,239, 86,
5, 72, 74, 74,138,225, 56,238, 87,106,181,122, 9,199,113, 49,147, 38, 77, 18,110,186,233, 38,117,223,190,125, 59,116,179,136,
136, 8,172, 92,185, 82,237,239,239,175,238,206, 74, 73, 76, 76, 28, 17, 16, 16,176,210,110,183,223, 86, 93, 93, 29,219,134,208,
40,252,189,200,191, 59, 16, 24, 24,216,202, 44,243,247,247,111,220,212, 59, 41, 41, 9,178, 44, 11,151, 46, 93,202,210,235,245,
35,211,210,210,242,186, 69, 1,146,146,146, 18, 4, 65,216, 59,102,204, 24,122,243,205, 55,251,199,198,198,162, 43,145, 45,127,
127,255,110,171,140,169, 83,167, 78, 11, 8, 8,120,153, 82,154, 16, 16, 16,160,150,101,249,163,236,236,108,135, 27,225, 81,248,
123,145,127,119, 65,167,211,193,100,106, 61, 11,187,193, 20,146,101,185, 65, 9, 84, 5, 5, 5,103,245,122,253,176,180,180, 52,
195, 53, 43,128,159,159,223,107,208,238,250,153, 0, 0, 20,252, 73, 68, 65, 84,119,222,121,167, 58, 33, 33,129,131, 23, 49,125,
250,116, 65,150,229,251,252,253,253, 95,241,247,247,239,255,224,131, 15, 6, 76,159, 62,157, 44, 88,176,192,102,177, 88, 62,114,
247, 61,133,191,119,249,119, 23,162,162,162, 80, 83, 83, 3,171,213, 10,173, 86, 11,160,110, 99,194,210,210, 82,148,151,151,163,
180,180, 20, 22,139, 5,131, 7, 15,134, 40,138,234,171, 87,175,158,215,235,245, 67,210,210,210,138,187,172, 0, 73, 73, 73, 35,
1, 36, 77,154, 52,201,107,149, 31, 31, 31, 31,172,209,104,150, 8,130,176, 98,232,208,161,154,135, 30,122, 40,104,202,148, 41,
32,132, 96,247,238,221, 16, 4,225, 84,122,122,250, 69, 55,173,167,194,223,139,252,187, 19,106,181, 26,227,199,143, 71, 78, 78,
14,116, 58, 29, 14, 28, 56,128,130,130, 2,196,198,198, 34, 42, 42, 10, 67,135, 14, 5,207,243, 72, 77, 77,133,209,104,132, 40,
138,126, 26,141, 38, 79,175,215, 15, 74, 75, 75, 43,237,146, 2,104, 52,154,151,166, 78,157,170,242, 70,148,160,186,186, 26, 28,
199,169, 2, 3, 3,139, 38, 79,158,140, 95,253,234, 87, 1, 55,220,112,131, 83,153,111,190,249,166,166,182,182,246,207,238,238,
161,240,119,195,205, 38,225,167,139,165, 40,169,113, 64, 45,112, 80,243, 4,106,158,131, 70,224, 48, 97, 64, 40,250, 6,251,117,
11,255,238,198,180,105,211,240,233,167,159, 66, 20, 69, 60,254,248,227,152, 57,115, 38,212,106,103,183,102,209,162, 69, 48,153,
76, 88,183,110, 29,182,108,217,162,165,148,190,137,166,245,192, 29, 87,128,164,164,164,104, 74,233,189,122,189, 94,232, 73,193,
41, 44, 44, 68, 74, 74, 10,206,157, 59,135, 57,115,230,240, 11, 22, 44, 8,136,140,108,157, 53, 34, 63, 63, 31, 5, 5, 5,148,
231,249,111,221,180,158, 94,231, 63,243,206,159,241,139,127,249,128, 79,240,183, 75, 20,169,121,229,216,157, 83,130,140,252, 74,
136,110,146, 26, 19, 0, 3, 53,118,220,104,207,198, 67,119, 37,240,183,205,127, 34, 32, 50, 50,170,211,252, 61,129,132,132, 4,
124,253,245,215,120,227,141, 55, 16, 19,227, 62, 29,125, 72, 72, 8,158,124,242, 73,108,223,190,157,213,212,212,140, 13, 13, 13,
237, 95, 85, 85,117,165, 51, 74, 32,168,213,234,231,110,186,233, 38,174, 59,157, 39,119, 96,140, 33, 39, 39, 7,169,169,169,168,
172,172,196,125,247,221,135,215, 95,127,189, 77,199, 45, 57, 57,217,193, 24, 91,179,127,255,126,201, 77,151,233, 85,254,137,243,
30,197,211,235,126,194, 61,178, 10,145, 94,228,207, 24,240,245,113, 3,214, 30, 42,128, 85,108,127, 93, 8, 3,144,111,215,224,
151,131,181,184, 91,216, 3,203,119,199, 96, 31, 57, 3,252,144,169, 16,162,199, 55, 46, 19,109,143,191, 39, 16, 20, 20,132, 53,
107,214,184, 93,126,218, 18, 67,134, 12,145, 12, 6,131,153,231,249,251, 81,151,152,184,227, 10,192,243,252,207, 39, 77,154,164,
241,228, 3, 73,146,132, 99,199,142, 33, 45, 45, 13, 1, 1, 1, 88,184,112, 33,166, 77,155,230, 50, 69,138, 83,107,102,183, 99,
231,206,157,212,106,181,254,205, 93, 25,111,242,207,200, 45,198, 93,171,190,129,213, 33,225,238,119,190,193,190, 87, 23, 34, 58,
44,176,199,249,151,155, 29,120,251,199,115, 56, 90,208,249,156,252, 19, 2,235,190,227, 47, 85,193,145,181, 5,200,218, 2,226,
23, 12, 97,144, 30,108,128, 30,251,246,180,205,223, 83,232,168,240,215, 7, 16, 24,165, 84, 98,140,105,208,201, 9,158, 2, 0,
194,113,158,241,189,204,102, 51,210,211,211,113,248,240, 97,140, 26, 53, 10, 43, 86,172,232,240,174,145, 0,176,111,223, 62, 8,
130,112, 36, 45, 45,173,173,156,228, 94,225,159,109, 40,195,188,119,183,194,234,168,107, 24, 11,202,170,113,239,159,147,177,243,
165,249, 8,214,106,122,140,191,201, 38,225,183,155, 51, 81, 80,209,249,100,180, 4,192,248,160,214, 89, 15,153,173, 26,226,185,
29,192,185, 29,248,247,108,162, 82, 17,246, 23,242,192,148,100,104,196,239,195,151, 30,243,201, 76, 17,245,232,218,154,224,238,
70,105,105, 41, 82, 83, 83,145,153,153,137,105,211,166,225,195, 15, 63,196,128,102, 27, 98,116, 20, 61,237,124,117,148,127, 65,
89, 53,230,190,243, 13,170,204,206,115,200, 50,243, 75,176,240,253,109, 72,126,238, 94,168, 5,222,227,252,173,162,140,231,147,
79,119, 73,248, 1, 32, 86, 91,139, 16,161,237,245, 35, 42,142,241, 0,230, 49, 96, 58,236,170,229,229, 31, 76,249, 74,144,201,
218,144,167,211,189,155, 5,152, 81,128, 52, 53, 28, 93,205,202,209,173, 10,144,151,151,135,148,148, 20, 20, 22, 22, 98,238,220,
185,120,238,185,231,208,213,161,248,220,220, 92, 92,189,122, 85,140,142,142,254,111, 79,213,105, 71,248,151,152, 44,152,179,106,
19,174, 86,185,222,163,111, 95, 86, 62,150,124,178, 3, 47,222, 57,210,227,252,255,153,122, 25, 57,198,154,182, 91,121, 2,232,
71,244, 71, 76, 88, 0,204, 54, 17,149,102, 59, 14, 95, 40, 2,101, 12, 19,130, 42,219,234,151,144,122,133,179,199,199,208, 39,
52, 4, 7, 67,151,165,229,250, 66, 19, 79, 45,229,176,253,176, 18,204, 82, 6,245,228, 37, 80,141,184,163,177,245,175, 95, 74,
217,233,244,232,215,180, 26,135, 82,138,204,204, 76,164,166,166, 66,150,101, 60,240,192, 3,184,253,246,219, 91,133,173, 58,139,
173, 91,183,218, 41,165, 31,111,218,180,169, 61,173,238, 49,254, 53, 86, 7,238,249,211, 22,228, 22,183,157, 44,121, 99,122, 14,
12,185, 57,178,218,131,252, 47,150,214, 34,249, 84,161,219,235,129,126,106,172,184, 39, 30, 11, 18, 71,161,127,120,144,211,181,
203, 37, 38,124,180,227, 56, 6, 95,106, 61,159,204, 6, 13,252, 96, 7, 24,197,153, 50, 97,227,220, 63,166,172,245, 37, 27,135,
85, 23, 65,174,200,173,219,179,109,223,219, 16,179,147, 17,227, 7, 82,191, 32,158,118,197, 7,232, 18, 28, 14, 7, 14, 29, 58,
132,244,244,116,244,239,223, 31, 79, 60,241, 4,226,227,227,209, 29, 11,131,108, 54, 27,246,236,217,195,108, 54,219, 39,158,170,
200,206,242,183,139, 50, 22,188,247, 45, 78, 94, 54,118,232,254,233, 37,224, 53, 33,137, 20,216,227, 17,254,255, 72,201, 3,117,
163, 58,209, 97,129,216,242,236,189, 24, 55,216,117, 50,226,193,145, 33,120,247,161, 91, 81,242,229, 23, 78,155,156,214,112, 65,
8,162, 77, 61,202,226, 56,199,224, 23,124,204,200,231,251,142,129,118,214, 27,176,238,124, 9,144, 69,200, 37,103,241,255, 6,
16,149,223, 20,255,193,111,109, 39, 93,234, 1,186,132,109,219,182,129, 82,138, 85,171, 86, 97,248,240,225,221,250,144,123,246,
236,129, 32, 8,169,169,169,169, 69,158,170,200,206,240,167,140,225,145,143,183, 99,127,118, 65,167,126,195,206,107, 95,230,231,
175, 58, 39,111, 92,185,161, 59,185,151,155, 29,200,200,175,116,217,216, 13,208, 5, 97,247, 43, 11, 49, 64, 23,212,142,187, 40,
66,107,174,123, 30, 17, 2,100,162,114, 18,126, 0, 80,243,152, 90,249,158,126,124,216,239,210, 78,250,146, 18, 8,131,244,208,
206,122, 3,182,157, 47,131,201, 14,240,132, 97,241, 36,191,113, 83, 6, 14,122, 88, 16,134,173,155,252,234,225,234,142,222,139,
67, 23,246, 21, 48,155,205,200,204,204,196,202,149, 43,187, 93,248, 27,156, 95,179,217,220, 81,231,209,227,252,151,125,182, 27,
91,143, 92,232,202,163, 16,194,176, 86,184,127,213,140,238,228,191, 35,171, 16,204, 77, 79,255,135,121,250,246,133, 31,128, 92,
94,103, 70,128, 87, 33, 48,225, 9,248, 49,215, 11, 99, 40, 47,223,235,139,225, 30, 97,144, 30,126,179,255, 8,162,210, 54,158,
27, 17,169,158, 52, 52,156, 28, 42,251, 48, 97,164, 71,123,128,163, 71,143, 34, 33, 33,161,205, 92,159, 93,197,185,115,231, 80,
82, 82, 98, 59,120,240,224, 78, 79, 85, 94,103,248,191,254, 77, 42, 62,219,155,121, 45, 63,167, 6,144,172, 90,240,206, 45,226,
215, 47,156,234, 14,254,169,103, 93, 79,126, 28,216, 39, 24, 11,147, 70,119, 44, 94, 88,114, 6, 32, 28,180,183,191, 6, 97,112,
18,196,236,100,208,106, 23, 62, 5, 35, 9, 61,102,223,215,150, 64, 42, 60, 6, 72,118, 48, 89, 4,100, 7, 24, 21, 65,168, 4,
230,176,130, 57,106,193, 28,181,128,104, 1,179,155,235,254,111,189, 51,234, 40,194,216,225,242, 15, 19,230,235,158, 74,255,177,
219, 21,128, 82,138,140,140, 12,188,252,242,203, 30,169,132,173, 91,183,218, 68, 81,252, 0, 30, 74,149,209, 25,254,127,251,241,
56,222, 73, 62,212,120, 28,164, 85, 99, 70,220, 32,216, 68, 9, 63,158,188,228,186, 66, 9, 16,224,168, 56,100, 82,133,107, 0,
76,168, 63, 29,204, 40,251,193,239,129, 85,122,219, 87, 43, 47, 95, 43,255,203,149, 86,128,104, 91, 93, 91,116,203,141, 80,241,
29, 27, 83,160, 37,103,161,137, 95, 10, 97,112,221, 62,191,170,225, 51, 97, 63,246,133,139, 62, 12, 61,178,233,175,116, 97, 39,
172,123,223,118, 37,208, 93, 65, 48, 24,219, 94,241, 97,252,178,240,167, 14,255,173, 61, 19,168, 83, 56,127,254, 60,130,130,130,
16, 23, 23,215,237,149, 96,177, 88,176,127,255,126, 56, 28,142,127,122,170,162, 59,202,255,235,180, 28, 60,183,110, 31,162,195,
2,241,248,109,227,240,237,138,121, 48,124,242,127,216,240,219,185,109,239,129, 69, 37,140, 40, 73,253,185,180,105,229, 68, 9,
100, 16, 1,158, 2,176, 27, 64,164, 36, 99, 7,238,125, 91,119,173,252, 45,196,245,250,243,168,144,128,142,219,102,234, 0,168,
199, 63,208, 36, 8, 49, 19,221, 21, 13,233, 9, 5, 16,207,239,236, 46,225,111,244,151, 25, 35, 31,151,127,144,240, 62,123,213,
189,156, 11,157,221, 91,245,240,225,195,248,197, 47,126,225,145, 74,216,181,107, 23, 83,171,213,123,247,236,217,211,225, 13,176,
61,193,127, 87,230,101,252,117, 91, 6,214, 44,189, 19, 11,244,163, 58,220,170, 2, 0, 3,145,210,210,210,234,248,111,122,161,
64, 4, 62, 2,240,145,102,193,159,134, 74,178,252,172, 32,112,155,164,251,255, 58, 7,155,158,182,118,149,191,138,143,133, 67,
110,253,181,176, 64,103,197, 56,124,161, 8,195,163,195, 17,222,226, 60, 24,133,122,226,131,206, 78,180,228, 54, 49, 4,199, 54,
222,207,147,249,155, 60,154,249,218,111,198,139,144, 75,178, 1,209, 10, 38, 90,193, 28, 22,192, 81, 3,106, 53,129,150,157,131,
92,226, 58,221, 63, 31, 58, 16,124,248, 96, 64,208,128, 89, 42, 32, 22,157,172,223,240,163, 65, 64,216,242,242,176, 41, 67, 75,
62,246, 91, 24,249,155,253,181, 93, 54,129, 24, 99, 40, 47, 47, 71, 65, 65, 1,110,187,237, 54,143, 84,194,166, 77,155,204,213,
213,213,239,122,196,190,236, 32,127,179, 93,132,192, 17, 28,122,251, 33,116, 37,162, 75, 9,231,114, 79, 45,251,215,207,231, 2,
248, 53, 22,190, 21, 37,136,142, 9, 18,144,214, 85,254, 1,125, 71,194, 97,110,253, 51,205,103,126,214,218, 28,120,107, 75, 58,
190, 91, 49,207, 69,171,193,129,248, 59,119, 68,204,230, 54,112, 34,226,204, 38,143,103,110, 35,218, 80, 8,131, 90,111,200, 46,
95,205,132, 53,111,127,171,243,170,126, 19,161,141,127, 28, 66,191,241,173,158,195,126,126, 39, 44, 41,171,235,156,124, 0,132,
224, 46, 94,182,165,148,175,142,191, 75,183,236,240,149, 78, 41, 0, 99,245, 59,142, 51,134,195,135, 15, 99,214,172, 89,208,104,
186,127,238,217,153, 51,103, 80, 85, 85, 85,147,154,154,186,175,187, 5,191, 51,252, 3, 52, 42,220, 26, 55,168,235,191, 7,210,
246,172,201, 13,127, 48, 74,128,241, 90,248, 27, 11,131, 81,105,110,189,246, 99,219,145, 11, 88,152, 56, 10,140, 1,203, 63,219,
141, 62, 65,218, 14,243, 46,185,120, 28,193,174, 47, 93, 32,175,194, 43,123, 6, 72, 23,247,192,186,239,237, 70, 65,110,236, 45,
110,122, 8,254, 9, 75, 27,167, 66,156, 59,127, 6,102,179, 25,186,112, 29, 6, 13,138,133,223,216,251, 32, 68,220,128,154,237,
43,192,172,141,131,150,227, 0,238, 61, 0,247,119,216, 7,160,148, 54,174,195,180,217,108, 56,126,252, 56,238,185,231, 30,143,
60,236,150, 45, 91,172,162, 40,190,215,221, 14,111, 79,241,247,148,195,238,138,255,228,225,209, 46,203,239,204,188, 12,139, 93,
196,239, 55, 28,192,134,212,179,152, 60, 44,186, 99, 74,230,176, 64,147,191,219, 77, 43, 79,206,244,248,131, 51, 10,251,225, 53,
176,238,126,189,149,240,171,135,205,128,191,254,215, 0,225,112, 56, 35, 29,241, 79,188,138,184, 23,191, 67,252,170, 61, 24,246,
220, 70,252,252,153, 55,112,241, 98, 14,132,232,177, 8,185,255, 95, 32,126,205,167,178,176,123,171, 62,156, 60,164,165, 2,180,
138, 67, 55,175,248,134, 79,102,102, 38,134, 13, 27,134,254,253,251,119,251,243,214,212,212, 32, 53, 53,149,216,108,182, 79,187,
214,200,123,151,255,181,119, 82,157,227, 63,101,120, 63,215, 65, 4,187,136,121,127,217,138, 15,182, 31, 5, 0, 76, 30, 22,211,
33, 2,181,199,191,130,134,147,220, 24,124,108,103,143, 42,189,185, 12,150,109,203,225, 56,241,159,214,129, 64, 65, 3,255,233,
207, 2, 0,242,242,206,227,231,171,119,227,120,133,179,127,243, 95,131, 10,243,255,244, 21, 36, 81, 4, 23,210, 15,234, 33,122,
39,151, 65,166,252,114,183, 61, 0, 99,172,177,194, 37, 73,130, 36, 73,141,199,199,143, 31,199,188,121,243, 60,242,208, 59,119,
238,132, 90,173,222,113,173,249,102,188,197,191, 59,205,181,142,240,159, 59,105, 24, 66,252, 93,155,113, 7,234, 71,171,181,106,
1, 99, 6, 69,180,111,102,228,167, 65, 62,245, 31,119,151,109, 68, 35,110,236, 49,147,231,202, 49, 88,191,121, 12,114,145,235,
225, 18, 85,244, 88,112,218,186,177,155, 15,191,254, 14,229, 14,215, 75, 72, 79, 87,249,225,207,255,168, 11, 36,170, 6, 76,110,
209,161,177, 71, 13,127, 77,208, 58, 41, 64,131,157,217,178,213,105,120, 17, 6,131, 1, 22,139, 5, 9, 9,221, 59, 38, 66, 41,
197,158, 61,123,176,118,237, 90,212,214,214,190,123, 45,130,227, 13,254,221,237,167,116,148,127,144, 86,141, 71,110, 29,219,230,
61,199,235, 36,168,218,153, 30,239,200,254, 22,150, 31, 86,130,103,110,167, 68,127,213, 35,243,255, 25,133,253,216, 90, 88,183,
63, 3,106,117, 63, 67, 85,136,106, 26,228, 59,125,213,220,230, 45,243, 74,235,156,122, 97,192,205, 45, 47, 5,169,180, 36,168,
185, 19,204, 26, 42,186,193,217,106, 72, 66,212,240, 57,113,226, 4,238,185,231, 30,116,215,194, 19, 89,150,177,107,215, 46,124,
246,217,103,176, 88, 44,142,226,226,226, 45, 6,131, 33, 60, 56, 56,248,230,234,234,234, 35,157,173,190,158,230, 79,105,183,250,
132, 93,226,255,200,140, 49, 88,179,235, 68,227,130,156,150,152,192, 95,132,121,227, 98, 8, 35,102, 67,125,195, 29, 32,129,117,
19,227,152,104,133,227,226, 62,148, 30,222,128, 16, 91,126, 91, 83, 39, 77, 50, 47,175,244,184,236,139, 86,216,118,189, 2,169,
224,144,115, 67,205,171,193,192,156,124, 0, 90,219, 20, 29, 31, 18,174,193,129, 54, 18,161,140,111,152, 8,232, 98,108,193,223,
108,111, 60, 41, 52,111,125, 26, 42,188,249, 75,176, 88, 44, 56,127,254, 60, 94,121,229,149,107,239,226, 36, 9, 63,252,240, 3,
214,174, 93, 11,155,205,102,191,122,245,234,214,162,162,162,100, 74,105, 49,207,243, 70, 89,150, 75,174,165,245,236, 41,254,255,
90,191, 3, 16, 98,187,189,245,119,197,223, 84,107,198,169,220, 43,184,243, 87, 75,177,249,240,121, 28,207, 43, 70,218,185, 66,
156,184,100,132, 67,114,223,194,223, 20, 84, 9,106, 42,130, 35,227,159,112,100,252,179, 46, 98, 66, 56, 48, 42,131,128,181, 59,
186, 69, 8, 94,136,252,205,145, 98,143, 10,191,189, 22,214,255, 62, 7,217,152,237,252,219,193, 49,240,159,245, 38,236, 71,254,
5, 41,191, 41, 90, 44,149,158,107,252,255,233, 7,238,194,127, 94,217, 6,145,181, 86,225, 80,149,132,217,183,212,141,112,203,
165,173,179, 39, 50, 78, 77,157,194,160, 45, 95, 64,243, 23,113,234,212, 41, 36, 36, 36,224, 90,114, 76, 58, 28, 14,124,255,253,
247, 88,183,110, 29, 28, 14,135,173,168,168, 40,185,168,168,232,123,142,227,140,140, 49,163, 36, 73,198,170,170,170,210,107,105,
145,123,146,255, 85, 41,226, 52,250,224,230,238,142,246,184,226,159,125,250, 52,134,198, 77,192, 15, 89,133,216,118,244, 34,174,
86,214,118,232,158, 55, 5, 87,180, 50, 51,192,104,135, 38,203, 51,134,191,233,150, 29,250,196,147,194, 79,173,149,117, 38, 79,
153,115,170, 33, 97,144, 30,126, 51, 94, 4,209, 4, 66, 24,156,232,164, 0,114,121, 30,236,103,191,135,102,212, 93, 24, 53, 50,
14,219,127, 99,196, 67,255, 76, 69,177,189,105,237,198,208, 0, 59, 62, 91, 58, 3,177,177,117,169, 93,172, 39,190,108,249,211,
162, 57,192, 97,115, 82,128, 6,123,179,229, 11,144,101, 25, 89, 89, 89,120,253,245,215,187,244,144,118,187, 29,223,126,251, 45,
214,175, 95, 15, 89,150,109,133,133,133,155,141, 70,227, 14,198,152, 17,128,145,231,121, 99,121,121,185,241, 90, 43,179,167,249,
91,198,207,187, 25,232, 62, 5,104,139,127,118,214,105,188,254,250,235, 24, 61,122, 52,254,186,120, 6, 14,157, 47, 66,114,198,
121,108,205, 56,143,194, 10,215,202, 16,163,177, 34, 90,109,235, 98,143,132, 47,117,149,135,158,242,104,203,111,173,130,245,219,
39, 65,171,154, 77,234,227, 4,104,110,126, 12,234, 9,191, 68,195, 8, 53, 63, 48,161,254,255,166,104,144, 53,245, 35,168, 98,
38,128, 11,233,135, 91,111,153,137,203,137,211,177,231,192, 30, 20,149,150, 33, 38,162, 15,110,155, 62, 19, 28,199, 3,140,194,
146,178, 26,210,149, 99, 45,186, 54,124, 25,179,244,152,197,165, 15,208,210,254,204,203,203, 67,104,104, 40, 70,143, 30,221,169,
7,180, 88, 44, 72, 78, 78,198,134, 13, 27, 64, 41,181, 22, 20, 20,108, 46, 47, 47,223,205, 24, 51, 82, 74,141,130, 32, 24,203,
202,202,140,232,194, 34,230,182,108,232,158,226, 79,253,195,251,121,194, 7,104,143, 63, 71, 8,244, 35,250, 65, 63,162, 31,254,
180,232, 86, 28,201,189,138,228,140,243, 72, 62,124, 30, 5,101,213, 78,230, 79, 23, 32,130,177,223,235,150, 29,254, 11, 33,158,
221,179, 75, 46, 60,234, 36,252, 92,200, 0,248,221,246, 50,248,136, 17, 78,229,184,128, 62,224,251,222, 8,185, 56,171, 89,207,
97,130,233,171,135, 17,112,219, 31,160, 30, 58, 29, 60,207, 99,214,140, 89,173, 76,171,218, 29, 47, 66, 44, 56,220,170,174,193,
216,159,156,122,156,230,161,183,150, 54,232,153, 51,103, 58, 21, 58,172,173,173,197,230,205,155,177,113,227, 70, 80, 74, 45, 6,
131,225,155,178,178,178,253,140, 49, 35,207,243, 70,198,152,177,170,170,202,136,174,239, 68,216,102,232,176,167,248,171,180, 33,
241,221, 37, 34, 93,229, 79, 8, 48,121, 88, 52, 38, 15,139,198,170, 95, 78,195,241, 60, 35, 54,238,203, 64,114,250,105,140, 15,
236,148, 2, 72,140, 97, 7,227,232,107, 17,203, 50,142, 98,185,231,163, 94,252,160, 68,240,125,199, 64, 46, 57, 11,213,136,217,
208,232,159,116,154,215,223, 28,154,164,223,194,178,229, 9,128, 54, 57,251,204, 81,139,218,255,174,132,122,232,116, 8, 81,163,
193,135, 15, 1, 9,208, 65,174,184, 12,185,236, 2, 28,185, 7, 64,171, 91,175,165, 98,192,247,125,150, 29,118, 26,216,115,235,
3,152, 76, 38, 20, 23, 23, 99,198,140, 25,237, 62, 80,117,117, 53,190,254,250,107, 36, 39, 39,131, 82,106,190,114,229,202,230,
178,178,178,131,140, 49, 99,189,157, 95, 28, 26, 26,106,188,120,241,162,221, 35,246,164,194, 31,199,246,124,135,204,228,100, 12,
161,212,188, 35,219,184,189,223, 56,106,191,101,120,224, 68,157, 63, 63, 26,196,133,233, 79,112,152, 49,178, 94,237,112,124, 21,
252,236,177,178,158, 12,251, 18,149, 22,254,247,124,220,184, 32,167, 77,101,233,115, 3,212,147, 30,169,115,228, 91,250,102,185,
251,225,200,221,223,193, 31, 37,121, 2,228, 86,234,237,214, 7,200,206,206,198,157,119,222,217,230,188,153,170,170, 42,124,249,
229,151, 13,203, 11,107, 13, 6,195,230,170,170,170,180, 6, 27,159, 82,106,212,106,181,198,162,162, 34, 75,101,101,165,199, 42,
84,225,223,154,255,243,151,152, 81,150,139,140,235, 31, 25, 64, 18, 6, 5,106,136, 74,230,136,172, 34, 96, 50, 7,162,170, 10,
95,150, 82, 0,111,131,239, 88, 46, 84,205,132, 95, 1,142, 90, 56, 78,118,121,101,233, 41,153,147,238,212,185,136,106, 53, 42,
64,115, 27, 84, 20, 69,156, 63,127, 30,207, 60,243,140,203,187,149,151,151, 99,253,250,245,216,177, 99, 7,100, 89,174,169,175,
248,140, 6,161, 81,169, 84,197,140, 49, 99, 69, 69, 69,173,171, 92,239,158, 16, 32,133,191,107,254,119,191,239,203,121,172, 58,
218,101,112,208, 76,249, 53,248, 62, 55,192,182,255,143, 96, 82,167, 28,252, 20,162, 17,239,138,116, 51,160,215,202, 4, 98,140,
225,226,197,139, 24, 49, 98, 4,250,245,115,246,245, 74, 74, 74,240,197, 23, 95, 96,247,238,221,144, 36,169,218, 96, 48,108,169,
174,174, 62,202, 24, 51, 54,216,201, 0,140, 37, 37, 37, 61, 90,235, 10,127,239,242,239, 41, 8,195,102,194,191,223, 68,136,103,
190,131,120,230, 91, 48,179, 91,203,205, 0, 32,153, 3,217, 18,218,183,127, 74, 91,107, 25, 4,198, 24,107,217, 5, 95,184,112,
1, 79, 61,213, 20, 9, 43, 42, 42,194,231,159,127,142, 3, 7, 14, 64,146, 36, 83,126,126,254,150,218,218,218,147, 13, 81, 17,
158,231,141,146, 36, 25, 43, 43, 43,123, 60, 91,152, 87,248,203,220, 81,240,244, 53,215,132,136,205,231,249,247, 98,112,218, 48,
104,110, 90, 12,205,132, 69,117,249,129, 28, 22,124,182,230, 67, 27, 45, 57,179,121, 76, 31,122,118,100,140,176,179,239,242, 35,
29,158, 77, 32, 16, 66,242,171,171,171, 71,134,133,133,129, 82,138,210,210, 82,136,162,136, 41, 83,166,192, 96, 48,224,223,255,
254, 55,210,210,210, 32,138, 98,229,229,203,151,183,154,205,230,204, 6,231, 16,128, 81,150,101, 99, 85, 85, 85,153,183, 42,196,
27,252,197,205, 43,142, 2, 56,218, 91,249,255,111,104, 2, 15,190, 79,221, 96,215, 57,115,152,188,255,136,120,188,160,160, 96,
91, 85, 85, 85,167, 54,241, 16,236,118,123,106, 73, 73,201,204,254,253,251, 11,148, 82, 92,188,120, 17, 19, 38, 76,192,203, 47,
191,140, 35, 71,142,192,110,183, 87, 24, 12,134,111,107,107,107,179, 8, 33, 37,168, 91,204, 97,228,121,222, 88, 82, 82, 98,244,
118, 61, 40,252,189, 15,147,201, 36,100,100,100,120,243,247,121, 66, 8,149,101,185,243,185, 65, 25, 99, 25,121,121,121,246, 33,
67,134, 8,118,187, 29,121,121,121,200,207,207,135,205,102,107,168,248,179,205, 91,155,102,131, 88,212, 23, 42, 95,225,239,117,
24,139,139,139, 79,173, 90,181,138,183,219,237,209,140, 49, 53, 0, 86,159, 97,143, 53,251,160,254, 60,107, 10,203, 59, 95,115,
119,189,197,189, 90,150,101,178, 44,203,146, 36,149,212,167, 71,236,212, 8, 13, 1,128,105,211,166, 61, 79, 41,125, 11,128,236,
112, 56,106,138,138,138,182,213,214,214,158,227, 56,174,193,198, 44, 97,140, 21,215, 79, 91,144,224, 99, 80,248,251,134, 81,162,
211,233,150, 3,232, 91,175,156, 50,234, 18,214, 74,132, 16,153, 49, 38, 19, 66,164,102,231,104,179,107, 13,231,101, 66,136, 84,
159,228, 86,110,184, 70, 8,145, 41,165, 82,139, 99,185, 33, 35, 52,165, 84,146,101, 89, 98,140, 89,204,102,243,149, 78, 43, 64,
61, 84,225,225,225, 81,140,177, 48,142,227,180, 0,136, 44,203,118,142,227,202,195,195,195, 75, 60, 53, 8,212,141, 80,248,123,
57, 88, 25, 24, 24, 24,205,113,156,154, 16,194, 84, 42, 21, 68, 81,108,108,165, 27, 90,241,230,199,132, 16,218,208,226, 59, 28,
14,167, 30,128, 16,194,154,125, 26,202,194, 98,177, 56,221,131,227, 56, 70, 8, 97,149,149,149,172, 94,233,196,174, 42,128, 2,
5,215,172, 4, 93,181, 4,189, 69,248,255, 3,212, 21,184,121, 66,226, 69,162, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
};

@ -486,8 +486,16 @@ void BIF_InitTheme(void)
/* space imageselect */
btheme->timasel= btheme->tv3d;
SETCOL(btheme->timasel.active, 195, 195, 195, 255); /* active tile */
SETCOL(btheme->timasel.grid, 94, 94, 94, 255); /* active file text */
SETCOL(btheme->timasel.back, 110, 110, 110, 255);
SETCOL(btheme->timasel.shade1, 0xaa, 0xaa, 0xba, 255);
SETCOL(btheme->timasel.header, 195, 195, 195, 255);
SETCOL(btheme->timasel.shade1, 94, 94, 94, 255); /* bar */
SETCOL(btheme->timasel.shade2, 172, 172, 172, 255); /* sliders */
SETCOL(btheme->timasel.hilite, 17, 27, 60, 100); /* selected tile */
SETCOL(btheme->timasel.text, 0, 0, 0, 255);
SETCOL(btheme->timasel.text_hi, 255, 255, 255, 255);
SETCOL(btheme->timasel.panel, 132, 132, 132, 255);
/* space text */
btheme->text= btheme->tv3d;
@ -658,7 +666,12 @@ char *BIF_ThemeColorsPup(int spacetype)
str += sprintf(str, "Panel %%x%d|", TH_PANEL);
break;
case SPACE_IMASEL:
str += sprintf(str, "Main Shade %%x%d|", TH_SHADE1);
str += sprintf(str, "Tiles %%x%d|", TH_PANEL);
str += sprintf(str, "Scrollbar %%x%d|", TH_SHADE1);
str += sprintf(str, "Scroll Handle %%x%d|", TH_SHADE2);
str += sprintf(str, "Selected File %%x%d|", TH_HILITE);
str += sprintf(str, "Active File %%x%d|", TH_ACTIVE);
str += sprintf(str, "Active File Text%%x%d|", TH_GRID);
break;
case SPACE_TEXT:
str += sprintf(str, "Scroll Bar %%x%d|", TH_SHADE1);

@ -110,6 +110,7 @@
#include "BIF_editsima.h"
#include "BIF_editsound.h"
#include "BIF_editview.h"
#include "BIF_filelist.h"
#include "BIF_gl.h"
#include "BIF_imasel.h"
#include "BIF_interface.h"
@ -3673,6 +3674,11 @@ void drawinfospace(ScrArea *sa, void *spacedata)
(xpos+edgsp+(2*mpref)+(3*midsp)),y3,(mpref),buth,
&U.recent_files, 0, 30, 0, 0,
"Maximum number of recently opened files to remember");
uiDefButBitI(block, TOG, USER_SAVE_PREVIEWS, 0, "Save Preview Images",
(xpos+edgsp+(3*mpref)+(4*midsp)),y3,mpref,buth,
&(U.flag), 0, 0, 0, 0,
"Enables automatic saving of preview images in the .blend file");
} else if (U.userpref == 4) { /* system & opengl */
@ -4657,39 +4663,6 @@ static void init_filespace(ScrArea *sa)
sfile->spacetype= SPACE_FILE;
}
static void init_imaselspace(ScrArea *sa)
{
SpaceImaSel *simasel;
simasel= MEM_callocN(sizeof(SpaceImaSel), "initimaselspace");
BLI_addhead(&sa->spacedata, simasel);
simasel->spacetype= SPACE_IMASEL;
simasel->blockscale= 0.7;
simasel->mode = 7;
strcpy (simasel->dir, U.textudir); /* TON */
strcpy (simasel->file, "");
strcpy(simasel->fole, simasel->file);
strcpy(simasel->dor, simasel->dir);
simasel->first_sel_ima = 0;
simasel->hilite_ima = 0;
simasel->firstdir = 0;
simasel->firstfile = 0;
simasel->cmap = 0;
simasel->returnfunc = NULL;
simasel->title[0] = 0;
clear_ima_dir(simasel);
/* simasel->cmap= IMB_loadiffmem((int*)datatoc_cmap_tga, IB_rect|IB_cmap); */
simasel->cmap= IMB_ibImageFromMemory((int *)datatoc_cmap_tga, datatoc_cmap_tga_size, IB_rect|IB_cmap);
if (!simasel->cmap) {
error("in console");
printf("Image select cmap file not found \n");
}
}
/* ******************** SPACE: SOUND ********************** */
@ -5009,9 +4982,61 @@ static void init_imagespace(ScrArea *sa)
extern void drawimaselspace(ScrArea *sa, void *spacedata);
extern void winqreadimaselspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt);
static void changeimaselspace(ScrArea *sa, void *spacedata)
{
if(G.v2d==0) return;
/* everything to imasel.c */
test_view2d(G.v2d, curarea->winx, curarea->winy);
myortho2(G.v2d->cur.xmin, G.v2d->cur.xmax, G.v2d->cur.ymin, G.v2d->cur.ymax);
}
static void init_imaselspace(ScrArea *sa)
{
SpaceImaSel *simasel;
simasel= MEM_callocN(sizeof(SpaceImaSel), "init imaselspace");
BLI_addhead(&sa->spacedata, simasel);
simasel->spacetype= SPACE_IMASEL;
simasel->blockscale= 0.7;
/* view 2D */
simasel->v2d.tot.xmin= -10.0;
simasel->v2d.tot.ymin= -10.0;
simasel->v2d.tot.xmax= (float)sa->winx + 10.0f;
simasel->v2d.tot.ymax= (float)sa->winy + 10.0f;
simasel->v2d.cur.xmin= 0.0;
simasel->v2d.cur.ymin= 0.0;
simasel->v2d.cur.xmax= (float)sa->winx;
simasel->v2d.cur.ymax= (float)sa->winy;
simasel->v2d.min[0]= 1.0;
simasel->v2d.min[1]= 1.0;
simasel->v2d.max[0]= 32000.0f;
simasel->v2d.max[1]= 32000.0f;
simasel->v2d.minzoom= 0.5f;
simasel->v2d.maxzoom= 1.21f;
simasel->v2d.scroll= 0;
simasel->v2d.keepaspect= 1;
simasel->v2d.keepzoom= 1;
simasel->v2d.keeptot= 0;
simasel->prv_h = 96;
simasel->prv_w = 96;
simasel->flag = 7; /* ??? elubie */
strcpy (simasel->dir, U.textudir); /* TON */
strcpy (simasel->file, "");
simasel->returnfunc = 0;
simasel->title[0] = 0;
simasel->type = FILE_UNIX;
simasel->files = BIF_filelist_new();
}
/* ******************** SPACE: OOPS ********************** */
@ -5496,11 +5521,7 @@ void newspace(ScrArea *sa, int type)
scrarea_queue_headredraw(sa);
addqueue(sa->win, CHANGED, 1);
scrarea_queue_winredraw(sa);
areawinset(sa->win);
bwin_clear_viewmat(sa->win);
scrarea_queue_winredraw(sa);
for (sl= sa->spacedata.first; sl; sl= sl->next)
if(sl->spacetype==type)
@ -5546,6 +5567,9 @@ void newspace(ScrArea *sa, int type)
sl= sa->spacedata.first;
sl->area= sa;
}
areawinset(sa->win);
bwin_clear_viewmat(sa->win);
}
}
@ -5567,6 +5591,17 @@ void newspace(ScrArea *sa, int type)
/* exception: imasel space */
else if(sa->spacetype==SPACE_IMASEL) {
SpaceImaSel *simasel= sa->spacedata.first;
if(simasel->type==FILE_MAIN) {
if (simasel->files) {
BIF_filelist_free(simasel->files);
BIF_filelist_settype(simasel->files, FILE_MAIN);
}
} else {
if (simasel->files) {
simasel->type= FILE_UNIX;
BIF_filelist_settype(simasel->files, simasel->type);
}
}
simasel->returnfunc= NULL;
simasel->title[0]= 0;
}
@ -5634,7 +5669,8 @@ void freespacelist(ScrArea *sa)
free_oopspace(so);
}
else if(sl->spacetype==SPACE_IMASEL) {
free_imasel((SpaceImaSel *)sl);
SpaceImaSel *simasel= (SpaceImaSel*) sl;
free_imasel(simasel);
}
else if(sl->spacetype==SPACE_ACTION) {
free_actionspace((SpaceAction*)sl);
@ -5701,11 +5737,13 @@ void duplicatespacelist(ScrArea *newarea, ListBase *lb1, ListBase *lb2)
so->treestore= NULL;
}
else if(sl->spacetype==SPACE_IMASEL) {
check_imasel_copy((SpaceImaSel *) sl);
}
else if(sl->spacetype==SPACE_IMAGE) {
SpaceImage *sima= (SpaceImage *)sl;
sima->spare= NULL;
SpaceImaSel *simasel= (SpaceImaSel*) sl;
simasel->pupmenu= NULL;
simasel->menup= NULL;
simasel->files = BIF_filelist_new();
BIF_filelist_setdir(simasel->files, simasel->dir);
BIF_filelist_settype(simasel->files, simasel->type);
/* see SPACE_FILE - elubie */
}
else if(sl->spacetype==SPACE_NODE) {
SpaceNode *snode= (SpaceNode *)sl;
@ -6177,7 +6215,7 @@ SpaceType *spaceimasel_get_type(void)
if (!st) {
st= spacetype_new("Imasel");
spacetype_set_winfuncs(st, drawimaselspace, NULL, winqreadimaselspace);
spacetype_set_winfuncs(st, drawimaselspace, changeimaselspace, winqreadimaselspace);
}
return st;

@ -73,6 +73,7 @@
#include "BIF_editseq.h"
#include "BIF_editsound.h"
#include "BIF_editmesh.h"
#include "BIF_imasel.h"
#include "BIF_interface.h"
#include "BKE_object.h"
#include "BIF_poseobject.h"
@ -466,6 +467,10 @@ int blenderqread(unsigned short event, short val)
activate_fileselect(FILE_LOADLIB, "Load Library", G.lib, 0);
return 0;
}
else if(G.qual==LR_CTRLKEY) {
activate_imageselect(FILE_LOADLIB, "Load Library", G.lib, 0);
return 0;
}
break;
case F2KEY:
if(G.qual==0) {
@ -506,6 +511,15 @@ int blenderqread(unsigned short event, short val)
activate_fileselect(FILE_MAIN, "Data Select", str, NULL);
return 0;
}
else if(G.qual==LR_CTRLKEY) {
memset(str, 0, 16);
ob= OBACT;
if(ob) strcpy(str, ob->id.name);
activate_imageselect(FILE_MAIN, "Data Select", str, 0);
return 0;
}
else if(G.qual==0) {
extern_set_butspace(event, 1);
}

@ -100,6 +100,7 @@
#include "BIF_editmesh.h"
#include "BIF_editmode_undo.h"
#include "BIF_editsound.h"
#include "BIF_filelist.h"
#include "BIF_poseobject.h"
#include "BIF_previewrender.h"
#include "BIF_renderwin.h"
@ -626,19 +627,19 @@ static void readBlog(void)
tmps[2]='\\';
tmps[3]=0;
fsmenu_insert_entry(tmps, 0);
fsmenu_insert_entry(tmps, 0, 0);
}
}
/* Adding Desktop and My Documents */
fsmenu_append_seperator();
fsmenu_append_separator();
SHGetSpecialFolderPath(0, folder, CSIDL_PERSONAL, 0);
fsmenu_insert_entry(folder, 0);
fsmenu_insert_entry(folder, 0, 0);
SHGetSpecialFolderPath(0, folder, CSIDL_DESKTOPDIRECTORY, 0);
fsmenu_insert_entry(folder, 0);
fsmenu_insert_entry(folder, 0, 0);
fsmenu_append_seperator();
fsmenu_append_separator();
}
#endif
@ -649,16 +650,16 @@ static void readBlog(void)
char *line= l->link;
if (!BLI_streq(line, "")) {
fsmenu_insert_entry(line, 0);
fsmenu_insert_entry(line, 0, 1);
}
}
fsmenu_append_seperator();
fsmenu_append_separator();
/* add last saved file */
BLI_split_dirfile(G.sce, name, filename); /* G.sce shouldn't be relative */
fsmenu_insert_entry(name, 0);
fsmenu_insert_entry(name, 0, 0);
BLI_free_file_lines(lines);
}
@ -884,6 +885,8 @@ void BIF_init(void)
BIF_resources_init(); /* after homefile, to dynamically load an icon file based on theme settings */
BIF_filelist_init_icons();
init_gl_stuff(); /* drawview.c, after homefile */
readBlog();
BLI_strncpy(G.lib, G.sce, FILE_MAX);
@ -965,7 +968,9 @@ void exit_usiblender(void)
if (!G.background) {
BIF_resources_free();
BIF_filelist_free_icons();
BIF_close_render_display();
mainwindow_close();
}