forked from old/legacy-imlib2
Simplify loader lookup functions
This commit is contained in:
parent
7a2769cad7
commit
5d1e984e57
111
src/lib/image.c
111
src/lib/image.c
|
@ -741,28 +741,13 @@ __imlib_LoadAllLoaders(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
__EXPORT__ ImlibLoader *
|
__EXPORT__ ImlibLoader *
|
||||||
__imlib_FindBestLoaderForFile(const char *file, int for_save)
|
__imlib_FindBestLoaderForFormat(const char *format, int for_save)
|
||||||
{
|
{
|
||||||
char *extension, *lower, *rfile;
|
ImlibLoader *l;
|
||||||
ImlibLoader *l = NULL;
|
|
||||||
|
|
||||||
/* use the file extension for a "best guess" as to what loader to try */
|
if (!format || format[0] == '\0')
|
||||||
/* first at any rate */
|
|
||||||
|
|
||||||
rfile = __imlib_FileRealFile(file);
|
|
||||||
extension = __imlib_FileExtension(rfile);
|
|
||||||
free(rfile);
|
|
||||||
/* change the extensiont o all lower case as all "types" are listed as */
|
|
||||||
/* lower case strings from the loader that represent all the possible */
|
|
||||||
/* extensions that file format could have */
|
|
||||||
lower = extension;
|
|
||||||
while (*lower)
|
|
||||||
{
|
|
||||||
*lower = tolower(*lower);
|
|
||||||
lower++;
|
|
||||||
}
|
|
||||||
if (!extension)
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* go through the loaders - first loader that claims to handle that */
|
/* go through the loaders - first loader that claims to handle that */
|
||||||
/* image type (extension wise) wins as a first guess to use - NOTE */
|
/* image type (extension wise) wins as a first guess to use - NOTE */
|
||||||
/* this is an OPTIMISATION - it is possible the file has no extension */
|
/* this is an OPTIMISATION - it is possible the file has no extension */
|
||||||
|
@ -775,8 +760,7 @@ __imlib_FindBestLoaderForFile(const char *file, int for_save)
|
||||||
/* to be used first next time in this search mechanims - this */
|
/* to be used first next time in this search mechanims - this */
|
||||||
/* assumes you tend to laod a few image types and ones generally */
|
/* assumes you tend to laod a few image types and ones generally */
|
||||||
/* of the same format */
|
/* of the same format */
|
||||||
l = loaders;
|
for (l = loaders; l; l = l->next)
|
||||||
while (l)
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -784,83 +768,44 @@ __imlib_FindBestLoaderForFile(const char *file, int for_save)
|
||||||
for (i = 0; i < l->num_formats; i++)
|
for (i = 0; i < l->num_formats; i++)
|
||||||
{
|
{
|
||||||
/* does it match ? */
|
/* does it match ? */
|
||||||
if (!strcmp(l->formats[i], extension))
|
if (strcasecmp(l->formats[i], format) == 0)
|
||||||
{
|
{
|
||||||
/* does it provide the function we need? */
|
/* does it provide the function we need? */
|
||||||
if ((for_save && l->save) || (!for_save && l->load))
|
if ((for_save && l->save) || (!for_save && l->load))
|
||||||
{
|
goto done;
|
||||||
/* free the memory allocated for the extension */
|
|
||||||
free(extension);
|
|
||||||
/* return the loader */
|
|
||||||
return l;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
l = l->next;
|
|
||||||
}
|
}
|
||||||
/* free the memory allocated for the extension */
|
|
||||||
free(extension);
|
done:
|
||||||
/* return the loader */
|
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
ImlibLoader *
|
__EXPORT__ ImlibLoader *
|
||||||
|
__imlib_FindBestLoaderForFile(const char *file, int for_save)
|
||||||
|
{
|
||||||
|
char *extension;
|
||||||
|
ImlibLoader *l;
|
||||||
|
|
||||||
|
extension = __imlib_FileExtension(file);
|
||||||
|
|
||||||
|
l = __imlib_FindBestLoaderForFormat(extension, for_save);
|
||||||
|
|
||||||
|
free(extension);
|
||||||
|
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ImlibLoader *
|
||||||
__imlib_FindBestLoaderForFileFormat(const char *file, char *format,
|
__imlib_FindBestLoaderForFileFormat(const char *file, char *format,
|
||||||
int for_save)
|
int for_save)
|
||||||
{
|
{
|
||||||
char *extension, *lower;
|
|
||||||
ImlibLoader *l = NULL;
|
|
||||||
|
|
||||||
/* if the format is provided ("png" "jpg" etc.) use that */
|
/* if the format is provided ("png" "jpg" etc.) use that */
|
||||||
|
/* otherwise us the file extension */
|
||||||
if (format)
|
if (format)
|
||||||
extension = strdup(format);
|
return __imlib_FindBestLoaderForFormat(format, for_save);
|
||||||
/* otherwise us the extension */
|
|
||||||
else
|
else
|
||||||
{
|
return __imlib_FindBestLoaderForFile(file, for_save);
|
||||||
extension = __imlib_FileExtension(file);
|
|
||||||
/* change the extension to all lower case as all "types" are listed as */
|
|
||||||
/* lower case strings from the loader that represent all the possible */
|
|
||||||
/* extensions that file format could have */
|
|
||||||
if (extension)
|
|
||||||
{
|
|
||||||
lower = extension;
|
|
||||||
while (*lower)
|
|
||||||
{
|
|
||||||
*lower = tolower(*lower);
|
|
||||||
lower++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!extension)
|
|
||||||
return NULL;
|
|
||||||
/* look through the loaders one by one to see if one matches that format */
|
|
||||||
l = loaders;
|
|
||||||
while (l)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* go through all the formats that loader supports */
|
|
||||||
for (i = 0; i < l->num_formats; i++)
|
|
||||||
{
|
|
||||||
/* does it match ? */
|
|
||||||
if (!strcmp(l->formats[i], extension))
|
|
||||||
{
|
|
||||||
/* does it provide the function we need? */
|
|
||||||
if ((for_save && l->save) || (!for_save && l->load))
|
|
||||||
{
|
|
||||||
/* free the memory allocated for the extension */
|
|
||||||
free(extension);
|
|
||||||
/* return the loader */
|
|
||||||
return l;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
l = l->next;
|
|
||||||
}
|
|
||||||
/* free the memory allocated for the extension */
|
|
||||||
free(extension);
|
|
||||||
/* return the loader */
|
|
||||||
return l;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set or unset the alpha flag on the umage (alpha = 1 / 0 ) */
|
/* set or unset the alpha flag on the umage (alpha = 1 / 0 ) */
|
||||||
|
|
|
@ -143,9 +143,8 @@ void __imlib_CleanupImagePixmapCache(void);
|
||||||
void __imlib_RemoveAllLoaders(void);
|
void __imlib_RemoveAllLoaders(void);
|
||||||
ImlibLoader *__imlib_FindBestLoaderForFile(const char *file,
|
ImlibLoader *__imlib_FindBestLoaderForFile(const char *file,
|
||||||
int for_save);
|
int for_save);
|
||||||
ImlibLoader *__imlib_FindBestLoaderForFileFormat(const char *file,
|
ImlibLoader *__imlib_FindBestLoaderForFormat(const char *format,
|
||||||
char *format,
|
int for_save);
|
||||||
int for_save);
|
|
||||||
void __imlib_SetImageAlphaFlag(ImlibImage * im, char alpha);
|
void __imlib_SetImageAlphaFlag(ImlibImage * im, char alpha);
|
||||||
ImlibImage *__imlib_CreateImage(int w, int h, DATA32 * data);
|
ImlibImage *__imlib_CreateImage(int w, int h, DATA32 * data);
|
||||||
ImlibImage *__imlib_LoadImage(const char *file,
|
ImlibImage *__imlib_LoadImage(const char *file,
|
||||||
|
|
|
@ -62,10 +62,10 @@ load(ImlibImage * im, ImlibProgressFunction progress,
|
||||||
if (!p || p == im->real_file || strcasecmp(p + 1, "bz2") || p == q)
|
if (!p || p == im->real_file || strcasecmp(p + 1, "bz2") || p == q)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!(real_ext = strndup(im->real_file, p - im->real_file)))
|
if (!(real_ext = strndup(q + 1, p - q - 1)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!(loader = __imlib_FindBestLoaderForFile(real_ext, 0)))
|
if (!(loader = __imlib_FindBestLoaderForFormat(real_ext, 0)))
|
||||||
{
|
{
|
||||||
free(real_ext);
|
free(real_ext);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -55,10 +55,10 @@ load(ImlibImage * im, ImlibProgressFunction progress,
|
||||||
if (!p || p == im->real_file || strcasecmp(p + 1, "gz") || p == q)
|
if (!p || p == im->real_file || strcasecmp(p + 1, "gz") || p == q)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!(real_ext = strndup(im->real_file, p - im->real_file)))
|
if (!(real_ext = strndup(q + 1, p - q - 1)))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!(loader = __imlib_FindBestLoaderForFile(real_ext, 0)))
|
if (!(loader = __imlib_FindBestLoaderForFormat(real_ext, 0)))
|
||||||
{
|
{
|
||||||
free(real_ext);
|
free(real_ext);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue