# Demo: Fast blitting of images via textures in GPU memory with SDL2 in Raspian-Stretch
# Images are loaded via SDL2_images
from os import listdir, path
import sys
import time
from sdl2 import *
from sdl2.sdlimage import IMG_Load as SDL_LoadImage
# Initialize SDL2
SDL_Init(SDL_INIT_VIDEO)
try:
# create fullscreen display
win = SDL_CreateWindow(b'Fast Blitting', 0,0,0,0, SDL_WINDOW_FULLSCREEN)
# create renderer
renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC)
# load all JPG files in folder 'fotos_jpg' into textures in GPU memory
textures = []
folder = path.realpath('.')+'/assets/fotos_jpg/'
files = listdir(folder)
for f in files:
img = SDL_LoadImage((folder+f).encode())
tex = SDL_CreateTextureFromSurface(renderer, img)
SDL_FreeSurface(img)
textures.append(tex)
# blit 100 images
cnt = len(textures)
t_start = time.time()
for i in range(100):
SDL_RenderCopy(renderer, textures[i % cnt], None, None)
# Use this function to update the screen with any rendering performed since the previous call.
SDL_RenderPresent(renderer)
# reduce fps via delay
#SDL_Delay(10)
# show fps
sec = time.time()-t_start
print('fps: '+str(100/sec))
except:
print(sys.exc_info())
# clean up
if 'win' in locals():
if 'renderer' in locals():
if 'textures' in locals():
for tex in textures: SDL_DestroyTexture(tex)
SDL_DestroyRenderer(renderer)
SDL_DestroyWindow(win)
SDL_Quit()