racket/collects/images/compile-time.rkt
Neil Toronto db57b78e18 Added lock-icon
Changed most *-icon and *-logo function arguments to keyword arguments

text-icon no longer uses font size

Small doc changes
2012-06-26 15:00:05 -06:00

117 lines
4.2 KiB
Racket

#lang racket/base
(require (for-syntax racket/base
racket/class racket/draw racket/math)
racket/class racket/draw)
(provide compiled-bitmap compiled-bitmap-list)
(begin-for-syntax
(define (save-png bm)
(define p (open-output-bytes))
(send bm save-file p 'png)
(define bs (get-output-bytes p))
;(printf "Wrote PNG: ~v bytes~n" (bytes-length bs))
bs)
(define (save-jpeg bm quality)
(define w (send bm get-width))
(define h (send bm get-height))
(define bs (make-bytes (* 4 w h)))
(send bm get-argb-pixels 0 0 w h bs #t)
(for ([i (in-range 0 (* 4 w h) 4)])
(define a (bytes-ref bs i))
(bytes-set! bs i 255)
(bytes-set! bs (+ i 1) a)
(bytes-set! bs (+ i 2) a)
(bytes-set! bs (+ i 3) a))
(define alpha-bm (make-bitmap w h #f))
(send alpha-bm set-argb-pixels 0 0 w h bs)
(define alpha-p (open-output-bytes))
(send alpha-bm save-file alpha-p 'jpeg quality)
(send bm get-argb-pixels 0 0 w h bs #f)
(define rgb-bm (make-bitmap w h #f))
(send rgb-bm set-argb-pixels 0 0 w h bs #f)
(define rgb-p (open-output-bytes))
(send rgb-bm save-file rgb-p 'jpeg quality)
(define alpha-bs (get-output-bytes alpha-p))
(define rgb-bs (get-output-bytes rgb-p))
;(printf "Wrote JPEG: ~v bytes~n" (+ (bytes-length alpha-bs) (bytes-length rgb-bs)))
(values alpha-bs rgb-bs))
(define (make-3d-bitmap ctxt bm quality)
(unless (is-a? bm bitmap%)
(raise-type-error 'make-3d-bitmap "bitmap%" 0 bm quality))
(unless (and (exact-integer? quality) (<= 0 quality 100))
(raise-type-error 'make-3d-bitmap "(integer-in 0 100)" 1 bm quality))
(cond [(= quality 100)
(with-syntax ([bs (datum->syntax ctxt (save-png bm))])
(syntax/loc ctxt (load-png bs)))]
[else
(define-values (alpha-bs rgb-bs) (save-jpeg bm quality))
(with-syntax ([alpha-bs (datum->syntax ctxt alpha-bs)]
[rgb-bs (datum->syntax ctxt rgb-bs)])
(syntax/loc ctxt (load-jpeg alpha-bs rgb-bs)))]))
)
(define (load-png bs)
(read-bitmap (open-input-bytes bs) 'png/alpha))
(define (load-jpeg alpha-bs rgb-bs)
(define alpha-bm (read-bitmap (open-input-bytes alpha-bs) 'jpeg))
(define rgb-bm (read-bitmap (open-input-bytes rgb-bs) 'jpeg))
(define w (send rgb-bm get-width))
(define h (send rgb-bm get-height))
(define new-bs (make-bytes (* 4 w h)))
(send rgb-bm get-argb-pixels 0 0 w h new-bs #f)
(define bs (make-bytes (* 4 w h)))
(send alpha-bm get-argb-pixels 0 0 w h bs #f)
(for ([i (in-range 0 (* 4 w h) 4)])
(define a (bytes-ref bs (+ i 2)))
(bytes-set! new-bs i a))
(define new-bm (make-bitmap w h))
(send new-bm set-argb-pixels 0 0 w h new-bs #f)
new-bm)
(define-syntax (compiled-bitmap stx)
(syntax-case stx ()
[(_ expr)
(syntax/loc stx (compiled-bitmap expr 100))]
[(_ expr quality)
(syntax/loc stx
(let-syntax ([maker (λ (inner-stx)
(define bm expr)
(unless (is-a? bm bitmap%)
(raise-syntax-error
'compiled-bitmap
(format "expected argument of type <bitmap%>; given ~e" bm)
#'expr))
(make-3d-bitmap inner-stx bm quality))])
(maker)))]))
(define-syntax (compiled-bitmap-list stx)
(syntax-case stx ()
[(_ expr)
(syntax/loc stx (compiled-bitmap-list expr 100))]
[(_ expr quality)
(syntax/loc stx
(let-syntax ([maker (λ (inner-stx)
(define bms expr)
(unless (and (list? bms) (andmap (λ (bm) (is-a? bm bitmap%)) bms))
(raise-syntax-error
'compiled-bitmap-list
(format "expected argument of type <list of bitmap%>; given ~e" bms)
#'expr))
(with-syntax ([(bm (... ...))
(map (λ (e) (make-3d-bitmap inner-stx e quality)) bms)])
#'(list bm (... ...))))])
(maker)))]))