loading: Introduce __imlib_ImageFileContextPush/Pop()

Makes dealing with nested file contexts much easier.
This commit is contained in:
Kim Woelders 2022-03-27 10:28:03 +02:00
parent 5b357a815b
commit e55208f4d6
24 changed files with 242 additions and 167 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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