module "/pliant/language/context.pli" module "/pliant/math/functions.pli" module "/pliant/SDL/SDL.pli" gvar Pointer:SDL_Surface tile gvar Pointer:SDL_Surface screen function rotate dest src angle scale arg Pointer:SDL_Surface dest src arg Float angle scale var Int u v du dv x y sx sy mv mu var uInt umask := src:w - 1 var uInt vmask := src:h - 1 var Address texture image var Float temp texture := src:pixels image := dest:pixels sx := 0; sy := 0 du := cast (scale * (cos angle) * 4096.0) Int dv := cast (scale * (sin angle) * 4096.0) Int for y 0 (dest:h - 1) u := sx v := sy for x 0 (dest:w - 1) mv := (v \ 2^12 ) .and. vmask mu := (u \ 2^12 ) .and. umask (image map uInt8) := (texture map uInt8 (mv * src:w + mu )) image := (image translate uInt8 1) u += du v += dv sx -= dv sy += du return function init -> b arg Bool b b := true if (SDL_Init SDL_INIT_VIDEO) < 0 console "Could not initialize SDL!" eol SDL_QUIT b := false return screen :> (SDL_SetVideoMode 640 480 8 SDL_SWSURFACE) if not (exists screen) console "Could not init video!" eol SDL_QUIT b := false return tile :> SDL_LoadBMP "astroids.bmp" SDL_SetColors screen tile:format:palette:colors 0 tile:format:palette:ncolors function main var SDL_Event event var Float angle := 0.0 if not (init) console "Init failed..." eol return var CBool done := false while not done while SDL_PollEvent:event > 0 if event:type = SDL_QUIT done := true eif event:type = SDL_KEYDOWN done := true rotate screen tile angle (sin angle) SDL_UpdateRect screen 0 0 0 0 angle += 0.005 SDL_FreeSurface tile SDL_QUIT return main