/* _fixup_loaded_bitmap: * Helper function for adjusting the color depth of a loaded image. * Converts the bitmap BMP to the color depth BPP. If BMP is a 8-bit * bitmap, PAL must be the palette attached to the bitmap. If BPP is * equal to 8, the conversion is performed either by building a palette * optimized for the bitmap if PAL is not NULL (in which case PAL gets * filled in with this palette) or by using the current palette if PAL * is NULL. In any other cases, PAL is unused. */ BITMAP *_fixup_loaded_bitmap(BITMAP *bmp, PALETTE pal, int bpp) { BITMAP *b2; ASSERT(bmp); b2 = create_bitmap_ex(bpp, bmp->w, bmp->h); if (!b2) { destroy_bitmap(bmp); return NULL; } if (bpp == 8) { RGB_MAP *old_map = rgb_map; if (pal) generate_optimized_palette(bmp, pal, NULL); else pal = _current_palette; rgb_map = _AL_MALLOC(sizeof(RGB_MAP)); if (rgb_map != NULL) create_rgb_table(rgb_map, pal, NULL); blit(bmp, b2, 0, 0, 0, 0, bmp->w, bmp->h); if (rgb_map != NULL) _AL_FREE(rgb_map); rgb_map = old_map; } else if (bitmap_color_depth(bmp) == 8) { select_palette(pal); blit(bmp, b2, 0, 0, 0, 0, bmp->w, bmp->h); unselect_palette(); } else { blit(bmp, b2, 0, 0, 0, 0, bmp->w, bmp->h); } destroy_bitmap(bmp); return b2; }
/* worker function for changing the color depth of bitmap data */ static int do_changedepth(DATAFILE *dat, int *param, int depth) { BITMAP *bmp, *bmp2; RLE_SPRITE *spr; RGB tmprgb = datedit_current_palette[0]; if ((dat->type != DAT_BITMAP) && (dat->type != DAT_RLE_SPRITE) && (dat->type != DAT_C_SPRITE) && (dat->type != DAT_XC_SPRITE)) { (*param)++; return D_O_K; } if (dat->type == DAT_RLE_SPRITE) { spr = (RLE_SPRITE *)dat->dat; if (spr->color_depth == depth) return D_O_K; bmp = create_bitmap_ex(spr->color_depth, spr->w, spr->h); clear_to_color(bmp, bmp->vtable->mask_color); draw_rle_sprite(bmp, spr, 0, 0); bmp2 = create_bitmap_ex(depth, bmp->w, bmp->h); datedit_current_palette[0].r = 63; datedit_current_palette[0].g = 0; datedit_current_palette[0].b = 63; select_palette(datedit_current_palette); blit(bmp, bmp2, 0, 0, 0, 0, bmp->w, bmp->h); unselect_palette(); datedit_current_palette[0] = tmprgb; dat->dat = get_rle_sprite(bmp2); destroy_bitmap(bmp); destroy_bitmap(bmp2); destroy_rle_sprite(spr); } else { bmp = (BITMAP *)dat->dat; if (bitmap_color_depth(bmp) == depth) return D_O_K; bmp2 = create_bitmap_ex(depth, bmp->w, bmp->h); if ((dat->type == DAT_C_SPRITE) || (dat->type == DAT_XC_SPRITE)) { datedit_current_palette[0].r = 63; datedit_current_palette[0].g = 0; datedit_current_palette[0].b = 63; } select_palette(datedit_current_palette); blit(bmp, bmp2, 0, 0, 0, 0, bmp->w, bmp->h); unselect_palette(); datedit_current_palette[0] = tmprgb; dat->dat = bmp2; destroy_bitmap(bmp); } return D_REDRAW; }