#lang scheme/gui (define N (string->number (read-line))) (unless (and N (exact-integer? N)) (error 'show-rb "expected an integer for size as first line")) ;; Create a bitmap to store current image (define bm (make-object bitmap% N N)) (define bdc (make-object bitmap-dc% bm)) (send bdc clear) ;; Create the GUI window (define f (new frame% [label "Red-Blue"])) (define c (new canvas% [parent f] [min-width N] [min-height N] [style '(no-autoclear)] [stretchable-width #f] [stretchable-height #f] [paint-callback (lambda (c dc) (send dc draw-bitmap bm 0 0))])) (define m (new message% [parent f] [stretchable-width #t] [label "Starting..."])) (send f show #t) (define queue-next (let ([in (current-input-port)] [buf (make-bytes (* N N 4))]) (lambda (cnt) (queue-callback (lambda () (if (eof-object? (peek-byte in)) (send m set-label "Done") ;; Read and display one image (let* ([pos 0] [out-bytes (lambda (px) (bytes-copy! buf pos px) (set! pos (+ pos 4)))]) (for ([j (in-range N)]) ;; Read one line and translate to ARGB (let ([src (read-bytes N in)]) (unless (bytes? src) (error 'show-rb "truncated input")) (for ([ch (in-bytes src)]) (case (integer->char ch) [(#\r) (out-bytes #"\0\xFF\0\0")] [(#\b) (out-bytes #"\0\0\0\xFF")] [(#\space) (out-bytes #"\0\xFF\xFF\xFF")] [else (error 'show-rb "bad input: `~a'" (integer->char ch))])) (unless (= N (bytes-length src)) (error 'show-rb "truncated input"))) (let ([ch (read-byte)]) (unless (equal? ch (char->integer #\newline)) (error 'show-rb "bad input: `~a'" (integer->char ch))))) ;; Convert ARGB to bitmap (send bdc set-argb-pixels 0 0 N N buf) ;; display image (send c refresh) (send m set-label (format "After ~a" cnt)) (queue-next (add1 cnt))))) #f)))) (queue-next 0)