showcase_clear.mod 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. MODULE showcase_clear ;
  2. (*
  3. m2SDL showcase, ported from SDL-main
  4. examples/renderer/01-clear/clear.c (public domain).
  5. Clears the window to a smoothly fading color every frame; the
  6. sine-wave trick picks the color from the elapsed time.
  7. SDL3 -> SDL2 adaptations
  8. - SDL_CreateWindowAndRenderer keeps the SDL2 (w, h, flags,
  9. win^, ren^) form; SDL_WINDOW_RESIZABLE reused as-is.
  10. - SDL_SetRenderDrawColorFloat does not exist in SDL2, so the
  11. 0.0..1.0 floats are scaled to Uint8 0..255 here.
  12. - Callback structure (SDL_AppInit/Iterate/...) is flattened
  13. into a plain main loop with DrainEvents; auto-quit after 8 s
  14. so the showcase also terminates unattended.
  15. *)
  16. FROM SYSTEM IMPORT CARDINAL8;
  17. FROM SDL2 IMPORT SDL_Init, SDL_Quit, SDL_Delay,
  18. SDL_GetTicks, SDL_GetTicks64, SDLInitVideo;
  19. FROM SDLVideo IMPORT WindowHandle, SDL_DestroyWindow, WindowResizable;
  20. FROM SDLRender IMPORT RendererHandle,
  21. SDL_CreateWindowAndRenderer, SDL_DestroyRenderer,
  22. SDL_SetRenderDrawColor, SDL_RenderClear, SDL_RenderPresent,
  23. SDL_RenderSetLogicalSize;
  24. FROM SDLUtils IMPORT DrainEvents;
  25. FROM MathLib0 IMPORT sin, entier;
  26. FROM libc IMPORT printf;
  27. CONST FrameMs = 16; MaxMs = 8000;
  28. VAR
  29. win: WindowHandle;
  30. ren: RendererHandle;
  31. quit: BOOLEAN;
  32. start: LONGCARD;
  33. t: REAL;
  34. r, g, b: INTEGER;
  35. BEGIN
  36. IF SDL_Init(SDLInitVideo) # 0 THEN
  37. printf("showcase_clear: SDL_Init failed\n");
  38. HALT(1)
  39. END;
  40. IF SDL_CreateWindowAndRenderer(640, 480, WindowResizable,
  41. win, ren) # 0 THEN
  42. printf("showcase_clear: CreateWindowAndRenderer failed\n");
  43. SDL_Quit;
  44. HALT(1)
  45. END;
  46. SDL_RenderSetLogicalSize(ren, 640, 480);
  47. printf("showcase_clear: fading, close window or wait 8s\n");
  48. quit := FALSE;
  49. start := SDL_GetTicks64();
  50. WHILE NOT quit DO
  51. DrainEvents(quit);
  52. (* seconds since start, as REAL (double). *)
  53. t := VAL(REAL, SDL_GetTicks()) / 1000.0;
  54. r := entier(127.5 + 127.5 * sin(t));
  55. g := entier(127.5 + 127.5 * sin(t + 2.0944));
  56. b := entier(127.5 + 127.5 * sin(t + 4.1888));
  57. SDL_SetRenderDrawColor(ren, VAL(CARDINAL8, r),
  58. VAL(CARDINAL8, g),
  59. VAL(CARDINAL8, b),
  60. VAL(CARDINAL8, 255));
  61. SDL_RenderClear(ren);
  62. SDL_RenderPresent(ren);
  63. IF SDL_GetTicks64() - start > MaxMs THEN quit := TRUE END;
  64. SDL_Delay(FrameMs)
  65. END;
  66. SDL_DestroyRenderer(ren);
  67. SDL_DestroyWindow(win);
  68. SDL_Quit;
  69. printf("showcase_clear: bye\n")
  70. END showcase_clear.