diff options
Diffstat (limited to 'source/blender/src/imasel.c')
-rw-r--r-- | source/blender/src/imasel.c | 900 |
1 files changed, 900 insertions, 0 deletions
diff --git a/source/blender/src/imasel.c b/source/blender/src/imasel.c new file mode 100644 index 00000000000..e75fa8eba26 --- /dev/null +++ b/source/blender/src/imasel.c @@ -0,0 +1,900 @@ +/** + * $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 ***** + */ + +#include <stdio.h> +#include <stdlib.h> +#ifndef WIN32 +#include <unistd.h> +#else +#include "BLI_winstuff.h" +#include <io.h> +#include <direct.h> +#endif +#include <fcntl.h> +#include "MEM_guardedalloc.h" + +#include "BLI_blenlib.h" +#include "BLI_arithb.h" +#include "BLI_editVert.h" + +#include "IMB_imbuf_types.h" +#include "IMB_imbuf.h" + +#include "DNA_screen_types.h" +#include "DNA_space_types.h" + +#include "BKE_utildefines.h" +#include "BKE_global.h" + +#include "BIF_imasel.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 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 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); + + 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(ima->dw*ima->dh, ibuf->rect); + + 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 naar 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(size, ibuf->rect); + + 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 (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(size, ima->pict->rect); + } + 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) +{ + + /* LET OP: wordt ook gebruikt bij inlezen blender file */ + /* dingen op nul zetten, opnieuw malloccen 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) +{ + /* NIET de imasel zelf vrijgeven */ + + clear_ima_dir(simasel); + IMB_freeImBuf(simasel->cmap); +} + |