Ключ al_draw_scaled_bitmap()
. Благодаря этому вы можете разбить любой растровый файл источника на целевую растровую карту любого нового размера. Поэтому вам не нужно создавать новый растровый рисунок. Вы всегда можете использовать эту функцию для рисования растрового изображения другого размера. Аллегро 5 аппаратно ускоряется, поэтому эти типы операций часто «бесплатны».
Чтобы получить ответ на вопрос:
ALLEGRO_BITMAP *load_bitmap_at_size(const char *filename, int w, int h)
{
ALLEGRO_BITMAP *resized_bmp, *loaded_bmp, *prev_target;
// 1. create a temporary bitmap of size we want
resized_bmp = al_create_bitmap(w, h);
if (!resized_bmp) return NULL;
// 2. load the bitmap at the original size
loaded_bmp = al_load_bitmap(filename);
if (!loaded_bmp)
{
al_destroy_bitmap(resized_bmp);
return NULL;
}
// 3. set the target bitmap to the resized bmp
prev_target = al_get_target_bitmap();
al_set_target_bitmap(resized_bmp);
// 4. copy the loaded bitmap to the resized bmp
al_draw_scaled_bitmap(loaded_bmp,
0, 0, // source origin
al_get_bitmap_width(loaded_bmp), // source width
al_get_bitmap_height(loaded_bmp), // source height
0, 0, // target origin
w, h, // target dimensions
0 // flags
);
// 5. restore the previous target and clean up
al_set_target_bitmap(prev_target);
al_destroy_loaded_bmp(loaded_bmp);
return resized_bmp;
}
Я комментировал основные шаги в коде. Имейте в виду, что Allegro 5 имеет неявную цель, которая обычно является обратным буфером дисплея. Однако, как видно из приведенного выше кода, вы можете настроить таргетинг на другие растровые изображения, если вам нужно сделать растровые изображения для растровых операций.
Альтернативный способ, перемещение целевой битовой карты за пределами функции:
void load_bitmap_onto_target(const char *filename)
{
ALLEGRO_BITMAP *loaded_bmp;
const int w = al_get_bitmap_width(al_get_target_bitmap());
const int h = al_get_bitmap_height(al_get_target_bitmap());
// 1. load the bitmap at the original size
loaded_bmp = al_load_bitmap(filename);
if (!loaded_bmp) return;
// 2. copy the loaded bitmap to the resized bmp
al_draw_scaled_bitmap(loaded_bmp,
0, 0, // source origin
al_get_bitmap_width(loaded_bmp), // source width
al_get_bitmap_height(loaded_bmp), // source height
0, 0, // target origin
w, h, // target dimensions
0 // flags
);
// 3. cleanup
al_destroy_bitmap(loaded_bmp);
}
ALLEGRO_BITMAP *my_bmp = al_create_bitmap(1000,1000);
al_set_target_bitmap(my_bmp);
load_bitmap_onto_target("test.png");
// perhaps restore the target bitmap to the back buffer, or continue
// to modify the my_bmp with more drawing operations.
Мэтью спасибо за это, именно то, что мне нужно. Хотя я немного смутился по части. prev_target = al_get_target_bitmap(); Я не понимаю, что делает pre_target? – codingNightmares
Allegro имеет неявное целевое растровое изображение, которое устанавливается через al_set_target_bitmap(). Все будущие операции рисования будут сделаны для этого растрового изображения. Если эта функция не восстановила целевое растровое изображение, тогда вызывающий код может не понимать, что цель была изменена и может случайно продолжить рисование на растровом изображении. Обычно в A5 вы позаботились об этом до вызова функции, но я оставил ее внутри функции, чтобы ее можно было использовать как есть. – Matthew
@codingNightmares, я добавил второй пример. Основная точка - это функция, обычно не имеющая побочных эффектов, таких как изменение целевого растрового изображения. Таким образом, во втором примере функция просто рисует текущую цель. Эта практика в целом лучше подходит для API A5. – Matthew