diff --git a/pipi/Makefile.am b/pipi/Makefile.am index eba82dd..6b1dfbf 100644 --- a/pipi/Makefile.am +++ b/pipi/Makefile.am @@ -10,31 +10,41 @@ pkgconfigdir = $(libdir)/pkgconfig include_HEADERS = pipi.h +# Conditional sources +codec_cflags = +codec_libs = +codec_sources = + +# The main library lib_LTLIBRARIES = libpipi.la libpipi_la_SOURCES = \ pipi.c \ pipi.h \ pipi_internals.h \ - io.c \ pixels.c \ + codec.c \ resize.c \ + $(codec_sources) \ $(NULL) -libpipi_la_CFLAGS = $(CFLAGS_EXTRA) -libpipi_la_LDFLAGS = $(LDFLAGS_EXTRA) \ +libpipi_la_CFLAGS = $(codec_cflags) +libpipi_la_LDFLAGS = $(codec_libs) \ -no-undefined -version-number @LT_VERSION@ if USE_SDL -CFLAGS_EXTRA = `sdl-config --cflags` -LDFLAGS_EXTRA = `sdl-config --libs` -lSDL_image -else -if USE_IMLIB2 -CFLAGS_EXTRA = @IMLIB2_CFLAGS@ -LDFLAGS_EXTRA = @IMLIB2_LIBS@ -else -if USE_OPENCV -CFLAGS_EXTRA = `opencv-config --cflags` -LDFLAGS_EXTRA = `opencv-config --libs opencv highgui` +codec_cflags += `sdl-config --cflags` +codec_libs += `sdl-config --libs` -lSDL_image +codec_sources += codec/sdl.c endif + +if USE_IMLIB2 +codec_cflags += @IMLIB2_CFLAGS@ +codec_libs += @IMLIB2_LIBS@ +codec_sources += codec/imlib.c endif + +if USE_OPENCV +codec_cflags += `opencv-config --cflags` +codec_libs += `opencv-config --libs opencv highgui` +codec_sources += codec/opencv.c endif diff --git a/pipi/codec.c b/pipi/codec.c new file mode 100644 index 0000000..7af7cd7 --- /dev/null +++ b/pipi/codec.c @@ -0,0 +1,90 @@ +/* + * libpipi Proper image processing implementation library + * Copyright (c) 2004-2008 Sam Hocevar + * All Rights Reserved + * + * $Id$ + * + * This library is free software. It comes without any warranty, to + * the extent permitted by applicable law. You can redistribute it + * and/or modify it under the terms of the Do What The Fuck You Want + * To Public License, Version 2, as published by Sam Hocevar. See + * http://sam.zoy.org/wtfpl/COPYING for more details. + */ + +/* + * codec.c: image I/O functions + */ + +#include +#include + +#include "config.h" +#include "common.h" + +#include "pipi.h" +#include "pipi_internals.h" + +pipi_image_t *pipi_load(const char *name) +{ +#if USE_SDL + return pipi_load_sdl(name); +#elif USE_IMLIB2 + return pipi_load_imlib2(name); +#elif USE_OPENCV + return pipi_load_opencv(name); +#else +# error "No imaging library" +#endif +} + +pipi_image_t *pipi_new(int width, int height) +{ +#if USE_SDL + return pipi_new_sdl(width, height); +#elif USE_IMLIB2 + return pipi_new_imlib2(width, height); +#elif USE_OPENCV + return pipi_new_opencv(width, height); +#endif +} + +pipi_image_t *pipi_copy(pipi_image_t const *img) +{ + pipi_image_t *dst; + int x, y; + dst = pipi_new(img->width, img->height); + for(y = 0; y < img->height; y++) + { + for(x = 0; x < img->width; x++) + { + double r, g, b; + pipi_getpixel(img, x, y, &r, &g, &b); + pipi_setpixel(dst, x, y, r, g, b); + } + } + return dst; +} + +void pipi_free(pipi_image_t *img) +{ +#if USE_SDL + return pipi_free_sdl(img); +#elif USE_IMLIB2 + return pipi_free_imlib2(img); +#elif USE_OPENCV + return pipi_free_opencv(img); +#endif +} + +void pipi_save(pipi_image_t *img, const char *name) +{ +#if USE_SDL + return pipi_save_sdl(img, name); +#elif USE_IMLIB2 + return pipi_save_imlib2(img, name); +#elif USE_OPENCV + return pipi_save_opencv(img, name); +#endif +} + diff --git a/pipi/codec/imlib.c b/pipi/codec/imlib.c new file mode 100644 index 0000000..d10138e --- /dev/null +++ b/pipi/codec/imlib.c @@ -0,0 +1,84 @@ +/* + * libpipi Proper image processing implementation library + * Copyright (c) 2004-2008 Sam Hocevar + * All Rights Reserved + * + * $Id$ + * + * This library is free software. It comes without any warranty, to + * the extent permitted by applicable law. You can redistribute it + * and/or modify it under the terms of the Do What The Fuck You Want + * To Public License, Version 2, as published by Sam Hocevar. See + * http://sam.zoy.org/wtfpl/COPYING for more details. + */ + +/* + * imlib.c: ImLib I/O functions + */ + +#include "config.h" +#include "common.h" + +#include +#include +#include + +#include + +#include "pipi.h" +#include "pipi_internals.h" + +pipi_image_t *pipi_load_imlib2(const char *name) +{ + pipi_image_t *img; + Imlib_Image priv = imlib_load_image(name); + + if(!priv) + return NULL; + + img = (pipi_image_t *)malloc(sizeof(pipi_image_t)); + imlib_context_set_image(priv); + img->width = imlib_image_get_width(); + img->height = imlib_image_get_height(); + img->pitch = 4 * imlib_image_get_width(); + img->channels = 4; + img->pixels = (char *)imlib_image_get_data(); + img->priv = (void *)priv; + + return img; +} + +pipi_image_t *pipi_new_imlib2(int width, int height) +{ + pipi_image_t *img; + Imlib_Image priv = imlib_create_image(width, height); + + if(!priv) + return NULL; + + img = (pipi_image_t *)malloc(sizeof(pipi_image_t)); + imlib_context_set_image(priv); + img->width = imlib_image_get_width(); + img->height = imlib_image_get_height(); + img->pitch = 4 * imlib_image_get_width(); + img->channels = 4; + img->pixels = (char *)imlib_image_get_data(); + img->priv = (void *)priv; + + return img; +} + +void pipi_free_imlib2(pipi_image_t *img) +{ + imlib_context_set_image(img->priv); + imlib_free_image(); + + free(img); +} + +void pipi_save_imlib2(pipi_image_t *img, const char *name) +{ + imlib_context_set_image(img->priv); + imlib_save_image(name); +} + diff --git a/pipi/codec/opencv.c b/pipi/codec/opencv.c new file mode 100644 index 0000000..d9f33ad --- /dev/null +++ b/pipi/codec/opencv.c @@ -0,0 +1,83 @@ +/* + * libpipi Proper image processing implementation library + * Copyright (c) 2004-2008 Sam Hocevar + * All Rights Reserved + * + * $Id$ + * + * This library is free software. It comes without any warranty, to + * the extent permitted by applicable law. You can redistribute it + * and/or modify it under the terms of the Do What The Fuck You Want + * To Public License, Version 2, as published by Sam Hocevar. See + * http://sam.zoy.org/wtfpl/COPYING for more details. + */ + +/* + * image.c: image I/O functions + */ + +#include "config.h" +#include "common.h" + +#include +#include +#include + +#include +#include + +#include "pipi.h" +#include "pipi_internals.h" + +pipi_image_t *pipi_load_opencv(const char *name) +{ + pipi_image_t *img; + IplImage *priv = cvLoadImage(name, -1); + + if(!priv) + return NULL; + + img = (pipi_image_t *)malloc(sizeof(pipi_image_t)); + img->width = priv->width; + img->height = priv->height; + img->pitch = priv->widthStep; + img->channels = priv->nChannels; + img->pixels = priv->imageData; + img->priv = (void *)priv; + + return img; +} + +pipi_image_t *pipi_new_opencv(int width, int height) +{ + pipi_image_t *img; + IplImage *priv = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3); + + if(!priv) + return NULL; + + img = (pipi_image_t *)malloc(sizeof(pipi_image_t)); + img->width = priv->width; + img->height = priv->height; + img->pitch = priv->widthStep; + img->channels = priv->nChannels; + img->pixels = priv->imageData; + img->priv = (void *)priv; + + return img; +} + +void pipi_free_opencv(pipi_image_t *img) +{ + IplImage *iplimg; + iplimg = (IplImage *)img->priv; + cvReleaseImage(&iplimg); + + free(img); +} + +void pipi_save_opencv(pipi_image_t *img, const char *name) +{ + cvSaveImage(name, img->priv); +} + diff --git a/pipi/codec/sdl.c b/pipi/codec/sdl.c new file mode 100644 index 0000000..fdd6d93 --- /dev/null +++ b/pipi/codec/sdl.c @@ -0,0 +1,102 @@ +/* + * libpipi Proper image processing implementation library + * Copyright (c) 2004-2008 Sam Hocevar + * All Rights Reserved + * + * $Id$ + * + * This library is free software. It comes without any warranty, to + * the extent permitted by applicable law. You can redistribute it + * and/or modify it under the terms of the Do What The Fuck You Want + * To Public License, Version 2, as published by Sam Hocevar. See + * http://sam.zoy.org/wtfpl/COPYING for more details. + */ + +/* + * sdl.c: SDL_image I/O functions + */ + +#include "config.h" +#include "common.h" + +#include +#include +#include + +#include + +#include "pipi.h" +#include "pipi_internals.h" + +pipi_image_t *pipi_load_sdl(const char *name) +{ + pipi_image_t *img; + SDL_Surface *priv = IMG_Load(name); + + if(!priv) + return NULL; + + if(priv->format->BytesPerPixel == 1) + { + img = pipi_new(priv->w, priv->h); + SDL_BlitSurface(priv, NULL, img->priv, NULL); + SDL_FreeSurface(priv); + return img; + } + + img = (pipi_image_t *)malloc(sizeof(pipi_image_t)); + img->width = priv->w; + img->height = priv->h; + img->pitch = priv->pitch; + img->channels = priv->format->BytesPerPixel; + img->pixels = priv->pixels; + img->priv = (void *)priv; + + return img; +} + +pipi_image_t *pipi_new_sdl(int width, int height) +{ + pipi_image_t *img; + SDL_Surface *priv; + Uint32 rmask, gmask, bmask, amask; +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + rmask = 0xff000000; + gmask = 0x00ff0000; + bmask = 0x0000ff00; + amask = 0x00000000; +#else + rmask = 0x000000ff; + gmask = 0x0000ff00; + bmask = 0x00ff0000; + amask = 0x00000000; +#endif + priv = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 32, + rmask, gmask, bmask, amask); + + if(!priv) + return NULL; + + img = (pipi_image_t *)malloc(sizeof(pipi_image_t)); + img->width = priv->w; + img->height = priv->h; + img->pitch = priv->pitch; + img->channels = priv->format->BytesPerPixel; + img->pixels = priv->pixels; + img->priv = (void *)priv; + + return img; +} + +void pipi_free_sdl(pipi_image_t *img) +{ + SDL_FreeSurface(img->priv); + + free(img); +} + +void pipi_save_sdl(pipi_image_t *img, const char *name) +{ + SDL_SaveBMP(img->priv, name); +} + diff --git a/pipi/io.c b/pipi/io.c deleted file mode 100644 index 08e5437..0000000 --- a/pipi/io.c +++ /dev/null @@ -1,188 +0,0 @@ -/* - * libpipi Proper image processing implementation library - * Copyright (c) 2004-2008 Sam Hocevar - * All Rights Reserved - * - * $Id$ - * - * This library is free software. It comes without any warranty, to - * the extent permitted by applicable law. You can redistribute it - * and/or modify it under the terms of the Do What The Fuck You Want - * To Public License, Version 2, as published by Sam Hocevar. See - * http://sam.zoy.org/wtfpl/COPYING for more details. - */ - -/* - * image.c: image I/O functions - */ - -#include -#include -#include - -#include "config.h" -#include "common.h" - -#if defined(HAVE_SDL_IMAGE_H) -# include -#elif defined(HAVE_IMLIB2_H) -# include -#elif defined(HAVE_CV_H) -# include -# include -#else -# error "No imaging library" -#endif - -#include "pipi_internals.h" -#include "pipi.h" - -pipi_image_t *pipi_load(const char *name) -{ - pipi_image_t *img; -#if defined(HAVE_SDL_IMAGE_H) - SDL_Surface *priv = IMG_Load(name); -#elif defined(HAVE_IMLIB2_H) - Imlib_Image priv = imlib_load_image(name); -#elif defined(HAVE_CV_H) - IplImage *priv = cvLoadImage(name, -1); -#endif - - if(!priv) - return NULL; - -#if defined(HAVE_SDL_IMAGE_H) - if(priv->format->BytesPerPixel == 1) - { - img = pipi_new(priv->w, priv->h); - SDL_BlitSurface(priv, NULL, img->priv, NULL); - SDL_FreeSurface(priv); - return img; - } -#endif - - img = (pipi_image_t *)malloc(sizeof(pipi_image_t)); -#if defined(HAVE_SDL_IMAGE_H) - img->width = priv->w; - img->height = priv->h; - img->pitch = priv->pitch; - img->channels = priv->format->BytesPerPixel; - img->pixels = priv->pixels; -#elif defined(HAVE_IMLIB2_H) - imlib_context_set_image(priv); - img->width = imlib_image_get_width(); - img->height = imlib_image_get_height(); - img->pitch = 4 * imlib_image_get_width(); - img->channels = 4; - img->pixels = (char *)imlib_image_get_data(); -#elif defined(HAVE_CV_H) - img->width = priv->width; - img->height = priv->height; - img->pitch = priv->widthStep; - img->channels = priv->nChannels; - img->pixels = priv->imageData; -#endif - img->priv = (void *)priv; - - return img; -} - -pipi_image_t *pipi_new(int width, int height) -{ - pipi_image_t *img; -#if defined(HAVE_SDL_IMAGE_H) - SDL_Surface *priv; - Uint32 rmask, gmask, bmask, amask; -# if SDL_BYTEORDER == SDL_BIG_ENDIAN - rmask = 0xff000000; - gmask = 0x00ff0000; - bmask = 0x0000ff00; - amask = 0x00000000; -# else - rmask = 0x000000ff; - gmask = 0x0000ff00; - bmask = 0x00ff0000; - amask = 0x00000000; -# endif - priv = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 32, - rmask, gmask, bmask, amask); -#elif defined(HAVE_IMLIB2_H) - Imlib_Image priv = imlib_create_image(width, height); -#elif defined(HAVE_CV_H) - IplImage *priv = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3); -#endif - - if(!priv) - return NULL; - - img = (pipi_image_t *)malloc(sizeof(pipi_image_t)); -#if defined(HAVE_SDL_IMAGE_H) - img->width = priv->w; - img->height = priv->h; - img->pitch = priv->pitch; - img->channels = priv->format->BytesPerPixel; - img->pixels = priv->pixels; -#elif defined(HAVE_IMLIB2_H) - imlib_context_set_image(priv); - img->width = imlib_image_get_width(); - img->height = imlib_image_get_height(); - img->pitch = 4 * imlib_image_get_width(); - img->channels = 4; - img->pixels = (char *)imlib_image_get_data(); -#elif defined(HAVE_CV_H) - img->width = priv->width; - img->height = priv->height; - img->pitch = priv->widthStep; - img->channels = priv->nChannels; - img->pixels = priv->imageData; -#endif - img->priv = (void *)priv; - - return img; -} - -pipi_image_t *pipi_copy(pipi_image_t const *img) -{ - pipi_image_t *dst; - int x, y; - dst = pipi_new(img->width, img->height); - for(y = 0; y < img->height; y++) - { - for(x = 0; x < img->width; x++) - { - int r, g, b; - pipi_getpixel(img, x, y, &r, &g, &b); - pipi_setpixel(dst, x, y, r, g, b); - } - } - return dst; -} - -void pipi_free(pipi_image_t *img) -{ -#if defined(HAVE_SDL_IMAGE_H) - SDL_FreeSurface(img->priv); -#elif defined(HAVE_IMLIB2_H) - imlib_context_set_image(img->priv); - imlib_free_image(); -#elif defined(HAVE_CV_H) - IplImage *iplimg; - iplimg = (IplImage *)img->priv; - cvReleaseImage(&iplimg); -#endif - - free(img); -} - -void pipi_save(pipi_image_t *img, const char *name) -{ -#if defined(HAVE_SDL_IMAGE_H) - SDL_SaveBMP(img->priv, name); -#elif defined(HAVE_IMLIB2_H) - imlib_context_set_image(img->priv); - imlib_save_image(name); -#elif defined(HAVE_CV_H) - cvSaveImage(name, img->priv); -#endif -} - diff --git a/pipi/pipi_internals.h b/pipi/pipi_internals.h index 17f7efd..bc0fd77 100644 --- a/pipi/pipi_internals.h +++ b/pipi/pipi_internals.h @@ -13,7 +13,7 @@ */ /* - * pipi_internals.h: internal types + * pipi_internals.h: internal types */ #ifndef __CACA_INTERNALS_H__ @@ -26,5 +26,26 @@ struct pipi_image void *priv; }; +#ifdef USE_IMLIB2 +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); +#endif + +#ifdef USE_OPENCV +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); +#endif + +#ifdef USE_SDL +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); +#endif + #endif /* __PIPI_INTERNALS_H__ */