forked from old/legacy-imlib2
db loader/saver needs edb now - much better! :)
SVN revision: 3317
This commit is contained in:
parent
20aa346460
commit
2fe8f410e5
|
@ -52,7 +52,7 @@ tga_la_LIBADD =
|
||||||
|
|
||||||
db_la_SOURCES = loader_db.c
|
db_la_SOURCES = loader_db.c
|
||||||
db_la_LDFLAGS = -no-undefined -module -avoid-version
|
db_la_LDFLAGS = -no-undefined -module -avoid-version
|
||||||
db_la_LIBADD = -ldb -lz
|
db_la_LIBADD = -ledb -ldb -lz
|
||||||
|
|
||||||
#xcf_la_SOURCES = loader_xcf.c loader_xcf_pixelfuncs.c
|
#xcf_la_SOURCES = loader_xcf.c loader_xcf_pixelfuncs.c
|
||||||
#xcf_la_LDFLAGS = -no-undefined -module -avoid-version
|
#xcf_la_LDFLAGS = -no-undefined -module -avoid-version
|
||||||
|
|
|
@ -20,11 +20,10 @@ void formats (ImlibLoader *l);
|
||||||
(((x) & 0x0000ff00 ) << 8) |\
|
(((x) & 0x0000ff00 ) << 8) |\
|
||||||
(((x) & 0x00ff0000 ) >> 8) |\
|
(((x) & 0x00ff0000 ) >> 8) |\
|
||||||
(((x) & 0xff000000 ) >> 24))
|
(((x) & 0xff000000 ) >> 24))
|
||||||
# define DB_DBM_HSEARCH 1
|
#include <Edb.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <db.h>
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <zlib.h>
|
#include <zlib.h>
|
||||||
|
@ -69,10 +68,10 @@ char
|
||||||
load (ImlibImage *im, ImlibProgressFunction progress,
|
load (ImlibImage *im, ImlibProgressFunction progress,
|
||||||
char progress_granularity, char immediate_load)
|
char progress_granularity, char immediate_load)
|
||||||
{
|
{
|
||||||
int w, h, alpha, compression;
|
int w, h, alpha, compression, size;
|
||||||
DBM *db;
|
E_DB_File *db;
|
||||||
char file[4096], key[4096], *ptr;
|
char file[4096], key[4096], *ptr;
|
||||||
datum dkey, ret;
|
DATA32 *ret;
|
||||||
DATA32 *body;
|
DATA32 *body;
|
||||||
|
|
||||||
if (im->data)
|
if (im->data)
|
||||||
|
@ -88,50 +87,31 @@ load (ImlibImage *im, ImlibProgressFunction progress,
|
||||||
*ptr = 0;
|
*ptr = 0;
|
||||||
if (!can_read(file))
|
if (!can_read(file))
|
||||||
return 0;
|
return 0;
|
||||||
flen = strlen(file);
|
|
||||||
strcpy(key, &(ptr[1]));
|
strcpy(key, &(ptr[1]));
|
||||||
if ((flen > 3) &&
|
|
||||||
(file[flen - 3] == '.') &&
|
|
||||||
(file[flen - 2] == 'd') &&
|
|
||||||
(file[flen - 1] == 'b'))
|
|
||||||
file[flen - 3] = 0;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
db = dbm_open(file, O_RDONLY, 0664);
|
db = e_db_open_read(file);
|
||||||
if (!db)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < 32; i++)
|
|
||||||
{
|
|
||||||
usleep((rand() % 0xff) * 1000);
|
|
||||||
db = dbm_open(file, O_RDONLY, 0664);
|
|
||||||
if (db)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!db)
|
if (!db)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
dkey.dptr = key;
|
ret = e_db_data_get(db, key, &size);
|
||||||
dkey.dsize = strlen(key);
|
if (!ret)
|
||||||
ret = dbm_fetch(db, dkey);
|
|
||||||
if (!ret.dptr)
|
|
||||||
{
|
{
|
||||||
dbm_close(db);
|
e_db_close(db);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/* header */
|
/* header */
|
||||||
{
|
{
|
||||||
DATA32 header[8];
|
DATA32 header[8];
|
||||||
|
|
||||||
if (ret.dsize < 32)
|
if (size < 32)
|
||||||
{
|
{
|
||||||
dbm_close(db);
|
free(ret);
|
||||||
|
e_db_close(db);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
memcpy(header, ret.dptr, 32);
|
memcpy(header, ret, 32);
|
||||||
#ifdef WORDS_BIGENDIAN
|
#ifdef WORDS_BIGENDIAN
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -141,7 +121,8 @@ load (ImlibImage *im, ImlibProgressFunction progress,
|
||||||
#endif
|
#endif
|
||||||
if (header[0] != 0xac1dfeed)
|
if (header[0] != 0xac1dfeed)
|
||||||
{
|
{
|
||||||
dbm_close(db);
|
free(ret);
|
||||||
|
e_db_close(db);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
w = header[1];
|
w = header[1];
|
||||||
|
@ -150,12 +131,14 @@ load (ImlibImage *im, ImlibProgressFunction progress,
|
||||||
compression = header[4];
|
compression = header[4];
|
||||||
if ((w > 8192) || (h > 8192))
|
if ((w > 8192) || (h > 8192))
|
||||||
{
|
{
|
||||||
dbm_close(db);
|
free(ret);
|
||||||
|
e_db_close(db);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if ((compression == 0) && (ret.dsize < ((w * h * 4) + 32)))
|
if ((compression == 0) && (size < ((w * h * 4) + 32)))
|
||||||
{
|
{
|
||||||
dbm_close(db);
|
free(ret);
|
||||||
|
e_db_close(db);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
im->w = w;
|
im->w = w;
|
||||||
|
@ -175,12 +158,12 @@ load (ImlibImage *im, ImlibProgressFunction progress,
|
||||||
int y, pl = 0;
|
int y, pl = 0;
|
||||||
char pper = 0;
|
char pper = 0;
|
||||||
|
|
||||||
body = &(((DATA32 *)ret.dptr)[8]);
|
body = &(ret[8]);
|
||||||
/* must set the im->data member before callign progress function */
|
/* must set the im->data member before callign progress function */
|
||||||
ptr = im->data = malloc(w * h * sizeof(DATA32));
|
ptr = im->data = malloc(w * h * sizeof(DATA32));
|
||||||
if (!im->data)
|
if (!im->data)
|
||||||
{
|
{
|
||||||
dbm_close(db);
|
e_db_close(db);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (!compression)
|
if (!compression)
|
||||||
|
@ -211,7 +194,8 @@ load (ImlibImage *im, ImlibProgressFunction progress,
|
||||||
l = y - pl;
|
l = y - pl;
|
||||||
if(!progress(im, per, 0, (y - l), im->w, l))
|
if(!progress(im, per, 0, (y - l), im->w, l))
|
||||||
{
|
{
|
||||||
dbm_close(db);
|
free(ret);
|
||||||
|
e_db_close(db);
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
pper = per;
|
pper = per;
|
||||||
|
@ -226,7 +210,7 @@ load (ImlibImage *im, ImlibProgressFunction progress,
|
||||||
int x;
|
int x;
|
||||||
|
|
||||||
dlen = w * h * sizeof(DATA32);
|
dlen = w * h * sizeof(DATA32);
|
||||||
uncompress(im->data, &dlen, body, ret.dsize - 32);
|
uncompress(im->data, &dlen, body, size - 32);
|
||||||
#ifdef WORDS_BIGENDIAN
|
#ifdef WORDS_BIGENDIAN
|
||||||
for (x = 0; x < (im->w * im->h); x++)
|
for (x = 0; x < (im->w * im->h); x++)
|
||||||
SWAP32(im->data[x]);
|
SWAP32(im->data[x]);
|
||||||
|
@ -235,7 +219,8 @@ load (ImlibImage *im, ImlibProgressFunction progress,
|
||||||
progress(im, 100, 0, 0, im->w, im->h);
|
progress(im, 100, 0, 0, im->w, im->h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dbm_close(db);
|
free(ret);
|
||||||
|
e_db_close(db);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -246,11 +231,10 @@ save (ImlibImage *im, ImlibProgressFunction progress,
|
||||||
int alpha = 0;
|
int alpha = 0;
|
||||||
char file[4096], key[4096], *cp;
|
char file[4096], key[4096], *cp;
|
||||||
DATA32 *header;
|
DATA32 *header;
|
||||||
datum dkey, ret;
|
|
||||||
DATA32 *buf, *buf2;
|
DATA32 *buf, *buf2;
|
||||||
DBM *db;
|
E_DB_File *db;
|
||||||
int compression = 0;
|
int compression = 0, size;
|
||||||
|
DATA32 *ret;
|
||||||
|
|
||||||
|
|
||||||
/* no image data? abort */
|
/* no image data? abort */
|
||||||
|
@ -274,36 +258,15 @@ save (ImlibImage *im, ImlibProgressFunction progress,
|
||||||
if (!can_read(file))
|
if (!can_read(file))
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
flen = strlen(file);
|
|
||||||
strcpy(key, &(cp[1]));
|
strcpy(key, &(cp[1]));
|
||||||
if ((flen > 3) &&
|
|
||||||
(file[flen - 3] == '.') &&
|
|
||||||
(file[flen - 2] == 'd') &&
|
|
||||||
(file[flen - 1] == 'b'))
|
|
||||||
file[flen - 3] = 0;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
db = dbm_open(file, O_RDWR | O_CREAT, 0664);
|
db = e_db_open(file);
|
||||||
if (!db)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < 32; i++)
|
|
||||||
{
|
|
||||||
usleep((rand() % 0xff) * 1000);
|
|
||||||
db = dbm_open(file, O_RDWR | O_CREAT, 0664);
|
|
||||||
if (db)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!db)
|
if (!db)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
dkey.dptr = key;
|
/* account for space for compression */
|
||||||
dkey.dsize = strlen(key);
|
|
||||||
|
|
||||||
/* account for space for xompression */
|
|
||||||
buf = (DATA32 *) malloc((((im->w * im->h * 101) / 100) + 3 + 8) * sizeof(DATA32));
|
buf = (DATA32 *) malloc((((im->w * im->h * 101) / 100) + 3 + 8) * sizeof(DATA32));
|
||||||
header = buf;
|
header = buf;
|
||||||
header[0] = 0xac1dfeed;
|
header[0] = 0xac1dfeed;
|
||||||
|
@ -362,7 +325,7 @@ save (ImlibImage *im, ImlibProgressFunction progress,
|
||||||
if (buflen >= (im->w * im->h * sizeof(DATA32)))
|
if (buflen >= (im->w * im->h * sizeof(DATA32)))
|
||||||
compressed = 0;
|
compressed = 0;
|
||||||
else
|
else
|
||||||
ret.dsize = (8 * sizeof(DATA32)) + buflen;
|
size = (8 * sizeof(DATA32)) + buflen;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (compression == 0)
|
if (compression == 0)
|
||||||
|
@ -374,7 +337,7 @@ save (ImlibImage *im, ImlibProgressFunction progress,
|
||||||
for (y = 0; y < (im->w * im->h) + 8; y++)
|
for (y = 0; y < (im->w * im->h) + 8; y++)
|
||||||
SWAP32(buf[y]);
|
SWAP32(buf[y]);
|
||||||
#endif
|
#endif
|
||||||
ret.dsize = ((im->w * im->h) + 8) * sizeof(DATA32);
|
size = ((im->w * im->h) + 8) * sizeof(DATA32);
|
||||||
}
|
}
|
||||||
#ifdef WORDS_BIGENDIAN
|
#ifdef WORDS_BIGENDIAN
|
||||||
else
|
else
|
||||||
|
@ -384,13 +347,14 @@ save (ImlibImage *im, ImlibProgressFunction progress,
|
||||||
SWAP32(buf2[y]);
|
SWAP32(buf2[y]);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
ret.dptr = buf;
|
ret = buf;
|
||||||
dbm_store(db, dkey, ret, DBM_REPLACE);
|
printf("set data of size %i key %s in db %s\n", size, key, file);
|
||||||
|
e_db_data_set(db, key, ret, size);
|
||||||
free(buf);
|
free(buf);
|
||||||
if (progress)
|
if (progress)
|
||||||
progress(im, 100, 0, 0, im->w, im->h);
|
progress(im, 100, 0, 0, im->w, im->h);
|
||||||
/* finish off */
|
/* finish off */
|
||||||
dbm_close(db);
|
e_db_close(db);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue