ALLEGRO_FONT *_al_load_bitmap_font(const char *fname, int size, int flags) { ALLEGRO_BITMAP *import_bmp; ALLEGRO_FONT *f; ALLEGRO_STATE backup; int range[2]; ASSERT(fname); (void)size; (void)flags; al_store_state(&backup, ALLEGRO_STATE_NEW_BITMAP_PARAMETERS); al_set_new_bitmap_flags(ALLEGRO_MEMORY_BITMAP); al_set_new_bitmap_format(ALLEGRO_PIXEL_FORMAT_ANY_WITH_ALPHA); import_bmp = al_load_bitmap(fname); al_restore_state(&backup); if (!import_bmp) return NULL; /* We assume a single unicode range, starting at the space * character. */ range[0] = 32; range[1] = 32 + bitmap_font_count(import_bmp) - 1; f = al_grab_font_from_bitmap(import_bmp, 1, range); al_destroy_bitmap(import_bmp); return f; }
FONT *_ji_bitmap2font(BITMAP *bmp) { FONT *f; int begin = ' '; int end = -1; import_bmp = bmp; import_x = 0; import_y = 0; if(bitmap_color_depth(import_bmp) != 8) { import_bmp = NULL; return 0; } f = (FONT*)_al_malloc(sizeof(FONT)); if(end == -1) end = bitmap_font_count(import_bmp) + begin; if (bitmap_font_ismono(import_bmp)) { FONT_MONO_DATA* mf = (FONT_MONO_DATA*)_al_malloc(sizeof(FONT_MONO_DATA)); mf->glyphs = (FONT_GLYPH**)_al_malloc(sizeof(FONT_GLYPH*) * (end - begin)); if( import_bitmap_font_mono(mf->glyphs, end - begin) ) { free(mf->glyphs); free(mf); free(f); f = 0; } else { f->data = mf; f->vtable = font_vtable_mono; f->height = mf->glyphs[0]->h; mf->begin = begin; mf->end = end; mf->next = 0; } } else { FONT_COLOR_DATA* cf = (FONT_COLOR_DATA*)_al_malloc(sizeof(FONT_COLOR_DATA)); cf->bitmaps = (BITMAP**)_al_malloc(sizeof(BITMAP*) * (end - begin)); if( import_bitmap_font_color(cf->bitmaps, end - begin) ) { free(cf->bitmaps); free(cf); free(f); f = 0; } else { f->data = cf; f->vtable = font_vtable_color; f->height = cf->bitmaps[0]->h; cf->begin = begin; cf->end = end; cf->next = 0; } } import_bmp = NULL; return f; }