LINUX.ORG.RU

масштабирование SDL_Surface

 


0

1

Добрый день! Использую SDL2. Есть у меня изображение мне его нужно увеличить и отобразить. Как я понимаю в SDL2 мы сначала рисуем на SDL_Surface, дальше перегоняем его в SDL_Texture и далее отображаем текстуру.

1) Попробовал масштабировать руками при отрисовке на SDL_Surface - работает но медленно.

2) Попробовал отрисовать на SDL_Surface перегонять в текстуру с помощью SDL_CreateTextureFromSurface и потом масштабировано рендерить с помощью SDL_RenderCopy - все работает быстро, но есть нюанс.

При такой схеме текстура создается из SDL_Surface, а мне нужна рамка по бокам картинки (типа margin) размеры которой будут меняться в зависимости от разрешения экрана.

3) Попробовал отрисовать в SDL_Surface далее масштабировать в другой SDL_Surface с краями при помощи SDL_BlitScaled потом опять в текстуру и SDL_RenderCopy без масштабирования. Работает но медленней в 10 раз - видимо эта операция не ускорена видяхой.

Кто знает как быстро масштабировать и в то-же время получить рамку. Может создавать текстуру заранее больше и туда какой-то функцией масштабировать SDL_Surface? Подскажите кто знает плиз!

★★★★

Как я понимаю в SDL2 мы сначала рисуем на SDL_Surface, дальше перегоняем его в SDL_Texture и далее отображаем текстуру.

Смотря для чего. В идеале никаких surface быть не должно, графика сразу грузится в текстуры и отображается через SDL_RenderCopy. Всё операции с surface - софтовые, а значит медленные.

Кто знает как быстро масштабировать и в то-же время получить рамку

Я не понял в чём ваша проблема. У SDL_RenderCopy есть 4-й параметр dstrect, передайте туда rect уменьшенный на размер рамки, будет вам рамка.

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 1)

Сделал вариант номер два - просто само окно сделал больше и видимо сначала буду на него отображать другую текстуру с рамкой.

quest ★★★★
() автор топика
Ответ на: комментарий от slovazap

Так и было и так и есть, но теперь предварительно увеличил само окно чтобы появилась рамка.

quest ★★★★
() автор топика
Ответ на: комментарий от slovazap

Всё операции с surface - софтовые, а значит медленные.

Не подскажите как заливать текстуру одним цветом максимально быстро и как включить полноэкранный режим (сейчас делаю SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL | SDL_WINDOW_FULLSCREEN | SDL_WINDOW_BORDERLESS | SDL_WINDOW_INPUT_GRABBED и все одно видны кнопки WMAKER который я юзаю)?

quest ★★★★
() автор топика
Ответ на: комментарий от quest

Так и было и так и есть, но теперь предварительно увеличил само окно чтобы появилась рамка.

Зачем трогать окно? Окно само по себе, внутри него расположена текстура как вам надо.

Не подскажите как заливать текстуру одним цветом максимально быстро

Зачем вам текстура заполненная одним цветом? Если всё для тех же рамок, во-первых, есть SDL_RenderClear чтобы залить фон цветом, если нарисовать поверх него текстуру с отступами, останется рамка соответствующего цвета. А вообще, есть SDL_RenderDrawRect(s).

и как включить полноэкранный режим

Понятия не имею, я считаю полноэкранный режим злом, у меня этим управляет WM. По идее, SDL_WINDOW_FULLSCREEN должно хватить.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

Зачем трогать окно? Окно само по себе, внутри него расположена текстура как вам надо.

У меня сейчас изображение рисуется условно на SDL_Surface 10x10, потом оно переводиться в текстуру 10x10 и потом с помощью SDL_RenderCopy масштабируется в избражение 20x20 а окно у меня 30x30 и потому получается рамка.

есть SDL_RenderClear

отлично теперь перед ним юзаю SDL_SetRenderDrawColor

По идее, SDL_WINDOW_FULLSCREEN должно хватить.

не хватает, включил через SDL_SetWindowFullscreen так оно 1024x768 включило почему-то хотя у меня 1920x1080

quest ★★★★
() автор топика
Ответ на: комментарий от quest

оно 1024x768 включило

А при создании окошка какие размеры были указаны? Там, где

window = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
, или как там в SDL2 начинают работу.

al_exquemelin ★★★
()
Ответ на: комментарий от al_exquemelin
win = SDL_CreateWindow("title", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1920, 1080, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL | SDL_WINDOW_FULLSCREEN | SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_BORDERLESS | SDL_WINDOW_INPUT_GRABBED);

SDL_GetCurrentDisplayMode то-же возвращает 1920x1080

quest ★★★★
() автор топика
Ответ на: комментарий от quest

Хм, буду иметь в виду. Когда масштабирование окажется слишком медленным — значит, пора мигрировать.

Если задачка про неправильное разрешение ещё не решилась, лично я бы оставил необходимый минимум параметров при создании окна и посмотрел, что из этого выйдет. А потом добавлял бы нужное.

al_exquemelin ★★★
()
Последнее исправление: al_exquemelin (всего исправлений: 1)
Ответ на: комментарий от al_exquemelin

да, буду на неделе еще играться с этим

quest ★★★★
() автор топика
Ответ на: комментарий от anonymous

SDL2 что не так с ним в 2016? предложите альтернативу! у меня задачи простого 2d вывода с масштабированием

quest ★★★★
() автор топика
Последнее исправление: quest (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.