MODULE showcase_primitives ; (* m2SDL3 showcase, ported from SDL upstream examples/renderer/02-primitives/primitives.c (public domain). Draws a filled rectangle, 500 random points, an inset outline and a yellow X across the canvas every frame. SDL3 native form: - SDL_RenderRect / SDL_RenderPoints / SDL_RenderFillRect take SDL_FRect / SDL_FPoint records with SHORTREAL fields. - Point array passes as ADR(points) + count (see SDL3Render). - libc rand seeded from SDL_GetTicks replaces SDL_randf. - Callback structure flattened into a main loop; auto-quit after 8 s so the showcase also terminates unattended. *) FROM SYSTEM IMPORT ADDRESS, ADR, CARDINAL8; FROM SDL3 IMPORT SDL_Init, SDL_Quit, SDL_Delay, SDL_GetTicks, SDLInitVideo; FROM SDL3Video IMPORT WindowHandle, SDL_DestroyWindow, WindowResizable; FROM SDL3Render IMPORT RendererHandle, SDL_CreateWindowAndRenderer, SDL_DestroyRenderer, SDL_SetRenderDrawColor, SDL_RenderClear, SDL_RenderPresent, SDL_SetRenderLogicalPresentation, LogicalLetterbox, SDL_RenderLine, SDL_RenderRect, SDL_RenderPoints, SDL_RenderFillRect; FROM SDL3Rect IMPORT SDLFRect, SDLFPoint, MakeFRect, MakeFPoint; FROM SDL3Utils IMPORT DrainEvents; FROM libc IMPORT printf, rand, srand; CONST FrameMs = 16; MaxMs = 8000; CONST WinW = 640; WinH = 480; NPoints = 500; VAR win: WindowHandle; ren: RendererHandle; points: ARRAY [0..NPoints-1] OF SDLFPoint; rect: SDLFRect; quit: BOOLEAN; start: LONGCARD; i: INTEGER; BEGIN IF NOT SDL_Init(SDLInitVideo) THEN printf("showcase_primitives: SDL_Init failed\n"); HALT(1) END; IF NOT SDL_CreateWindowAndRenderer("m2SDL3 primitives", WinW, WinH, VAL(LONGCARD, WindowResizable), win, ren) THEN printf("showcase_primitives: CreateWindowAndRenderer failed\n"); SDL_Quit; HALT(1) END; SDL_SetRenderLogicalPresentation(ren, WinW, WinH, LogicalLetterbox); (* scatter the points inside the blue rectangle, as in the C code. *) srand(VAL(INTEGER, SDL_GetTicks())); FOR i := 0 TO NPoints - 1 DO points[i] := MakeFPoint(VAL(SHORTREAL, VAL(REAL, rand() MOD 440 + 100)), VAL(SHORTREAL, VAL(REAL, rand() MOD 280 + 100))) END; printf("showcase_primitives: close window or wait 8s\n"); quit := FALSE; start := SDL_GetTicks(); WHILE NOT quit DO DrainEvents(quit); SDL_SetRenderDrawColor(ren, VAL(CARDINAL8, 33), VAL(CARDINAL8, 33), VAL(CARDINAL8, 33), VAL(CARDINAL8, 255)); SDL_RenderClear(ren); rect := MakeFRect(VAL(SHORTREAL, 100.0), VAL(SHORTREAL, 100.0), VAL(SHORTREAL, 440.0), VAL(SHORTREAL, 280.0)); SDL_SetRenderDrawColor(ren, VAL(CARDINAL8, 0), VAL(CARDINAL8, 0), VAL(CARDINAL8, 255), VAL(CARDINAL8, 255)); SDL_RenderFillRect(ren, rect); SDL_SetRenderDrawColor(ren, VAL(CARDINAL8, 255), VAL(CARDINAL8, 0), VAL(CARDINAL8, 0), VAL(CARDINAL8, 255)); SDL_RenderPoints(ren, ADR(points), NPoints); rect := MakeFRect(VAL(SHORTREAL, 130.0), VAL(SHORTREAL, 130.0), VAL(SHORTREAL, 380.0), VAL(SHORTREAL, 220.0)); SDL_SetRenderDrawColor(ren, VAL(CARDINAL8, 0), VAL(CARDINAL8, 255), VAL(CARDINAL8, 0), VAL(CARDINAL8, 255)); SDL_RenderRect(ren, rect); SDL_SetRenderDrawColor(ren, VAL(CARDINAL8, 255), VAL(CARDINAL8, 255), VAL(CARDINAL8, 0), VAL(CARDINAL8, 255)); SDL_RenderLine(ren, VAL(SHORTREAL, 0.0), VAL(SHORTREAL, 0.0), VAL(SHORTREAL, VAL(REAL, WinW)), VAL(SHORTREAL, VAL(REAL, WinH))); SDL_RenderLine(ren, VAL(SHORTREAL, 0.0), VAL(SHORTREAL, VAL(REAL, WinH)), VAL(SHORTREAL, VAL(REAL, WinW)), VAL(SHORTREAL, 0.0)); SDL_RenderPresent(ren); IF SDL_GetTicks() - start > MaxMs THEN quit := TRUE END; SDL_Delay(FrameMs) END; SDL_DestroyRenderer(ren); SDL_DestroyWindow(win); SDL_Quit; printf("showcase_primitives: bye\n") END showcase_primitives.