I did some tests for this problem.
Test 1: blitting order: surface -> texture -> window. Then SDL2 can handle resize automatically. When window resizes, image resizes too.
code of test1:
int sdltest() {
SDL_Window* window;
SDL_Renderer* renderer;
if (SDL_Init(SDL_INIT_EVERYTHING) < 0) return 1;
if (!IMG_Init(IMG_INIT_PNG)) return 1;
window = SDL_CreateWindow(“test”, SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE | SDL_RENDERER_PRESENTVSYNC);
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, “linear”);
renderer = SDL_CreateRenderer(window, -1, 0);
SDL_Surface *_mainpic = IMG_Load(“somepic.png”);
SDL_Texture *_maintx = SDL_CreateTextureFromSurface(renderer, _mainpic);
SDL_FreeSurface(_mainpic);
SDL_Event ev;
while (true){
while (SDL_PollEvent(&ev))
if (ev.type == SDL_QUIT) return 0;
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, _maintx, NULL, NULL);
SDL_RenderPresent(renderer);
SDL_Delay(10);
}
return 0;
}
Test 2: blitting order: surface -> texture -> another texture -> window. Then SDL2 can not handle resize. When window resizes, image stops updating. If I drag the window to smaller size, the image will be cut to the window size (not zoom), and will not restore even when I drag the window to original size.
code of test2:
Code:
int sdltest() {
SDL_Window* window;
SDL_Renderer* renderer;
if (SDL_Init(SDL_INIT_EVERYTHING) < 0) return 1;
if (!IMG_Init(IMG_INIT_PNG)) return 1;
window = SDL_CreateWindow(“test”, SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE | SDL_RENDERER_PRESENTVSYNC);
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, “linear”);
renderer = SDL_CreateRenderer(window, -1, 0);
SDL_Surface *_mainpic = IMG_Load(“somepic.png”);
SDL_Texture *_maintx = SDL_CreateTextureFromSurface(renderer, _mainpic);
SDL_Texture *tex = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, 640, 480);
SDL_FreeSurface(_mainpic);
SDL_Event ev;
while (true){
while (SDL_PollEvent(&ev))
if (ev.type == SDL_QUIT) return 0;
SDL_SetRenderTarget(renderer, NULL);
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
SDL_RenderClear(renderer);
SDL_SetRenderTarget(renderer, tex);
SDL_RenderCopy(renderer, _maintx, NULL, NULL);
SDL_SetRenderTarget(renderer, NULL);
SDL_RenderCopy(renderer, tex, NULL, NULL);
SDL_RenderPresent(renderer);
SDL_Delay(10);
}
return 0;
}
Jonny D wrote:> Which function are you using to resize the window, or is it user-resizable? ?Which platform and renderer are you using?
Jonny D