loading: Introduce __imlib_ImageFileContextPush/Pop()
Makes dealing with nested file contexts much easier.
This commit is contained in:
parent
5b357a815b
commit
e55208f4d6
|
@ -114,6 +114,13 @@ unsigned int __imlib_time_us(void);
|
|||
#define LOAD_BADIMAGE -3 /* Image is corrupt */
|
||||
#define LOAD_BADFRAME -4 /* Requested frame not found */
|
||||
|
||||
typedef struct _ImlibImageFileInfo {
|
||||
struct _ImlibImageFileInfo *next;
|
||||
char *name;
|
||||
FILE *fp;
|
||||
off_t fsize;
|
||||
} ImlibImageFileInfo;
|
||||
|
||||
typedef struct _imlibldctx ImlibLdCtx;
|
||||
|
||||
typedef struct _ImlibImageTag {
|
||||
|
@ -125,10 +132,7 @@ typedef struct _ImlibImageTag {
|
|||
} ImlibImageTag;
|
||||
|
||||
struct _ImlibImage {
|
||||
char *real_file;
|
||||
FILE *fp;
|
||||
off_t fsize;
|
||||
|
||||
ImlibImageFileInfo *fi;
|
||||
ImlibLdCtx *lc;
|
||||
|
||||
int w, h;
|
||||
|
|
158
src/lib/image.c
158
src/lib/image.c
|
@ -74,6 +74,77 @@ __imlib_ReplaceData(ImlibImage * im, unsigned int *new_data)
|
|||
im->data_memory_func = NULL;
|
||||
}
|
||||
|
||||
static int
|
||||
__imlib_FileContextOpen(ImlibImageFileInfo * fi, FILE * fp, off_t fsize)
|
||||
{
|
||||
struct stat st;
|
||||
|
||||
if (fp)
|
||||
{
|
||||
fi->keep_fp = true;
|
||||
fi->fp = fp;
|
||||
}
|
||||
else
|
||||
{
|
||||
fi->fp = fopen(fi->name, "rb");
|
||||
if (!fi->fp)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (fi->fsize == 0)
|
||||
{
|
||||
if (fsize == 0)
|
||||
{
|
||||
__imlib_FileStat(fi->name, &st);
|
||||
fsize = st.st_size;
|
||||
}
|
||||
fi->fsize = fsize;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
__imlib_FileContextClose(ImlibImageFileInfo * fi)
|
||||
{
|
||||
if (!fi->keep_fp)
|
||||
{
|
||||
if (fi->fp)
|
||||
{
|
||||
fclose(fi->fp);
|
||||
fi->fp = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
__imlib_ImageFileContextPush(ImlibImage * im, bool load, char *file)
|
||||
{
|
||||
ImlibImageFileInfo *fi;
|
||||
|
||||
fi = calloc(1, sizeof(ImlibImageFileInfo));
|
||||
if (!fi)
|
||||
return -1;
|
||||
|
||||
fi->name = file; /* file must have been alloced, will be freed */
|
||||
|
||||
fi->next = im->fi;
|
||||
im->fi = fi;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
__imlib_ImageFileContextPop(ImlibImage * im)
|
||||
{
|
||||
ImlibImageFileInfo *fi = im->fi;
|
||||
|
||||
im->fi = fi->next;
|
||||
|
||||
free(fi->name);
|
||||
free(fi);
|
||||
}
|
||||
|
||||
/* create an image data struct and fill it in */
|
||||
static ImlibImage *
|
||||
__imlib_ProduceImage(void)
|
||||
|
@ -96,14 +167,16 @@ __imlib_ConsumeImage(ImlibImage * im)
|
|||
|
||||
__imlib_FreeAllTags(im);
|
||||
|
||||
if (im->real_file && im->real_file != im->file)
|
||||
free(im->real_file);
|
||||
free(im->file);
|
||||
if (im->fi && im->fi->name && im->fi->name != im->file)
|
||||
free(im->file);
|
||||
free(im->key);
|
||||
if (im->data && !IM_FLAG_ISSET(im, F_DONT_FREE_DATA))
|
||||
__imlib_FreeData(im);
|
||||
free(im->format);
|
||||
|
||||
if (im->fi)
|
||||
__imlib_ImageFileContextPop(im);
|
||||
|
||||
free(im);
|
||||
}
|
||||
|
||||
|
@ -127,7 +200,7 @@ __imlib_FindCachedImage(const char *file, int frame)
|
|||
im->next = images;
|
||||
images = im;
|
||||
}
|
||||
DP(" got %p: '%s' frame %d\n", im, im->real_file, im->frame_num);
|
||||
DP(" got %p: '%s' frame %d\n", im, im->fi->name, im->frame_num);
|
||||
return im;
|
||||
}
|
||||
}
|
||||
|
@ -139,7 +212,7 @@ __imlib_FindCachedImage(const char *file, int frame)
|
|||
static void
|
||||
__imlib_AddImageToCache(ImlibImage * im)
|
||||
{
|
||||
DP("%s: %p: '%s' frame %d\n", __func__, im, im->real_file, im->frame_num);
|
||||
DP("%s: %p: '%s' frame %d\n", __func__, im, im->fi->name, im->frame_num);
|
||||
im->next = images;
|
||||
images = im;
|
||||
}
|
||||
|
@ -151,7 +224,7 @@ __imlib_RemoveImageFromCache(ImlibImage * im_del)
|
|||
ImlibImage *im, *im_prev;
|
||||
|
||||
im = im_del;
|
||||
DP("%s: %p: '%s' frame %d\n", __func__, im, im->real_file, im->frame_num);
|
||||
DP("%s: %p: '%s' frame %d\n", __func__, im, im->fi->name, im->frame_num);
|
||||
|
||||
for (im = images, im_prev = NULL; im; im_prev = im, im = im->next)
|
||||
{
|
||||
|
@ -278,7 +351,7 @@ __imlib_LoadImageWrapper(const ImlibLoader * l, ImlibImage * im, int load_data)
|
|||
int rc;
|
||||
|
||||
DP("%s: fmt='%s' file='%s'(%s), imm=%d\n", __func__,
|
||||
l->name, im->file, im->real_file, load_data);
|
||||
l->name, im->file, im->fi->name, load_data);
|
||||
|
||||
#if IMLIB2_DEBUG
|
||||
unsigned int t0 = __imlib_time_us();
|
||||
|
@ -286,22 +359,10 @@ __imlib_LoadImageWrapper(const ImlibLoader * l, ImlibImage * im, int load_data)
|
|||
|
||||
if (l->module->load)
|
||||
{
|
||||
FILE *fp = NULL;
|
||||
|
||||
if (!im->fp)
|
||||
{
|
||||
fp = im->fp = fopen(im->real_file, "rb");
|
||||
if (!im->fp)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!im->format)
|
||||
im->format = strdup(l->name);
|
||||
|
||||
rc = l->module->load(im, load_data);
|
||||
|
||||
if (fp)
|
||||
fclose(fp);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -309,7 +370,7 @@ __imlib_LoadImageWrapper(const ImlibLoader * l, ImlibImage * im, int load_data)
|
|||
}
|
||||
|
||||
DP("%s: %-4s: %s: Elapsed time: %.3f ms\n", __func__,
|
||||
l->name, im->file, 1e-3 * (__imlib_time_us() - t0));
|
||||
l->name, im->fi->name, 1e-3 * (__imlib_time_us() - t0));
|
||||
|
||||
if (rc <= LOAD_FAIL)
|
||||
{
|
||||
|
@ -389,7 +450,7 @@ __imlib_LoadImage(const char *file, ImlibLoadArgs * ila)
|
|||
|
||||
current_modified_time = ila->fp ?
|
||||
__imlib_FileModDateFd(fileno(ila->fp)) :
|
||||
__imlib_FileModDate(im->real_file);
|
||||
__imlib_FileModDate(im->fi->name);
|
||||
/* if the file on disk is newer than the cached one */
|
||||
if (current_modified_time != im->moddate)
|
||||
{
|
||||
|
@ -450,17 +511,11 @@ __imlib_LoadImage(const char *file, ImlibLoadArgs * ila)
|
|||
/* so produce a new one and load an image into that */
|
||||
im = __imlib_ProduceImage();
|
||||
im->file = strdup(file);
|
||||
im->fsize = st.st_size;
|
||||
im->real_file = im_file ? im_file : im->file;
|
||||
im->key = im_key;
|
||||
im->frame_num = ila->frame;
|
||||
|
||||
if (ila->fp)
|
||||
im->fp = ila->fp;
|
||||
else
|
||||
im->fp = fopen(im->real_file, "rb");
|
||||
|
||||
if (!im->fp)
|
||||
if (__imlib_ImageFileContextPush(im, true, im_file ? im_file : im->file) ||
|
||||
__imlib_FileContextOpen(im->fi, ila->fp, st.st_size))
|
||||
{
|
||||
ila->err = errno;
|
||||
__imlib_ConsumeImage(im);
|
||||
|
@ -478,7 +533,7 @@ __imlib_LoadImage(const char *file, ImlibLoadArgs * ila)
|
|||
}
|
||||
|
||||
/* take a guess by extension on the best loader to use */
|
||||
best_loader = __imlib_FindBestLoader(im->real_file, NULL, 0);
|
||||
best_loader = __imlib_FindBestLoader(im->fi->name, NULL, 0);
|
||||
|
||||
loader_ret = LOAD_FAIL;
|
||||
loaders = NULL;
|
||||
|
@ -527,8 +582,8 @@ __imlib_LoadImage(const char *file, ImlibLoadArgs * ila)
|
|||
|
||||
case LOAD_FAIL:
|
||||
/* Image was not recognized by loader - try next */
|
||||
fflush(im->fp);
|
||||
rewind(im->fp);
|
||||
fflush(im->fi->fp);
|
||||
rewind(im->fi->fp);
|
||||
continue;
|
||||
|
||||
default: /* We should not go here */
|
||||
|
@ -548,8 +603,7 @@ __imlib_LoadImage(const char *file, ImlibLoadArgs * ila)
|
|||
im->lc = NULL;
|
||||
|
||||
if (!ila->fp)
|
||||
fclose(im->fp);
|
||||
im->fp = NULL;
|
||||
__imlib_FileContextClose(im->fi);
|
||||
|
||||
if (loader_ret <= LOAD_FAIL)
|
||||
{
|
||||
|
@ -585,8 +639,13 @@ __imlib_LoadImageData(ImlibImage * im)
|
|||
if (!im->loader)
|
||||
return IMLIB_ERR_INTERNAL;
|
||||
|
||||
err = __imlib_FileContextOpen(im->fi, NULL, 0);
|
||||
if (err)
|
||||
return err;
|
||||
err = __imlib_LoadImageWrapper(im->loader, im, 1);
|
||||
|
||||
__imlib_FileContextClose(im->fi);
|
||||
|
||||
return __imlib_LoadErrorToErrno(err, 0);
|
||||
}
|
||||
|
||||
|
@ -595,29 +654,19 @@ __imlib_LoadEmbedded(ImlibLoader * l, ImlibImage * im, const char *file,
|
|||
int load_data)
|
||||
{
|
||||
int rc;
|
||||
struct stat st;
|
||||
char *file_save;
|
||||
FILE *fp_save;
|
||||
off_t fsize_save;
|
||||
|
||||
if (!l || !im)
|
||||
return 0;
|
||||
|
||||
/* remember the original filename */
|
||||
file_save = im->real_file;
|
||||
im->real_file = strdup(file);
|
||||
fp_save = im->fp;
|
||||
im->fp = NULL;
|
||||
fsize_save = im->fsize;
|
||||
__imlib_FileStat(file, &st);
|
||||
im->fsize = st.st_size;
|
||||
__imlib_ImageFileContextPush(im, true, strdup(file));
|
||||
rc = __imlib_FileContextOpen(im->fi, NULL, 0);
|
||||
if (rc)
|
||||
return LOAD_FAIL;
|
||||
|
||||
rc = __imlib_LoadImageWrapper(l, im, load_data);
|
||||
|
||||
im->fp = fp_save;
|
||||
free(im->real_file);
|
||||
im->real_file = file_save;
|
||||
im->fsize = fsize_save;
|
||||
__imlib_FileContextClose(im->fi);
|
||||
__imlib_ImageFileContextPop(im);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
@ -720,7 +769,6 @@ void
|
|||
__imlib_SaveImage(ImlibImage * im, const char *file, ImlibLoadArgs * ila)
|
||||
{
|
||||
ImlibLoader *l;
|
||||
char *pfile;
|
||||
ImlibLdCtx ilc;
|
||||
int loader_ret;
|
||||
|
||||
|
@ -742,16 +790,12 @@ __imlib_SaveImage(ImlibImage * im, const char *file, ImlibLoadArgs * ila)
|
|||
if (ila->pfunc)
|
||||
__imlib_LoadCtxInit(im, &ilc, ila->pfunc, ila->pgran);
|
||||
|
||||
/* set the filename to the user supplied one */
|
||||
pfile = im->real_file;
|
||||
im->real_file = strdup(file);
|
||||
__imlib_ImageFileContextPush(im, false, strdup(file));
|
||||
|
||||
/* call the saver */
|
||||
loader_ret = l->module->save(im);
|
||||
|
||||
/* set the filename back to the laoder image filename */
|
||||
free(im->real_file);
|
||||
im->real_file = pfile;
|
||||
__imlib_ImageFileContextPop(im);
|
||||
|
||||
im->lc = NULL;
|
||||
|
||||
|
|
|
@ -7,8 +7,6 @@
|
|||
|
||||
#include "types.h"
|
||||
|
||||
typedef struct _imlibldctx ImlibLdCtx;
|
||||
|
||||
typedef void (*ImlibDataDestructorFunction)(ImlibImage * im, void *data);
|
||||
typedef void *(*ImlibImageDataMemoryFunction)(void *, size_t size);
|
||||
|
||||
|
@ -28,6 +26,18 @@ typedef int (*ImlibProgressFunction)(ImlibImage * im, char percent,
|
|||
#define FF_FRAME_DISPOSE_CLEAR (1 << 2) /* Clear before rendering next frame */
|
||||
#define FF_FRAME_DISPOSE_PREV (1 << 3) /* Revert before rendering next frame */
|
||||
|
||||
typedef struct _ImlibImageFileInfo {
|
||||
struct _ImlibImageFileInfo *next;
|
||||
char *name;
|
||||
FILE *fp;
|
||||
off_t fsize;
|
||||
/* vvv Private vvv */
|
||||
char keep_fp;
|
||||
/* ^^^ Private ^^^ */
|
||||
} ImlibImageFileInfo;
|
||||
|
||||
typedef struct _imlibldctx ImlibLdCtx;
|
||||
|
||||
typedef struct {
|
||||
int left, right, top, bottom;
|
||||
} ImlibBorder;
|
||||
|
@ -41,10 +51,7 @@ typedef struct _ImlibImageTag {
|
|||
} ImlibImageTag;
|
||||
|
||||
struct _ImlibImage {
|
||||
char *real_file;
|
||||
FILE *fp;
|
||||
off_t fsize;
|
||||
|
||||
ImlibImageFileInfo *fi;
|
||||
ImlibLdCtx *lc;
|
||||
|
||||
int w, h;
|
||||
|
|
|
@ -17,7 +17,7 @@ decompress_load(ImlibImage * im, int load_data, const char *const *pext,
|
|||
|
||||
/* make sure this file ends in a known name and that there's another ext
|
||||
* (e.g. "foo.png.bz2") */
|
||||
for (p = s = im->real_file, q = NULL; *s; s++)
|
||||
for (p = s = im->fi->name, q = NULL; *s; s++)
|
||||
{
|
||||
if (*s != '.' && *s != '/')
|
||||
continue;
|
||||
|
@ -47,14 +47,15 @@ decompress_load(ImlibImage * im, int load_data, const char *const *pext,
|
|||
if (!loader)
|
||||
return rc;
|
||||
|
||||
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
|
||||
fdata =
|
||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
||||
if (fdata == MAP_FAILED)
|
||||
return LOAD_BADFILE;
|
||||
|
||||
if ((dest = mkstemp(tmp)) < 0)
|
||||
QUIT_WITH_RC(LOAD_OOM);
|
||||
|
||||
res = fdec(fdata, im->fsize, dest);
|
||||
res = fdec(fdata, im->fi->fsize, dest);
|
||||
|
||||
close(dest);
|
||||
|
||||
|
@ -64,7 +65,7 @@ decompress_load(ImlibImage * im, int load_data, const char *const *pext,
|
|||
unlink(tmp);
|
||||
|
||||
quit:
|
||||
munmap(fdata, im->fsize);
|
||||
munmap(fdata, im->fi->fsize);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
|
|
@ -50,16 +50,17 @@ _load(ImlibImage * im, int load_data)
|
|||
|
||||
rc = LOAD_FAIL;
|
||||
|
||||
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
|
||||
fdata =
|
||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
||||
if (fdata == MAP_FAILED)
|
||||
return LOAD_BADFILE;
|
||||
|
||||
mm_init(fdata, im->fsize);
|
||||
mm_init(fdata, im->fi->fsize);
|
||||
|
||||
/* header */
|
||||
|
||||
fptr = fdata;
|
||||
size = im->fsize > 31 ? 31 : im->fsize; /* Look for \n in at most 31 byte */
|
||||
size = im->fi->fsize > 31 ? 31 : im->fi->fsize; /* Look for \n in at most 31 byte */
|
||||
row = memchr(fptr, '\n', size);
|
||||
if (!row)
|
||||
goto quit;
|
||||
|
@ -107,7 +108,7 @@ _load(ImlibImage * im, int load_data)
|
|||
rc = LOAD_SUCCESS;
|
||||
|
||||
quit:
|
||||
munmap(fdata, im->fsize);
|
||||
munmap(fdata, im->fi->fsize);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
@ -120,7 +121,7 @@ _save(ImlibImage * im)
|
|||
uint32_t *ptr;
|
||||
int y, alpha = 0;
|
||||
|
||||
f = fopen(im->real_file, "wb");
|
||||
f = fopen(im->fi->name, "wb");
|
||||
if (!f)
|
||||
return LOAD_FAIL;
|
||||
|
||||
|
|
|
@ -179,12 +179,13 @@ _load(ImlibImage * im, int load_data)
|
|||
|
||||
rc = LOAD_FAIL;
|
||||
|
||||
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
|
||||
fdata =
|
||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
||||
if (fdata == MAP_FAILED)
|
||||
return LOAD_BADFILE;
|
||||
|
||||
fptr = fdata;
|
||||
mm_init(fdata, im->fsize);
|
||||
mm_init(fdata, im->fi->fsize);
|
||||
|
||||
/* Load header */
|
||||
|
||||
|
@ -194,7 +195,7 @@ _load(ImlibImage * im, int load_data)
|
|||
if (bfh.header[0] != 'B' || bfh.header[1] != 'M')
|
||||
goto quit;
|
||||
|
||||
size = im->fsize;
|
||||
size = im->fi->fsize;
|
||||
#define WORD_LE_32(p8) (((p8)[3] << 24) | ((p8)[2] << 16) | ((p8)[1] << 8) | (p8)[0])
|
||||
bfh_offset = WORD_LE_32(bfh.offs);
|
||||
|
||||
|
@ -759,7 +760,7 @@ _load(ImlibImage * im, int load_data)
|
|||
rc = LOAD_SUCCESS;
|
||||
|
||||
quit:
|
||||
munmap(fdata, im->fsize);
|
||||
munmap(fdata, im->fi->fsize);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
@ -772,7 +773,7 @@ _save(ImlibImage * im)
|
|||
int i, j, pad;
|
||||
uint32_t pixel;
|
||||
|
||||
f = fopen(im->real_file, "wb");
|
||||
f = fopen(im->fi->name, "wb");
|
||||
if (!f)
|
||||
return LOAD_FAIL;
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
static const char *const _formats[] = { "ff" };
|
||||
|
||||
#define mm_check(p) ((const char *)(p) <= (const char *)fdata + im->fsize)
|
||||
#define mm_check(p) ((const char *)(p) <= (const char *)fdata + im->fi->fsize)
|
||||
|
||||
typedef struct {
|
||||
unsigned char magic[8];
|
||||
|
@ -25,10 +25,11 @@ _load(ImlibImage * im, int load_data)
|
|||
|
||||
rc = LOAD_FAIL;
|
||||
|
||||
if (im->fsize < (long)sizeof(ff_hdr_t))
|
||||
if (im->fi->fsize < (long)sizeof(ff_hdr_t))
|
||||
return rc;
|
||||
|
||||
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
|
||||
fdata =
|
||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
||||
if (fdata == MAP_FAILED)
|
||||
return LOAD_BADFILE;
|
||||
|
||||
|
@ -82,7 +83,7 @@ _load(ImlibImage * im, int load_data)
|
|||
rc = LOAD_SUCCESS;
|
||||
|
||||
quit:
|
||||
munmap(fdata, im->fsize);
|
||||
munmap(fdata, im->fi->fsize);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
@ -97,7 +98,7 @@ _save(ImlibImage * im)
|
|||
uint16_t *row;
|
||||
uint8_t *dat;
|
||||
|
||||
f = fopen(im->real_file, "wb");
|
||||
f = fopen(im->fi->name, "wb");
|
||||
if (!f)
|
||||
return LOAD_FAIL;
|
||||
|
||||
|
|
|
@ -68,14 +68,15 @@ _load(ImlibImage * im, int load_data)
|
|||
uint32_t colormap[256];
|
||||
int fcount, frame, multiframe;
|
||||
|
||||
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
|
||||
fdata =
|
||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
||||
if (fdata == MAP_FAILED)
|
||||
return LOAD_BADFILE;
|
||||
|
||||
rc = LOAD_FAIL;
|
||||
rows = NULL;
|
||||
|
||||
mm_init(fdata, im->fsize);
|
||||
mm_init(fdata, im->fi->fsize);
|
||||
|
||||
#if GIFLIB_MAJOR >= 5
|
||||
gif = DGifOpen(NULL, mm_read, &err);
|
||||
|
@ -301,7 +302,7 @@ _load(ImlibImage * im, int load_data)
|
|||
DGifCloseFile(gif);
|
||||
#endif
|
||||
|
||||
munmap(fdata, im->fsize);
|
||||
munmap(fdata, im->fi->fsize);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
|
|
@ -36,15 +36,16 @@ _load(ImlibImage * im, int load_data)
|
|||
rc = LOAD_FAIL;
|
||||
|
||||
/* input data needs to be atleast 12 bytes */
|
||||
if (im->fsize < HEIF_BYTES_TO_CHECK)
|
||||
if (im->fi->fsize < HEIF_BYTES_TO_CHECK)
|
||||
return rc;
|
||||
|
||||
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
|
||||
fdata =
|
||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
||||
if (fdata == MAP_FAILED)
|
||||
return LOAD_BADFILE;
|
||||
|
||||
/* check signature */
|
||||
switch (heif_check_filetype(fdata, im->fsize))
|
||||
switch (heif_check_filetype(fdata, im->fi->fsize))
|
||||
{
|
||||
case heif_filetype_no:
|
||||
case heif_filetype_yes_unsupported:
|
||||
|
@ -62,7 +63,7 @@ _load(ImlibImage * im, int load_data)
|
|||
goto quit;
|
||||
|
||||
error = heif_context_read_from_memory_without_copy(ctx, fdata,
|
||||
im->fsize, NULL);
|
||||
im->fi->fsize, NULL);
|
||||
if (error.code != heif_error_Ok)
|
||||
goto quit;
|
||||
|
||||
|
@ -155,7 +156,7 @@ _load(ImlibImage * im, int load_data)
|
|||
heif_context_free(ctx);
|
||||
heif_decoding_options_free(decode_opts);
|
||||
|
||||
munmap(fdata, im->fsize);
|
||||
munmap(fdata, im->fi->fsize);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
|
|
@ -402,11 +402,12 @@ _load(ImlibImage * im, int load_data)
|
|||
|
||||
rc = LOAD_FAIL;
|
||||
|
||||
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
|
||||
fdata =
|
||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
||||
if (fdata == MAP_FAILED)
|
||||
return LOAD_BADFILE;
|
||||
|
||||
mm_init(fdata, im->fsize);
|
||||
mm_init(fdata, im->fi->fsize);
|
||||
|
||||
ico.ie = NULL;
|
||||
if (mm_read(&ico.idir, sizeof(ico.idir)))
|
||||
|
@ -424,7 +425,7 @@ _load(ImlibImage * im, int load_data)
|
|||
if (!ico.ie)
|
||||
QUIT_WITH_RC(LOAD_OOM);
|
||||
|
||||
D("Loading '%s' Nicons = %d\n", im->real_file, ico.idir.icons);
|
||||
D("Loading '%s' Nicons = %d\n", im->fi->name, ico.idir.icons);
|
||||
|
||||
for (i = 0; i < ico.idir.icons; i++)
|
||||
{
|
||||
|
@ -443,7 +444,8 @@ _load(ImlibImage * im, int load_data)
|
|||
|
||||
quit:
|
||||
ico_delete(&ico);
|
||||
munmap(fdata, im->fsize);
|
||||
munmap(fdata, im->fi->fsize);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
|
@ -287,8 +287,8 @@ get_options(lopt * opt, const ImlibImage * im)
|
|||
}
|
||||
if (handle)
|
||||
ctx = context_get(handle);
|
||||
else if (!(ctx = context_get_by_name(im->real_file)) &&
|
||||
!(ctx = context_create(im->real_file, im->fp)))
|
||||
else if (!(ctx = context_get_by_name(im->fi->name)) &&
|
||||
!(ctx = context_create(im->fi->name, im->fi->fp)))
|
||||
return 0;
|
||||
|
||||
if (!index)
|
||||
|
@ -481,8 +481,8 @@ write_tags(ImlibImage * im, lopt * opt)
|
|||
<= id3_tag_get_numframes(opt->ctx->tag)
|
||||
&& (opt->index + opt->traverse) > 0)
|
||||
{
|
||||
buf = (char *)malloc((strlen(im->real_file) + 50) * sizeof(char));
|
||||
sprintf(buf, "%s:index=%d,traverse=%d", im->real_file,
|
||||
buf = (char *)malloc((strlen(im->fi->name) + 50) * sizeof(char));
|
||||
sprintf(buf, "%s:index=%d,traverse=%d", im->fi->name,
|
||||
opt->index + opt->traverse, opt->traverse);
|
||||
}
|
||||
__imlib_AttachTag(im, "next", 0, buf, destructor_data);
|
||||
|
|
|
@ -108,7 +108,8 @@ _load(ImlibImage * im, int load_data)
|
|||
OPJ_INT32 *pa, *pr, *pg, *pb;
|
||||
unsigned char a, r, g, b;
|
||||
|
||||
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
|
||||
fdata =
|
||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
||||
if (fdata == MAP_FAILED)
|
||||
return LOAD_BADFILE;
|
||||
|
||||
|
@ -118,7 +119,7 @@ _load(ImlibImage * im, int load_data)
|
|||
jimage = NULL;
|
||||
|
||||
/* Signature check */
|
||||
if (im->fsize < 12)
|
||||
if (im->fi->fsize < 12)
|
||||
goto quit;
|
||||
|
||||
if (memcmp(fdata, JP2_MAGIC, 4) == 0 ||
|
||||
|
@ -155,8 +156,7 @@ _load(ImlibImage * im, int load_data)
|
|||
|
||||
if (getenv("JP2_USE_FILE"))
|
||||
{
|
||||
jstream =
|
||||
opj_stream_create_default_file_stream(im->real_file, OPJ_TRUE);
|
||||
jstream = opj_stream_create_default_file_stream(im->fi->name, OPJ_TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -164,9 +164,9 @@ _load(ImlibImage * im, int load_data)
|
|||
if (!jstream)
|
||||
goto quit;
|
||||
|
||||
mm_init(fdata, im->fsize);
|
||||
mm_init(fdata, im->fi->fsize);
|
||||
opj_stream_set_user_data(jstream, &mdata, NULL);
|
||||
opj_stream_set_user_data_length(jstream, im->fsize);
|
||||
opj_stream_set_user_data_length(jstream, im->fi->fsize);
|
||||
opj_stream_set_read_function(jstream, mm_read);
|
||||
opj_stream_set_skip_function(jstream, mm_seek_cur);
|
||||
opj_stream_set_seek_function(jstream, mm_seek_set);
|
||||
|
@ -275,7 +275,7 @@ _load(ImlibImage * im, int load_data)
|
|||
opj_stream_destroy(jstream);
|
||||
if (jcodec)
|
||||
opj_destroy_codec(jcodec);
|
||||
munmap(fdata, im->fsize);
|
||||
munmap(fdata, im->fi->fsize);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
|
|
@ -78,7 +78,8 @@ _load(ImlibImage * im, int load_data)
|
|||
|
||||
rc = LOAD_FAIL;
|
||||
|
||||
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
|
||||
fdata =
|
||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
||||
if (fdata == MAP_FAILED)
|
||||
return rc;
|
||||
|
||||
|
@ -88,7 +89,7 @@ _load(ImlibImage * im, int load_data)
|
|||
QUIT_WITH_RC(LOAD_FAIL);
|
||||
|
||||
jpeg_create_decompress(&jds);
|
||||
jpeg_mem_src(&jds, fdata, im->fsize);
|
||||
jpeg_mem_src(&jds, fdata, im->fi->fsize);
|
||||
jpeg_save_markers(&jds, JPEG_APP0 + 1, 256);
|
||||
jpeg_read_header(&jds, TRUE);
|
||||
|
||||
|
@ -251,7 +252,7 @@ _load(ImlibImage * im, int load_data)
|
|||
quit:
|
||||
jpeg_destroy_decompress(&jds);
|
||||
free(jdata.data);
|
||||
munmap(fdata, im->fsize);
|
||||
munmap(fdata, im->fi->fsize);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
@ -277,7 +278,7 @@ _save(ImlibImage * im)
|
|||
|
||||
rc = LOAD_FAIL;
|
||||
|
||||
f = fopen(im->real_file, "wb");
|
||||
f = fopen(im->fi->name, "wb");
|
||||
if (!f)
|
||||
goto quit;
|
||||
|
||||
|
|
|
@ -55,7 +55,8 @@ _load(ImlibImage * im, int load_data)
|
|||
JxlParallelRunner *runner = NULL;
|
||||
#endif
|
||||
|
||||
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
|
||||
fdata =
|
||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
||||
if (fdata == MAP_FAILED)
|
||||
return LOAD_BADFILE;
|
||||
|
||||
|
@ -100,7 +101,7 @@ _load(ImlibImage * im, int load_data)
|
|||
if (jst != JXL_DEC_SUCCESS)
|
||||
goto quit;
|
||||
|
||||
jst = JxlDecoderSetInput(dec, fdata, im->fsize);
|
||||
jst = JxlDecoderSetInput(dec, fdata, im->fi->fsize);
|
||||
if (jst != JXL_DEC_SUCCESS)
|
||||
goto quit;
|
||||
|
||||
|
@ -213,7 +214,7 @@ _load(ImlibImage * im, int load_data)
|
|||
#endif
|
||||
if (dec)
|
||||
JxlDecoderDestroy(dec);
|
||||
munmap(fdata, im->fsize);
|
||||
munmap(fdata, im->fi->fsize);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
|
|
@ -451,7 +451,8 @@ _load(ImlibImage * im, int load_data)
|
|||
|
||||
rc = LOAD_FAIL;
|
||||
|
||||
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
|
||||
fdata =
|
||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
||||
if (fdata == MAP_FAILED)
|
||||
return LOAD_BADFILE;
|
||||
|
||||
|
@ -462,7 +463,7 @@ _load(ImlibImage * im, int load_data)
|
|||
* Load the chunk(s) we're interested in. If load_data is not true, then we only
|
||||
* want the image size and format.
|
||||
*----------*/
|
||||
if (!loadchunks(fdata, im->fsize, &ilbm, load_data))
|
||||
if (!loadchunks(fdata, im->fi->fsize, &ilbm, load_data))
|
||||
goto quit;
|
||||
|
||||
rc = LOAD_BADIMAGE; /* Format accepted */
|
||||
|
@ -568,7 +569,7 @@ _load(ImlibImage * im, int load_data)
|
|||
|
||||
freeilbm(&ilbm);
|
||||
|
||||
munmap(fdata, im->fsize);
|
||||
munmap(fdata, im->fi->fsize);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
|
|
@ -305,10 +305,11 @@ _load(ImlibImage * im, int load_data)
|
|||
/* read header */
|
||||
rc = LOAD_FAIL;
|
||||
|
||||
if (im->fsize < _PNG_MIN_SIZE)
|
||||
if (im->fi->fsize < _PNG_MIN_SIZE)
|
||||
return rc;
|
||||
|
||||
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
|
||||
fdata =
|
||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
||||
if (fdata == MAP_FAILED)
|
||||
return LOAD_BADFILE;
|
||||
|
||||
|
@ -354,7 +355,7 @@ _load(ImlibImage * im, int load_data)
|
|||
len = htonl(chunk->hdr.len);
|
||||
D("Scan %3d: %06lx: %6d: %.4s: ", ic,
|
||||
fptr - (unsigned char *)fdata, len, chunk->hdr.name);
|
||||
if (fptr + len - (unsigned char *)fdata > im->fsize)
|
||||
if (fptr + len - (unsigned char *)fdata > im->fi->fsize)
|
||||
break;
|
||||
|
||||
switch (chunk->hdr.type)
|
||||
|
@ -424,7 +425,7 @@ _load(ImlibImage * im, int load_data)
|
|||
len = htonl(chunk->hdr.len);
|
||||
D("Chunk %3d: %06lx: %6d: %.4s: ", ic,
|
||||
fptr - (unsigned char *)fdata, len, chunk->hdr.name);
|
||||
if (fptr + len - (unsigned char *)fdata > im->fsize)
|
||||
if (fptr + len - (unsigned char *)fdata > im->fi->fsize)
|
||||
break;
|
||||
|
||||
switch (chunk->hdr.type)
|
||||
|
@ -566,7 +567,7 @@ _load(ImlibImage * im, int load_data)
|
|||
|
||||
quit:
|
||||
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
||||
munmap(fdata, im->fsize);
|
||||
munmap(fdata, im->fi->fsize);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
@ -587,7 +588,7 @@ _save(ImlibImage * im)
|
|||
int pass, n_passes = 1;
|
||||
int has_alpha;
|
||||
|
||||
f = fopen(im->real_file, "wb");
|
||||
f = fopen(im->fi->name, "wb");
|
||||
if (!f)
|
||||
return LOAD_FAIL;
|
||||
|
||||
|
|
|
@ -129,11 +129,12 @@ _load(ImlibImage * im, int load_data)
|
|||
|
||||
rc = LOAD_FAIL;
|
||||
|
||||
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
|
||||
fdata =
|
||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
||||
if (fdata == MAP_FAILED)
|
||||
return LOAD_BADFILE;
|
||||
|
||||
mm_init(fdata, im->fsize);
|
||||
mm_init(fdata, im->fi->fsize);
|
||||
|
||||
/* read the header info */
|
||||
|
||||
|
@ -464,7 +465,7 @@ _load(ImlibImage * im, int load_data)
|
|||
quit:
|
||||
free(idata);
|
||||
free(data);
|
||||
munmap(fdata, im->fsize);
|
||||
munmap(fdata, im->fi->fsize);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
@ -478,7 +479,7 @@ _save(ImlibImage * im)
|
|||
uint32_t *ptr;
|
||||
int x, y;
|
||||
|
||||
f = fopen(im->real_file, "wb");
|
||||
f = fopen(im->fi->name, "wb");
|
||||
if (!f)
|
||||
return LOAD_FAIL;
|
||||
|
||||
|
|
|
@ -24,7 +24,8 @@ _load(ImlibImage * im, int load_data)
|
|||
uint32_t *dst;
|
||||
int i, j;
|
||||
|
||||
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
|
||||
fdata =
|
||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
||||
if (fdata == MAP_FAILED)
|
||||
return LOAD_BADFILE;
|
||||
|
||||
|
@ -41,7 +42,7 @@ _load(ImlibImage * im, int load_data)
|
|||
if (!spdoc)
|
||||
goto quit;
|
||||
|
||||
spectre_document_load(spdoc, im->real_file);
|
||||
spectre_document_load(spdoc, im->fi->name);
|
||||
spst = spectre_document_status(spdoc);
|
||||
if (spst != SPECTRE_STATUS_SUCCESS)
|
||||
{
|
||||
|
@ -137,7 +138,7 @@ _load(ImlibImage * im, int load_data)
|
|||
spectre_page_free(sppage);
|
||||
if (spdoc)
|
||||
spectre_document_free(spdoc);
|
||||
munmap(fdata, im->fsize);
|
||||
munmap(fdata, im->fi->fsize);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
|
|
@ -81,7 +81,8 @@ _load(ImlibImage * im, int load_data)
|
|||
|
||||
rc = LOAD_FAIL;
|
||||
|
||||
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
|
||||
fdata =
|
||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
||||
if (fdata == MAP_FAILED)
|
||||
return LOAD_BADFILE;
|
||||
|
||||
|
@ -91,10 +92,10 @@ _load(ImlibImage * im, int load_data)
|
|||
cr = NULL;
|
||||
|
||||
/* Signature check */
|
||||
if (_sig_check(fdata, im->fsize))
|
||||
if (_sig_check(fdata, im->fi->fsize))
|
||||
goto quit;
|
||||
|
||||
rsvg = rsvg_handle_new_from_data(fdata, im->fsize, &error);
|
||||
rsvg = rsvg_handle_new_from_data(fdata, im->fi->fsize, &error);
|
||||
if (!rsvg)
|
||||
goto quit;
|
||||
|
||||
|
@ -241,7 +242,7 @@ _load(ImlibImage * im, int load_data)
|
|||
cairo_destroy(cr);
|
||||
if (rsvg)
|
||||
g_object_unref(rsvg);
|
||||
munmap(fdata, im->fsize);
|
||||
munmap(fdata, im->fi->fsize);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
|
|
@ -86,20 +86,21 @@ _load(ImlibImage * im, int load_data)
|
|||
|
||||
rc = LOAD_FAIL;
|
||||
|
||||
if (im->fsize < (int)(sizeof(tga_header)) ||
|
||||
(uintmax_t) im->fsize > SIZE_MAX)
|
||||
if (im->fi->fsize < (int)(sizeof(tga_header)) ||
|
||||
(uintmax_t) im->fi->fsize > SIZE_MAX)
|
||||
return rc;
|
||||
|
||||
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
|
||||
fdata =
|
||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
||||
if (fdata == MAP_FAILED)
|
||||
return LOAD_BADFILE;
|
||||
|
||||
fptr = fdata;
|
||||
header = fdata;
|
||||
|
||||
if (im->fsize > (int)(sizeof(tga_footer)))
|
||||
if (im->fi->fsize > (int)(sizeof(tga_footer)))
|
||||
{
|
||||
footer = (tga_footer *) (fptr + im->fsize - sizeof(tga_footer));
|
||||
footer = (tga_footer *) (fptr + im->fi->fsize - sizeof(tga_footer));
|
||||
|
||||
/* check the footer to see if we have a v2.0 TGA file */
|
||||
footer_present = memcmp(footer->signature, TGA_SIGNATURE,
|
||||
|
@ -110,7 +111,7 @@ _load(ImlibImage * im, int load_data)
|
|||
footer_present = 0;
|
||||
}
|
||||
|
||||
if ((size_t)im->fsize < sizeof(tga_header) + header->idLength +
|
||||
if ((size_t)im->fi->fsize < sizeof(tga_header) + header->idLength +
|
||||
(footer_present ? sizeof(tga_footer) : 0))
|
||||
goto quit;
|
||||
|
||||
|
@ -197,7 +198,7 @@ _load(ImlibImage * im, int load_data)
|
|||
/* find out how much data must be read from the file */
|
||||
/* (this is NOT simply width*height*4, due to compression) */
|
||||
|
||||
datasize = im->fsize - sizeof(tga_header) - header->idLength -
|
||||
datasize = im->fi->fsize - sizeof(tga_header) - header->idLength -
|
||||
(footer_present ? sizeof(tga_footer) : 0);
|
||||
|
||||
palette = NULL;
|
||||
|
@ -465,7 +466,7 @@ _load(ImlibImage * im, int load_data)
|
|||
rc = LOAD_SUCCESS;
|
||||
|
||||
quit:
|
||||
munmap(fdata, im->fsize);
|
||||
munmap(fdata, im->fi->fsize);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
@ -510,7 +511,7 @@ _save(ImlibImage * im)
|
|||
int y;
|
||||
tga_header header;
|
||||
|
||||
f = fopen(im->real_file, "wb");
|
||||
f = fopen(im->fi->name, "wb");
|
||||
if (!f)
|
||||
return LOAD_FAIL;
|
||||
|
||||
|
|
|
@ -349,10 +349,11 @@ _load(ImlibImage * im, int load_data)
|
|||
/* Do initial signature check */
|
||||
#define TIFF_BYTES_TO_CHECK sizeof(magic_number)
|
||||
|
||||
if (im->fsize < (int)TIFF_BYTES_TO_CHECK)
|
||||
if (im->fi->fsize < (int)TIFF_BYTES_TO_CHECK)
|
||||
return rc;
|
||||
|
||||
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
|
||||
fdata =
|
||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
||||
if (fdata == MAP_FAILED)
|
||||
return LOAD_BADFILE;
|
||||
|
||||
|
@ -361,9 +362,9 @@ _load(ImlibImage * im, int load_data)
|
|||
if (magic_number != TIFF_BIGENDIAN && magic_number != TIFF_LITTLEENDIAN)
|
||||
return rc;
|
||||
|
||||
mm_init(fdata, im->fsize);
|
||||
mm_init(fdata, im->fi->fsize);
|
||||
|
||||
tif = TIFFClientOpen(im->real_file, "r", NULL, _tiff_read, _tiff_write,
|
||||
tif = TIFFClientOpen(im->fi->name, "r", NULL, _tiff_read, _tiff_write,
|
||||
_tiff_seek, _tiff_close, _tiff_size,
|
||||
_tiff_map, _tiff_unmap);
|
||||
if (!tif)
|
||||
|
@ -449,7 +450,7 @@ _load(ImlibImage * im, int load_data)
|
|||
TIFFRGBAImageEnd((TIFFRGBAImage *) & rgba_image);
|
||||
if (tif)
|
||||
TIFFClose(tif);
|
||||
munmap(fdata, im->fsize);
|
||||
munmap(fdata, im->fi->fsize);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
@ -472,7 +473,7 @@ _save(ImlibImage * im)
|
|||
int i;
|
||||
ImlibImageTag *tag;
|
||||
|
||||
tif = TIFFOpen(im->real_file, "w");
|
||||
tif = TIFFOpen(im->fi->name, "w");
|
||||
if (!tif)
|
||||
return LOAD_FAIL;
|
||||
|
||||
|
|
|
@ -21,15 +21,16 @@ _load(ImlibImage * im, int load_data)
|
|||
|
||||
rc = LOAD_FAIL;
|
||||
|
||||
if (im->fsize < 12)
|
||||
if (im->fi->fsize < 12)
|
||||
return rc;
|
||||
|
||||
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
|
||||
fdata =
|
||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
||||
if (fdata == MAP_FAILED)
|
||||
return LOAD_BADFILE;
|
||||
|
||||
webp_data.bytes = fdata;
|
||||
webp_data.size = im->fsize;
|
||||
webp_data.size = im->fi->fsize;
|
||||
|
||||
/* Init (includes signature check) */
|
||||
demux = WebPDemux(&webp_data);
|
||||
|
@ -101,7 +102,7 @@ _load(ImlibImage * im, int load_data)
|
|||
quit:
|
||||
if (demux)
|
||||
WebPDemuxDelete(demux);
|
||||
munmap(fdata, im->fsize);
|
||||
munmap(fdata, im->fi->fsize);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
@ -116,7 +117,7 @@ _save(ImlibImage * im)
|
|||
uint8_t *fdata;
|
||||
size_t encoded_size;
|
||||
|
||||
f = fopen(im->real_file, "wb");
|
||||
f = fopen(im->fi->name, "wb");
|
||||
if (!f)
|
||||
return LOAD_FAIL;
|
||||
|
||||
|
|
|
@ -94,21 +94,22 @@ _load(ImlibImage * im, int load_data)
|
|||
|
||||
rc = LOAD_FAIL;
|
||||
|
||||
if (im->fsize < 64)
|
||||
if (im->fi->fsize < 64)
|
||||
return rc; /* Not XBM */
|
||||
|
||||
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
|
||||
fdata =
|
||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
||||
if (fdata == MAP_FAILED)
|
||||
return LOAD_BADFILE;
|
||||
|
||||
/* Signature check ("#define") allow longish initial comment */
|
||||
s = fdata;
|
||||
nlen = s[0] == '/' && s[1] == '*' ? 4096 : 256;
|
||||
nlen = im->fsize > nlen ? nlen : im->fsize;
|
||||
nlen = im->fi->fsize > nlen ? nlen : im->fi->fsize;
|
||||
if (!memmem(s, nlen, "#define", 7))
|
||||
goto quit;
|
||||
|
||||
mm_init(fdata, im->fsize);
|
||||
mm_init(fdata, im->fi->fsize);
|
||||
|
||||
ptr = NULL;
|
||||
x = y = 0;
|
||||
|
@ -211,7 +212,7 @@ _load(ImlibImage * im, int load_data)
|
|||
rc = LOAD_SUCCESS;
|
||||
|
||||
quit:
|
||||
munmap(fdata, im->fsize);
|
||||
munmap(fdata, im->fi->fsize);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
@ -226,13 +227,13 @@ _save(ImlibImage * im)
|
|||
int i, k, x, y, bits, nval, val;
|
||||
uint32_t *ptr;
|
||||
|
||||
f = fopen(im->real_file, "wb");
|
||||
f = fopen(im->fi->name, "wb");
|
||||
if (!f)
|
||||
return LOAD_FAIL;
|
||||
|
||||
rc = LOAD_SUCCESS;
|
||||
|
||||
name = im->real_file;
|
||||
name = im->fi->name;
|
||||
if ((s = strrchr(name, '/')) != 0)
|
||||
name = s + 1;
|
||||
|
||||
|
|
|
@ -174,16 +174,17 @@ _load(ImlibImage * im, int load_data)
|
|||
line = NULL;
|
||||
cmap = NULL;
|
||||
|
||||
fdata = mmap(NULL, im->fsize, PROT_READ, MAP_SHARED, fileno(im->fp), 0);
|
||||
fdata =
|
||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
||||
if (fdata == MAP_FAILED)
|
||||
return LOAD_BADFILE;
|
||||
|
||||
if (!memmem(fdata, im->fsize <= 256 ? im->fsize : 256, " XPM */", 7))
|
||||
if (!memmem(fdata, im->fi->fsize <= 256 ? im->fi->fsize : 256, " XPM */", 7))
|
||||
goto quit;
|
||||
|
||||
rc = LOAD_BADIMAGE; /* Format accepted */
|
||||
|
||||
mm_init(fdata, im->fsize);
|
||||
mm_init(fdata, im->fi->fsize);
|
||||
|
||||
j = 0;
|
||||
w = 10;
|
||||
|
@ -472,7 +473,7 @@ _load(ImlibImage * im, int load_data)
|
|||
|
||||
xpm_parse_done();
|
||||
|
||||
munmap(fdata, im->fsize);
|
||||
munmap(fdata, im->fi->fsize);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue