/** * Load bitmap (this function is aware of truecolor transparency) */ static BITMAP *load_bitmap_alpha(const char *filename, bool keep_alpha) { // Allow any color conversions except when loaded file // contains alpha channel int cc = get_color_conversion(); set_color_conversion((COLORCONV_TOTAL | COLORCONV_KEEP_TRANS) & ~(COLORCONV_32A_TO_8 | COLORCONV_32A_TO_15 | COLORCONV_32A_TO_16 | COLORCONV_32A_TO_24)); BITMAP *bmp_orig = load_bitmap(filename, NULL); set_color_conversion(cc); return convert_bitmap_alpha(bmp_orig, keep_alpha); }
Bitmap *ConvertBitmap(Bitmap *src, int dst_color_depth) { int src_col_depth = src->GetColorDepth(); if (src_col_depth != dst_color_depth) { int old_conv = get_color_conversion(); // TODO: find out what is this, and why do we need to call this every time (do we?) set_color_conversion(COLORCONV_KEEP_TRANS | COLORCONV_TOTAL); Bitmap *dst = BitmapHelper::CreateBitmapCopy(src, dst_color_depth); set_color_conversion(old_conv); return dst; } return src; }
Image* AllegroImageLoader::load(const std::string& filename, bool convertToDisplayFormat) { #if !(ALLEGRO_VERSION == 4 && ALLEGRO_SUB_VERSION == 0) int colconv = get_color_conversion(); #endif set_color_conversion(COLORCONV_NONE); PALETTE pal; BITMAP *bmp = loadBitmap(filename, pal); if (bmp == NULL) { throw FCN_EXCEPTION(std::string("Unable to load: ") + filename); } BITMAP *bmp2 = create_bitmap_ex(32, bmp->w, bmp->h); if (bmp2 == NULL) { throw FCN_EXCEPTION(std::string("Not enough memory to load: ") + filename); } set_palette(pal); blit(bmp, bmp2, 0, 0, 0, 0, bmp->w, bmp->h); destroy_bitmap(bmp); #if (ALLEGRO_VERSION == 4 && ALLEGRO_SUB_VERSION == 0) set_color_conversion(COLORCONV_TOTAL); #else set_color_conversion(colconv); #endif Image *image = new AllegroImage(bmp2, true); if (convertToDisplayFormat) { image->convertToDisplayFormat(); } return image; }
/* See README for details. */ void abitmap_init (char const *path, DATAFILE *datafile) { int i; int prev[10]; int cv; char str[1024]; DATAFILE *dat; cv = get_color_conversion (); set_color_conversion (COLORCONV_TOTAL | COLORCONV_KEEP_TRANS); used_bitmaps_cleanup (); push_config_state (); dat = set_theme_config (path, datafile); if (dat != datafile) used_dat = dat; theme->fg_color = get_color_string ("fg", "0x000000"); theme->bg_color = get_color_string ("bg", "0xffffff"); theme->mg_color = get_color_string ("mg", "0x808080"); theme->textpushx = get_config_int ("agup.cfg", "px", 0); theme->textpushy = get_config_int ("agup.cfg", "py", 0); for (i = 0; bload[i].name; i++) { int j; int s; char const *suffix[] = { "", "_hl", "_dis" }; for (s = 0; bload[i].name[s] == ' '; s++); for (j = 0; j < 3; j++) { char **argv = NULL; int argc = 0; BITMAP *bmp = NULL; int got_color = 0; theme->bitmaps[bload[i].elem][j].bmp = NULL; theme->bitmaps[bload[i].elem][j].flags = 0; theme->bitmaps[bload[i].elem][j].bl = 0; theme->bitmaps[bload[i].elem][j].br = 0; theme->bitmaps[bload[i].elem][j].bt = 0; theme->bitmaps[bload[i].elem][j].bb = 0; sprintf (str, "%s%s", bload[i].name + s, suffix[j]); argv = get_config_argv ("agup.cfg", str, &argc); TRACE ("%s: ", str); if (argc) { bmp = find_theme_bitmap (dat, argv[0]); } if (bmp) { int a; theme->bitmaps[bload[i].elem][j].bmp = bmp; for (a = 1; a < argc; a++) { if (!strcmp (argv[a], "stretch")) theme->bitmaps[bload[i].elem][j].flags |= ABMAP_STRETCH_H | ABMAP_STRETCH_V; else if (!strcmp (argv[a], "center")) theme->bitmaps[bload[i].elem][j].flags |= ABMAP_CENTER_H | ABMAP_CENTER_V; else if (!strcmp (argv[a], "stretchh")) theme->bitmaps[bload[i].elem][j].flags |= ABMAP_STRETCH_H; else if (!strcmp (argv[a], "centerh")) theme->bitmaps[bload[i].elem][j].flags |= ABMAP_CENTER_H; else if (!strcmp (argv[a], "alignh")) theme->bitmaps[bload[i].elem][j].flags |= ABMAP_ALIGN_H; else if (!strcmp (argv[a], "stretchv")) theme->bitmaps[bload[i].elem][j].flags |= ABMAP_STRETCH_V; else if (!strcmp (argv[a], "centerv")) theme->bitmaps[bload[i].elem][j].flags |= ABMAP_CENTER_V; else if (!strcmp (argv[a], "alignv")) theme->bitmaps[bload[i].elem][j].flags |= ABMAP_ALIGN_V; else if (!strcmp (argv[a], "cut")) { int cx, cy, cw, ch; a++; if (a < argc) { cx = strtol (argv[a], NULL, 10); a++; if (a < argc) { cy = strtol (argv[a], NULL, 10); a++; if (a < argc) { cw = strtol (argv[a], NULL, 10); a++; if (a < argc) { BITMAP *sub; ch = strtol (argv[a], NULL, 10); if (cw <= 0) cw += bmp->w; if (ch <= 0) ch += bmp->h; sub = create_sub_bitmap (bmp, cx, cy, cw, ch); used_bitmap (sub, NULL); theme->bitmaps[bload[i].elem][j].bmp = sub; } } } } } else if (!strcmp (argv[a], "border")) { a++; if (a < argc) { theme->bitmaps[bload[i].elem][j].bl = strtol (argv[a], NULL, 10); a++; if (a < argc) { theme->bitmaps[bload[i].elem][j].br = strtol (argv[a], NULL, 10); a++; if (a < argc) { theme->bitmaps[bload[i].elem][j].bt = strtol (argv[a], NULL, 10); a++; if (a < argc) { theme->bitmaps[bload[i].elem][j].bb = strtol (argv[a], NULL, 10); } } } } } else if (!strcmp (argv[a], "color")) { a++; if (a < argc) { int rgb32 = strtol (argv[a], NULL, 0); theme->bitmaps[bload[i].elem][j].color = makecol (rgb32 >> 16, (rgb32 >> 8) & 255, rgb32 & 255); got_color = 1; TRACE ("color %06x ", rgb32); } } } TRACE ("loaded successfully.\n"); } else { /* If everything fails, try to inherit from another bitmap. */ if (j) {