git-svn-id: file:///srv/caca.zoy.org/var/lib/svn/libpipi/trunk@2837 92316355-f0b4-4df1-b90c-862c8a59935fremotes/tiles
| @@ -28,21 +28,28 @@ | |||||
| pipi_image_t *pipi_load(char const *name) | pipi_image_t *pipi_load(char const *name) | ||||
| { | { | ||||
| pipi_image_t *ret = NULL; | |||||
| if(!strncmp(name, "random:", 7) || | if(!strncmp(name, "random:", 7) || | ||||
| !strncmp(name, "ediff:", 6) || | !strncmp(name, "ediff:", 6) || | ||||
| !strncmp(name, "halftone:", 6) || | !strncmp(name, "halftone:", 6) || | ||||
| !strncmp(name, "bayer:", 6)) | !strncmp(name, "bayer:", 6)) | ||||
| return pipi_load_stock(name); | |||||
| ret = pipi_load_stock(name); | |||||
| #if USE_IMLIB2 | #if USE_IMLIB2 | ||||
| return pipi_load_imlib2(name); | |||||
| #elif USE_OPENCV | |||||
| return pipi_load_opencv(name); | |||||
| #elif USE_SDL | |||||
| return pipi_load_sdl(name); | |||||
| #else | |||||
| # error "No imaging library" | |||||
| if(!ret) | |||||
| ret = pipi_load_imlib2(name); | |||||
| #endif | |||||
| #if USE_OPENCV | |||||
| if(!ret) | |||||
| ret = pipi_load_opencv(name); | |||||
| #endif | |||||
| #if USE_SDL | |||||
| if(!ret) | |||||
| ret = pipi_load_sdl(name); | |||||
| #endif | #endif | ||||
| return ret; | |||||
| } | } | ||||
| void pipi_free(pipi_image_t *img) | void pipi_free(pipi_image_t *img) | ||||
| @@ -54,25 +61,28 @@ void pipi_free(pipi_image_t *img) | |||||
| free(img->p[i].pixels); | free(img->p[i].pixels); | ||||
| if(img->codec_priv) | if(img->codec_priv) | ||||
| #if USE_IMLIB2 | |||||
| pipi_free_imlib2(img); | |||||
| #elif USE_OPENCV | |||||
| pipi_free_opencv(img); | |||||
| #elif USE_SDL | |||||
| pipi_free_sdl(img); | |||||
| #endif | |||||
| img->codec_free(img); | |||||
| free(img); | free(img); | ||||
| } | } | ||||
| void pipi_save(pipi_image_t *img, const char *name) | |||||
| int pipi_save(pipi_image_t *img, const char *name) | |||||
| { | { | ||||
| int ret = -1; | |||||
| #if USE_IMLIB2 | #if USE_IMLIB2 | ||||
| return pipi_save_imlib2(img, name); | |||||
| #elif USE_OPENCV | |||||
| return pipi_save_opencv(img, name); | |||||
| #elif USE_SDL | |||||
| return pipi_save_sdl(img, name); | |||||
| if(ret < 0) | |||||
| ret = pipi_save_imlib2(img, name); | |||||
| #endif | |||||
| #if USE_OPENCV | |||||
| if(ret < 0) | |||||
| ret = pipi_save_opencv(img, name); | |||||
| #endif | #endif | ||||
| #if USE_SDL | |||||
| if(ret < 0) | |||||
| ret = pipi_save_sdl(img, name); | |||||
| #endif | |||||
| return ret; | |||||
| } | } | ||||
| @@ -28,6 +28,8 @@ | |||||
| #include "pipi.h" | #include "pipi.h" | ||||
| #include "pipi_internals.h" | #include "pipi_internals.h" | ||||
| static int pipi_free_imlib2(pipi_image_t *); | |||||
| pipi_image_t *pipi_load_imlib2(const char *name) | pipi_image_t *pipi_load_imlib2(const char *name) | ||||
| { | { | ||||
| pipi_image_t *img; | pipi_image_t *img; | ||||
| @@ -49,6 +51,7 @@ pipi_image_t *pipi_load_imlib2(const char *name) | |||||
| img->codec_priv = (void *)priv; | img->codec_priv = (void *)priv; | ||||
| img->codec_format = PIPI_PIXELS_RGBA_C; | img->codec_format = PIPI_PIXELS_RGBA_C; | ||||
| img->codec_free = pipi_free_imlib2; | |||||
| img->wrap = 0; | img->wrap = 0; | ||||
| img->u8 = 1; | img->u8 = 1; | ||||
| @@ -56,13 +59,7 @@ pipi_image_t *pipi_load_imlib2(const char *name) | |||||
| return img; | return img; | ||||
| } | } | ||||
| void pipi_free_imlib2(pipi_image_t *img) | |||||
| { | |||||
| imlib_context_set_image(img->codec_priv); | |||||
| imlib_free_image(); | |||||
| } | |||||
| void pipi_save_imlib2(pipi_image_t *img, const char *name) | |||||
| int pipi_save_imlib2(pipi_image_t *img, const char *name) | |||||
| { | { | ||||
| if(!img->codec_priv) | if(!img->codec_priv) | ||||
| { | { | ||||
| @@ -97,5 +94,19 @@ void pipi_save_imlib2(pipi_image_t *img, const char *name) | |||||
| pipi_getpixels(img, img->codec_format); | pipi_getpixels(img, img->codec_format); | ||||
| imlib_context_set_image(img->codec_priv); | imlib_context_set_image(img->codec_priv); | ||||
| imlib_save_image(name); | imlib_save_image(name); | ||||
| return 0; | |||||
| } | |||||
| /* | |||||
| * XXX: The following functions are local. | |||||
| */ | |||||
| static int pipi_free_imlib2(pipi_image_t *img) | |||||
| { | |||||
| imlib_context_set_image(img->codec_priv); | |||||
| imlib_free_image(); | |||||
| return 0; | |||||
| } | } | ||||
| @@ -31,6 +31,8 @@ | |||||
| /* FIXME: this whole file is broken until we support BGR24 images */ | /* FIXME: this whole file is broken until we support BGR24 images */ | ||||
| static int pipi_free_opencv(pipi_image_t *); | |||||
| pipi_image_t *pipi_load_opencv(const char *name) | pipi_image_t *pipi_load_opencv(const char *name) | ||||
| { | { | ||||
| pipi_image_t *img; | pipi_image_t *img; | ||||
| @@ -52,6 +54,7 @@ pipi_image_t *pipi_load_opencv(const char *name) | |||||
| img->codec_priv = (void *)priv; | img->codec_priv = (void *)priv; | ||||
| img->codec_format = PIPI_PIXELS_BGR_C; | img->codec_format = PIPI_PIXELS_BGR_C; | ||||
| img->codec_free = pipi_free_opencv; | |||||
| img->wrap = 0; | img->wrap = 0; | ||||
| img->u8 = 1; | img->u8 = 1; | ||||
| @@ -59,14 +62,7 @@ pipi_image_t *pipi_load_opencv(const char *name) | |||||
| return img; | return img; | ||||
| } | } | ||||
| void pipi_free_opencv(pipi_image_t *img) | |||||
| { | |||||
| IplImage *iplimg; | |||||
| iplimg = (IplImage *)img->codec_priv; | |||||
| cvReleaseImage(&iplimg); | |||||
| } | |||||
| void pipi_save_opencv(pipi_image_t *img, const char *name) | |||||
| int pipi_save_opencv(pipi_image_t *img, const char *name) | |||||
| { | { | ||||
| if(!img->codec_priv) | if(!img->codec_priv) | ||||
| { | { | ||||
| @@ -97,5 +93,20 @@ void pipi_save_opencv(pipi_image_t *img, const char *name) | |||||
| pipi_getpixels(img, img->codec_format); | pipi_getpixels(img, img->codec_format); | ||||
| cvSaveImage(name, img->codec_priv); | cvSaveImage(name, img->codec_priv); | ||||
| return 0; | |||||
| } | |||||
| /* | |||||
| * XXX: The following functions are local. | |||||
| */ | |||||
| static int pipi_free_opencv(pipi_image_t *img) | |||||
| { | |||||
| IplImage *iplimg; | |||||
| iplimg = (IplImage *)img->codec_priv; | |||||
| cvReleaseImage(&iplimg); | |||||
| return 0; | |||||
| } | } | ||||
| @@ -28,6 +28,7 @@ | |||||
| #include "pipi.h" | #include "pipi.h" | ||||
| #include "pipi_internals.h" | #include "pipi_internals.h" | ||||
| static int pipi_free_sdl(pipi_image_t *); | |||||
| static SDL_Surface *create_32bpp_surface(int w, int h); | static SDL_Surface *create_32bpp_surface(int w, int h); | ||||
| pipi_image_t *pipi_load_sdl(const char *name) | pipi_image_t *pipi_load_sdl(const char *name) | ||||
| @@ -58,6 +59,7 @@ pipi_image_t *pipi_load_sdl(const char *name) | |||||
| img->codec_priv = (void *)priv; | img->codec_priv = (void *)priv; | ||||
| img->codec_format = PIPI_PIXELS_RGBA_C; | img->codec_format = PIPI_PIXELS_RGBA_C; | ||||
| img->codec_free = pipi_free_sdl; | |||||
| img->wrap = 0; | img->wrap = 0; | ||||
| img->u8 = 1; | img->u8 = 1; | ||||
| @@ -65,12 +67,7 @@ pipi_image_t *pipi_load_sdl(const char *name) | |||||
| return img; | return img; | ||||
| } | } | ||||
| void pipi_free_sdl(pipi_image_t *img) | |||||
| { | |||||
| SDL_FreeSurface(img->codec_priv); | |||||
| } | |||||
| void pipi_save_sdl(pipi_image_t *img, const char *name) | |||||
| int pipi_save_sdl(pipi_image_t *img, const char *name) | |||||
| { | { | ||||
| if(!img->codec_priv) | if(!img->codec_priv) | ||||
| { | { | ||||
| @@ -100,12 +97,21 @@ void pipi_save_sdl(pipi_image_t *img, const char *name) | |||||
| pipi_getpixels(img, img->codec_format); | pipi_getpixels(img, img->codec_format); | ||||
| SDL_SaveBMP(img->codec_priv, name); | SDL_SaveBMP(img->codec_priv, name); | ||||
| return 0; | |||||
| } | } | ||||
| /* | /* | ||||
| * The following functions are local. | |||||
| * XXX: The following functions are local. | |||||
| */ | */ | ||||
| static int pipi_free_sdl(pipi_image_t *img) | |||||
| { | |||||
| SDL_FreeSurface(img->codec_priv); | |||||
| return 0; | |||||
| } | |||||
| static SDL_Surface *create_32bpp_surface(int w, int h) | static SDL_Surface *create_32bpp_surface(int w, int h) | ||||
| { | { | ||||
| Uint32 rmask, gmask, bmask, amask; | Uint32 rmask, gmask, bmask, amask; | ||||
| @@ -116,7 +116,7 @@ extern pipi_image_t *pipi_load_stock(char const *); | |||||
| extern pipi_image_t *pipi_new(int, int); | extern pipi_image_t *pipi_new(int, int); | ||||
| extern pipi_image_t *pipi_copy(pipi_image_t *); | extern pipi_image_t *pipi_copy(pipi_image_t *); | ||||
| extern void pipi_free(pipi_image_t *); | extern void pipi_free(pipi_image_t *); | ||||
| extern void pipi_save(pipi_image_t *, const char *); | |||||
| extern int pipi_save(pipi_image_t *, const char *); | |||||
| extern pipi_pixels_t *pipi_getpixels(pipi_image_t *, pipi_format_t); | extern pipi_pixels_t *pipi_getpixels(pipi_image_t *, pipi_format_t); | ||||
| extern int pipi_get_image_width(pipi_image_t *img); | extern int pipi_get_image_width(pipi_image_t *img); | ||||
| @@ -56,6 +56,7 @@ struct pipi_image | |||||
| /* Private data used by the codec */ | /* Private data used by the codec */ | ||||
| pipi_format_t codec_format; | pipi_format_t codec_format; | ||||
| void *codec_priv; | void *codec_priv; | ||||
| int (*codec_free)(pipi_image_t *); | |||||
| }; | }; | ||||
| struct pipi_context | struct pipi_context | ||||
| @@ -66,23 +67,17 @@ struct pipi_context | |||||
| #ifdef USE_IMLIB2 | #ifdef USE_IMLIB2 | ||||
| pipi_image_t *pipi_load_imlib2(const char *name); | pipi_image_t *pipi_load_imlib2(const char *name); | ||||
| pipi_image_t *pipi_new_imlib2(int width, int height); | |||||
| void pipi_free_imlib2(pipi_image_t *img); | |||||
| void pipi_save_imlib2(pipi_image_t *img, const char *name); | |||||
| int pipi_save_imlib2(pipi_image_t *img, const char *name); | |||||
| #endif | #endif | ||||
| #ifdef USE_OPENCV | #ifdef USE_OPENCV | ||||
| pipi_image_t *pipi_load_opencv(const char *name); | pipi_image_t *pipi_load_opencv(const char *name); | ||||
| pipi_image_t *pipi_new_opencv(int width, int height); | |||||
| void pipi_free_opencv(pipi_image_t *img); | |||||
| void pipi_save_opencv(pipi_image_t *img, const char *name); | |||||
| int pipi_save_opencv(pipi_image_t *img, const char *name); | |||||
| #endif | #endif | ||||
| #ifdef USE_SDL | #ifdef USE_SDL | ||||
| pipi_image_t *pipi_load_sdl(const char *name); | pipi_image_t *pipi_load_sdl(const char *name); | ||||
| pipi_image_t *pipi_new_sdl(int width, int height); | |||||
| void pipi_free_sdl(pipi_image_t *img); | |||||
| void pipi_save_sdl(pipi_image_t *img, const char *name); | |||||
| int pipi_save_sdl(pipi_image_t *img, const char *name); | |||||
| #endif | #endif | ||||
| #endif /* __PIPI_INTERNALS_H__ */ | #endif /* __PIPI_INTERNALS_H__ */ | ||||