| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- 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.
|