X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fimage.c;h=f7bf538f86107728774541a4b51dedad954f5c1b;hb=92204d79d159df0be4bd05c4b4e4dabbcaefe805;hp=ddec954a6dd3480e1469107eaa10aba67e4c5198;hpb=fa9c72bb286c8e5e5095e666dbf85981ad3a8ea2;p=rocksndiamonds.git diff --git a/src/libgame/image.c b/src/libgame/image.c index ddec954a..f7bf538f 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) @@ -734,6 +790,16 @@ 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, @@ -750,15 +816,15 @@ void InitImageList(struct ConfigInfo *config_list, int num_file_list_entries, image_info->num_file_list_entries = num_file_list_entries; image_info->num_dynamic_file_list_entries = 0; - 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->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->suffix_list = config_suffix_list; /* ---------- initialize base prefix and suffixes lists ---------- */ @@ -779,6 +845,10 @@ void InitImageList(struct ConfigInfo *config_list, int num_file_list_entries, image_info->ext1_suffixes = ext1_suffixes; image_info->ext2_suffixes = ext2_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 *);