Commita5e9960dRecorded11 Dec 2025Repositorysigil-studio

Add draw-text-centered and transform demo

Changed
 src/sigil/studio/font.sgl |   9 ++++++---
 test/test-transforms.sgl  | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 150 insertions(+), 3 deletions(-)
Diff
src/sigil/studio/font.sglmodified
@@ -12,8 +12,11 @@
12
font? font-size font-line-height
13
14
;; Text rendering
15
draw-text draw-text-char text-width)
+15
draw-text draw-text-char text-width
+16
draw-text-centered)
17
18
(begin
18
;; Native functions are automatically available after native module init.
19
))
+19
;; Draw text centered on position x, y
+20
(define (draw-text-centered font text x y)
+21
(let ((w (text-width font text)))
+22
(draw-text font text (- x (/ w 2)) y)))))
test/test-transforms.sgladded
@@ -0,0 +1,144 @@
+1
;;; test-transforms.sgl - Demo of transform stack
+2
+3
(import (sigil core)
+4
(sigil studio app)
+5
(sigil studio graphics)
+6
(sigil studio font))
+7
+8
(define (label text x y)
+9
(set-color 0.7 0.7 0.7)
+10
(draw-text-centered *font* text x y))
+11
+12
(define *font* #f)
+13
(define *angle* 0.0)
+14
(define *time* 0.0)
+15
+16
(define (on-init)
+17
(set! *font* (load-font "test/Saucer.ttf" 18)))
+18
+19
(define (on-frame)
+20
(begin-frame)
+21
(clear-screen 0.05 0.05 0.1)
+22
+23
;; Update time
+24
(set! *time* (+ *time* 0.016))
+25
(set! *angle* (+ *angle* 0.02))
+26
+27
;; Title
+28
(when *font*
+29
(set-color 0.0 1.0 1.0)
+30
(draw-text-centered *font* "Transform Stack Demo" 400 30))
+31
+32
;; 1. Simple rotation around center
+33
(push-transform)
+34
(translate 150 150)
+35
(rotate *angle*)
+36
(set-color 1.0 0.3 0.3)
+37
(draw-filled-rect -40 -40 80 80)
+38
(set-color 1.0 1.0 1.0)
+39
(draw-rect -40 -40 80 80)
+40
(pop-transform)
+41
+42
(when *font*
+43
(label "Rotating" 150 250))
+44
+45
;; 2. Scaling pulse
+46
(push-transform)
+47
(translate 400 150)
+48
(define pulse (+ 0.7 (* 0.3 (sin (* *time* 3)))))
+49
(scale pulse pulse)
+50
(set-color 0.3 1.0 0.3)
+51
(draw-filled-rect -40 -40 80 80)
+52
(set-color 1.0 1.0 1.0)
+53
(draw-rect -40 -40 80 80)
+54
(pop-transform)
+55
+56
(when *font*
+57
(label "Pulsing" 400 250))
+58
+59
;; 3. Rotation + scale combined
+60
(push-transform)
+61
(translate 650 150)
+62
(rotate (* *angle* -0.5))
+63
(scale (+ 0.8 (* 0.2 (cos (* *time* 2))))
+64
(+ 0.8 (* 0.2 (sin (* *time* 2)))))
+65
(set-color 0.3 0.3 1.0)
+66
(draw-filled-rect -40 -40 80 80)
+67
(set-color 1.0 1.0 1.0)
+68
(draw-rect -40 -40 80 80)
+69
(pop-transform)
+70
+71
(when *font*
+72
(label "Combined" 650 250))
+73
+74
;; 4. Nested transforms - orbiting squares
+75
(push-transform)
+76
(translate 150 400)
+77
+78
;; Outer rotation
+79
(push-transform)
+80
(rotate *angle*)
+81
+82
;; Draw center
+83
(set-color 1.0 1.0 0.0)
+84
(draw-filled-rect -15 -15 30 30)
+85
+86
;; Orbiting square 1
+87
(push-transform)
+88
(translate 70 0)
+89
(rotate (* *angle* -2))
+90
(set-color 1.0 0.5 0.0)
+91
(draw-filled-rect -12 -12 24 24)
+92
(pop-transform)
+93
+94
;; Orbiting square 2
+95
(push-transform)
+96
(translate -70 0)
+97
(rotate (* *angle* -2))
+98
(set-color 0.0 1.0 0.5)
+99
(draw-filled-rect -12 -12 24 24)
+100
(pop-transform)
+101
+102
(pop-transform)
+103
(pop-transform)
+104
+105
(when *font*
+106
(label "Orbiting" 150 500))
+107
+108
;; 5. Triangle rotation
+109
(push-transform)
+110
(translate 400 400)
+111
(rotate (* *angle* 0.7))
+112
(set-color 1.0 0.0 1.0)
+113
(fill-triangle 0 -50 -43 25 43 25)
+114
(set-color 1.0 1.0 1.0)
+115
(draw-triangle 0 -50 -43 25 43 25)
+116
(pop-transform)
+117
+118
(when *font*
+119
(label "Triangle" 400 500))
+120
+121
;; 6. Line spinner
+122
(push-transform)
+123
(translate 650 400)
+124
(let loop ((i 0))
+125
(when (< i 8)
+126
(push-transform)
+127
(rotate (+ *angle* (* i 0.785))) ; i * pi/4
+128
(set-color (/ i 8.0) 1.0 (- 1.0 (/ i 8.0)))
+129
(draw-line 0 0 60 0)
+130
(pop-transform)
+131
(loop (+ i 1))))
+132
(pop-transform)
+133
+134
(when *font*
+135
(label "Spinner" 650 500))
+136
+137
(when (key-pressed? 'escape)
+138
(request-quit))
+139
+140
(end-frame))
+141
+142
(define (on-cleanup) #t)
+143
+144
(app-run on-init on-frame on-cleanup "Transform Demo" 800 550)