showcase_debug_text.mod 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. MODULE showcase_debug_text ;
  2. (*
  3. m2SDL3 showcase, ported from SDL upstream
  4. examples/renderer/18-debug-text/debug-text.c (public domain).
  5. Renders built-in bitmap debug text: plain lines, a colored line,
  6. a 4x-scaled line and a live "running for N seconds" counter.
  7. Porting notes
  8. - SDL_RenderDebugTextFormat (C varargs) has no Modula-2 mapping,
  9. so the counter line is composed into a CHAR buffer with the
  10. local AppendCard helper instead.
  11. - The upstream emoji line is ASCII-only in SDL anyway; the emoji
  12. bytes are replaced by plain words here (CHAR literals stay
  13. 8-bit clean this way).
  14. - Callback structure flattened into a main loop; auto-quit
  15. after 8 s so the showcase also terminates unattended.
  16. *)
  17. FROM SYSTEM IMPORT CARDINAL8;
  18. FROM SDL3 IMPORT SDL_Init, SDL_Quit, SDL_Delay,
  19. SDL_GetTicks, SDLInitVideo;
  20. FROM SDL3Video IMPORT WindowHandle, SDL_DestroyWindow, WindowResizable;
  21. FROM SDL3Render IMPORT RendererHandle,
  22. SDL_CreateWindowAndRenderer, SDL_DestroyRenderer,
  23. SDL_SetRenderDrawColor, SDL_RenderClear, SDL_RenderPresent,
  24. SDL_SetRenderLogicalPresentation, LogicalLetterbox,
  25. SDL_SetRenderScale, SDL_RenderDebugText;
  26. FROM SDL3Utils IMPORT DrainEvents;
  27. FROM libc IMPORT printf;
  28. CONST FrameMs = 16; MaxMs = 8000;
  29. CONST WinW = 640; WinH = 480;
  30. VAR
  31. win: WindowHandle;
  32. ren: RendererHandle;
  33. quit: BOOLEAN;
  34. start: LONGCARD;
  35. secs: LONGCARD;
  36. pos: CARDINAL;
  37. msg: ARRAY [0..127] OF CHAR;
  38. (* Append decimal n at buf[pos]; RETURN new pos (buf stays NUL-ended). *)
  39. PROCEDURE AppendCard (VAR buf: ARRAY OF CHAR; pos: CARDINAL;
  40. n: LONGCARD) : CARDINAL;
  41. VAR digits: ARRAY [0..23] OF CHAR; nd, k: CARDINAL;
  42. BEGIN
  43. nd := 0;
  44. IF n = 0 THEN digits[0] := "0"; nd := 1
  45. ELSE
  46. WHILE n > 0 DO
  47. digits[nd] := CHR(ORD("0") + VAL(CARDINAL, n MOD 10));
  48. INC(nd);
  49. n := n DIV 10
  50. END
  51. END;
  52. k := nd;
  53. WHILE k > 0 DO
  54. DEC(k);
  55. IF pos <= HIGH(buf) THEN buf[pos] := digits[k]; INC(pos) END
  56. END;
  57. IF pos <= HIGH(buf) THEN buf[pos] := 0C END;
  58. RETURN pos
  59. END AppendCard;
  60. PROCEDURE AppendStr (VAR buf: ARRAY OF CHAR; pos: CARDINAL;
  61. s: ARRAY OF CHAR) : CARDINAL;
  62. VAR k: CARDINAL;
  63. BEGIN
  64. k := 0;
  65. WHILE (k <= HIGH(s)) AND (s[k] # 0C) DO
  66. IF pos <= HIGH(buf) THEN buf[pos] := s[k]; INC(pos) END;
  67. INC(k)
  68. END;
  69. IF pos <= HIGH(buf) THEN buf[pos] := 0C END;
  70. RETURN pos
  71. END AppendStr;
  72. BEGIN
  73. IF NOT SDL_Init(SDLInitVideo) THEN
  74. printf("showcase_debug_text: SDL_Init failed\n");
  75. HALT(1)
  76. END;
  77. IF NOT SDL_CreateWindowAndRenderer("m2SDL3 debug text",
  78. WinW, WinH,
  79. VAL(LONGCARD, WindowResizable),
  80. win, ren) THEN
  81. printf("showcase_debug_text: CreateWindowAndRenderer failed\n");
  82. SDL_Quit;
  83. HALT(1)
  84. END;
  85. SDL_SetRenderLogicalPresentation(ren, WinW, WinH, LogicalLetterbox);
  86. printf("showcase_debug_text: close window or wait 8s\n");
  87. quit := FALSE;
  88. start := SDL_GetTicks();
  89. WHILE NOT quit DO
  90. DrainEvents(quit);
  91. SDL_SetRenderDrawColor(ren, VAL(CARDINAL8, 0), VAL(CARDINAL8, 0),
  92. VAL(CARDINAL8, 0), VAL(CARDINAL8, 255));
  93. SDL_RenderClear(ren);
  94. SDL_SetRenderDrawColor(ren, VAL(CARDINAL8, 255), VAL(CARDINAL8, 255),
  95. VAL(CARDINAL8, 255), VAL(CARDINAL8, 255));
  96. SDL_RenderDebugText(ren, VAL(SHORTREAL, 272.0),
  97. VAL(SHORTREAL, 100.0), "Hello world!");
  98. SDL_RenderDebugText(ren, VAL(SHORTREAL, 224.0),
  99. VAL(SHORTREAL, 150.0),
  100. "This is some debug text.");
  101. SDL_SetRenderDrawColor(ren, VAL(CARDINAL8, 51), VAL(CARDINAL8, 102),
  102. VAL(CARDINAL8, 255), VAL(CARDINAL8, 255));
  103. SDL_RenderDebugText(ren, VAL(SHORTREAL, 184.0),
  104. VAL(SHORTREAL, 200.0),
  105. "You can do it in different colors.");
  106. SDL_SetRenderDrawColor(ren, VAL(CARDINAL8, 255), VAL(CARDINAL8, 255),
  107. VAL(CARDINAL8, 255), VAL(CARDINAL8, 255));
  108. SDL_SetRenderScale(ren, VAL(SHORTREAL, 4.0), VAL(SHORTREAL, 4.0));
  109. SDL_RenderDebugText(ren, VAL(SHORTREAL, 14.0),
  110. VAL(SHORTREAL, 65.0), "It can be scaled.");
  111. SDL_SetRenderScale(ren, VAL(SHORTREAL, 1.0), VAL(SHORTREAL, 1.0));
  112. SDL_RenderDebugText(ren, VAL(SHORTREAL, 64.0),
  113. VAL(SHORTREAL, 350.0),
  114. "This only does ASCII chars.");
  115. secs := (SDL_GetTicks() - start) DIV 1000;
  116. pos := AppendStr(msg, 0, "(This program has been running for ");
  117. pos := AppendCard(msg, pos, secs);
  118. pos := AppendStr(msg, pos, " seconds.)");
  119. SDL_RenderDebugText(ren, VAL(SHORTREAL, 136.0),
  120. VAL(SHORTREAL, 400.0), msg);
  121. SDL_RenderPresent(ren);
  122. IF SDL_GetTicks() - start > MaxMs THEN quit := TRUE END;
  123. SDL_Delay(FrameMs)
  124. END;
  125. SDL_DestroyRenderer(ren);
  126. SDL_DestroyWindow(win);
  127. SDL_Quit;
  128. printf("showcase_debug_text: bye\n")
  129. END showcase_debug_text.