loading: Centralize mmap handling
Loader interface should be stable now.
This commit is contained in:
parent
e55208f4d6
commit
753065d5a3
|
@ -10,7 +10,6 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/mman.h>
|
|
||||||
|
|
||||||
/* types.h */
|
/* types.h */
|
||||||
|
|
||||||
|
@ -118,6 +117,7 @@ typedef struct _ImlibImageFileInfo {
|
||||||
struct _ImlibImageFileInfo *next;
|
struct _ImlibImageFileInfo *next;
|
||||||
char *name;
|
char *name;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
const void *fdata;
|
||||||
off_t fsize;
|
off_t fsize;
|
||||||
} ImlibImageFileInfo;
|
} ImlibImageFileInfo;
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
@ -78,6 +79,7 @@ static int
|
||||||
__imlib_FileContextOpen(ImlibImageFileInfo * fi, FILE * fp, off_t fsize)
|
__imlib_FileContextOpen(ImlibImageFileInfo * fi, FILE * fp, off_t fsize)
|
||||||
{
|
{
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
void *fdata;
|
||||||
|
|
||||||
if (fp)
|
if (fp)
|
||||||
{
|
{
|
||||||
|
@ -101,6 +103,12 @@ __imlib_FileContextOpen(ImlibImageFileInfo * fi, FILE * fp, off_t fsize)
|
||||||
fi->fsize = fsize;
|
fi->fsize = fsize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fdata = mmap(NULL, fi->fsize, PROT_READ, MAP_SHARED, fileno(fi->fp), 0);
|
||||||
|
if (fdata == MAP_FAILED)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
fi->fdata = fdata;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,6 +117,11 @@ __imlib_FileContextClose(ImlibImageFileInfo * fi)
|
||||||
{
|
{
|
||||||
if (!fi->keep_fp)
|
if (!fi->keep_fp)
|
||||||
{
|
{
|
||||||
|
if (fi->fdata)
|
||||||
|
{
|
||||||
|
munmap((void *)fi->fdata, fi->fsize);
|
||||||
|
fi->fdata = NULL;
|
||||||
|
}
|
||||||
if (fi->fp)
|
if (fi->fp)
|
||||||
{
|
{
|
||||||
fclose(fi->fp);
|
fclose(fi->fp);
|
||||||
|
|
|
@ -30,6 +30,7 @@ typedef struct _ImlibImageFileInfo {
|
||||||
struct _ImlibImageFileInfo *next;
|
struct _ImlibImageFileInfo *next;
|
||||||
char *name;
|
char *name;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
const void *fdata;
|
||||||
off_t fsize;
|
off_t fsize;
|
||||||
/* vvv Private vvv */
|
/* vvv Private vvv */
|
||||||
char keep_fp;
|
char keep_fp;
|
||||||
|
|
|
@ -11,7 +11,6 @@ decompress_load(ImlibImage * im, int load_data, const char *const *pext,
|
||||||
const char *s, *p, *q;
|
const char *s, *p, *q;
|
||||||
char tmp[] = "/tmp/imlib2_loader_dec-XXXXXX";
|
char tmp[] = "/tmp/imlib2_loader_dec-XXXXXX";
|
||||||
char *real_ext;
|
char *real_ext;
|
||||||
void *fdata;
|
|
||||||
|
|
||||||
rc = LOAD_FAIL;
|
rc = LOAD_FAIL;
|
||||||
|
|
||||||
|
@ -47,15 +46,10 @@ decompress_load(ImlibImage * im, int load_data, const char *const *pext,
|
||||||
if (!loader)
|
if (!loader)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
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)
|
if ((dest = mkstemp(tmp)) < 0)
|
||||||
QUIT_WITH_RC(LOAD_OOM);
|
QUIT_WITH_RC(LOAD_OOM);
|
||||||
|
|
||||||
res = fdec(fdata, im->fi->fsize, dest);
|
res = fdec(im->fi->fdata, im->fi->fsize, dest);
|
||||||
|
|
||||||
close(dest);
|
close(dest);
|
||||||
|
|
||||||
|
@ -65,7 +59,6 @@ decompress_load(ImlibImage * im, int load_data, const char *const *pext,
|
||||||
unlink(tmp);
|
unlink(tmp);
|
||||||
|
|
||||||
quit:
|
quit:
|
||||||
munmap(fdata, im->fi->fsize);
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,6 @@ static int
|
||||||
_load(ImlibImage * im, int load_data)
|
_load(ImlibImage * im, int load_data)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
void *fdata;
|
|
||||||
int alpha;
|
int alpha;
|
||||||
uint32_t *ptr;
|
uint32_t *ptr;
|
||||||
int y;
|
int y;
|
||||||
|
@ -50,16 +49,11 @@ _load(ImlibImage * im, int load_data)
|
||||||
|
|
||||||
rc = LOAD_FAIL;
|
rc = LOAD_FAIL;
|
||||||
|
|
||||||
fdata =
|
mm_init(im->fi->fdata, im->fi->fsize);
|
||||||
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->fi->fsize);
|
|
||||||
|
|
||||||
/* header */
|
/* header */
|
||||||
|
|
||||||
fptr = fdata;
|
fptr = im->fi->fdata;
|
||||||
size = im->fi->fsize > 31 ? 31 : im->fi->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);
|
row = memchr(fptr, '\n', size);
|
||||||
if (!row)
|
if (!row)
|
||||||
|
@ -108,8 +102,6 @@ _load(ImlibImage * im, int load_data)
|
||||||
rc = LOAD_SUCCESS;
|
rc = LOAD_SUCCESS;
|
||||||
|
|
||||||
quit:
|
quit:
|
||||||
munmap(fdata, im->fi->fsize);
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -158,7 +158,6 @@ static int
|
||||||
_load(ImlibImage * im, int load_data)
|
_load(ImlibImage * im, int load_data)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
void *fdata;
|
|
||||||
const unsigned char *fptr;
|
const unsigned char *fptr;
|
||||||
bfh_t bfh;
|
bfh_t bfh;
|
||||||
unsigned int bfh_offset;
|
unsigned int bfh_offset;
|
||||||
|
@ -179,13 +178,8 @@ _load(ImlibImage * im, int load_data)
|
||||||
|
|
||||||
rc = LOAD_FAIL;
|
rc = LOAD_FAIL;
|
||||||
|
|
||||||
fdata =
|
fptr = im->fi->fdata;
|
||||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
mm_init(im->fi->fdata, im->fi->fsize);
|
||||||
if (fdata == MAP_FAILED)
|
|
||||||
return LOAD_BADFILE;
|
|
||||||
|
|
||||||
fptr = fdata;
|
|
||||||
mm_init(fdata, im->fi->fsize);
|
|
||||||
|
|
||||||
/* Load header */
|
/* Load header */
|
||||||
|
|
||||||
|
@ -760,8 +754,6 @@ _load(ImlibImage * im, int load_data)
|
||||||
rc = LOAD_SUCCESS;
|
rc = LOAD_SUCCESS;
|
||||||
|
|
||||||
quit:
|
quit:
|
||||||
munmap(fdata, im->fi->fsize);
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
static const char *const _formats[] = { "ff" };
|
static const char *const _formats[] = { "ff" };
|
||||||
|
|
||||||
#define mm_check(p) ((const char *)(p) <= (const char *)fdata + im->fi->fsize)
|
#define mm_check(p) ((const char *)(p) <= (const char *)im->fi->fdata + im->fi->fsize)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
unsigned char magic[8];
|
unsigned char magic[8];
|
||||||
|
@ -17,7 +17,6 @@ static int
|
||||||
_load(ImlibImage * im, int load_data)
|
_load(ImlibImage * im, int load_data)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
void *fdata;
|
|
||||||
int rowlen, i, j;
|
int rowlen, i, j;
|
||||||
const ff_hdr_t *hdr;
|
const ff_hdr_t *hdr;
|
||||||
const uint16_t *row;
|
const uint16_t *row;
|
||||||
|
@ -28,13 +27,8 @@ _load(ImlibImage * im, int load_data)
|
||||||
if (im->fi->fsize < (long)sizeof(ff_hdr_t))
|
if (im->fi->fsize < (long)sizeof(ff_hdr_t))
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
fdata =
|
|
||||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
|
||||||
if (fdata == MAP_FAILED)
|
|
||||||
return LOAD_BADFILE;
|
|
||||||
|
|
||||||
/* read and check the header */
|
/* read and check the header */
|
||||||
hdr = fdata;
|
hdr = im->fi->fdata;
|
||||||
if (memcmp("farbfeld", hdr->magic, sizeof(hdr->magic)))
|
if (memcmp("farbfeld", hdr->magic, sizeof(hdr->magic)))
|
||||||
goto quit;
|
goto quit;
|
||||||
|
|
||||||
|
@ -83,8 +77,6 @@ _load(ImlibImage * im, int load_data)
|
||||||
rc = LOAD_SUCCESS;
|
rc = LOAD_SUCCESS;
|
||||||
|
|
||||||
quit:
|
quit:
|
||||||
munmap(fdata, im->fi->fsize);
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,6 @@ static int
|
||||||
_load(ImlibImage * im, int load_data)
|
_load(ImlibImage * im, int load_data)
|
||||||
{
|
{
|
||||||
int rc, err;
|
int rc, err;
|
||||||
void *fdata;
|
|
||||||
uint32_t *ptr;
|
uint32_t *ptr;
|
||||||
GifFileType *gif;
|
GifFileType *gif;
|
||||||
GifRowType *rows;
|
GifRowType *rows;
|
||||||
|
@ -68,15 +67,10 @@ _load(ImlibImage * im, int load_data)
|
||||||
uint32_t colormap[256];
|
uint32_t colormap[256];
|
||||||
int fcount, frame, multiframe;
|
int fcount, frame, multiframe;
|
||||||
|
|
||||||
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;
|
rc = LOAD_FAIL;
|
||||||
rows = NULL;
|
rows = NULL;
|
||||||
|
|
||||||
mm_init(fdata, im->fi->fsize);
|
mm_init(im->fi->fdata, im->fi->fsize);
|
||||||
|
|
||||||
#if GIFLIB_MAJOR >= 5
|
#if GIFLIB_MAJOR >= 5
|
||||||
gif = DGifOpen(NULL, mm_read, &err);
|
gif = DGifOpen(NULL, mm_read, &err);
|
||||||
|
@ -302,8 +296,6 @@ _load(ImlibImage * im, int load_data)
|
||||||
DGifCloseFile(gif);
|
DGifCloseFile(gif);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
munmap(fdata, im->fi->fsize);
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,6 @@ static int
|
||||||
_load(ImlibImage * im, int load_data)
|
_load(ImlibImage * im, int load_data)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
void *fdata;
|
|
||||||
int img_has_alpha;
|
int img_has_alpha;
|
||||||
int stride = 0;
|
int stride = 0;
|
||||||
int bytes_per_px;
|
int bytes_per_px;
|
||||||
|
@ -39,13 +38,8 @@ _load(ImlibImage * im, int load_data)
|
||||||
if (im->fi->fsize < HEIF_BYTES_TO_CHECK)
|
if (im->fi->fsize < HEIF_BYTES_TO_CHECK)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
fdata =
|
|
||||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
|
||||||
if (fdata == MAP_FAILED)
|
|
||||||
return LOAD_BADFILE;
|
|
||||||
|
|
||||||
/* check signature */
|
/* check signature */
|
||||||
switch (heif_check_filetype(fdata, im->fi->fsize))
|
switch (heif_check_filetype(im->fi->fdata, im->fi->fsize))
|
||||||
{
|
{
|
||||||
case heif_filetype_no:
|
case heif_filetype_no:
|
||||||
case heif_filetype_yes_unsupported:
|
case heif_filetype_yes_unsupported:
|
||||||
|
@ -62,7 +56,7 @@ _load(ImlibImage * im, int load_data)
|
||||||
if (!ctx)
|
if (!ctx)
|
||||||
goto quit;
|
goto quit;
|
||||||
|
|
||||||
error = heif_context_read_from_memory_without_copy(ctx, fdata,
|
error = heif_context_read_from_memory_without_copy(ctx, im->fi->fdata,
|
||||||
im->fi->fsize, NULL);
|
im->fi->fsize, NULL);
|
||||||
if (error.code != heif_error_Ok)
|
if (error.code != heif_error_Ok)
|
||||||
goto quit;
|
goto quit;
|
||||||
|
@ -156,8 +150,6 @@ _load(ImlibImage * im, int load_data)
|
||||||
heif_context_free(ctx);
|
heif_context_free(ctx);
|
||||||
heif_decoding_options_free(decode_opts);
|
heif_decoding_options_free(decode_opts);
|
||||||
|
|
||||||
munmap(fdata, im->fi->fsize);
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -396,18 +396,12 @@ static int
|
||||||
_load(ImlibImage * im, int load_data)
|
_load(ImlibImage * im, int load_data)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
void *fdata;
|
|
||||||
ico_t ico;
|
ico_t ico;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
rc = LOAD_FAIL;
|
rc = LOAD_FAIL;
|
||||||
|
|
||||||
fdata =
|
mm_init(im->fi->fdata, im->fi->fsize);
|
||||||
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->fi->fsize);
|
|
||||||
|
|
||||||
ico.ie = NULL;
|
ico.ie = NULL;
|
||||||
if (mm_read(&ico.idir, sizeof(ico.idir)))
|
if (mm_read(&ico.idir, sizeof(ico.idir)))
|
||||||
|
@ -444,7 +438,6 @@ _load(ImlibImage * im, int load_data)
|
||||||
|
|
||||||
quit:
|
quit:
|
||||||
ico_delete(&ico);
|
ico_delete(&ico);
|
||||||
munmap(fdata, im->fi->fsize);
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -500,6 +500,9 @@ _load(ImlibImage * im, int load_data)
|
||||||
rc = LOAD_FAIL;
|
rc = LOAD_FAIL;
|
||||||
opt.ctx = NULL;
|
opt.ctx = NULL;
|
||||||
|
|
||||||
|
if (!im->fi->fp)
|
||||||
|
return rc;
|
||||||
|
|
||||||
if (!get_options(&opt, im))
|
if (!get_options(&opt, im))
|
||||||
goto quit;
|
goto quit;
|
||||||
|
|
||||||
|
|
|
@ -96,7 +96,6 @@ static int
|
||||||
_load(ImlibImage * im, int load_data)
|
_load(ImlibImage * im, int load_data)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
void *fdata;
|
|
||||||
int ok;
|
int ok;
|
||||||
opj_dparameters_t jparam;
|
opj_dparameters_t jparam;
|
||||||
opj_codec_t *jcodec;
|
opj_codec_t *jcodec;
|
||||||
|
@ -108,11 +107,6 @@ _load(ImlibImage * im, int load_data)
|
||||||
OPJ_INT32 *pa, *pr, *pg, *pb;
|
OPJ_INT32 *pa, *pr, *pg, *pb;
|
||||||
unsigned char a, r, g, b;
|
unsigned char a, r, g, b;
|
||||||
|
|
||||||
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;
|
rc = LOAD_FAIL;
|
||||||
jcodec = NULL;
|
jcodec = NULL;
|
||||||
jstream = NULL;
|
jstream = NULL;
|
||||||
|
@ -122,10 +116,10 @@ _load(ImlibImage * im, int load_data)
|
||||||
if (im->fi->fsize < 12)
|
if (im->fi->fsize < 12)
|
||||||
goto quit;
|
goto quit;
|
||||||
|
|
||||||
if (memcmp(fdata, JP2_MAGIC, 4) == 0 ||
|
if (memcmp(im->fi->fdata, JP2_MAGIC, 4) == 0 ||
|
||||||
memcmp(fdata, JP2_RFC3745_MAGIC, 12) == 0)
|
memcmp(im->fi->fdata, JP2_RFC3745_MAGIC, 12) == 0)
|
||||||
jfmt = OPJ_CODEC_JP2;
|
jfmt = OPJ_CODEC_JP2;
|
||||||
else if (memcmp(fdata, J2K_CODESTREAM_MAGIC, 4) == 0)
|
else if (memcmp(im->fi->fdata, J2K_CODESTREAM_MAGIC, 4) == 0)
|
||||||
jfmt = OPJ_CODEC_J2K;
|
jfmt = OPJ_CODEC_J2K;
|
||||||
else
|
else
|
||||||
goto quit;
|
goto quit;
|
||||||
|
@ -164,7 +158,7 @@ _load(ImlibImage * im, int load_data)
|
||||||
if (!jstream)
|
if (!jstream)
|
||||||
goto quit;
|
goto quit;
|
||||||
|
|
||||||
mm_init(fdata, im->fi->fsize);
|
mm_init(im->fi->fdata, im->fi->fsize);
|
||||||
opj_stream_set_user_data(jstream, &mdata, NULL);
|
opj_stream_set_user_data(jstream, &mdata, NULL);
|
||||||
opj_stream_set_user_data_length(jstream, im->fi->fsize);
|
opj_stream_set_user_data_length(jstream, im->fi->fsize);
|
||||||
opj_stream_set_read_function(jstream, mm_read);
|
opj_stream_set_read_function(jstream, mm_read);
|
||||||
|
@ -275,7 +269,6 @@ _load(ImlibImage * im, int load_data)
|
||||||
opj_stream_destroy(jstream);
|
opj_stream_destroy(jstream);
|
||||||
if (jcodec)
|
if (jcodec)
|
||||||
opj_destroy_codec(jcodec);
|
opj_destroy_codec(jcodec);
|
||||||
munmap(fdata, im->fi->fsize);
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,7 +68,6 @@ static int
|
||||||
_load(ImlibImage * im, int load_data)
|
_load(ImlibImage * im, int load_data)
|
||||||
{
|
{
|
||||||
int w, h, rc;
|
int w, h, rc;
|
||||||
void *fdata;
|
|
||||||
struct jpeg_decompress_struct jds;
|
struct jpeg_decompress_struct jds;
|
||||||
ImLib_JPEG_data jdata;
|
ImLib_JPEG_data jdata;
|
||||||
uint8_t *ptr, *line[16];
|
uint8_t *ptr, *line[16];
|
||||||
|
@ -78,18 +77,13 @@ _load(ImlibImage * im, int load_data)
|
||||||
|
|
||||||
rc = LOAD_FAIL;
|
rc = LOAD_FAIL;
|
||||||
|
|
||||||
fdata =
|
|
||||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
|
||||||
if (fdata == MAP_FAILED)
|
|
||||||
return rc;
|
|
||||||
|
|
||||||
/* set up error handling */
|
/* set up error handling */
|
||||||
jds.err = _jdata_init(&jdata);
|
jds.err = _jdata_init(&jdata);
|
||||||
if (sigsetjmp(jdata.setjmp_buffer, 1))
|
if (sigsetjmp(jdata.setjmp_buffer, 1))
|
||||||
QUIT_WITH_RC(LOAD_FAIL);
|
QUIT_WITH_RC(LOAD_FAIL);
|
||||||
|
|
||||||
jpeg_create_decompress(&jds);
|
jpeg_create_decompress(&jds);
|
||||||
jpeg_mem_src(&jds, fdata, im->fi->fsize);
|
jpeg_mem_src(&jds, im->fi->fdata, im->fi->fsize);
|
||||||
jpeg_save_markers(&jds, JPEG_APP0 + 1, 256);
|
jpeg_save_markers(&jds, JPEG_APP0 + 1, 256);
|
||||||
jpeg_read_header(&jds, TRUE);
|
jpeg_read_header(&jds, TRUE);
|
||||||
|
|
||||||
|
@ -252,7 +246,6 @@ _load(ImlibImage * im, int load_data)
|
||||||
quit:
|
quit:
|
||||||
jpeg_destroy_decompress(&jds);
|
jpeg_destroy_decompress(&jds);
|
||||||
free(jdata.data);
|
free(jdata.data);
|
||||||
munmap(fdata, im->fi->fsize);
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,6 @@ _load(ImlibImage * im, int load_data)
|
||||||
};
|
};
|
||||||
|
|
||||||
int rc;
|
int rc;
|
||||||
void *fdata;
|
|
||||||
JxlDecoderStatus jst;
|
JxlDecoderStatus jst;
|
||||||
JxlDecoder *dec;
|
JxlDecoder *dec;
|
||||||
JxlBasicInfo info;
|
JxlBasicInfo info;
|
||||||
|
@ -55,15 +54,10 @@ _load(ImlibImage * im, int load_data)
|
||||||
JxlParallelRunner *runner = NULL;
|
JxlParallelRunner *runner = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
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;
|
rc = LOAD_FAIL;
|
||||||
dec = NULL;
|
dec = NULL;
|
||||||
|
|
||||||
switch (JxlSignatureCheck(fdata, 128))
|
switch (JxlSignatureCheck(im->fi->fdata, 128))
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
// case JXL_SIG_NOT_ENOUGH_BYTES:
|
// case JXL_SIG_NOT_ENOUGH_BYTES:
|
||||||
|
@ -101,7 +95,7 @@ _load(ImlibImage * im, int load_data)
|
||||||
if (jst != JXL_DEC_SUCCESS)
|
if (jst != JXL_DEC_SUCCESS)
|
||||||
goto quit;
|
goto quit;
|
||||||
|
|
||||||
jst = JxlDecoderSetInput(dec, fdata, im->fi->fsize);
|
jst = JxlDecoderSetInput(dec, im->fi->fdata, im->fi->fsize);
|
||||||
if (jst != JXL_DEC_SUCCESS)
|
if (jst != JXL_DEC_SUCCESS)
|
||||||
goto quit;
|
goto quit;
|
||||||
|
|
||||||
|
@ -214,7 +208,6 @@ _load(ImlibImage * im, int load_data)
|
||||||
#endif
|
#endif
|
||||||
if (dec)
|
if (dec)
|
||||||
JxlDecoderDestroy(dec);
|
JxlDecoderDestroy(dec);
|
||||||
munmap(fdata, im->fi->fsize);
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -443,7 +443,6 @@ static int
|
||||||
_load(ImlibImage * im, int load_data)
|
_load(ImlibImage * im, int load_data)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
void *fdata;
|
|
||||||
char *env;
|
char *env;
|
||||||
int i, n, y, z;
|
int i, n, y, z;
|
||||||
unsigned char *plane[40];
|
unsigned char *plane[40];
|
||||||
|
@ -451,11 +450,6 @@ _load(ImlibImage * im, int load_data)
|
||||||
|
|
||||||
rc = LOAD_FAIL;
|
rc = LOAD_FAIL;
|
||||||
|
|
||||||
fdata =
|
|
||||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
|
||||||
if (fdata == MAP_FAILED)
|
|
||||||
return LOAD_BADFILE;
|
|
||||||
|
|
||||||
plane[0] = NULL;
|
plane[0] = NULL;
|
||||||
memset(&ilbm, 0, sizeof(ilbm));
|
memset(&ilbm, 0, sizeof(ilbm));
|
||||||
|
|
||||||
|
@ -463,7 +457,7 @@ _load(ImlibImage * im, int load_data)
|
||||||
* Load the chunk(s) we're interested in. If load_data is not true, then we only
|
* Load the chunk(s) we're interested in. If load_data is not true, then we only
|
||||||
* want the image size and format.
|
* want the image size and format.
|
||||||
*----------*/
|
*----------*/
|
||||||
if (!loadchunks(fdata, im->fi->fsize, &ilbm, load_data))
|
if (!loadchunks(im->fi->fdata, im->fi->fsize, &ilbm, load_data))
|
||||||
goto quit;
|
goto quit;
|
||||||
|
|
||||||
rc = LOAD_BADIMAGE; /* Format accepted */
|
rc = LOAD_BADIMAGE; /* Format accepted */
|
||||||
|
@ -569,8 +563,6 @@ _load(ImlibImage * im, int load_data)
|
||||||
|
|
||||||
freeilbm(&ilbm);
|
freeilbm(&ilbm);
|
||||||
|
|
||||||
munmap(fdata, im->fi->fsize);
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,8 @@ static const char *const _formats[] = { "png" };
|
||||||
#define APNG_BLEND_OP_SOURCE 0
|
#define APNG_BLEND_OP_SOURCE 0
|
||||||
#define APNG_BLEND_OP_OVER 1
|
#define APNG_BLEND_OP_OVER 1
|
||||||
|
|
||||||
|
#define mm_check(p) ((const char *)(p) <= (const char *)im->fi->fdata + im->fi->fsize)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t len;
|
uint32_t len;
|
||||||
union {
|
union {
|
||||||
|
@ -290,7 +292,6 @@ static int
|
||||||
_load(ImlibImage * im, int load_data)
|
_load(ImlibImage * im, int load_data)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
void *fdata;
|
|
||||||
png_structp png_ptr = NULL;
|
png_structp png_ptr = NULL;
|
||||||
png_infop info_ptr = NULL;
|
png_infop info_ptr = NULL;
|
||||||
ctx_t ctx = { 0 };
|
ctx_t ctx = { 0 };
|
||||||
|
@ -308,13 +309,8 @@ _load(ImlibImage * im, int load_data)
|
||||||
if (im->fi->fsize < _PNG_MIN_SIZE)
|
if (im->fi->fsize < _PNG_MIN_SIZE)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
fdata =
|
|
||||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
|
||||||
if (fdata == MAP_FAILED)
|
|
||||||
return LOAD_BADFILE;
|
|
||||||
|
|
||||||
/* Signature check */
|
/* Signature check */
|
||||||
if (png_sig_cmp(fdata, 0, _PNG_SIG_SIZE))
|
if (png_sig_cmp(im->fi->fdata, 0, _PNG_SIG_SIZE))
|
||||||
goto quit;
|
goto quit;
|
||||||
|
|
||||||
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL,
|
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL,
|
||||||
|
@ -347,15 +343,16 @@ _load(ImlibImage * im, int load_data)
|
||||||
|
|
||||||
frame = 0; /* Frame number */
|
frame = 0; /* Frame number */
|
||||||
ctx.pch_fctl = NULL; /* Ponter to requested frame fcTL chunk */
|
ctx.pch_fctl = NULL; /* Ponter to requested frame fcTL chunk */
|
||||||
fptr = (unsigned char *)fdata + _PNG_SIG_SIZE;
|
fptr = (unsigned char *)im->fi->fdata;
|
||||||
|
fptr += _PNG_SIG_SIZE;
|
||||||
|
|
||||||
for (ic = 0;; ic++, fptr += 8 + len + 4)
|
for (ic = 0;; ic++, fptr += 8 + len + 4)
|
||||||
{
|
{
|
||||||
chunk = (const png_chunk_t *)fptr;
|
chunk = (const png_chunk_t *)fptr;
|
||||||
len = htonl(chunk->hdr.len);
|
len = htonl(chunk->hdr.len);
|
||||||
D("Scan %3d: %06lx: %6d: %.4s: ", ic,
|
D("Scan %3d: %06lx: %6d: %.4s: ", ic,
|
||||||
fptr - (unsigned char *)fdata, len, chunk->hdr.name);
|
fptr - (unsigned char *)im->fi->fdata, len, chunk->hdr.name);
|
||||||
if (fptr + len - (unsigned char *)fdata > im->fi->fsize)
|
if (!mm_check(fptr + len))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
switch (chunk->hdr.type)
|
switch (chunk->hdr.type)
|
||||||
|
@ -414,18 +411,18 @@ _load(ImlibImage * im, int load_data)
|
||||||
save_fdat = 0;
|
save_fdat = 0;
|
||||||
|
|
||||||
/* At this point we start "progressive" PNG data processing */
|
/* At this point we start "progressive" PNG data processing */
|
||||||
fptr = fdata;
|
fptr = (unsigned char *)im->fi->fdata;
|
||||||
png_process_data(png_ptr, info_ptr, fptr, _PNG_SIG_SIZE);
|
png_process_data(png_ptr, info_ptr, fptr, _PNG_SIG_SIZE);
|
||||||
|
|
||||||
fptr = (unsigned char *)fdata + _PNG_SIG_SIZE;
|
fptr += _PNG_SIG_SIZE;
|
||||||
|
|
||||||
for (ic = 0;; ic++, fptr += 8 + len + 4)
|
for (ic = 0;; ic++, fptr += 8 + len + 4)
|
||||||
{
|
{
|
||||||
chunk = (const png_chunk_t *)fptr;
|
chunk = (const png_chunk_t *)fptr;
|
||||||
len = htonl(chunk->hdr.len);
|
len = htonl(chunk->hdr.len);
|
||||||
D("Chunk %3d: %06lx: %6d: %.4s: ", ic,
|
D("Chunk %3d: %06lx: %6d: %.4s: ", ic,
|
||||||
fptr - (unsigned char *)fdata, len, chunk->hdr.name);
|
fptr - (unsigned char *)im->fi->fdata, len, chunk->hdr.name);
|
||||||
if (fptr + len - (unsigned char *)fdata > im->fi->fsize)
|
if (!mm_check(fptr + len))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
switch (chunk->hdr.type)
|
switch (chunk->hdr.type)
|
||||||
|
@ -567,7 +564,6 @@ _load(ImlibImage * im, int load_data)
|
||||||
|
|
||||||
quit:
|
quit:
|
||||||
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
||||||
munmap(fdata, im->fi->fsize);
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,7 +118,6 @@ static int
|
||||||
_load(ImlibImage * im, int load_data)
|
_load(ImlibImage * im, int load_data)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
void *fdata;
|
|
||||||
int c, p;
|
int c, p;
|
||||||
int w, h, v, numbers, count;
|
int w, h, v, numbers, count;
|
||||||
uint8_t *data = NULL; /* for the binary versions */
|
uint8_t *data = NULL; /* for the binary versions */
|
||||||
|
@ -129,12 +128,7 @@ _load(ImlibImage * im, int load_data)
|
||||||
|
|
||||||
rc = LOAD_FAIL;
|
rc = LOAD_FAIL;
|
||||||
|
|
||||||
fdata =
|
mm_init(im->fi->fdata, im->fi->fsize);
|
||||||
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->fi->fsize);
|
|
||||||
|
|
||||||
/* read the header info */
|
/* read the header info */
|
||||||
|
|
||||||
|
@ -465,7 +459,6 @@ _load(ImlibImage * im, int load_data)
|
||||||
quit:
|
quit:
|
||||||
free(idata);
|
free(idata);
|
||||||
free(data);
|
free(data);
|
||||||
munmap(fdata, im->fi->fsize);
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,6 @@ static int
|
||||||
_load(ImlibImage * im, int load_data)
|
_load(ImlibImage * im, int load_data)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
void *fdata;
|
|
||||||
SpectreDocument *spdoc;
|
SpectreDocument *spdoc;
|
||||||
SpectrePage *sppage;
|
SpectrePage *sppage;
|
||||||
SpectreStatus spst;
|
SpectreStatus spst;
|
||||||
|
@ -24,18 +23,13 @@ _load(ImlibImage * im, int load_data)
|
||||||
uint32_t *dst;
|
uint32_t *dst;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
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;
|
rc = LOAD_FAIL;
|
||||||
spdoc = NULL;
|
spdoc = NULL;
|
||||||
sppage = NULL;
|
sppage = NULL;
|
||||||
sprc = NULL;
|
sprc = NULL;
|
||||||
|
|
||||||
/* Signature check */
|
/* Signature check */
|
||||||
if (memcmp(fdata, "%!PS", 4) != 0)
|
if (memcmp(im->fi->fdata, "%!PS", 4) != 0)
|
||||||
goto quit;
|
goto quit;
|
||||||
|
|
||||||
spdoc = spectre_document_new();
|
spdoc = spectre_document_new();
|
||||||
|
@ -138,7 +132,6 @@ _load(ImlibImage * im, int load_data)
|
||||||
spectre_page_free(sppage);
|
spectre_page_free(sppage);
|
||||||
if (spdoc)
|
if (spdoc)
|
||||||
spectre_document_free(spdoc);
|
spectre_document_free(spdoc);
|
||||||
munmap(fdata, im->fi->fsize);
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,7 +72,6 @@ static int
|
||||||
_load(ImlibImage * im, int load_data)
|
_load(ImlibImage * im, int load_data)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
void *fdata;
|
|
||||||
RsvgHandle *rsvg;
|
RsvgHandle *rsvg;
|
||||||
GError *error;
|
GError *error;
|
||||||
gboolean ok;
|
gboolean ok;
|
||||||
|
@ -80,22 +79,16 @@ _load(ImlibImage * im, int load_data)
|
||||||
cairo_t *cr;
|
cairo_t *cr;
|
||||||
|
|
||||||
rc = LOAD_FAIL;
|
rc = LOAD_FAIL;
|
||||||
|
|
||||||
fdata =
|
|
||||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
|
||||||
if (fdata == MAP_FAILED)
|
|
||||||
return LOAD_BADFILE;
|
|
||||||
|
|
||||||
error = NULL;
|
error = NULL;
|
||||||
rsvg = NULL;
|
rsvg = NULL;
|
||||||
surface = NULL;
|
surface = NULL;
|
||||||
cr = NULL;
|
cr = NULL;
|
||||||
|
|
||||||
/* Signature check */
|
/* Signature check */
|
||||||
if (_sig_check(fdata, im->fi->fsize))
|
if (_sig_check(im->fi->fdata, im->fi->fsize))
|
||||||
goto quit;
|
goto quit;
|
||||||
|
|
||||||
rsvg = rsvg_handle_new_from_data(fdata, im->fi->fsize, &error);
|
rsvg = rsvg_handle_new_from_data(im->fi->fdata, im->fi->fsize, &error);
|
||||||
if (!rsvg)
|
if (!rsvg)
|
||||||
goto quit;
|
goto quit;
|
||||||
|
|
||||||
|
@ -242,7 +235,6 @@ _load(ImlibImage * im, int load_data)
|
||||||
cairo_destroy(cr);
|
cairo_destroy(cr);
|
||||||
if (rsvg)
|
if (rsvg)
|
||||||
g_object_unref(rsvg);
|
g_object_unref(rsvg);
|
||||||
munmap(fdata, im->fi->fsize);
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,7 +71,6 @@ static int
|
||||||
_load(ImlibImage * im, int load_data)
|
_load(ImlibImage * im, int load_data)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
void *fdata;
|
|
||||||
const unsigned char *fptr;
|
const unsigned char *fptr;
|
||||||
const tga_header *header;
|
const tga_header *header;
|
||||||
const tga_footer *footer;
|
const tga_footer *footer;
|
||||||
|
@ -90,13 +89,8 @@ _load(ImlibImage * im, int load_data)
|
||||||
(uintmax_t) im->fi->fsize > SIZE_MAX)
|
(uintmax_t) im->fi->fsize > SIZE_MAX)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
fdata =
|
fptr = im->fi->fdata;
|
||||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
header = im->fi->fdata;
|
||||||
if (fdata == MAP_FAILED)
|
|
||||||
return LOAD_BADFILE;
|
|
||||||
|
|
||||||
fptr = fdata;
|
|
||||||
header = fdata;
|
|
||||||
|
|
||||||
if (im->fi->fsize > (int)(sizeof(tga_footer)))
|
if (im->fi->fsize > (int)(sizeof(tga_footer)))
|
||||||
{
|
{
|
||||||
|
@ -466,8 +460,6 @@ _load(ImlibImage * im, int load_data)
|
||||||
rc = LOAD_SUCCESS;
|
rc = LOAD_SUCCESS;
|
||||||
|
|
||||||
quit:
|
quit:
|
||||||
munmap(fdata, im->fi->fsize);
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -336,7 +336,6 @@ static int
|
||||||
_load(ImlibImage * im, int load_data)
|
_load(ImlibImage * im, int load_data)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
void *fdata;
|
|
||||||
TIFF *tif = NULL;
|
TIFF *tif = NULL;
|
||||||
uint16_t magic_number;
|
uint16_t magic_number;
|
||||||
TIFFRGBAImage_Extra rgba_image;
|
TIFFRGBAImage_Extra rgba_image;
|
||||||
|
@ -352,17 +351,12 @@ _load(ImlibImage * im, int load_data)
|
||||||
if (im->fi->fsize < (int)TIFF_BYTES_TO_CHECK)
|
if (im->fi->fsize < (int)TIFF_BYTES_TO_CHECK)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
fdata =
|
magic_number = *(const uint16_t *)im->fi->fdata;
|
||||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
|
||||||
if (fdata == MAP_FAILED)
|
|
||||||
return LOAD_BADFILE;
|
|
||||||
|
|
||||||
magic_number = *(uint16_t *) fdata;
|
|
||||||
|
|
||||||
if (magic_number != TIFF_BIGENDIAN && magic_number != TIFF_LITTLEENDIAN)
|
if (magic_number != TIFF_BIGENDIAN && magic_number != TIFF_LITTLEENDIAN)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
mm_init(fdata, im->fi->fsize);
|
mm_init(im->fi->fdata, im->fi->fsize);
|
||||||
|
|
||||||
tif = TIFFClientOpen(im->fi->name, "r", NULL, _tiff_read, _tiff_write,
|
tif = TIFFClientOpen(im->fi->name, "r", NULL, _tiff_read, _tiff_write,
|
||||||
_tiff_seek, _tiff_close, _tiff_size,
|
_tiff_seek, _tiff_close, _tiff_size,
|
||||||
|
@ -450,7 +444,6 @@ _load(ImlibImage * im, int load_data)
|
||||||
TIFFRGBAImageEnd((TIFFRGBAImage *) & rgba_image);
|
TIFFRGBAImageEnd((TIFFRGBAImage *) & rgba_image);
|
||||||
if (tif)
|
if (tif)
|
||||||
TIFFClose(tif);
|
TIFFClose(tif);
|
||||||
munmap(fdata, im->fi->fsize);
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,6 @@ static int
|
||||||
_load(ImlibImage * im, int load_data)
|
_load(ImlibImage * im, int load_data)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
void *fdata;
|
|
||||||
WebPData webp_data;
|
WebPData webp_data;
|
||||||
WebPDemuxer *demux;
|
WebPDemuxer *demux;
|
||||||
WebPIterator iter;
|
WebPIterator iter;
|
||||||
|
@ -24,12 +23,7 @@ _load(ImlibImage * im, int load_data)
|
||||||
if (im->fi->fsize < 12)
|
if (im->fi->fsize < 12)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
fdata =
|
webp_data.bytes = im->fi->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->fi->fsize;
|
webp_data.size = im->fi->fsize;
|
||||||
|
|
||||||
/* Init (includes signature check) */
|
/* Init (includes signature check) */
|
||||||
|
@ -102,7 +96,6 @@ _load(ImlibImage * im, int load_data)
|
||||||
quit:
|
quit:
|
||||||
if (demux)
|
if (demux)
|
||||||
WebPDemuxDelete(demux);
|
WebPDemuxDelete(demux);
|
||||||
munmap(fdata, im->fi->fsize);
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,7 +85,6 @@ static int
|
||||||
_load(ImlibImage * im, int load_data)
|
_load(ImlibImage * im, int load_data)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
void *fdata;
|
|
||||||
char buf[4096], tok1[1024], tok2[1024];
|
char buf[4096], tok1[1024], tok2[1024];
|
||||||
uint32_t *ptr, pixel;
|
uint32_t *ptr, pixel;
|
||||||
int i, x, y, bit, nl;
|
int i, x, y, bit, nl;
|
||||||
|
@ -97,19 +96,14 @@ _load(ImlibImage * im, int load_data)
|
||||||
if (im->fi->fsize < 64)
|
if (im->fi->fsize < 64)
|
||||||
return rc; /* Not XBM */
|
return rc; /* Not XBM */
|
||||||
|
|
||||||
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 */
|
/* Signature check ("#define") allow longish initial comment */
|
||||||
s = fdata;
|
s = im->fi->fdata;
|
||||||
nlen = s[0] == '/' && s[1] == '*' ? 4096 : 256;
|
nlen = s[0] == '/' && s[1] == '*' ? 4096 : 256;
|
||||||
nlen = im->fi->fsize > nlen ? nlen : im->fi->fsize;
|
nlen = im->fi->fsize > nlen ? nlen : im->fi->fsize;
|
||||||
if (!memmem(s, nlen, "#define", 7))
|
if (!memmem(s, nlen, "#define", 7))
|
||||||
goto quit;
|
goto quit;
|
||||||
|
|
||||||
mm_init(fdata, im->fi->fsize);
|
mm_init(im->fi->fdata, im->fi->fsize);
|
||||||
|
|
||||||
ptr = NULL;
|
ptr = NULL;
|
||||||
x = y = 0;
|
x = y = 0;
|
||||||
|
@ -212,8 +206,6 @@ _load(ImlibImage * im, int load_data)
|
||||||
rc = LOAD_SUCCESS;
|
rc = LOAD_SUCCESS;
|
||||||
|
|
||||||
quit:
|
quit:
|
||||||
munmap(fdata, im->fi->fsize);
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -157,7 +157,6 @@ static int
|
||||||
_load(ImlibImage * im, int load_data)
|
_load(ImlibImage * im, int load_data)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
void *fdata;
|
|
||||||
uint32_t *ptr;
|
uint32_t *ptr;
|
||||||
int pc, c, i, j, k, w, h, ncolors, cpp;
|
int pc, c, i, j, k, w, h, ncolors, cpp;
|
||||||
int comment, transp, quote, context, len, done, backslash;
|
int comment, transp, quote, context, len, done, backslash;
|
||||||
|
@ -174,17 +173,13 @@ _load(ImlibImage * im, int load_data)
|
||||||
line = NULL;
|
line = NULL;
|
||||||
cmap = NULL;
|
cmap = NULL;
|
||||||
|
|
||||||
fdata =
|
if (!memmem(im->fi->fdata,
|
||||||
mmap(NULL, im->fi->fsize, PROT_READ, MAP_SHARED, fileno(im->fi->fp), 0);
|
im->fi->fsize <= 256 ? im->fi->fsize : 256, " XPM */", 7))
|
||||||
if (fdata == MAP_FAILED)
|
|
||||||
return LOAD_BADFILE;
|
|
||||||
|
|
||||||
if (!memmem(fdata, im->fi->fsize <= 256 ? im->fi->fsize : 256, " XPM */", 7))
|
|
||||||
goto quit;
|
goto quit;
|
||||||
|
|
||||||
rc = LOAD_BADIMAGE; /* Format accepted */
|
rc = LOAD_BADIMAGE; /* Format accepted */
|
||||||
|
|
||||||
mm_init(fdata, im->fi->fsize);
|
mm_init(im->fi->fdata, im->fi->fsize);
|
||||||
|
|
||||||
j = 0;
|
j = 0;
|
||||||
w = 10;
|
w = 10;
|
||||||
|
@ -473,8 +468,6 @@ _load(ImlibImage * im, int load_data)
|
||||||
|
|
||||||
xpm_parse_done();
|
xpm_parse_done();
|
||||||
|
|
||||||
munmap(fdata, im->fi->fsize);
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue