1 /***********************************************************
2 * Artsoft Retro-Game Library *
3 *----------------------------------------------------------*
4 * (c) 1994-2006 Artsoft Entertainment *
6 * Detmolder Strasse 189 *
9 * e-mail: info@artsoft.org *
10 *----------------------------------------------------------*
12 ***********************************************************/
21 char *source_filename;
26 int original_width; /* original image file width */
27 int original_height; /* original image file height */
29 boolean contains_small_images; /* set after adding small images */
30 boolean scaled_up; /* set after scaling up */
32 typedef struct ImageInfo ImageInfo;
34 static struct ArtworkListInfo *image_info = NULL;
37 static void *Load_Image(char *filename)
39 static void *Load_PCX(char *filename)
45 printf("::: loading PCX file '%s'\n", filename);
48 img_info = checked_calloc(sizeof(ImageInfo));
50 if ((img_info->bitmap = LoadImage(filename)) == NULL)
52 Error(ERR_WARN, "cannot load image file '%s': LoadImage() failed: %s",
53 filename, GetError());
58 img_info->source_filename = getStringCopy(filename);
60 img_info->original_width = img_info->bitmap->width;
61 img_info->original_height = img_info->bitmap->height;
63 img_info->contains_small_images = FALSE;
64 img_info->scaled_up = FALSE;
69 static void FreeImage(void *ptr)
71 ImageInfo *image = (ImageInfo *)ptr;
77 FreeBitmap(image->bitmap);
79 if (image->source_filename)
80 free(image->source_filename);
85 int getImageListSize()
87 return (image_info->num_file_list_entries +
88 image_info->num_dynamic_file_list_entries);
91 struct FileInfo *getImageListEntryFromImageID(int pos)
93 int num_list_entries = image_info->num_file_list_entries;
94 int list_pos = (pos < num_list_entries ? pos : pos - num_list_entries);
96 return (pos < num_list_entries ? &image_info->file_list[list_pos] :
97 &image_info->dynamic_file_list[list_pos]);
100 static ImageInfo *getImageInfoEntryFromImageID(int pos)
102 int num_list_entries = image_info->num_file_list_entries;
103 int list_pos = (pos < num_list_entries ? pos : pos - num_list_entries);
104 ImageInfo **img_info =
105 (ImageInfo **)(pos < num_list_entries ? image_info->artwork_list :
106 image_info->dynamic_artwork_list);
108 return img_info[list_pos];
111 Bitmap *getBitmapFromImageID(int pos)
113 ImageInfo *img_info = getImageInfoEntryFromImageID(pos);
115 return (img_info != NULL ? img_info->bitmap : NULL);
118 int getOriginalImageWidthFromImageID(int pos)
120 ImageInfo *img_info = getImageInfoEntryFromImageID(pos);
122 return (img_info != NULL ? img_info->original_width : 0);
125 int getOriginalImageHeightFromImageID(int pos)
127 ImageInfo *img_info = getImageInfoEntryFromImageID(pos);
129 return (img_info != NULL ? img_info->original_height : 0);
132 char *getTokenFromImageID(int graphic)
134 struct FileInfo *file_list = getImageListEntryFromImageID(graphic);
136 return (file_list != NULL ? file_list->token : NULL);
139 int getImageIDFromToken(char *token)
141 struct FileInfo *file_list = image_info->file_list;
142 int num_list_entries = image_info->num_file_list_entries;
145 for (i = 0; i < num_list_entries; i++)
146 if (strEqual(file_list[i].token, token))
152 char *getImageConfigFilename()
154 return getCustomArtworkConfigFilename(image_info->type);
157 int getImageListPropertyMappingSize()
159 return image_info->num_property_mapping_entries;
162 struct PropertyMapping *getImageListPropertyMapping()
164 return image_info->property_mapping;
167 void InitImageList(struct ConfigInfo *config_list, int num_file_list_entries,
168 struct ConfigTypeInfo *config_suffix_list,
169 char **base_prefixes, char **ext1_suffixes,
170 char **ext2_suffixes, char **ext3_suffixes,
171 char **ignore_tokens)
175 image_info = checked_calloc(sizeof(struct ArtworkListInfo));
176 image_info->type = ARTWORK_TYPE_GRAPHICS;
178 /* ---------- initialize file list and suffix lists ---------- */
180 image_info->num_file_list_entries = num_file_list_entries;
181 image_info->num_dynamic_file_list_entries = 0;
183 image_info->file_list =
184 getFileListFromConfigList(config_list, config_suffix_list, ignore_tokens,
185 num_file_list_entries);
186 image_info->dynamic_file_list = NULL;
188 image_info->num_suffix_list_entries = 0;
189 for (i = 0; config_suffix_list[i].token != NULL; i++)
190 image_info->num_suffix_list_entries++;
192 image_info->suffix_list = config_suffix_list;
194 /* ---------- initialize base prefix and suffixes lists ---------- */
196 image_info->num_base_prefixes = 0;
197 for (i = 0; base_prefixes[i] != NULL; i++)
198 image_info->num_base_prefixes++;
200 image_info->num_ext1_suffixes = 0;
201 for (i = 0; ext1_suffixes[i] != NULL; i++)
202 image_info->num_ext1_suffixes++;
204 image_info->num_ext2_suffixes = 0;
205 for (i = 0; ext2_suffixes[i] != NULL; i++)
206 image_info->num_ext2_suffixes++;
208 image_info->num_ext3_suffixes = 0;
209 for (i = 0; ext3_suffixes[i] != NULL; i++)
210 image_info->num_ext3_suffixes++;
212 image_info->num_ignore_tokens = 0;
213 for (i = 0; ignore_tokens[i] != NULL; i++)
214 image_info->num_ignore_tokens++;
216 image_info->base_prefixes = base_prefixes;
217 image_info->ext1_suffixes = ext1_suffixes;
218 image_info->ext2_suffixes = ext2_suffixes;
219 image_info->ext3_suffixes = ext3_suffixes;
220 image_info->ignore_tokens = ignore_tokens;
222 image_info->num_property_mapping_entries = 0;
224 image_info->property_mapping = NULL;
226 /* ---------- initialize artwork reference and content lists ---------- */
228 image_info->sizeof_artwork_list_entry = sizeof(ImageInfo *);
230 image_info->artwork_list =
231 checked_calloc(num_file_list_entries * sizeof(ImageInfo *));
232 image_info->dynamic_artwork_list = NULL;
234 image_info->content_list = NULL;
236 /* ---------- initialize artwork loading/freeing functions ---------- */
239 image_info->load_artwork = Load_Image;
241 image_info->load_artwork = Load_PCX;
243 image_info->free_artwork = FreeImage;
246 void ReloadCustomImages()
249 printf("::: reloading images '%s' ...\n", artwork.gfx_current_identifier);
252 print_timestamp_init("ReloadCustomImages");
254 LoadArtworkConfig(image_info);
255 print_timestamp_time("LoadArtworkConfig");
257 ReloadCustomArtworkList(image_info);
258 print_timestamp_time("ReloadCustomArtworkList");
260 print_timestamp_done("ReloadCustomImages");
263 void CreateImageWithSmallImages(int pos, int zoom_factor)
265 ImageInfo *img_info = getImageInfoEntryFromImageID(pos);
267 if (img_info == NULL || img_info->contains_small_images)
270 CreateBitmapWithSmallBitmaps(img_info->bitmap, zoom_factor);
272 img_info->contains_small_images = TRUE;
273 img_info->scaled_up = TRUE;
276 void ScaleImage(int pos, int zoom_factor)
278 ImageInfo *img_info = getImageInfoEntryFromImageID(pos);
280 if (img_info == NULL || img_info->scaled_up)
283 if (zoom_factor != 1)
284 ScaleBitmap(img_info->bitmap, zoom_factor);
286 img_info->scaled_up = TRUE;
291 FreeCustomArtworkLists(image_info);