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)