|
|
@@ -0,0 +1,117 @@
|
|
|
+MODULE showcase_rectangles ;
|
|
|
+
|
|
|
+(*
|
|
|
+ m2SDL showcase, ported from SDL-main
|
|
|
+ examples/renderer/05-rectangles/rectangles.c (public domain).
|
|
|
+
|
|
|
+ Draws animated rectangle outlines, a filled rectangle and a
|
|
|
+ bar chart every frame; sizes breathe in and out over 2 seconds.
|
|
|
+
|
|
|
+ SDL3 -> SDL2 adaptations
|
|
|
+ - SDL_RenderRect/Rects/FillRect/FillRects become the SDL2
|
|
|
+ SDL_RenderDrawRect(s) / SDL_RenderFillRect(s) spellings.
|
|
|
+ - SDL_FRect floats become integer SDLRect; the -1.0..1.0 scale
|
|
|
+ is kept as permille (-500..500) with integer arithmetic.
|
|
|
+ - Rect arrays pass as ADR(rects) + count (see SDLRender docs).
|
|
|
+ - 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 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,
|
|
|
+ SDL_RenderDrawRect, SDL_RenderDrawRects,
|
|
|
+ SDL_RenderFillRect, SDL_RenderFillRects;
|
|
|
+FROM SDLRect IMPORT SDLRect, MakeRect;
|
|
|
+FROM SDLUtils IMPORT DrainEvents;
|
|
|
+FROM libc IMPORT printf;
|
|
|
+
|
|
|
+CONST FrameMs = 16; MaxMs = 8000;
|
|
|
+CONST WinW = 640; WinH = 480;
|
|
|
+
|
|
|
+VAR
|
|
|
+ win: WindowHandle;
|
|
|
+ ren: RendererHandle;
|
|
|
+ rects: ARRAY [0..15] OF SDLRect;
|
|
|
+ quit: BOOLEAN;
|
|
|
+ start: LONGCARD;
|
|
|
+ now: CARDINAL;
|
|
|
+ dir, sm, i, size, w, h: INTEGER;
|
|
|
+
|
|
|
+BEGIN
|
|
|
+ IF SDL_Init(SDLInitVideo) # 0 THEN
|
|
|
+ printf("showcase_rectangles: SDL_Init failed\n");
|
|
|
+ HALT(1)
|
|
|
+ END;
|
|
|
+ IF SDL_CreateWindowAndRenderer(WinW, WinH, WindowResizable,
|
|
|
+ win, ren) # 0 THEN
|
|
|
+ printf("showcase_rectangles: CreateWindowAndRenderer failed\n");
|
|
|
+ SDL_Quit;
|
|
|
+ HALT(1)
|
|
|
+ END;
|
|
|
+ SDL_RenderSetLogicalSize(ren, WinW, WinH);
|
|
|
+
|
|
|
+ printf("showcase_rectangles: close window or wait 8s\n");
|
|
|
+ quit := FALSE;
|
|
|
+ start := SDL_GetTicks64();
|
|
|
+ WHILE NOT quit DO
|
|
|
+ DrainEvents(quit);
|
|
|
+ now := SDL_GetTicks();
|
|
|
+ (* breathe: +1 for one second, -1 for the next. *)
|
|
|
+ IF VAL(INTEGER, now MOD 2000) >= 1000 THEN dir := 1 ELSE dir := -1 END;
|
|
|
+ (* scale in permille, -500..500. *)
|
|
|
+ sm := (VAL(INTEGER, now MOD 1000) - 500) * dir;
|
|
|
+
|
|
|
+ SDL_SetRenderDrawColor(ren, VAL(CARDINAL8, 0), VAL(CARDINAL8, 0),
|
|
|
+ VAL(CARDINAL8, 0), VAL(CARDINAL8, 255));
|
|
|
+ SDL_RenderClear(ren);
|
|
|
+
|
|
|
+ (* single outlined square, top left. *)
|
|
|
+ rects[0] := MakeRect(100, 100, 100 + 100 * sm DIV 500,
|
|
|
+ 100 + 100 * sm DIV 500);
|
|
|
+ SDL_SetRenderDrawColor(ren, VAL(CARDINAL8, 255), VAL(CARDINAL8, 0),
|
|
|
+ VAL(CARDINAL8, 0), VAL(CARDINAL8, 255));
|
|
|
+ SDL_RenderDrawRect(ren, rects[0]);
|
|
|
+
|
|
|
+ (* three centered outlines at once. *)
|
|
|
+ FOR i := 0 TO 2 DO
|
|
|
+ size := (i + 1) * 50;
|
|
|
+ w := size + size * sm DIV 500;
|
|
|
+ rects[i] := MakeRect((WinW - w) DIV 2, (WinH - w) DIV 2, w, w)
|
|
|
+ END;
|
|
|
+ SDL_SetRenderDrawColor(ren, VAL(CARDINAL8, 0), VAL(CARDINAL8, 255),
|
|
|
+ VAL(CARDINAL8, 0), VAL(CARDINAL8, 255));
|
|
|
+ SDL_RenderDrawRects(ren, ADR(rects), 3);
|
|
|
+
|
|
|
+ (* one filled rectangle. *)
|
|
|
+ rects[0] := MakeRect(400, 50, 100 + 100 * sm DIV 500,
|
|
|
+ 50 + 50 * sm DIV 500);
|
|
|
+ SDL_SetRenderDrawColor(ren, VAL(CARDINAL8, 0), VAL(CARDINAL8, 0),
|
|
|
+ VAL(CARDINAL8, 255), VAL(CARDINAL8, 255));
|
|
|
+ SDL_RenderFillRect(ren, rects[0]);
|
|
|
+
|
|
|
+ (* white bar chart along the bottom. *)
|
|
|
+ FOR i := 0 TO 15 DO
|
|
|
+ w := WinW DIV 16;
|
|
|
+ h := i * 8;
|
|
|
+ rects[i] := MakeRect(i * w, WinH - h, w, h)
|
|
|
+ END;
|
|
|
+ SDL_SetRenderDrawColor(ren, VAL(CARDINAL8, 255), VAL(CARDINAL8, 255),
|
|
|
+ VAL(CARDINAL8, 255), VAL(CARDINAL8, 255));
|
|
|
+ SDL_RenderFillRects(ren, ADR(rects), 16);
|
|
|
+
|
|
|
+ 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_rectangles: bye\n")
|
|
|
+END showcase_rectangles.
|