|
|
@@ -15,11 +15,13 @@ |
|
|
|
#include "config.h" |
|
|
|
#include "common.h" |
|
|
|
|
|
|
|
#if defined(HAVE_CV_H) |
|
|
|
# include <cv.h> |
|
|
|
# include <highgui.h> |
|
|
|
#if defined(HAVE_SDL_IMAGE_H) |
|
|
|
# include <SDL_image.h> |
|
|
|
#elif defined(HAVE_IMLIB2_H) |
|
|
|
# include <Imlib2.h> |
|
|
|
#elif defined(HAVE_CV_H) |
|
|
|
# include <cv.h> |
|
|
|
# include <highgui.h> |
|
|
|
#else |
|
|
|
# error "No imaging library" |
|
|
|
#endif |
|
|
@@ -27,22 +29,24 @@ |
|
|
|
struct image *image_load(char *name) |
|
|
|
{ |
|
|
|
struct image *img; |
|
|
|
#if defined(HAVE_CV_H) |
|
|
|
IplImage *priv = cvLoadImage(name, -1); |
|
|
|
#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; |
|
|
|
|
|
|
|
img = malloc(sizeof(struct image)); |
|
|
|
#if defined(HAVE_CV_H) |
|
|
|
img->width = priv->width; |
|
|
|
img->height = priv->height; |
|
|
|
img->pitch = priv->widthStep; |
|
|
|
img->channels = priv->nChannels; |
|
|
|
img->pixels = priv->imageData; |
|
|
|
#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(); |
|
|
@@ -50,6 +54,12 @@ struct image *image_load(char *name) |
|
|
|
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; |
|
|
|
|
|
|
@@ -59,22 +69,38 @@ struct image *image_load(char *name) |
|
|
|
struct image *image_new(int width, int height) |
|
|
|
{ |
|
|
|
struct image *img; |
|
|
|
#if defined(HAVE_CV_H) |
|
|
|
IplImage *priv = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3); |
|
|
|
#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 = 0x000000ff; |
|
|
|
# else |
|
|
|
rmask = 0x000000ff; |
|
|
|
gmask = 0x0000ff00; |
|
|
|
bmask = 0x00ff0000; |
|
|
|
amask = 0xff000000; |
|
|
|
# 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 = malloc(sizeof(struct image)); |
|
|
|
#if defined(HAVE_CV_H) |
|
|
|
img->width = priv->width; |
|
|
|
img->height = priv->height; |
|
|
|
img->pitch = priv->widthStep; |
|
|
|
img->channels = priv->nChannels; |
|
|
|
img->pixels = priv->imageData; |
|
|
|
#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(); |
|
|
@@ -82,6 +108,12 @@ struct image *image_new(int width, int 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; |
|
|
|
|
|
|
@@ -90,13 +122,15 @@ struct image *image_new(int width, int height) |
|
|
|
|
|
|
|
void image_free(struct image *img) |
|
|
|
{ |
|
|
|
#if defined(HAVE_CV_H) |
|
|
|
IplImage *iplimg; |
|
|
|
iplimg = (IplImage *)img->priv; |
|
|
|
cvReleaseImage(&iplimg); |
|
|
|
#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); |
|
|
@@ -146,14 +180,8 @@ int setpixel(struct image *img, int x, int y, int r, int g, int b) |
|
|
|
|
|
|
|
void image_display(struct image *img) |
|
|
|
{ |
|
|
|
#if defined(HAVE_CV_H) |
|
|
|
char name[BUFSIZ]; |
|
|
|
sprintf(name, "Image %p (%i x %i)", img, img->width, img->height); |
|
|
|
cvNamedWindow(name, 0); |
|
|
|
cvShowImage(name, img->priv); |
|
|
|
cvResizeWindow(name, img->width * 2, img->height * 2 + 50); |
|
|
|
while((unsigned char)cvWaitKey(0) != 0x1b) |
|
|
|
; |
|
|
|
#if defined(HAVE_SDL_IMAGE_H) |
|
|
|
//Nothing to do here |
|
|
|
#elif defined(HAVE_IMLIB2_H) |
|
|
|
//char name[BUFSIZ]; |
|
|
|
//static int i = 0; |
|
|
@@ -161,6 +189,14 @@ void image_display(struct image *img) |
|
|
|
//imlib_context_set_image(img->priv); |
|
|
|
//imlib_save_image(name); |
|
|
|
//fprintf(stderr, "saved to %s\n", name); |
|
|
|
#elif defined(HAVE_CV_H) |
|
|
|
char name[BUFSIZ]; |
|
|
|
sprintf(name, "Image %p (%i x %i)", img, img->width, img->height); |
|
|
|
cvNamedWindow(name, 0); |
|
|
|
cvShowImage(name, img->priv); |
|
|
|
cvResizeWindow(name, img->width * 2, img->height * 2 + 50); |
|
|
|
while((unsigned char)cvWaitKey(0) != 0x1b) |
|
|
|
; |
|
|
|
#endif |
|
|
|
} |
|
|
|
|