X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fimage.c;h=8e69de5460a4b518d0c4fb40320abacc0bbd5078;hb=a750ba6776fdfb711f5da2e6094c8010cd19645a;hp=13cfce001e50e03caf5a01eee2241bbfccc4b9b5;hpb=28f0f8708f4b4f8c4f39f1b23bc5fc7e0fed7579;p=rocksndiamonds.git diff --git a/src/libgame/image.c b/src/libgame/image.c index 13cfce00..8e69de54 100644 --- a/src/libgame/image.c +++ b/src/libgame/image.c @@ -37,8 +37,8 @@ Image *newImage(unsigned int width, unsigned int height, unsigned int depth) depth = 8; #endif - image = checked_malloc(sizeof(Image)); - image->data = checked_malloc(width * height * bytes_per_pixel); + image = checked_calloc(sizeof(Image)); + image->data = checked_calloc(width * height * bytes_per_pixel); image->width = width; image->height = height; image->depth = depth; @@ -649,18 +649,103 @@ struct ImageInfo { char *source_filename; int num_references; + + Bitmap *bitmap; }; typedef struct ImageInfo ImageInfo; -static ImageInfo **ImageList = NULL; -static struct ArtworkConfigInfo *image_config = NULL; -static int num_images = 0; +static struct ArtworkListInfo *image_info = NULL; -void InitImageList(struct ArtworkConfigInfo *config_list, int num_list_entries) +static void *Load_PCX(char *filename) { - if (ImageList == NULL) - ImageList = checked_calloc(num_list_entries * sizeof(ImageInfo *)); + ImageInfo *img_info; + +#if 0 + printf("loading PCX file '%s'\n", filename); +#endif + + img_info = checked_calloc(sizeof(ImageInfo)); + + if ((img_info->bitmap = LoadImage(filename)) == NULL) + { + Error(ERR_WARN, "cannot read image file '%s': LoadImage() failed: %s", + filename, GetError()); + free(img_info); + return NULL; + } + + img_info->source_filename = getStringCopy(filename); + + return img_info; +} + +static void FreeImage(void *ptr) +{ + ImageInfo *image = (ImageInfo *)ptr; + + if (image == NULL) + return; + + if (image->bitmap) + FreeBitmap(image->bitmap); + + if (image->source_filename) + free(image->source_filename); + + free(image); +} + +struct FileInfo *getCurrentImageList() +{ + return image_info->file_list; +} - image_config = config_list; - num_images = num_list_entries; +Bitmap *getBitmapFromImageID(int graphic) +{ + ImageInfo **img_info = (ImageInfo **)image_info->artwork_list; + + return img_info[graphic]->bitmap; +} + +void InitImageList(struct ConfigInfo *config_list, + struct ConfigInfo *config_suffix_list, + int num_file_list_entries) +{ + int i; + + image_info = checked_calloc(sizeof(struct ArtworkListInfo)); + + image_info->type = ARTWORK_TYPE_GRAPHICS; + + image_info->num_file_list_entries = num_file_list_entries; + image_info->num_suffix_list_entries = 0; + for (i=0; config_suffix_list[i].token != NULL; i++) + image_info->num_suffix_list_entries++; + + image_info->file_list = + getFileListFromConfigList(config_list, config_suffix_list, + num_file_list_entries); + image_info->suffix_list = config_suffix_list; + + image_info->artwork_list = + checked_calloc(num_file_list_entries * sizeof(ImageInfo *)); + + image_info->content_list = NULL; + + image_info->load_artwork = Load_PCX; + image_info->free_artwork = FreeImage; +} + +void ReloadCustomImages() +{ +#if 0 + printf("DEBUG: reloading images '%s' ...\n", artwork.gfx_current_identifier); +#endif + + ReloadCustomArtworkList(image_info); +} + +void FreeAllImages() +{ + FreeCustomArtworkList(image_info); }