Artifact 1a260d97ea8351f86874a0479dfbcdcb87257715:


0000: 23 6c 61 6e 67 20 72 61 63 6b 65 74 0a 28 72 65  #lang racket.(re
0010: 71 75 69 72 65 0a 20 73 72 66 69 2f 31 37 0a 20  quire. srfi/17. 
0020: 66 66 69 2f 75 6e 73 61 66 65 0a 20 22 62 61 73  ffi/unsafe. "bas
0030: 65 2e 72 6b 74 22 29 0a 0a 28 64 65 66 69 6e 65  e.rkt")..(define
0040: 20 6c 69 62 63 64 0a 20 20 28 63 61 73 65 20 28   libcd.  (case (
0050: 73 79 73 74 65 6d 2d 74 79 70 65 20 27 6f 73 29  system-type 'os)
0060: 0a 20 20 20 20 5b 28 77 69 6e 64 6f 77 73 29 0a  .    [(windows).
0070: 20 20 20 20 20 28 66 66 69 2d 6c 69 62 20 22 63       (ffi-lib "c
0080: 64 22 29 5d 0a 20 20 20 20 5b 65 6c 73 65 0a 20  d")].    [else. 
0090: 20 20 20 20 28 66 66 69 2d 6c 69 62 20 22 6c 69      (ffi-lib "li
00a0: 62 63 64 22 29 5d 29 29 0a 0a 3b 3b 20 7b 7b 7b  bcd")]))..;; {{{
00b0: 20 43 6f 6e 74 65 78 74 20 74 79 70 65 73 0a 0a   Context types..
00c0: 28 64 65 66 69 6e 65 20 63 6f 6e 74 65 78 74 3a  (define context:
00d0: 69 6d 61 67 65 0a 20 20 28 28 67 65 74 2d 66 66  image.  ((get-ff
00e0: 69 2d 6f 62 6a 20 22 63 64 43 6f 6e 74 65 78 74  i-obj "cdContext
00f0: 49 6d 61 67 65 52 47 42 22 20 6c 69 62 63 64 20  ImageRGB" libcd 
0100: 28 5f 66 75 6e 20 2d 3e 20 5b 63 6f 6e 74 65 78  (_fun -> [contex
0110: 74 20 3a 20 5f 63 6f 6e 74 65 78 74 5d 29 29 29  t : _context])))
0120: 29 0a 0a 28 64 65 66 69 6e 65 20 63 6f 6e 74 65  )..(define conte
0130: 78 74 3a 64 6f 75 62 6c 65 2d 62 75 66 66 65 72  xt:double-buffer
0140: 0a 20 20 28 28 67 65 74 2d 66 66 69 2d 6f 62 6a  .  ((get-ffi-obj
0150: 20 22 63 64 43 6f 6e 74 65 78 74 44 42 75 66 66   "cdContextDBuff
0160: 65 72 52 47 42 22 20 6c 69 62 63 64 20 28 5f 66  erRGB" libcd (_f
0170: 75 6e 20 2d 3e 20 5b 63 6f 6e 74 65 78 74 20 3a  un -> [context :
0180: 20 5f 63 6f 6e 74 65 78 74 5d 29 29 29 29 0a 0a   _context]))))..
0190: 28 70 72 6f 76 69 64 65 0a 20 63 6f 6e 74 65 78  (provide. contex
01a0: 74 3a 69 6d 61 67 65 20 63 6f 6e 74 65 78 74 3a  t:image context:
01b0: 64 6f 75 62 6c 65 2d 62 75 66 66 65 72 29 0a 0a  double-buffer)..
01c0: 3b 3b 20 7d 7d 7d 0a 0a 3b 3b 20 7b 7b 7b 20 41  ;; }}}..;; {{{ A
01d0: 75 78 69 6c 69 61 72 79 20 66 75 6e 63 74 69 6f  uxiliary functio
01e0: 6e 73 0a 0a 28 64 65 66 69 6e 65 20 28 62 79 74  ns..(define (byt
01f0: 65 73 2d 73 6c 69 63 65 20 62 73 74 72 20 6e 20  es-slice bstr n 
0200: 6b 20 73 6c 65 6e 29 0a 20 20 28 6c 65 74 20 28  k slen).  (let (
0210: 5b 62 6c 65 6e 20 28 62 79 74 65 73 2d 6c 65 6e  [blen (bytes-len
0220: 67 74 68 20 62 73 74 72 29 5d 29 0a 20 20 20 20  gth bstr)]).    
0230: 28 75 6e 6c 65 73 73 20 28 3d 20 62 6c 65 6e 20  (unless (= blen 
0240: 28 2a 20 6e 20 73 6c 65 6e 29 29 0a 20 20 20 20  (* n slen)).    
0250: 20 20 28 65 72 72 6f 72 20 27 62 79 74 65 73 2d    (error 'bytes-
0260: 73 6c 69 63 65 20 22 64 61 74 61 20 6c 65 6e 67  slice "data leng
0270: 74 68 20 6d 69 73 6d 61 74 63 68 20 28 61 63 74  th mismatch (act
0280: 75 61 6c 20 7e 73 2c 20 72 65 71 75 69 72 65 64  ual ~s, required
0290: 20 7e 73 29 22 20 62 6c 65 6e 20 28 2a 20 6e 20   ~s)" blen (* n 
02a0: 73 6c 65 6e 29 29 29 0a 20 20 20 20 28 6c 65 74  slen))).    (let
02b0: 20 28 5b 73 6c 69 63 65 20 28 6d 61 6b 65 2d 62   ([slice (make-b
02c0: 79 74 65 73 20 73 6c 65 6e 29 5d 29 0a 20 20 20  ytes slen)]).   
02d0: 20 20 20 28 66 6f 72 20 28 5b 62 69 20 28 69 6e     (for ([bi (in
02e0: 2d 72 61 6e 67 65 20 6b 20 62 6c 65 6e 20 6e 29  -range k blen n)
02f0: 5d 20 5b 73 69 20 28 69 6e 2d 72 61 6e 67 65 20  ] [si (in-range 
0300: 73 6c 65 6e 29 5d 29 0a 20 20 20 20 20 20 20 20  slen)]).        
0310: 28 62 79 74 65 73 2d 73 65 74 21 20 73 6c 69 63  (bytes-set! slic
0320: 65 20 73 69 20 28 62 79 74 65 73 2d 72 65 66 20  e si (bytes-ref 
0330: 62 73 74 72 20 62 69 29 29 29 0a 20 20 20 20 20  bstr bi))).     
0340: 20 73 6c 69 63 65 29 29 29 0a 0a 28 64 65 66 69   slice)))..(defi
0350: 6e 65 20 28 62 79 74 65 73 2d 6d 69 78 20 73 6c  ne (bytes-mix sl
0360: 69 63 65 30 20 2e 20 73 6c 69 63 65 2a 29 0a 20  ice0 . slice*). 
0370: 20 28 6c 65 74 2a 20 28 5b 6e 20 28 61 64 64 31   (let* ([n (add1
0380: 20 28 6c 65 6e 67 74 68 20 73 6c 69 63 65 2a 29   (length slice*)
0390: 29 5d 0a 20 20 20 20 20 20 20 20 20 5b 62 6c 65  )].         [ble
03a0: 6e 20 28 2a 20 6e 20 28 62 79 74 65 73 2d 6c 65  n (* n (bytes-le
03b0: 6e 67 74 68 20 73 6c 69 63 65 30 29 29 5d 0a 20  ngth slice0))]. 
03c0: 20 20 20 20 20 20 20 20 5b 62 73 74 72 20 28 6d          [bstr (m
03d0: 61 6b 65 2d 62 79 74 65 73 20 62 6c 65 6e 29 5d  ake-bytes blen)]
03e0: 29 0a 20 20 20 20 28 66 6f 72 20 28 5b 73 6c 69  ).    (for ([sli
03f0: 63 65 20 28 69 6e 2d 63 79 63 6c 65 20 28 69 6e  ce (in-cycle (in
0400: 2d 76 61 6c 75 65 20 73 6c 69 63 65 30 29 20 28  -value slice0) (
0410: 69 6e 2d 6c 69 73 74 20 73 6c 69 63 65 2a 29 29  in-list slice*))
0420: 5d 0a 20 20 20 20 20 20 20 20 20 20 5b 62 69 20  ].          [bi 
0430: 28 69 6e 2d 72 61 6e 67 65 20 62 6c 65 6e 29 5d  (in-range blen)]
0440: 20 23 3a 77 68 65 6e 20 23 74 20 5b 73 69 20 28   #:when #t [si (
0450: 69 6e 2d 76 61 6c 75 65 20 28 71 75 6f 74 69 65  in-value (quotie
0460: 6e 74 20 62 69 20 6e 29 29 5d 29 0a 20 20 20 20  nt bi n))]).    
0470: 20 20 28 62 79 74 65 73 2d 73 65 74 21 20 62 73    (bytes-set! bs
0480: 74 72 20 62 69 20 28 62 79 74 65 73 2d 72 65 66  tr bi (bytes-ref
0490: 20 73 6c 69 63 65 20 73 69 29 29 29 0a 20 20 20   slice si))).   
04a0: 20 62 73 74 72 29 29 0a 0a 28 64 65 66 69 6e 65   bstr))..(define
04b0: 20 63 61 6e 76 61 73 2d 69 6d 61 67 65 2d 70 75   canvas-image-pu
04c0: 74 2f 72 67 62 21 0a 20 20 28 67 65 74 2d 66 66  t/rgb!.  (get-ff
04d0: 69 2d 6f 62 6a 0a 20 20 20 22 63 64 43 61 6e 76  i-obj.   "cdCanv
04e0: 61 73 50 75 74 49 6d 61 67 65 52 65 63 74 52 47  asPutImageRectRG
04f0: 42 22 20 6c 69 62 63 64 0a 20 20 20 28 5f 66 75  B" libcd.   (_fu
0500: 6e 20 28 63 61 6e 76 61 73 20 64 73 74 2d 78 20  n (canvas dst-x 
0510: 64 73 74 2d 79 20 73 72 63 2d 77 69 64 74 68 20  dst-y src-width 
0520: 73 72 63 2d 68 65 69 67 68 74 20 64 61 74 61 0a  src-height data.
0530: 20 20 20 20 20 20 20 20 20 20 23 3a 77 69 64 74            #:widt
0540: 68 20 5b 64 73 74 2d 77 69 64 74 68 20 30 5d 20  h [dst-width 0] 
0550: 23 3a 68 65 69 67 68 74 20 5b 64 73 74 2d 68 65  #:height [dst-he
0560: 69 67 68 74 20 30 5d 0a 20 20 20 20 20 20 20 20  ight 0].        
0570: 20 20 23 3a 78 30 20 5b 73 72 63 2d 78 30 20 30    #:x0 [src-x0 0
0580: 5d 20 23 3a 78 31 20 5b 73 72 63 2d 78 31 20 30  ] #:x1 [src-x1 0
0590: 5d 0a 20 20 20 20 20 20 20 20 20 20 23 3a 79 30  ].          #:y0
05a0: 20 5b 73 72 63 2d 79 30 20 30 5d 20 23 3a 79 31   [src-y0 0] #:y1
05b0: 20 5b 73 72 63 2d 79 31 20 30 5d 29 0a 20 20 20   [src-y1 0]).   
05c0: 20 20 20 20 20 20 3a 3a 20 5b 63 61 6e 76 61 73        :: [canvas
05d0: 20 3a 20 5f 63 61 6e 76 61 73 5d 0a 20 20 20 20   : _canvas].    
05e0: 20 20 20 20 20 20 20 20 5b 73 72 63 2d 77 69 64          [src-wid
05f0: 74 68 20 3a 20 5f 69 6e 74 5d 20 5b 73 72 63 2d  th : _int] [src-
0600: 68 65 69 67 68 74 20 3a 20 5f 69 6e 74 5d 0a 20  height : _int]. 
0610: 20 20 20 20 20 20 20 20 20 20 20 5b 72 65 64 20             [red 
0620: 3a 20 5f 62 79 74 65 73 20 3d 20 28 62 79 74 65  : _bytes = (byte
0630: 73 2d 73 6c 69 63 65 20 64 61 74 61 20 33 20 30  s-slice data 3 0
0640: 20 28 2a 20 73 72 63 2d 77 69 64 74 68 20 73 72   (* src-width sr
0650: 63 2d 68 65 69 67 68 74 29 29 5d 0a 20 20 20 20  c-height))].    
0660: 20 20 20 20 20 20 20 20 5b 67 72 65 65 6e 20 3a          [green :
0670: 20 5f 62 79 74 65 73 20 3d 20 28 62 79 74 65 73   _bytes = (bytes
0680: 2d 73 6c 69 63 65 20 64 61 74 61 20 33 20 31 20  -slice data 3 1 
0690: 28 2a 20 73 72 63 2d 77 69 64 74 68 20 73 72 63  (* src-width src
06a0: 2d 68 65 69 67 68 74 29 29 5d 0a 20 20 20 20 20  -height))].     
06b0: 20 20 20 20 20 20 20 5b 62 6c 75 65 20 3a 20 5f         [blue : _
06c0: 62 79 74 65 73 20 3d 20 28 62 79 74 65 73 2d 73  bytes = (bytes-s
06d0: 6c 69 63 65 20 64 61 74 61 20 33 20 32 20 28 2a  lice data 3 2 (*
06e0: 20 73 72 63 2d 77 69 64 74 68 20 73 72 63 2d 68   src-width src-h
06f0: 65 69 67 68 74 29 29 5d 0a 20 20 20 20 20 20 20  eight))].       
0700: 20 20 20 20 20 5b 64 73 74 2d 78 20 3a 20 5f 69       [dst-x : _i
0710: 6e 74 5d 20 5b 64 73 74 2d 79 20 3a 20 5f 69 6e  nt] [dst-y : _in
0720: 74 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  t].            [
0730: 64 73 74 2d 77 69 64 74 68 20 3a 20 5f 69 6e 74  dst-width : _int
0740: 5d 20 5b 64 73 74 2d 68 65 69 67 68 74 20 3a 20  ] [dst-height : 
0750: 5f 69 6e 74 5d 0a 20 20 20 20 20 20 20 20 20 20  _int].          
0760: 20 20 5b 73 72 63 2d 78 30 20 3a 20 5f 69 6e 74    [src-x0 : _int
0770: 5d 20 5b 73 72 63 2d 78 31 20 3a 20 5f 69 6e 74  ] [src-x1 : _int
0780: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 73  ].            [s
0790: 72 63 2d 79 30 20 3a 20 5f 69 6e 74 5d 20 5b 73  rc-y0 : _int] [s
07a0: 72 63 2d 79 31 20 3a 20 5f 69 6e 74 5d 0a 20 20  rc-y1 : _int].  
07b0: 20 20 20 20 20 20 20 2d 3e 20 5f 76 6f 69 64 29         -> _void)
07c0: 29 29 0a 0a 28 64 65 66 69 6e 65 20 63 61 6e 76  ))..(define canv
07d0: 61 73 2d 69 6d 61 67 65 2d 70 75 74 2f 72 67 62  as-image-put/rgb
07e0: 61 21 0a 20 20 28 67 65 74 2d 66 66 69 2d 6f 62  a!.  (get-ffi-ob
07f0: 6a 0a 20 20 20 22 63 64 43 61 6e 76 61 73 50 75  j.   "cdCanvasPu
0800: 74 49 6d 61 67 65 52 65 63 74 52 47 42 41 22 20  tImageRectRGBA" 
0810: 6c 69 62 63 64 0a 20 20 20 28 5f 66 75 6e 20 28  libcd.   (_fun (
0820: 63 61 6e 76 61 73 20 64 73 74 2d 78 20 64 73 74  canvas dst-x dst
0830: 2d 79 20 73 72 63 2d 77 69 64 74 68 20 73 72 63  -y src-width src
0840: 2d 68 65 69 67 68 74 20 64 61 74 61 0a 20 20 20  -height data.   
0850: 20 20 20 20 20 20 20 23 3a 77 69 64 74 68 20 5b         #:width [
0860: 64 73 74 2d 77 69 64 74 68 20 30 5d 20 23 3a 68  dst-width 0] #:h
0870: 65 69 67 68 74 20 5b 64 73 74 2d 68 65 69 67 68  eight [dst-heigh
0880: 74 20 30 5d 0a 20 20 20 20 20 20 20 20 20 20 23  t 0].          #
0890: 3a 78 30 20 5b 73 72 63 2d 78 30 20 30 5d 20 23  :x0 [src-x0 0] #
08a0: 3a 78 31 20 5b 73 72 63 2d 78 31 20 30 5d 0a 20  :x1 [src-x1 0]. 
08b0: 20 20 20 20 20 20 20 20 20 23 3a 79 30 20 5b 73           #:y0 [s
08c0: 72 63 2d 79 30 20 30 5d 20 23 3a 79 31 20 5b 73  rc-y0 0] #:y1 [s
08d0: 72 63 2d 79 31 20 30 5d 29 0a 20 20 20 20 20 20  rc-y1 0]).      
08e0: 20 20 20 3a 3a 20 5b 63 61 6e 76 61 73 20 3a 20     :: [canvas : 
08f0: 5f 63 61 6e 76 61 73 5d 0a 20 20 20 20 20 20 20  _canvas].       
0900: 20 20 20 20 20 5b 73 72 63 2d 77 69 64 74 68 20       [src-width 
0910: 3a 20 5f 69 6e 74 5d 20 5b 73 72 63 2d 68 65 69  : _int] [src-hei
0920: 67 68 74 20 3a 20 5f 69 6e 74 5d 0a 20 20 20 20  ght : _int].    
0930: 20 20 20 20 20 20 20 20 5b 72 65 64 20 3a 20 5f          [red : _
0940: 62 79 74 65 73 20 3d 20 28 62 79 74 65 73 2d 73  bytes = (bytes-s
0950: 6c 69 63 65 20 64 61 74 61 20 34 20 30 20 28 2a  lice data 4 0 (*
0960: 20 73 72 63 2d 77 69 64 74 68 20 73 72 63 2d 68   src-width src-h
0970: 65 69 67 68 74 29 29 5d 0a 20 20 20 20 20 20 20  eight))].       
0980: 20 20 20 20 20 5b 67 72 65 65 6e 20 3a 20 5f 62       [green : _b
0990: 79 74 65 73 20 3d 20 28 62 79 74 65 73 2d 73 6c  ytes = (bytes-sl
09a0: 69 63 65 20 64 61 74 61 20 34 20 31 20 28 2a 20  ice data 4 1 (* 
09b0: 73 72 63 2d 77 69 64 74 68 20 73 72 63 2d 68 65  src-width src-he
09c0: 69 67 68 74 29 29 5d 0a 20 20 20 20 20 20 20 20  ight))].        
09d0: 20 20 20 20 5b 62 6c 75 65 20 3a 20 5f 62 79 74      [blue : _byt
09e0: 65 73 20 3d 20 28 62 79 74 65 73 2d 73 6c 69 63  es = (bytes-slic
09f0: 65 20 64 61 74 61 20 34 20 32 20 28 2a 20 73 72  e data 4 2 (* sr
0a00: 63 2d 77 69 64 74 68 20 73 72 63 2d 68 65 69 67  c-width src-heig
0a10: 68 74 29 29 5d 0a 20 20 20 20 20 20 20 20 20 20  ht))].          
0a20: 20 20 5b 61 6c 70 68 61 20 3a 20 5f 62 79 74 65    [alpha : _byte
0a30: 73 20 3d 20 28 62 79 74 65 73 2d 73 6c 69 63 65  s = (bytes-slice
0a40: 20 64 61 74 61 20 34 20 33 20 28 2a 20 73 72 63   data 4 3 (* src
0a50: 2d 77 69 64 74 68 20 73 72 63 2d 68 65 69 67 68  -width src-heigh
0a60: 74 29 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20  t))].           
0a70: 20 5b 64 73 74 2d 78 20 3a 20 5f 69 6e 74 5d 20   [dst-x : _int] 
0a80: 5b 64 73 74 2d 79 20 3a 20 5f 69 6e 74 5d 0a 20  [dst-y : _int]. 
0a90: 20 20 20 20 20 20 20 20 20 20 20 5b 64 73 74 2d             [dst-
0aa0: 77 69 64 74 68 20 3a 20 5f 69 6e 74 5d 20 5b 64  width : _int] [d
0ab0: 73 74 2d 68 65 69 67 68 74 20 3a 20 5f 69 6e 74  st-height : _int
0ac0: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 73  ].            [s
0ad0: 72 63 2d 78 30 20 3a 20 5f 69 6e 74 5d 20 5b 73  rc-x0 : _int] [s
0ae0: 72 63 2d 78 31 20 3a 20 5f 69 6e 74 5d 0a 20 20  rc-x1 : _int].  
0af0: 20 20 20 20 20 20 20 20 20 20 5b 73 72 63 2d 79            [src-y
0b00: 30 20 3a 20 5f 69 6e 74 5d 20 5b 73 72 63 2d 79  0 : _int] [src-y
0b10: 31 20 3a 20 5f 69 6e 74 5d 0a 20 20 20 20 20 20  1 : _int].      
0b20: 20 20 20 2d 3e 20 5f 76 6f 69 64 29 29 29 0a 0a     -> _void)))..
0b30: 28 64 65 66 69 6e 65 20 63 61 6e 76 61 73 2d 69  (define canvas-i
0b40: 6d 61 67 65 2f 72 67 62 0a 20 20 28 67 65 74 74  mage/rgb.  (gett
0b50: 65 72 2d 77 69 74 68 2d 73 65 74 74 65 72 0a 20  er-with-setter. 
0b60: 20 20 28 67 65 74 2d 66 66 69 2d 6f 62 6a 0a 20    (get-ffi-obj. 
0b70: 20 20 20 22 63 64 43 61 6e 76 61 73 47 65 74 49     "cdCanvasGetI
0b80: 6d 61 67 65 52 47 42 22 20 6c 69 62 63 64 0a 20  mageRGB" libcd. 
0b90: 20 20 20 28 5f 66 75 6e 20 28 63 61 6e 76 61 73     (_fun (canvas
0ba0: 20 78 20 79 20 77 69 64 74 68 20 68 65 69 67 68   x y width heigh
0bb0: 74 29 0a 20 20 20 20 20 20 20 20 20 20 3a 3a 20  t).          :: 
0bc0: 5b 63 61 6e 76 61 73 20 3a 20 5f 63 61 6e 76 61  [canvas : _canva
0bd0: 73 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s].             
0be0: 5b 72 65 64 20 3a 20 28 5f 62 79 74 65 73 20 6f  [red : (_bytes o
0bf0: 20 28 2a 20 77 69 64 74 68 20 68 65 69 67 68 74   (* width height
0c00: 29 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))].            
0c10: 20 5b 67 72 65 65 6e 20 3a 20 28 5f 62 79 74 65   [green : (_byte
0c20: 73 20 6f 20 28 2a 20 77 69 64 74 68 20 68 65 69  s o (* width hei
0c30: 67 68 74 29 29 5d 0a 20 20 20 20 20 20 20 20 20  ght))].         
0c40: 20 20 20 20 5b 62 6c 75 65 20 3a 20 28 5f 62 79      [blue : (_by
0c50: 74 65 73 20 6f 20 28 2a 20 77 69 64 74 68 20 68  tes o (* width h
0c60: 65 69 67 68 74 29 29 5d 0a 20 20 20 20 20 20 20  eight))].       
0c70: 20 20 20 20 20 20 5b 78 20 3a 20 5f 69 6e 74 5d        [x : _int]
0c80: 20 5b 79 20 3a 20 5f 69 6e 74 5d 0a 20 20 20 20   [y : _int].    
0c90: 20 20 20 20 20 20 20 20 20 5b 77 69 64 74 68 20           [width 
0ca0: 3a 20 5f 69 6e 74 5d 20 5b 68 65 69 67 68 74 20  : _int] [height 
0cb0: 3a 20 5f 69 6e 74 5d 0a 20 20 20 20 20 20 20 20  : _int].        
0cc0: 20 20 2d 3e 20 5f 76 6f 69 64 0a 20 20 20 20 20    -> _void.     
0cd0: 20 20 20 20 20 2d 3e 20 28 62 79 74 65 73 2d 6d       -> (bytes-m
0ce0: 69 78 20 72 65 64 20 67 72 65 65 6e 20 62 6c 75  ix red green blu
0cf0: 65 29 29 29 0a 20 20 20 63 61 6e 76 61 73 2d 69  e))).   canvas-i
0d00: 6d 61 67 65 2d 70 75 74 2f 72 67 62 21 29 29 0a  mage-put/rgb!)).
0d10: 0a 28 70 72 6f 76 69 64 65 0a 20 63 61 6e 76 61  .(provide. canva
0d20: 73 2d 69 6d 61 67 65 2f 72 67 62 20 63 61 6e 76  s-image/rgb canv
0d30: 61 73 2d 69 6d 61 67 65 2d 70 75 74 2f 72 67 62  as-image-put/rgb
0d40: 21 20 63 61 6e 76 61 73 2d 69 6d 61 67 65 2d 70  ! canvas-image-p
0d50: 75 74 2f 72 67 62 61 21 29 0a 0a 3b 3b 20 7d 7d  ut/rgba!)..;; }}
0d60: 7d 0a                                            }.