| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- MODULE showcase_clear ;
- (*
- m2SDL showcase, ported from SDL-main
- examples/renderer/01-clear/clear.c (public domain).
- Clears the window to a smoothly fading color every frame; the
- sine-wave trick picks the color from the elapsed time.
- SDL3 -> SDL2 adaptations
- - SDL_CreateWindowAndRenderer keeps the SDL2 (w, h, flags,
- win^, ren^) form; SDL_WINDOW_RESIZABLE reused as-is.
- - SDL_SetRenderDrawColorFloat does not exist in SDL2, so the
- 0.0..1.0 floats are scaled to Uint8 0..255 here.
- - Callback structure (SDL_AppInit/Iterate/...) is flattened
- into a plain main loop with DrainEvents; auto-quit after 8 s
- so the showcase also terminates unattended.
- *)
- FROM SYSTEM IMPORT CARDINAL8;
- FROM SDL2 IMPORT SDL_Init, SDL_Quit, SDL_Delay,
- SDL_GetTicks, SDL_GetTicks64, SDLInitVideo;
- FROM SDLVideo IMPORT WindowHandle, SDL_DestroyWindow, WindowResizable;
- FROM SDLRender IMPORT RendererHandle,
- SDL_CreateWindowAndRenderer, SDL_DestroyRenderer,
- SDL_SetRenderDrawColor, SDL_RenderClear, SDL_RenderPresent,
- SDL_RenderSetLogicalSize;
- FROM SDLUtils IMPORT DrainEvents;
- FROM MathLib0 IMPORT sin, entier;
- FROM libc IMPORT printf;
- CONST FrameMs = 16; MaxMs = 8000;
- VAR
- win: WindowHandle;
- ren: RendererHandle;
- quit: BOOLEAN;
- start: LONGCARD;
- t: REAL;
- r, g, b: INTEGER;
- BEGIN
- IF SDL_Init(SDLInitVideo) # 0 THEN
- printf("showcase_clear: SDL_Init failed\n");
- HALT(1)
- END;
- IF SDL_CreateWindowAndRenderer(640, 480, WindowResizable,
- win, ren) # 0 THEN
- printf("showcase_clear: CreateWindowAndRenderer failed\n");
- SDL_Quit;
- HALT(1)
- END;
- SDL_RenderSetLogicalSize(ren, 640, 480);
- printf("showcase_clear: fading, close window or wait 8s\n");
- quit := FALSE;
- start := SDL_GetTicks64();
- WHILE NOT quit DO
- DrainEvents(quit);
- (* seconds since start, as REAL (double). *)
- t := VAL(REAL, SDL_GetTicks()) / 1000.0;
- r := entier(127.5 + 127.5 * sin(t));
- g := entier(127.5 + 127.5 * sin(t + 2.0944));
- b := entier(127.5 + 127.5 * sin(t + 4.1888));
- SDL_SetRenderDrawColor(ren, VAL(CARDINAL8, r),
- VAL(CARDINAL8, g),
- VAL(CARDINAL8, b),
- VAL(CARDINAL8, 255));
- SDL_RenderClear(ren);
- SDL_RenderPresent(ren);
- IF SDL_GetTicks64() - start > MaxMs THEN quit := TRUE END;
- SDL_Delay(FrameMs)
- END;
- SDL_DestroyRenderer(ren);
- SDL_DestroyWindow(win);
- SDL_Quit;
- printf("showcase_clear: bye\n")
- END showcase_clear.
|