You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
289 lines
7.5 KiB
C
289 lines
7.5 KiB
C
/*
|
|
* modules.c: Dynamically loading the format handlers for save and load
|
|
* operations in Imlib.
|
|
*
|
|
* Author:
|
|
* Miguel de Icaza (miguel@gnu.org).
|
|
*/
|
|
#include <config.h>
|
|
#include <glib.h>
|
|
#include <gmodule.h>
|
|
#include "gdk_imlib.h"
|
|
#define id _gdk_imlib_data
|
|
#include "gdk_imlib_private.h"
|
|
|
|
#ifdef USE_GMODULE
|
|
|
|
static unsigned char *loader_bmp (FILE *f, int *w, int *h, int *t);
|
|
static unsigned char *loader_xpm (FILE *f, int *w, int *h, int *t);
|
|
static unsigned char *loader_gif (FILE *f, int *w, int *h, int *t);
|
|
static unsigned char *loader_tiff (FILE *f, char *n, int *w, int *h, int *t);
|
|
static unsigned char *loader_jpeg (FILE *f, int *w, int *h, int *t);
|
|
static unsigned char *loader_png (FILE *f, int *w, int *h, int *t);
|
|
static unsigned char *loader_ppm (FILE *f, int *w, int *h, int *t);
|
|
|
|
static gint saver_tiff (GdkImlibImage *im, char *file, GdkImlibSaveInfo *info);
|
|
static gint saver_png (GdkImlibImage *im, char *file, GdkImlibSaveInfo *info);
|
|
static gint saver_jpeg (GdkImlibImage *im, char *file, GdkImlibSaveInfo *info);
|
|
static gint saver_ps (GdkImlibImage *im, char *file, GdkImlibSaveInfo *info);
|
|
static gint saver_ppm (GdkImlibImage *im, char *file, GdkImlibSaveInfo *info);
|
|
|
|
static GdkImlibImage *loader_alpha_png (char *file);
|
|
|
|
static GdkImlibImage *inline_png (unsigned char *data, int data_size);
|
|
|
|
#else
|
|
# include "io-png.c"
|
|
# include "io-bmp.c"
|
|
# include "io-gif.c"
|
|
# include "io-jpeg.c"
|
|
# include "io-ppm.c"
|
|
# include "io-ps.c"
|
|
# include "io-tiff.c"
|
|
# include "io-xpm.c"
|
|
#endif
|
|
|
|
gdk_imlib_loader_fn _gdk_imlib_LoadBMP = loader_bmp;
|
|
gdk_imlib_loader_fn _gdk_imlib_LoadXPM = loader_xpm;
|
|
gdk_imlib_loader_fn _gdk_imlib_LoadGIF = loader_gif;
|
|
gdk_imlib_loader_fn2 _gdk_imlib_LoadTIFF = loader_tiff;
|
|
gdk_imlib_loader_fn _gdk_imlib_LoadJPEG = loader_jpeg;
|
|
gdk_imlib_loader_fn _gdk_imlib_LoadPNG = loader_png;
|
|
gdk_imlib_loader_fn _gdk_imlib_LoadPPM = loader_ppm;
|
|
|
|
gdk_imlib_saver_fn _gdk_imlib_SaveTIFF = saver_tiff;
|
|
gdk_imlib_saver_fn _gdk_imlib_SavePNG = saver_png;
|
|
gdk_imlib_saver_fn _gdk_imlib_SaveJPEG = saver_jpeg;
|
|
gdk_imlib_saver_fn _gdk_imlib_SavePS = saver_ps;
|
|
gdk_imlib_saver_fn _gdk_imlib_SavePPM = saver_ppm;
|
|
|
|
gdk_imlib_inline_fn _gdk_imlib_inlined_png_to_image = inline_png;
|
|
gdk_imlib_load_alpha_fn _gdk_imlib_load_alpha_png = loader_alpha_png;
|
|
|
|
#ifdef USE_GMODULE
|
|
static unsigned char *
|
|
load_fail_fn (FILE *f, int *w, int *h, int *t)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static gint
|
|
save_fail_fn (GdkImlibImage *im, char *file, GdkImlibSaveInfo *info)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static gboolean
|
|
get_module_loader_saver (char *mod,
|
|
void **loader, void *def_loader,
|
|
void **saver, void *def_saver)
|
|
{
|
|
char *path, *modname;
|
|
GModule *m;
|
|
gboolean v;
|
|
void *ptr;
|
|
|
|
modname = g_strconcat ("imlib-", mod, NULL);
|
|
path = g_module_build_path (IMLIB_LIB, modname);
|
|
g_free (modname);
|
|
|
|
m = g_module_open (path, G_MODULE_BIND_LAZY);
|
|
g_free (path);
|
|
if (!m){
|
|
if (loader)
|
|
*loader = def_loader;
|
|
if (saver)
|
|
*saver = def_saver;
|
|
return FALSE;
|
|
}
|
|
|
|
if (loader){
|
|
char *loader_name;
|
|
|
|
loader_name = g_strconcat ("loader_", mod, NULL);
|
|
v = g_module_symbol (m, loader_name, (void **) &ptr);
|
|
if (v)
|
|
*loader = ptr;
|
|
else
|
|
*loader = def_loader;
|
|
g_free (loader_name);
|
|
}
|
|
|
|
if (saver){
|
|
char *saver_name;
|
|
|
|
saver_name = g_strconcat ("saver_", mod, NULL);
|
|
v = g_module_symbol (m, saver_name, (void **) &ptr);
|
|
if (v)
|
|
*saver = ptr;
|
|
else
|
|
*saver = def_saver;
|
|
g_free (saver_name);
|
|
}
|
|
|
|
/* Ugly hack, this is an exception */
|
|
if (strcmp (mod, "png") == 0){
|
|
char *inline_name, *alpha_name;
|
|
|
|
inline_name = g_strconcat ("inline_", mod, NULL);
|
|
v = g_module_symbol (m, inline_name, (void **) &ptr);
|
|
if (v)
|
|
_gdk_imlib_inlined_png_to_image = ptr;
|
|
else
|
|
_gdk_imlib_inlined_png_to_image = (gdk_imlib_inline_fn) load_fail_fn;
|
|
g_free (inline_name);
|
|
|
|
alpha_name = g_strconcat ("loader_alpha_", mod, NULL);
|
|
v = g_module_symbol (m, alpha_name, (void **) &ptr);
|
|
if (v)
|
|
_gdk_imlib_load_alpha_png = ptr;
|
|
else
|
|
_gdk_imlib_load_alpha_png = (gdk_imlib_load_alpha_fn) load_fail_fn;
|
|
g_free (alpha_name);
|
|
}
|
|
|
|
return TRUE; /* FIXME: return value is never checked */
|
|
}
|
|
|
|
static unsigned char *
|
|
load_module_relay (char *mod, gdk_imlib_loader_fn *lf, gdk_imlib_saver_fn *sf, FILE *f, int *w, int *h, int *t)
|
|
{
|
|
get_module_loader_saver (mod,
|
|
(void **) lf, (void *) load_fail_fn,
|
|
(void **) sf, (void *) save_fail_fn);
|
|
|
|
return (*lf)(f, w, h, t);
|
|
}
|
|
|
|
static gint
|
|
save_module_relay (char *mod, gdk_imlib_loader_fn *lf, gdk_imlib_saver_fn *sf,
|
|
GdkImlibImage *im, char *fname, GdkImlibSaveInfo *info)
|
|
{
|
|
get_module_loader_saver (mod,
|
|
(void **) lf, (void *) load_fail_fn,
|
|
(void **) sf, (void *) save_fail_fn);
|
|
|
|
return (*sf)(im, fname, info);
|
|
}
|
|
|
|
static unsigned char *
|
|
loader_tiff (FILE *f, char *n, int *w, int *h, int *t)
|
|
{
|
|
get_module_loader_saver ("tiff",
|
|
(void **) &_gdk_imlib_LoadTIFF, (void *) load_fail_fn,
|
|
(void **) &_gdk_imlib_SaveTIFF, (void *) save_fail_fn);
|
|
|
|
return _gdk_imlib_LoadTIFF (f, n, w, h, t);
|
|
}
|
|
|
|
static unsigned char *
|
|
loader_bmp (FILE *f, int *w, int *h, int *t)
|
|
{
|
|
return load_module_relay ("bmp", &_gdk_imlib_LoadBMP, NULL, f, w, h, t);
|
|
}
|
|
|
|
static unsigned char *
|
|
loader_xpm (FILE *f, int *w, int *h, int *t)
|
|
{
|
|
return load_module_relay ("xpm", &_gdk_imlib_LoadXPM, NULL, f, w, h, t);
|
|
}
|
|
|
|
static unsigned char *
|
|
loader_gif (FILE *f, int *w, int *h, int *t)
|
|
{
|
|
return load_module_relay ("gif", &_gdk_imlib_LoadGIF, NULL, f, w, h, t);
|
|
}
|
|
|
|
static unsigned char *
|
|
loader_jpeg (FILE *f, int *w, int *h, int *t)
|
|
{
|
|
return load_module_relay ("jpeg",
|
|
&_gdk_imlib_LoadJPEG,
|
|
&_gdk_imlib_SaveJPEG, f, w, h, t);
|
|
}
|
|
|
|
static unsigned char *
|
|
loader_png (FILE *f, int *w, int *h, int *t)
|
|
{
|
|
return load_module_relay ("png",
|
|
&_gdk_imlib_LoadPNG,
|
|
&_gdk_imlib_SavePNG, f, w, h, t);
|
|
}
|
|
|
|
static unsigned char *
|
|
loader_ppm (FILE *f, int *w, int *h, int *t)
|
|
{
|
|
return load_module_relay ("ppm",
|
|
&_gdk_imlib_LoadPPM,
|
|
&_gdk_imlib_SavePPM, f, w, h, t);
|
|
}
|
|
|
|
static gint
|
|
saver_tiff (GdkImlibImage *im, char *file, GdkImlibSaveInfo *info)
|
|
{
|
|
return save_module_relay ("tiff",
|
|
(gdk_imlib_loader_fn *) &_gdk_imlib_LoadTIFF,
|
|
&_gdk_imlib_SaveTIFF, im, file, info);
|
|
}
|
|
|
|
static gint
|
|
saver_png (GdkImlibImage *im, char *file, GdkImlibSaveInfo *info)
|
|
{
|
|
return save_module_relay ("png",
|
|
&_gdk_imlib_LoadPNG,
|
|
&_gdk_imlib_SavePNG, im, file, info);
|
|
}
|
|
|
|
static gint
|
|
saver_jpeg (GdkImlibImage *im, char *file, GdkImlibSaveInfo *info)
|
|
{
|
|
return save_module_relay ("jpeg",
|
|
&_gdk_imlib_LoadJPEG,
|
|
&_gdk_imlib_SaveJPEG, im, file, info);
|
|
}
|
|
|
|
static gint
|
|
saver_ps (GdkImlibImage *im, char *file, GdkImlibSaveInfo *info)
|
|
{
|
|
return save_module_relay ("ps", NULL, &_gdk_imlib_SavePS, im, file, info);
|
|
}
|
|
|
|
static gint
|
|
saver_ppm (GdkImlibImage *im, char *file, GdkImlibSaveInfo *info)
|
|
{
|
|
return save_module_relay ("ppm", &_gdk_imlib_LoadPPM, &_gdk_imlib_SavePPM, im, file, info);
|
|
}
|
|
|
|
static GdkImlibImage *
|
|
inline_png (unsigned char *data, int data_size)
|
|
{
|
|
get_module_loader_saver ("png",
|
|
(void **) &_gdk_imlib_LoadPNG, load_fail_fn,
|
|
(void **) &_gdk_imlib_SavePNG, save_fail_fn);
|
|
return _gdk_imlib_inlined_png_to_image (data, data_size);
|
|
}
|
|
|
|
static GdkImlibImage *
|
|
loader_alpha_png (char *file)
|
|
{
|
|
get_module_loader_saver ("png",
|
|
(void **) &_gdk_imlib_LoadPNG, load_fail_fn,
|
|
(void **) &_gdk_imlib_SavePNG, save_fail_fn);
|
|
return _gdk_imlib_load_alpha_png (file);
|
|
}
|
|
#endif
|
|
|
|
|
|
GdkImlibImage *
|
|
gdk_imlib_inlined_png_to_image(unsigned char *data, int data_size)
|
|
{
|
|
return _gdk_imlib_inlined_png_to_image (data, data_size);
|
|
}
|
|
|
|
GdkImlibImage *
|
|
gdk_imlib_load_alpha (char *file)
|
|
{
|
|
/* We only support png for now */
|
|
return _gdk_imlib_load_alpha_png (file);
|
|
}
|