148 lines
3.2 KiB
C++
148 lines
3.2 KiB
C++
#include "lice.h"
|
|
|
|
|
|
|
|
LICE_IBitmap* LICE_LoadImage(const char* filename, LICE_IBitmap* bmp, bool tryIgnoreExtension)
|
|
{
|
|
_LICE_ImageLoader_rec *hdr = LICE_ImageLoader_list;
|
|
while (hdr)
|
|
{
|
|
LICE_IBitmap *ret = hdr->loadfunc(filename,true,bmp);
|
|
if (ret) return ret;
|
|
hdr=hdr->_next;
|
|
}
|
|
if (tryIgnoreExtension)
|
|
{
|
|
hdr = LICE_ImageLoader_list;
|
|
while (hdr)
|
|
{
|
|
LICE_IBitmap *ret = hdr->loadfunc(filename,false,bmp);
|
|
if (ret) return ret;
|
|
hdr=hdr->_next;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
static bool grow_buf(char **buf, int *bufsz, int *wrpos, const char *rd, int len)
|
|
{
|
|
if (*wrpos + len > *bufsz)
|
|
{
|
|
char *nbuf=(char*)realloc(*buf,*bufsz = *wrpos+len+4096);
|
|
if (!nbuf) return true; // ugh
|
|
*buf = nbuf;
|
|
}
|
|
memcpy(*buf+*wrpos,rd,len);
|
|
*wrpos+=len;
|
|
return false;
|
|
}
|
|
|
|
char *LICE_GetImageExtensionList(bool wantAllSup, bool wantAllFiles)
|
|
{
|
|
_LICE_ImageLoader_rec *hdr = LICE_ImageLoader_list;
|
|
int bufsz=4096;
|
|
int wrpos=0;
|
|
char *buf=(char *)malloc(bufsz);
|
|
buf[0]=buf[1]=buf[2]=0;
|
|
|
|
if (wantAllSup)
|
|
{
|
|
static const char af[]="All supported images";
|
|
if (grow_buf(&buf,&bufsz,&wrpos,af,sizeof(af))) { free(buf); return NULL; } // fail
|
|
|
|
int cnt=0;
|
|
while (hdr)
|
|
{
|
|
const char *rd = hdr->get_extlist();
|
|
if (rd && *rd)
|
|
{
|
|
bool st=false;
|
|
const char *p=rd;
|
|
while (*p)
|
|
{
|
|
if (st)
|
|
{
|
|
if (cnt++)
|
|
if (grow_buf(&buf,&bufsz,&wrpos,";",1)) { free(buf); return NULL; } // fail
|
|
if (grow_buf(&buf,&bufsz,&wrpos,p,(int)strlen(p)+1)) { free(buf); return NULL; } // fail
|
|
wrpos--;
|
|
}
|
|
while (*p) p++;
|
|
p++;
|
|
st=!st;
|
|
}
|
|
}
|
|
hdr=hdr->_next;
|
|
}
|
|
|
|
if (!cnt)
|
|
{
|
|
wrpos=0; // reset if nothing meaningful added
|
|
buf[0]=buf[1]=buf[2]=0;
|
|
}
|
|
else wrpos++;
|
|
|
|
hdr = LICE_ImageLoader_list;
|
|
}
|
|
|
|
while (hdr)
|
|
{
|
|
const char *rd = hdr->get_extlist();
|
|
if (rd && *rd)
|
|
{
|
|
int len = 0;
|
|
while (rd[len] || rd[len+1]) len++; // doublenull terminated list
|
|
|
|
if (len)
|
|
{
|
|
if (grow_buf(&buf, &bufsz, &wrpos, rd, len+2)) return buf; // fail
|
|
wrpos--; // remove doublenull on next round
|
|
}
|
|
}
|
|
hdr=hdr->_next;
|
|
}
|
|
if (wantAllFiles)
|
|
{
|
|
static const char af[]="All files (*.*)\0*.*\0";
|
|
if (grow_buf(&buf,&bufsz,&wrpos,af,sizeof(af))) return buf; // fail
|
|
wrpos--;
|
|
}
|
|
|
|
return buf;
|
|
}
|
|
|
|
bool LICE_ImageIsSupported(const char *filename)
|
|
{
|
|
const char *extension = filename;
|
|
while (*extension)extension++;
|
|
while (extension>=filename && *extension != '/' && *extension != '.' && *extension != '\\') extension--;
|
|
if (extension<filename || *extension != '.') return false;
|
|
|
|
const size_t extlen = strlen(extension);
|
|
|
|
_LICE_ImageLoader_rec *hdr = LICE_ImageLoader_list;
|
|
while (hdr)
|
|
{
|
|
const char *el = hdr->get_extlist();
|
|
if (el)
|
|
{
|
|
while (*el) el++; // skip desc
|
|
++el;
|
|
|
|
// scan rest of buffer
|
|
while (*el)
|
|
{
|
|
if (!strnicmp(el,extension,extlen))
|
|
{
|
|
if (el[extlen] == 0|| el[extlen] == ';') return true;
|
|
}
|
|
el++;
|
|
}
|
|
}
|
|
hdr=hdr->_next;
|
|
}
|
|
return false;
|
|
}
|