SDL 1.3: как добавить простую шкалу масштаба 9 для изменения размера изображения? - PullRequest
1 голос
/ 25 июня 2011

У нас есть изображение, например:

enter image description here

У нас есть 4 координаты: верхняя, 10, нижняя: 10, левая: 10, правая: 10, мы изменили размеры до значений типа newWidth: 100, newHeight: 35 у нас есть SDL_Rect Sprite, который был сгенерирован из некоторого SDL_Surface *button, как выполнить на этом Sprite такие преобразования изменения размера?

Так как же добавить 9-фрагментное масштабирование в SDL?

1 Ответ

0 голосов
/ 12 марта 2019

Я сделал демонстрационный проект, выполняющий рендеринг с 9 срезами, используя и здесь: https://github.com/cxong/sdl2-9-slice

screenshot

Взгляните на функцию render() и скопируйте ее, если хотите, - она ​​разрешительно лицензирована.

Ключом является использование параметров srcrect и dstrect SDL_RenderCopy() - первая - это какая часть исходной текстуры для рендеринга, вторая - какая часть назначения (цель рендеринга) для рендеринга.

Для 9 срезов углы копируются как есть;для средних частей, в зависимости от того, как вы хотите визуализировать - растягивать или повторять - srcrect будет одинаковым, но dstrect будет растягиваться или повторяться.

Другое дело, что SDL делаетне делайте текстуру, повторяющуюся (пока).Поэтому, если вы хотите выполнить рендеринг в режиме повтора, вам нужно использовать цикл.

Вот функция на случай, если проект умрет:

int render(
    SDL_Renderer *renderer, SDL_Surface *s, SDL_Texture *t,
    int x, int y, int top, int bottom, int left, int right, int w, int h,
    bool repeat)
{
    const int srcX[] = {0, left, s->w - right};
    const int srcY[] = {0, top, s->h - bottom};
    const int srcW[] = {left, s->w - right - left, right};
    const int srcH[] = {top, s->h - bottom - top, bottom};
    const int dstX[] = {x, x + left, x + w - right, x + w};
    const int dstY[] = {y, y + top, y + h - bottom, y + h};
    const int dstW[] = {left, w - right - left, right};
    const int dstH[] = {top, h - bottom - top, bottom};
    SDL_Rect src;
    SDL_Rect dst;
    for (int i = 0; i < 3; i++)
    {
        src.x = srcX[i];
        src.w = srcW[i];
        dst.w = repeat ? srcW[i] : dstW[i];
        for (dst.x = dstX[i]; dst.x < dstX[i + 1]; dst.x += dst.w)
        {
            if (dst.x + dst.w > dstX[i + 1])
            {
                src.w = dst.w = dstX[i + 1] - dst.x;
            }
            for (int j = 0; j < 3; j++)
            {
                src.y = srcY[j];
                src.h = srcH[j];
                dst.h = repeat ? srcH[j] : dstH[j];
                for (dst.y = dstY[j]; dst.y < dstY[j + 1]; dst.y += dst.h)
                {
                    if (dst.y + dst.h > dstY[j + 1])
                    {
                        src.h = dst.h = dstY[j + 1] - dst.y;
                    }
                    const int res = SDL_RenderCopy(renderer, t, &src, &dst);
                    if (res != 0)
                    {
                        return res;
                    }
                }
            }
        }
    }
    return 0;
}
...