summary refs log tree commit diff stats
path: root/tests/niminaction/Chapter8
diff options
context:
space:
mode:
Diffstat (limited to 'tests/niminaction/Chapter8')
-rw-r--r--tests/niminaction/Chapter8/canvas/canvas.nim23
-rw-r--r--tests/niminaction/Chapter8/canvas/canvas_test.nim19
-rw-r--r--tests/niminaction/Chapter8/sdl/sdl.nim38
-rw-r--r--tests/niminaction/Chapter8/sdl/sdl_test.nim41
-rw-r--r--tests/niminaction/Chapter8/sfml/sfml.nim26
-rw-r--r--tests/niminaction/Chapter8/sfml/sfml_test.nim14
6 files changed, 161 insertions, 0 deletions
diff --git a/tests/niminaction/Chapter8/canvas/canvas.nim b/tests/niminaction/Chapter8/canvas/canvas.nim
new file mode 100644
index 000000000..ae2765630
--- /dev/null
+++ b/tests/niminaction/Chapter8/canvas/canvas.nim
@@ -0,0 +1,23 @@
+discard """
+action: compile
+"""
+
+import dom
+
+type
+  CanvasRenderingContext* = ref object
+    fillStyle* {.importc.}: cstring
+    strokeStyle* {.importc.}: cstring
+
+{.push importcpp.}
+
+proc getContext*(canvasElement: Element,
+    contextType: cstring): CanvasRenderingContext
+
+proc fillRect*(context: CanvasRenderingContext, x, y, width, height: int)
+
+proc moveTo*(context: CanvasRenderingContext, x, y: int)
+
+proc lineTo*(context: CanvasRenderingContext, x, y: int)
+
+proc stroke*(context: CanvasRenderingContext)
diff --git a/tests/niminaction/Chapter8/canvas/canvas_test.nim b/tests/niminaction/Chapter8/canvas/canvas_test.nim
new file mode 100644
index 000000000..42d222b7b
--- /dev/null
+++ b/tests/niminaction/Chapter8/canvas/canvas_test.nim
@@ -0,0 +1,19 @@
+import canvas, dom
+
+proc onLoad() {.exportc.} =
+  var canvas = document.getElementById("canvas").EmbedElement
+  canvas.width = window.innerWidth
+  canvas.height = window.innerHeight
+  var ctx = canvas.getContext("2d")
+
+  ctx.fillStyle = "#1d4099"
+  ctx.fillRect(0, 0, window.innerWidth, window.innerHeight)
+
+  ctx.strokeStyle = "#ffffff"
+  let letterWidth = 100
+  let letterLeftPos = (window.innerWidth div 2) - (letterWidth div 2)
+  ctx.moveTo(letterLeftPos, 320)
+  ctx.lineTo(letterLeftPos, 110)
+  ctx.lineTo(letterLeftPos + letterWidth, 320)
+  ctx.lineTo(letterLeftPos + letterWidth, 110)
+  ctx.stroke()
diff --git a/tests/niminaction/Chapter8/sdl/sdl.nim b/tests/niminaction/Chapter8/sdl/sdl.nim
new file mode 100644
index 000000000..212f7b022
--- /dev/null
+++ b/tests/niminaction/Chapter8/sdl/sdl.nim
@@ -0,0 +1,38 @@
+when defined(windows):
+  const libName* = "SDL2.dll"
+elif defined(linux) or defined(freebsd) or defined(netbsd):
+  const libName* = "libSDL2.so"
+elif defined(macosx):
+  const libName* = "libSDL2.dylib"
+elif defined(openbsd):
+  const libName* = "libSDL2.so.0.6"
+else:
+  {.error: "SDL library name not set for this platform".}
+
+type
+  SdlWindow = object
+  SdlWindowPtr* = ptr SdlWindow
+  SdlRenderer = object
+  SdlRendererPtr* = ptr SdlRenderer
+
+const INIT_VIDEO* = 0x00000020
+
+{.push dynlib: libName.}
+proc init*(flags: uint32): cint {.importc: "SDL_Init".}
+
+proc createWindowAndRenderer*(width, height: cint, window_flags: cuint,
+    window: var SdlWindowPtr, renderer: var SdlRendererPtr): cint
+    {.importc: "SDL_CreateWindowAndRenderer".}
+
+proc pollEvent*(event: pointer): cint {.importc: "SDL_PollEvent".}
+
+proc setDrawColor*(renderer: SdlRendererPtr, r, g, b, a: uint8): cint
+    {.importc: "SDL_SetRenderDrawColor", discardable.}
+
+proc present*(renderer: SdlRendererPtr) {.importc: "SDL_RenderPresent".}
+
+proc clear*(renderer: SdlRendererPtr) {.importc: "SDL_RenderClear".}
+
+proc drawLines*(renderer: SdlRendererPtr, points: ptr tuple[x, y: cint],
+    count: cint): cint {.importc: "SDL_RenderDrawLines", discardable.}
+{.pop.}
diff --git a/tests/niminaction/Chapter8/sdl/sdl_test.nim b/tests/niminaction/Chapter8/sdl/sdl_test.nim
new file mode 100644
index 000000000..db1700e0d
--- /dev/null
+++ b/tests/niminaction/Chapter8/sdl/sdl_test.nim
@@ -0,0 +1,41 @@
+discard """
+action: compile
+"""
+
+import os
+import sdl
+
+if sdl.init(INIT_VIDEO) == -1:
+  quit("Couldn't initialise SDL")
+
+var window: SdlWindowPtr
+var renderer: SdlRendererPtr
+if createWindowAndRenderer(640, 480, 0, window, renderer) == -1:
+  quit("Couldn't create a window or renderer")
+
+discard pollEvent(nil)
+renderer.setDrawColor 29, 64, 153, 255
+renderer.clear
+renderer.setDrawColor 255, 255, 255, 255
+
+when false: # no long work with gcc 14!
+  # just to ensure code from NimInAction still works, but
+  # the `else` branch would work as well in C mode
+  var points = [
+    (260'i32, 320'i32),
+    (260'i32, 110'i32),
+    (360'i32, 320'i32),
+    (360'i32, 110'i32)
+  ]
+else:
+  var points = [
+    (260.cint, 320.cint),
+    (260.cint, 110.cint),
+    (360.cint, 320.cint),
+    (360.cint, 110.cint)
+  ]
+
+renderer.drawLines(addr points[0], points.len.cint)
+
+renderer.present
+sleep(5000)
diff --git a/tests/niminaction/Chapter8/sfml/sfml.nim b/tests/niminaction/Chapter8/sfml/sfml.nim
new file mode 100644
index 000000000..fea85fcd4
--- /dev/null
+++ b/tests/niminaction/Chapter8/sfml/sfml.nim
@@ -0,0 +1,26 @@
+{.passL: "-lsfml-graphics -lsfml-system -lsfml-window".}
+
+type
+  VideoMode* {.importcpp: "sf::VideoMode".} = object
+  RenderWindowObj {.importcpp: "sf::RenderWindow".} = object
+  RenderWindow* = ptr RenderWindowObj
+  Color* {.importcpp: "sf::Color".} = object
+  Event* {.importcpp: "sf::Event".} = object
+
+{.push cdecl, header: "<SFML/Graphics.hpp>".}
+
+proc videoMode*(modeWidth, modeHeight: cuint, modeBitsPerPixel: cuint = 32): VideoMode
+    {.importcpp: "sf::VideoMode(@)", constructor.}
+
+proc newRenderWindow*(mode: VideoMode, title: cstring): RenderWindow
+    {.importcpp: "new sf::RenderWindow(@)", constructor.}
+
+proc pollEvent*(window: RenderWindow, event: var Event): bool
+    {.importcpp: "#.pollEvent(@)".}
+
+proc newColor*(red, green, blue, alpha: uint8): Color
+    {.importcpp: "sf::Color(@)", constructor.}
+
+proc clear*(window: RenderWindow, color: Color) {.importcpp: "#.clear(@)".}
+
+proc display*(window: RenderWindow) {.importcpp: "#.display()".}
diff --git a/tests/niminaction/Chapter8/sfml/sfml_test.nim b/tests/niminaction/Chapter8/sfml/sfml_test.nim
new file mode 100644
index 000000000..e71060cb4
--- /dev/null
+++ b/tests/niminaction/Chapter8/sfml/sfml_test.nim
@@ -0,0 +1,14 @@
+discard """
+action: compile
+disabled: "windows"
+"""
+
+import sfml, os
+var window = newRenderWindow(videoMode(800, 600), "SFML works!")
+
+var event: Event
+discard window.pollEvent(event)
+window.clear(newColor(29, 64, 153, 255))
+window.display()
+
+sleep(1000)