X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fimage.c;h=f72c37e81577f52f5c269ea97a5d616fbf950b90;hb=ff2510f5098b545a03965c6b95296eec6885a4fb;hp=dfd806e37ddec66c4e3dfc9fdb33b857a4c611da;hpb=ba0568bc8d5b8b3d081691b8e987f2b66a4c13e6;p=rocksndiamonds.git diff --git a/src/libgame/image.c b/src/libgame/image.c index dfd806e3..f72c37e8 100644 --- a/src/libgame/image.c +++ b/src/libgame/image.c @@ -443,8 +443,8 @@ XImageInfo *Image_to_Pixmap(Display *display, int screen, Visual *visual, display_bits_per_pixel = bitsPerPixelAtDepth(display, screen, depth); display_bytes_per_pixel = (display_bits_per_pixel + 7) / 8; - ximage = XCreateImage(display, visual, depth, ZPixmap, 0, - NULL, image->width, image->height, + ximage = XCreateImage(display, visual, depth, ZPixmap, + 0, NULL, image->width, image->height, 8, image->width * display_bytes_per_pixel); ximage->data = checked_malloc(image->width * image->height * display_bytes_per_pixel); @@ -565,6 +565,62 @@ XImageInfo *Image_to_Pixmap(Display *display, int screen, Visual *visual, return ximageinfo; } +/* + ----------------------------------------------------------------------------- + ZoomPixmap + + Important note: The scaling code currently only supports scaling down the + image by a power of 2 -- scaling up is currently not supported at all! + ----------------------------------------------------------------------------- +*/ + +void ZoomPixmap(Display *display, GC gc, Pixmap src_pixmap, Pixmap dst_pixmap, + int src_width, int src_height, + int dst_width, int dst_height) +{ + XImage *src_ximage, *dst_ximage; + byte *src_ptr, *dst_ptr; + int bits_per_pixel; + int bytes_per_pixel; + int x, y, i; + int zoom_factor = src_width / dst_width; /* currently very limited! */ + int row_skip, col_skip; + + /* copy source pixmap to temporary image */ + src_ximage = XGetImage(display, src_pixmap, 0, 0, + src_width, src_height, AllPlanes, ZPixmap); + + bits_per_pixel = src_ximage->bits_per_pixel; + bytes_per_pixel = (bits_per_pixel + 7) / 8; + + dst_ximage = XCreateImage(display, visual, src_ximage->depth, ZPixmap, + 0, NULL, dst_width, dst_height, + 8, dst_width * bytes_per_pixel); + dst_ximage->data = + checked_malloc(dst_width * dst_height * bytes_per_pixel); + dst_ximage->byte_order = src_ximage->byte_order; + + src_ptr = (byte *)src_ximage->data; + dst_ptr = (byte *)dst_ximage->data; + + col_skip = (zoom_factor - 1) * bytes_per_pixel; + row_skip = col_skip * src_width; + + /* scale image down by scaling factor 'zoom_factor' */ + for (y=0; y < src_height; y += zoom_factor, src_ptr += row_skip) + for (x=0; x < src_width; x += zoom_factor, src_ptr += col_skip) + for (i=0; iindex != NULL && ximageinfo->no > 0) @@ -652,6 +708,7 @@ struct ImageInfo int num_references; Bitmap *bitmap; + boolean contains_small_images; }; typedef struct ImageInfo ImageInfo; @@ -677,6 +734,8 @@ static void *Load_PCX(char *filename) img_info->source_filename = getStringCopy(filename); + img_info->contains_small_images = FALSE; + return img_info; } @@ -696,16 +755,47 @@ static void FreeImage(void *ptr) free(image); } -struct FileInfo *getCurrentImageList() +int getImageListSize() +{ + return (image_info->num_file_list_entries + + image_info->num_dynamic_file_list_entries); +} + +struct FileInfo *getImageListEntry(int pos) +{ + int num_list_entries = image_info->num_file_list_entries; + int list_pos = (pos < num_list_entries ? pos : pos - num_list_entries); + + return (pos < num_list_entries ? &image_info->file_list[list_pos] : + &image_info->dynamic_file_list[list_pos]); +} + +static ImageInfo *getImageInfoEntryFromImageID(int pos) { - return image_info->file_list; + int num_list_entries = image_info->num_file_list_entries; + int list_pos = (pos < num_list_entries ? pos : pos - num_list_entries); + ImageInfo **img_info = + (ImageInfo **)(pos < num_list_entries ? image_info->artwork_list : + image_info->dynamic_artwork_list); + + return img_info[list_pos]; } -Bitmap *getBitmapFromImageID(int graphic) +Bitmap *getBitmapFromImageID(int pos) { - ImageInfo **img_info = (ImageInfo **)image_info->artwork_list; +#if 0 + int num_list_entries = image_info->num_file_list_entries; + int list_pos = (pos < num_list_entries ? pos : pos - num_list_entries); + ImageInfo **img_info = + (ImageInfo **)(pos < num_list_entries ? image_info->artwork_list : + image_info->dynamic_artwork_list); + + return (img_info[list_pos] != NULL ? img_info[list_pos]->bitmap : NULL); +#else + ImageInfo *img_info = getImageInfoEntryFromImageID(pos); - return (img_info[graphic] != NULL ? img_info[graphic]->bitmap : NULL); + return (img_info != NULL ? img_info->bitmap : NULL); +#endif } char *getTokenFromImageID(int graphic) @@ -720,11 +810,22 @@ char *getImageConfigFilename() return getCustomArtworkConfigFilename(image_info->type); } +int getImageListPropertyMappingSize() +{ + return image_info->num_property_mapping_entries; +} + +struct PropertyMapping *getImageListPropertyMapping() +{ + return image_info->property_mapping; +} + void InitImageList(struct ConfigInfo *config_list, int num_file_list_entries, struct ConfigInfo *config_suffix_list, char **base_prefixes, char **ext1_suffixes, - char **ext2_suffixes) + char **ext2_suffixes, + char **ext3_suffixes) { int i; @@ -734,14 +835,17 @@ void InitImageList(struct ConfigInfo *config_list, int num_file_list_entries, /* ---------- initialize file list and suffix lists ---------- */ image_info->num_file_list_entries = num_file_list_entries; + image_info->num_dynamic_file_list_entries = 0; + + image_info->file_list = + getFileListFromConfigList(config_list, config_suffix_list, + num_file_list_entries); + image_info->dynamic_file_list = NULL; 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; /* ---------- initialize base prefix and suffixes lists ---------- */ @@ -758,15 +862,26 @@ void InitImageList(struct ConfigInfo *config_list, int num_file_list_entries, for (i=0; ext2_suffixes[i] != NULL; i++) image_info->num_ext2_suffixes++; + image_info->num_ext3_suffixes = 0; + for (i=0; ext3_suffixes[i] != NULL; i++) + image_info->num_ext3_suffixes++; + image_info->base_prefixes = base_prefixes; image_info->ext1_suffixes = ext1_suffixes; image_info->ext2_suffixes = ext2_suffixes; - image_info->custom_setup_list = NULL; + image_info->ext3_suffixes = ext3_suffixes; + + image_info->num_property_mapping_entries = 0; + + image_info->property_mapping = NULL; /* ---------- initialize artwork reference and content lists ---------- */ + image_info->sizeof_artwork_list_entry = sizeof(ImageInfo *); + image_info->artwork_list = checked_calloc(num_file_list_entries * sizeof(ImageInfo *)); + image_info->dynamic_artwork_list = NULL; image_info->content_list = NULL; @@ -786,7 +901,21 @@ void ReloadCustomImages() ReloadCustomArtworkList(image_info); } +void CreateImageWithSmallImages(int pos) +{ + ImageInfo *img_info = getImageInfoEntryFromImageID(pos); + + if (img_info == NULL || img_info->contains_small_images) + return; + + printf(" creating small image for '%s'\n", img_info->source_filename); + + CreateBitmapWithSmallBitmaps(img_info->bitmap); + + img_info->contains_small_images = TRUE; +} + void FreeAllImages() { - FreeCustomArtworkList(image_info); + FreeCustomArtworkLists(image_info); }