AtlatestRepositorysigil-studio

sigil-studio / tree / testtest-font.sgl

1;;; test-font.sgl - Test font loading and text rendering
2
3(import (sigil core)
4 (sigil app)
5 (sigil graphics)
6 (sigil graphics font))
7
8(display "Loading font...\n")
9
10(define font #f)
11(define font-small #f)
12(define time 0.0)
13(define fps 0.0)
14(define frame-count 0)
15(define fps-timer 0.0)
16(define message "Practical Symbolic Power")
18;; Set to #t to use fixed 800x400 viewport with letterboxing
19(define use-fixed-viewport #t)
21(define (on-init)
22 (display "Initializing...\n")
23 (set! font (load-font "test/Saucer.ttf" 48))
24 (set! font-small (load-font "test/Saucer.ttf" 20))
25 ;; Enable fixed viewport if desired
26 (when use-fixed-viewport
27 (set-viewport 800 400)
28 (set-letterbox-color 0.1 0.0 0.15)) ;; Dark purple bars
29 (if font
30 (begin
31 (display "Font loaded! Size: ")
32 (display (font-size font))
33 (display ", Line height: ")
34 (display (font-line-height font))
35 (newline))
36 (display "ERROR: Failed to load font!\n")))
38(define (on-frame)
39 (let ((dt (frame-time)))
40 (set! time (+ time dt))
41 ;; Update FPS counter every second
42 (set! frame-count (+ frame-count 1))
43 (set! fps-timer (+ fps-timer dt))
44 (when (>= fps-timer 1.0)
45 (set! fps frame-count)
46 (set! frame-count 0)
47 (set! fps-timer (- fps-timer 1.0))))
49 (begin-frame)
50 (clear-screen 0.05 0.05 0.1)
52 (when font
53 ;; Draw wavy text with color gradient
54 (let ((start-x 80)
55 (base-y 200)
56 (amplitude 30)
57 (frequency 0.3)
58 (speed 4.0))
59 (let loop ((i 0)
60 (x start-x))
61 (when (< i (string-length message))
62 (let* ((char (string-ref message i))
63 (phase (+ (* i frequency) (* time speed)))
64 (y-offset (* amplitude (sin phase)))
65 ;; Rotating color gradient using sine for smooth cycling
66 (color-phase (+ (* i 0.25) (* time 2.0)))
67 (wave (* 0.5 (+ 1.0 (sin color-phase)))) ;; 0 to 1 smoothly
68 (r 1.0)
69 (g (- 0.9 (* 0.4 wave)))
70 (b (* 0.2 (- 1.0 wave))))
71 (set-color r g b)
72 (let ((advance (draw-text-char font char x (+ base-y y-offset))))
73 (loop (+ i 1) (+ x advance)))))))
75 ;; Draw FPS counter in top right
76 (when font-small
77 (let* ((fps-text (string-append (number->string fps) " FPS"))
78 (text-w (text-width font-small fps-text))
79 ;; Use fixed width when viewport enabled, else reactive
80 (screen-w (if use-fixed-viewport 800 (frame-width))))
81 (set-color 0.6 0.6 0.6)
82 (draw-text font-small fps-text (- screen-w text-w 10) 25))))
84 (end-frame))
86(define (on-cleanup)
87 (display "Cleaning up...\n"))
89(display "Starting app...\n")
90(app-run on-init on-frame on-cleanup "Sigil Demo" 800 400)