Правильный способ масштабирования поверхности SDL без отсечения? - PullRequest
8 голосов
/ 30 ноября 2008

Как правильно масштабировать поверхность SDL? Я нашел одно объяснение в Интернете, но оно требовало перерисовки поверхности пиксель за пикселем. Кажется, должен быть какой-то способ сделать это изначально через SDL, а не перерисовывать изображение таким образом. Я не смог найти ничего в документации SDL, которая покрывает это. Я могу изменять размеры поверхностей без каких-либо проблем, изменяя ширину и высоту поверхностей, но полученная поверхность обрезается.

Ответы [ 3 ]

7 голосов
/ 30 ноября 2008

SDL не поддерживает масштабированный блиттинг. Согласно документации SDL_BlitSurface :

Примечание: SDL Blitter не (пока) иметь возможность масштабирования перевернутые поверхности вверх или вниз, как есть дело с другим более сложным Блитинговые механизмы. Ты должен придумать что-то для себя, если Вы хотите масштабировать изображения (например, использовать SDL_gfx).

Вы можете найти SDL_gfx здесь . Написание вашей собственной функции блитинга не так уж и плохо, это может быть веселый и полезный учебный эксперимент (хотя вы бы заново изобрели колесо). Использование OpenGL также является опцией, поскольку такие вещи, как масштабирование и вращение, могут быть выполнены одним вызовом функции.

5 голосов
/ 22 июня 2015

Я знаю, что этот ответ слишком поздно, чтобы помочь человеку, который его задал, но я решил написать это, чтобы помочь любому, кто наткнется на этот вопрос. В SDL 2.0 Вы можете использовать функцию SDL_BlitScaled() для масштабирования поверхности в целевой SDL_Rect. LazyFoo есть руководство, которое описывает это, или посмотрите эту документацию .

1 голос
/ 17 февраля 2015

Для полноты и из-за того, что в вопросе не указана версия SDL, в SDL2 возможно масштабирование с использованием метода API SDL_RenderCopyEx. Никаких дополнительных библиотек кроме базовой библиотеки SDL2 не требуется.

int SDL_RenderCopyEx(SDL_Renderer*          renderer,
                     SDL_Texture*           texture,
                     const SDL_Rect*        srcrect,
                     const SDL_Rect*        dstrect,
                     const double           angle,
                     const SDL_Point*       center,
                     const SDL_RendererFlip flip)

Установив размер dstrect, можно масштабировать текстуру до целого числа пикселей. Также возможно вращать и переворачивать текстуру одновременно.

Технически это не масштабирование поверхности, а масштабирование текстуры. Процедура должна быть такой же актуальной, хотя поверхности почти всегда преобразуются в текстуры до того, как рендеринг происходит в приложениях на основе SDL2.

Ссылка: https://wiki.libsdl.org/SDL_RenderCopyEx

Создайте свои текстуры как обычно:

surface = IMG_Load(filePath);
texture = SDL_CreateTextureFromSurface(renderer, surface);

А когда пришло время сделать это, позвоните SDL_RenderCopyEx вместо SDL_RenderCopy

...