1 // ============================================================================
2 // Artsoft Retro-Game Library
3 // ----------------------------------------------------------------------------
4 // (c) 1995-2014 by Artsoft Entertainment
7 // http://www.artsoft.org/
8 // ----------------------------------------------------------------------------
10 // ============================================================================
19 char *source_filename;
24 int original_width; /* original image file width */
25 int original_height; /* original image file height */
27 boolean contains_small_images; /* set after adding small images */
28 boolean scaled_up; /* set after scaling up */
30 typedef struct ImageInfo ImageInfo;
32 static struct ArtworkListInfo *image_info = NULL;
35 static void *Load_Image(char *filename)
37 static void *Load_PCX(char *filename)
43 printf("::: loading PCX file '%s'\n", filename);
46 img_info = checked_calloc(sizeof(ImageInfo));
48 if ((img_info->bitmap = LoadImage(filename)) == NULL)
50 Error(ERR_WARN, "cannot load image file '%s': LoadImage() failed: %s",
51 filename, GetError());
56 img_info->source_filename = getStringCopy(filename);
58 img_info->original_width = img_info->bitmap->width;
59 img_info->original_height = img_info->bitmap->height;
61 img_info->contains_small_images = FALSE;
62 img_info->scaled_up = FALSE;
67 static void FreeImage(void *ptr)
69 ImageInfo *image = (ImageInfo *)ptr;
75 FreeBitmap(image->bitmap);
77 if (image->source_filename)
78 free(image->source_filename);
83 int getImageListSize()
85 return (image_info->num_file_list_entries +
86 image_info->num_dynamic_file_list_entries);
89 struct FileInfo *getImageListEntryFromImageID(int pos)
91 int num_list_entries = image_info->num_file_list_entries;
92 int list_pos = (pos < num_list_entries ? pos : pos - num_list_entries);
94 return (pos < num_list_entries ? &image_info->file_list[list_pos] :
95 &image_info->dynamic_file_list[list_pos]);
98 static ImageInfo *getImageInfoEntryFromImageID(int pos)
100 int num_list_entries = image_info->num_file_list_entries;
101 int list_pos = (pos < num_list_entries ? pos : pos - num_list_entries);
102 ImageInfo **img_info =
103 (ImageInfo **)(pos < num_list_entries ? image_info->artwork_list :
104 image_info->dynamic_artwork_list);
106 return img_info[list_pos];
109 Bitmap *getBitmapFromImageID(int pos)
111 ImageInfo *img_info = getImageInfoEntryFromImageID(pos);
113 return (img_info != NULL ? img_info->bitmap : NULL);
116 int getOriginalImageWidthFromImageID(int pos)
118 ImageInfo *img_info = getImageInfoEntryFromImageID(pos);
120 return (img_info != NULL ? img_info->original_width : 0);
123 int getOriginalImageHeightFromImageID(int pos)
125 ImageInfo *img_info = getImageInfoEntryFromImageID(pos);
127 return (img_info != NULL ? img_info->original_height : 0);
130 char *getTokenFromImageID(int graphic)
132 struct FileInfo *file_list = getImageListEntryFromImageID(graphic);
134 return (file_list != NULL ? file_list->token : NULL);
137 int getImageIDFromToken(char *token)
139 struct FileInfo *file_list = image_info->file_list;
140 int num_list_entries = image_info->num_file_list_entries;
143 for (i = 0; i < num_list_entries; i++)
144 if (strEqual(file_list[i].token, token))
150 char *getImageConfigFilename()
152 return getCustomArtworkConfigFilename(image_info->type);
155 int getImageListPropertyMappingSize()
157 return image_info->num_property_mapping_entries;
160 struct PropertyMapping *getImageListPropertyMapping()
162 return image_info->property_mapping;
165 void InitImageList(struct ConfigInfo *config_list, int num_file_list_entries,
166 struct ConfigTypeInfo *config_suffix_list,
167 char **base_prefixes, char **ext1_suffixes,
168 char **ext2_suffixes, char **ext3_suffixes,
169 char **ignore_tokens)
173 image_info = checked_calloc(sizeof(struct ArtworkListInfo));
174 image_info->type = ARTWORK_TYPE_GRAPHICS;
176 /* ---------- initialize file list and suffix lists ---------- */
178 image_info->num_file_list_entries = num_file_list_entries;
179 image_info->num_dynamic_file_list_entries = 0;
181 image_info->file_list =
182 getFileListFromConfigList(config_list, config_suffix_list, ignore_tokens,
183 num_file_list_entries);
184 image_info->dynamic_file_list = NULL;
186 image_info->num_suffix_list_entries = 0;
187 for (i = 0; config_suffix_list[i].token != NULL; i++)
188 image_info->num_suffix_list_entries++;
190 image_info->suffix_list = config_suffix_list;
192 /* ---------- initialize base prefix and suffixes lists ---------- */
194 image_info->num_base_prefixes = 0;
195 for (i = 0; base_prefixes[i] != NULL; i++)
196 image_info->num_base_prefixes++;
198 image_info->num_ext1_suffixes = 0;
199 for (i = 0; ext1_suffixes[i] != NULL; i++)
200 image_info->num_ext1_suffixes++;
202 image_info->num_ext2_suffixes = 0;
203 for (i = 0; ext2_suffixes[i] != NULL; i++)
204 image_info->num_ext2_suffixes++;
206 image_info->num_ext3_suffixes = 0;
207 for (i = 0; ext3_suffixes[i] != NULL; i++)
208 image_info->num_ext3_suffixes++;
210 image_info->num_ignore_tokens = 0;
211 for (i = 0; ignore_tokens[i] != NULL; i++)
212 image_info->num_ignore_tokens++;
214 image_info->base_prefixes = base_prefixes;
215 image_info->ext1_suffixes = ext1_suffixes;
216 image_info->ext2_suffixes = ext2_suffixes;
217 image_info->ext3_suffixes = ext3_suffixes;
218 image_info->ignore_tokens = ignore_tokens;
220 image_info->num_property_mapping_entries = 0;
222 image_info->property_mapping = NULL;
224 /* ---------- initialize artwork reference and content lists ---------- */
226 image_info->sizeof_artwork_list_entry = sizeof(ImageInfo *);
228 image_info->artwork_list =
229 checked_calloc(num_file_list_entries * sizeof(ImageInfo *));
230 image_info->dynamic_artwork_list = NULL;
232 image_info->content_list = NULL;
234 /* ---------- initialize artwork loading/freeing functions ---------- */
237 image_info->load_artwork = Load_Image;
239 image_info->load_artwork = Load_PCX;
241 image_info->free_artwork = FreeImage;
244 void ReloadCustomImages()
247 printf("::: reloading images '%s' ...\n", artwork.gfx_current_identifier);
250 print_timestamp_init("ReloadCustomImages");
252 LoadArtworkConfig(image_info);
253 print_timestamp_time("LoadArtworkConfig");
255 ReloadCustomArtworkList(image_info);
256 print_timestamp_time("ReloadCustomArtworkList");
258 print_timestamp_done("ReloadCustomImages");
261 void CreateImageWithSmallImages(int pos, int zoom_factor, int tile_size)
263 ImageInfo *img_info = getImageInfoEntryFromImageID(pos);
265 if (img_info == NULL || img_info->contains_small_images)
268 CreateBitmapWithSmallBitmaps(img_info->bitmap, zoom_factor, tile_size);
270 img_info->contains_small_images = TRUE;
271 img_info->scaled_up = TRUE;
274 void ScaleImage(int pos, int zoom_factor)
276 ImageInfo *img_info = getImageInfoEntryFromImageID(pos);
278 if (img_info == NULL || img_info->scaled_up)
281 if (zoom_factor != 1)
282 ScaleBitmap(img_info->bitmap, zoom_factor);
284 img_info->scaled_up = TRUE;
289 FreeCustomArtworkLists(image_info);