#include #include #include #include #include #include "image.h" Image *load_image(char *filename) { Image *img; ILuint image_name; ILenum error; char *error_str; ILint cur_format; ilGenImages(1, &image_name); ilBindImage(image_name); // Force OpenGL-compatible row order. ilEnable(IL_ORIGIN_SET); ilOriginFunc(IL_ORIGIN_LOWER_LEFT); if (ilLoadImage(filename)) { cur_format = ilGetInteger(IL_IMAGE_FORMAT); if ( cur_format == IL_COLOR_INDEX ) { printf("DEBUG: load_image: Image format for \"%s\" is COLOR_INDEX, converting to RGBA\n", filename); if ( !ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE) ) { fprintf(stderr, "load_image: Failed to convert color indexed image \"%s\" to RGBA.\n", filename); ilDeleteImages(1, &image_name); return NULL; } } img = (Image *) malloc(sizeof(Image)); img->width = ilGetInteger(IL_IMAGE_WIDTH); img->height = ilGetInteger(IL_IMAGE_HEIGHT); img->data = (unsigned char *) malloc(img->width * img->height * 4); if( !ilCopyPixels(0, 0, 0, img->width, img->height, 1, IL_RGBA, IL_UNSIGNED_BYTE, img->data) ) { error = ilGetError(); error_str = iluErrorString(error); fprintf(stderr, "load_image: Failed to read image data for \"%s\". (Last error given by DevIL was \"%s (code %d)\".)\n", filename, error_str, error); free( (void *) img->data ); free(img); ilDeleteImages(1, &image_name); return NULL; } } else { fprintf(stderr, "load_image: Failed to load image \"%s\".\n", filename); ilDeleteImages(1, &image_name); return NULL; } ilDeleteImages(1, &image_name); return img; } void draw_image(Image *img, int x, int y) { if ( img != NULL ) { glWindowPos2iARB(x, y); glDrawPixels(img->width, img->height, GL_RGBA, GL_UNSIGNED_BYTE, img->data); } else { #ifdef DEBUG fprintf(stderr, "DEBUG: draw_image: Unable to draw image, img = NULL.\n"); #endif } } void delete_image(Image *img) { if ( img != NULL ) { if ( img->data != NULL ) { free(img->data); } else { #ifdef DEBUG fprintf(stderr, "DEBUG: delete_image: Warning, img->data is NULL.\n"); #endif } free(img); } else { #ifdef DEBUG fprintf(stderr, "DEBUG draw_image: Warning, img is NULL.\n"); #endif } }