Artifact b7d557a7f82f5b22cba521bc83bc4c5d8618d720:


0000: 28 72 65 71 75 69 72 65 2d 6c 69 62 72 61 72 79  (require-library
0010: 20 63 61 6e 76 61 73 2d 64 72 61 77 2d 62 61 73   canvas-draw-bas
0020: 65 29 0a 0a 28 6d 6f 64 75 6c 65 20 63 61 6e 76  e)..(module canv
0030: 61 73 2d 64 72 61 77 2d 63 6c 69 65 6e 74 0a 09  as-draw-client..
0040: 28 63 6f 6e 74 65 78 74 3a 69 6d 61 67 65 20 63  (context:image c
0050: 6f 6e 74 65 78 74 3a 64 6f 75 62 6c 65 2d 62 75  ontext:double-bu
0060: 66 66 65 72 0a 09 20 63 61 6e 76 61 73 2d 69 6d  ffer.. canvas-im
0070: 61 67 65 2f 72 67 62 20 63 61 6e 76 61 73 2d 69  age/rgb canvas-i
0080: 6d 61 67 65 2d 70 75 74 2f 72 67 62 21 20 63 61  mage-put/rgb! ca
0090: 6e 76 61 73 2d 69 6d 61 67 65 2d 70 75 74 2f 72  nvas-image-put/r
00a0: 67 62 61 21 29 0a 09 28 69 6d 70 6f 72 74 20 73  gba!)..(import s
00b0: 63 68 65 6d 65 20 63 68 69 63 6b 65 6e 20 66 6f  cheme chicken fo
00c0: 72 65 69 67 6e 20 63 61 6e 76 61 73 2d 64 72 61  reign canvas-dra
00d0: 77 2d 62 61 73 65 29 0a 0a 3b 3b 20 7b 7b 7b 20  w-base)..;; {{{ 
00e0: 44 61 74 61 20 74 79 70 65 73 0a 0a 28 66 6f 72  Data types..(for
00f0: 65 69 67 6e 2d 64 65 63 6c 61 72 65 0a 09 22 23  eign-declare.."#
0100: 69 6e 63 6c 75 64 65 20 3c 63 64 2e 68 3e 5c 6e  include <cd.h>\n
0110: 22 0a 09 22 23 69 6e 63 6c 75 64 65 20 3c 63 64  ".."#include <cd
0120: 69 72 67 62 2e 68 3e 5c 6e 22 29 0a 0a 28 69 6e  irgb.h>\n")..(in
0130: 63 6c 75 64 65 20 22 63 61 6e 76 61 73 2d 64 72  clude "canvas-dr
0140: 61 77 2d 74 79 70 65 73 2e 73 63 6d 22 29 0a 0a  aw-types.scm")..
0150: 3b 3b 20 7d 7d 7d 0a 0a 3b 3b 20 7b 7b 7b 20 43  ;; }}}..;; {{{ C
0160: 6f 6e 74 65 78 74 20 74 79 70 65 73 0a 0a 28 64  ontext types..(d
0170: 65 66 69 6e 65 20 63 6f 6e 74 65 78 74 3a 69 6d  efine context:im
0180: 61 67 65 0a 09 28 66 6f 72 65 69 67 6e 2d 76 61  age..(foreign-va
0190: 6c 75 65 20 22 43 44 5f 49 4d 41 47 45 52 47 42  lue "CD_IMAGERGB
01a0: 22 20 6e 6f 6e 6e 75 6c 6c 2d 63 6f 6e 74 65 78  " nonnull-contex
01b0: 74 29 29 0a 0a 28 64 65 66 69 6e 65 20 63 6f 6e  t))..(define con
01c0: 74 65 78 74 3a 64 6f 75 62 6c 65 2d 62 75 66 66  text:double-buff
01d0: 65 72 0a 09 28 66 6f 72 65 69 67 6e 2d 76 61 6c  er..(foreign-val
01e0: 75 65 20 22 43 44 5f 44 42 55 46 46 45 52 52 47  ue "CD_DBUFFERRG
01f0: 42 22 20 6e 6f 6e 6e 75 6c 6c 2d 63 6f 6e 74 65  B" nonnull-conte
0200: 78 74 29 29 0a 0a 3b 3b 20 7d 7d 7d 0a 0a 3b 3b  xt))..;; }}}..;;
0210: 20 7b 7b 7b 20 41 75 78 69 6c 69 61 72 79 20 66   {{{ Auxiliary f
0220: 75 6e 63 74 69 6f 6e 73 0a 0a 28 64 65 66 69 6e  unctions..(defin
0230: 65 20 63 61 6e 76 61 73 2d 69 6d 61 67 65 2d 70  e canvas-image-p
0240: 75 74 2f 72 67 62 21 0a 09 28 6c 65 74 72 65 63  ut/rgb!..(letrec
0250: 20 28 5b 63 61 6e 76 61 73 2d 69 6d 61 67 65 2d   ([canvas-image-
0260: 73 65 74 2f 72 67 62 2f 72 61 77 21 0a 09 20 20  set/rgb/raw!..  
0270: 20 20 20 20 20 20 20 20 28 66 6f 72 65 69 67 6e          (foreign
0280: 2d 6c 61 6d 62 64 61 2a 20 76 6f 69 64 20 28 5b  -lambda* void ([
0290: 6e 6f 6e 6e 75 6c 6c 2d 63 61 6e 76 61 73 20 63  nonnull-canvas c
02a0: 61 6e 76 61 73 5d 20 5b 69 6e 74 20 64 73 74 5f  anvas] [int dst_
02b0: 78 5d 20 5b 69 6e 74 20 64 73 74 5f 79 5d 0a 09  x] [int dst_y]..
02c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02e0: 20 5b 69 6e 74 20 73 72 63 5f 77 69 64 74 68 5d   [int src_width]
02f0: 20 5b 69 6e 74 20 73 72 63 5f 68 65 69 67 68 74   [int src_height
0300: 5d 20 5b 6e 6f 6e 6e 75 6c 6c 2d 62 6c 6f 62 20  ] [nonnull-blob 
0310: 64 61 74 61 5d 0a 09 20 20 20 20 20 20 20 20 20  data]..         
0320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0330: 20 20 20 20 20 20 20 20 5b 69 6e 74 20 64 73 74          [int dst
0340: 5f 77 69 64 74 68 5d 20 5b 69 6e 74 20 64 73 74  _width] [int dst
0350: 5f 68 65 69 67 68 74 5d 0a 09 20 20 20 20 20 20  _height]..      
0360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0370: 20 20 20 20 20 20 20 20 20 20 20 5b 69 6e 74 20             [int 
0380: 73 72 63 5f 78 30 5d 20 5b 69 6e 74 20 73 72 63  src_x0] [int src
0390: 5f 78 31 5d 20 5b 69 6e 74 20 73 72 63 5f 79 30  _x1] [int src_y0
03a0: 5d 20 5b 69 6e 74 20 73 72 63 5f 79 31 5d 29 0a  ] [int src_y1]).
03b0: 09 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f  .            "co
03c0: 6e 73 74 20 69 6e 74 20 6e 63 68 61 6e 73 20 3d  nst int nchans =
03d0: 20 33 3b 5c 6e 22 0a 09 20 20 20 20 20 20 20 20   3;\n"..        
03e0: 20 20 09 22 75 6e 73 69 67 6e 65 64 20 63 68 61    ."unsigned cha
03f0: 72 20 63 68 61 6e 73 5b 6e 63 68 61 6e 73 5d 5b  r chans[nchans][
0400: 73 72 63 5f 77 69 64 74 68 20 2a 20 73 72 63 5f  src_width * src_
0410: 68 65 69 67 68 74 5d 3b 5c 6e 22 0a 09 20 20 20  height];\n"..   
0420: 20 20 20 20 20 20 20 09 22 69 6e 74 20 69 3b 5c         ."int i;\
0430: 6e 22 0a 09 20 20 20 20 20 20 20 20 20 20 09 22  n"..          ."
0440: 5c 6e 22 0a 09 20 20 20 20 20 20 20 20 20 20 09  \n"..          .
0450: 22 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c  "for (i = 0; i <
0460: 20 6e 63 68 61 6e 73 20 2a 20 73 72 63 5f 77 69   nchans * src_wi
0470: 64 74 68 20 2a 20 73 72 63 5f 68 65 69 67 68 74  dth * src_height
0480: 3b 20 2b 2b 69 29 5c 6e 22 0a 09 20 20 20 20 20  ; ++i)\n"..     
0490: 20 20 20 20 20 09 22 09 63 68 61 6e 73 5b 69 20       .".chans[i 
04a0: 25 20 6e 63 68 61 6e 73 5d 5b 69 20 2f 20 6e 63  % nchans][i / nc
04b0: 68 61 6e 73 5d 20 3d 20 64 61 74 61 5b 69 5d 3b  hans] = data[i];
04c0: 5c 6e 22 0a 09 20 20 20 20 20 20 20 20 20 20 09  \n"..          .
04d0: 22 5c 6e 22 0a 09 20 20 20 20 20 20 20 20 20 20  "\n"..          
04e0: 09 22 63 64 43 61 6e 76 61 73 50 75 74 49 6d 61  ."cdCanvasPutIma
04f0: 67 65 52 65 63 74 52 47 42 28 5c 6e 22 0a 09 20  geRectRGB(\n".. 
0500: 20 20 20 20 20 20 20 20 20 09 22 09 63 61 6e 76           .".canv
0510: 61 73 2c 20 73 72 63 5f 77 69 64 74 68 2c 20 73  as, src_width, s
0520: 72 63 5f 68 65 69 67 68 74 2c 5c 6e 22 0a 09 20  rc_height,\n".. 
0530: 20 20 20 20 20 20 20 20 20 09 22 09 63 68 61 6e           .".chan
0540: 73 5b 30 5d 2c 20 63 68 61 6e 73 5b 31 5d 2c 20  s[0], chans[1], 
0550: 63 68 61 6e 73 5b 32 5d 2c 5c 6e 22 0a 09 20 20  chans[2],\n"..  
0560: 20 20 20 20 20 20 20 20 09 22 09 64 73 74 5f 78          .".dst_x
0570: 2c 20 64 73 74 5f 79 2c 20 64 73 74 5f 77 69 64  , dst_y, dst_wid
0580: 74 68 2c 20 64 73 74 5f 68 65 69 67 68 74 2c 22  th, dst_height,"
0590: 0a 09 20 20 20 20 20 20 20 20 20 20 09 22 09 73  ..          .".s
05a0: 72 63 5f 78 30 2c 20 73 72 63 5f 78 31 2c 20 73  rc_x0, src_x1, s
05b0: 72 63 5f 79 30 2c 20 73 72 63 5f 79 31 22 0a 09  rc_y0, src_y1"..
05c0: 20 20 20 20 20 20 20 20 20 20 09 22 29 3b 22 29            .");")
05d0: 5d 29 0a 09 20 20 28 6c 61 6d 62 64 61 20 28 63  ])..  (lambda (c
05e0: 61 6e 76 61 73 20 64 73 74 2d 78 20 64 73 74 2d  anvas dst-x dst-
05f0: 79 20 73 72 63 2d 77 69 64 74 68 20 73 72 63 2d  y src-width src-
0600: 68 65 69 67 68 74 20 64 61 74 61 0a 09 20 20 20  height data..   
0610: 20 20 20 20 20 20 20 20 23 21 6b 65 79 20 5b 77          #!key [w
0620: 69 64 74 68 20 30 5d 20 5b 68 65 69 67 68 74 20  idth 0] [height 
0630: 30 5d 20 5b 78 30 20 30 5d 20 5b 78 31 20 30 5d  0] [x0 0] [x1 0]
0640: 20 5b 79 30 20 30 5d 20 5b 79 31 20 30 5d 29 0a   [y0 0] [y1 0]).
0650: 09 20 20 09 28 75 6e 6c 65 73 73 20 28 3d 20 28  .  .(unless (= (
0660: 62 6c 6f 62 2d 73 69 7a 65 20 64 61 74 61 29 20  blob-size data) 
0670: 28 2a 20 33 20 73 72 63 2d 77 69 64 74 68 20 73  (* 3 src-width s
0680: 72 63 2d 68 65 69 67 68 74 29 29 0a 09 20 20 09  rc-height))..  .
0690: 09 28 65 72 72 6f 72 20 27 63 61 6e 76 61 73 2d  .(error 'canvas-
06a0: 69 6d 61 67 65 2d 73 65 74 2f 72 67 62 21 20 22  image-set/rgb! "
06b0: 62 61 64 20 69 6d 61 67 65 20 73 69 7a 65 22 20  bad image size" 
06c0: 28 62 6c 6f 62 2d 73 69 7a 65 20 64 61 74 61 29  (blob-size data)
06d0: 20 28 2a 20 33 20 73 72 63 2d 77 69 64 74 68 20   (* 3 src-width 
06e0: 73 72 63 2d 68 65 69 67 68 74 29 29 29 0a 09 20  src-height))).. 
06f0: 20 09 28 63 61 6e 76 61 73 2d 69 6d 61 67 65 2d   .(canvas-image-
0700: 73 65 74 2f 72 67 62 2f 72 61 77 21 0a 09 20 20  set/rgb/raw!..  
0710: 09 09 63 61 6e 76 61 73 20 64 73 74 2d 78 20 64  ..canvas dst-x d
0720: 73 74 2d 79 20 73 72 63 2d 77 69 64 74 68 20 73  st-y src-width s
0730: 72 63 2d 68 65 69 67 68 74 20 64 61 74 61 0a 09  rc-height data..
0740: 20 20 09 09 77 69 64 74 68 20 68 65 69 67 68 74    ..width height
0750: 20 78 30 20 78 31 20 79 30 20 79 31 29 29 29 29   x0 x1 y0 y1))))
0760: 0a 0a 28 64 65 66 69 6e 65 20 63 61 6e 76 61 73  ..(define canvas
0770: 2d 69 6d 61 67 65 2d 70 75 74 2f 72 67 62 61 21  -image-put/rgba!
0780: 0a 09 28 6c 65 74 72 65 63 20 28 5b 63 61 6e 76  ..(letrec ([canv
0790: 61 73 2d 69 6d 61 67 65 2d 73 65 74 2f 72 67 62  as-image-set/rgb
07a0: 61 2f 72 61 77 21 0a 09 20 20 20 20 20 20 20 20  a/raw!..        
07b0: 20 20 28 66 6f 72 65 69 67 6e 2d 6c 61 6d 62 64    (foreign-lambd
07c0: 61 2a 20 76 6f 69 64 20 28 5b 6e 6f 6e 6e 75 6c  a* void ([nonnul
07d0: 6c 2d 63 61 6e 76 61 73 20 63 61 6e 76 61 73 5d  l-canvas canvas]
07e0: 20 5b 69 6e 74 20 64 73 74 5f 78 5d 20 5b 69 6e   [int dst_x] [in
07f0: 74 20 64 73 74 5f 79 5d 0a 09 20 20 20 20 20 20  t dst_y]..      
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 20 20 20 20 20 20 20 5b 69 6e 74 20             [int 
0820: 73 72 63 5f 77 69 64 74 68 5d 20 5b 69 6e 74 20  src_width] [int 
0830: 73 72 63 5f 68 65 69 67 68 74 5d 20 5b 6e 6f 6e  src_height] [non
0840: 6e 75 6c 6c 2d 62 6c 6f 62 20 64 61 74 61 5d 0a  null-blob data].
0850: 09 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0870: 20 20 5b 69 6e 74 20 64 73 74 5f 77 69 64 74 68    [int dst_width
0880: 5d 20 5b 69 6e 74 20 64 73 74 5f 68 65 69 67 68  ] [int dst_heigh
0890: 74 5d 0a 09 20 20 20 20 20 20 20 20 20 20 20 20  t]..            
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 20 5b 69 6e 74 20 73 72 63 5f 78 30       [int src_x0
08c0: 5d 20 5b 69 6e 74 20 73 72 63 5f 78 31 5d 20 5b  ] [int src_x1] [
08d0: 69 6e 74 20 73 72 63 5f 79 30 5d 20 5b 69 6e 74  int src_y0] [int
08e0: 20 73 72 63 5f 79 31 5d 29 0a 09 20 20 20 20 20   src_y1])..     
08f0: 20 20 20 20 20 20 20 22 63 6f 6e 73 74 20 69 6e         "const in
0900: 74 20 6e 63 68 61 6e 73 20 3d 20 34 3b 5c 6e 22  t nchans = 4;\n"
0910: 0a 09 20 20 20 20 20 20 20 20 20 20 09 22 75 6e  ..          ."un
0920: 73 69 67 6e 65 64 20 63 68 61 72 20 63 68 61 6e  signed char chan
0930: 73 5b 6e 63 68 61 6e 73 5d 5b 73 72 63 5f 77 69  s[nchans][src_wi
0940: 64 74 68 20 2a 20 73 72 63 5f 68 65 69 67 68 74  dth * src_height
0950: 5d 3b 5c 6e 22 0a 09 20 20 20 20 20 20 20 20 20  ];\n"..         
0960: 20 09 22 69 6e 74 20 69 3b 5c 6e 22 0a 09 20 20   ."int i;\n"..  
0970: 20 20 20 20 20 20 20 20 09 22 5c 6e 22 0a 09 20          ."\n".. 
0980: 20 20 20 20 20 20 20 20 20 09 22 66 6f 72 20 28           ."for (
0990: 69 20 3d 20 30 3b 20 69 20 3c 20 6e 63 68 61 6e  i = 0; i < nchan
09a0: 73 20 2a 20 73 72 63 5f 77 69 64 74 68 20 2a 20  s * src_width * 
09b0: 73 72 63 5f 68 65 69 67 68 74 3b 20 2b 2b 69 29  src_height; ++i)
09c0: 5c 6e 22 0a 09 20 20 20 20 20 20 20 20 20 20 09  \n"..          .
09d0: 22 09 63 68 61 6e 73 5b 69 20 25 20 6e 63 68 61  ".chans[i % ncha
09e0: 6e 73 5d 5b 69 20 2f 20 6e 63 68 61 6e 73 5d 20  ns][i / nchans] 
09f0: 3d 20 64 61 74 61 5b 69 5d 3b 5c 6e 22 0a 09 20  = data[i];\n".. 
0a00: 20 20 20 20 20 20 20 20 20 09 22 5c 6e 22 0a 09           ."\n"..
0a10: 20 20 20 20 20 20 20 20 20 20 09 22 63 64 43 61            ."cdCa
0a20: 6e 76 61 73 50 75 74 49 6d 61 67 65 52 65 63 74  nvasPutImageRect
0a30: 52 47 42 41 28 5c 6e 22 0a 09 20 20 20 20 20 20  RGBA(\n"..      
0a40: 20 20 20 20 09 22 09 63 61 6e 76 61 73 2c 20 73      .".canvas, s
0a50: 72 63 5f 77 69 64 74 68 2c 20 73 72 63 5f 68 65  rc_width, src_he
0a60: 69 67 68 74 2c 5c 6e 22 0a 09 20 20 20 20 20 20  ight,\n"..      
0a70: 20 20 20 20 09 22 09 63 68 61 6e 73 5b 30 5d 2c      .".chans[0],
0a80: 20 63 68 61 6e 73 5b 31 5d 2c 20 63 68 61 6e 73   chans[1], chans
0a90: 5b 32 5d 2c 20 63 68 61 6e 73 5b 33 5d 2c 5c 6e  [2], chans[3],\n
0aa0: 22 0a 09 20 20 20 20 20 20 20 20 20 20 09 22 09  "..          .".
0ab0: 64 73 74 5f 78 2c 20 64 73 74 5f 79 2c 20 64 73  dst_x, dst_y, ds
0ac0: 74 5f 77 69 64 74 68 2c 20 64 73 74 5f 68 65 69  t_width, dst_hei
0ad0: 67 68 74 2c 22 0a 09 20 20 20 20 20 20 20 20 20  ght,"..         
0ae0: 20 09 22 09 73 72 63 5f 78 30 2c 20 73 72 63 5f   .".src_x0, src_
0af0: 78 31 2c 20 73 72 63 5f 79 30 2c 20 73 72 63 5f  x1, src_y0, src_
0b00: 79 31 22 0a 09 20 20 20 20 20 20 20 20 20 20 09  y1"..          .
0b10: 22 29 3b 22 29 5d 29 0a 09 20 20 28 6c 61 6d 62  ");")])..  (lamb
0b20: 64 61 20 28 63 61 6e 76 61 73 20 64 73 74 2d 78  da (canvas dst-x
0b30: 20 64 73 74 2d 79 20 73 72 63 2d 77 69 64 74 68   dst-y src-width
0b40: 20 73 72 63 2d 68 65 69 67 68 74 20 64 61 74 61   src-height data
0b50: 0a 09 20 20 20 20 20 20 20 20 20 20 20 23 21 6b  ..           #!k
0b60: 65 79 20 5b 77 69 64 74 68 20 30 5d 20 5b 68 65  ey [width 0] [he
0b70: 69 67 68 74 20 30 5d 20 5b 78 30 20 30 5d 20 5b  ight 0] [x0 0] [
0b80: 78 31 20 30 5d 20 5b 79 30 20 30 5d 20 5b 79 31  x1 0] [y0 0] [y1
0b90: 20 30 5d 29 0a 09 20 20 09 28 75 6e 6c 65 73 73   0])..  .(unless
0ba0: 20 28 3d 20 28 62 6c 6f 62 2d 73 69 7a 65 20 64   (= (blob-size d
0bb0: 61 74 61 29 20 28 2a 20 34 20 73 72 63 2d 77 69  ata) (* 4 src-wi
0bc0: 64 74 68 20 73 72 63 2d 68 65 69 67 68 74 29 29  dth src-height))
0bd0: 0a 09 20 20 09 09 28 65 72 72 6f 72 20 27 63 61  ..  ..(error 'ca
0be0: 6e 76 61 73 2d 69 6d 61 67 65 2d 73 65 74 2f 72  nvas-image-set/r
0bf0: 67 62 61 21 20 22 62 61 64 20 69 6d 61 67 65 20  gba! "bad image 
0c00: 73 69 7a 65 22 20 28 62 6c 6f 62 2d 73 69 7a 65  size" (blob-size
0c10: 20 64 61 74 61 29 20 28 2a 20 34 20 73 72 63 2d   data) (* 4 src-
0c20: 77 69 64 74 68 20 73 72 63 2d 68 65 69 67 68 74  width src-height
0c30: 29 29 29 0a 09 20 20 09 28 63 61 6e 76 61 73 2d  )))..  .(canvas-
0c40: 69 6d 61 67 65 2d 73 65 74 2f 72 67 62 61 2f 72  image-set/rgba/r
0c50: 61 77 21 0a 09 20 20 09 09 63 61 6e 76 61 73 20  aw!..  ..canvas 
0c60: 64 73 74 2d 78 20 64 73 74 2d 79 20 73 72 63 2d  dst-x dst-y src-
0c70: 77 69 64 74 68 20 73 72 63 2d 68 65 69 67 68 74  width src-height
0c80: 20 64 61 74 61 0a 09 20 20 09 09 77 69 64 74 68   data..  ..width
0c90: 20 68 65 69 67 68 74 20 78 30 20 78 31 20 79 30   height x0 x1 y0
0ca0: 20 79 31 29 29 29 29 0a 0a 28 64 65 66 69 6e 65   y1))))..(define
0cb0: 20 63 61 6e 76 61 73 2d 69 6d 61 67 65 2f 72 67   canvas-image/rg
0cc0: 62 0a 09 28 67 65 74 74 65 72 2d 77 69 74 68 2d  b..(getter-with-
0cd0: 73 65 74 74 65 72 0a 09 09 28 6c 65 74 72 65 63  setter...(letrec
0ce0: 20 28 5b 63 61 6e 76 61 73 2d 69 6d 61 67 65 2f   ([canvas-image/
0cf0: 72 67 62 2f 72 61 77 0a 09 09 09 09 09 09 09 28  rgb/raw........(
0d00: 66 6f 72 65 69 67 6e 2d 6c 61 6d 62 64 61 2a 20  foreign-lambda* 
0d10: 76 6f 69 64 20 28 5b 6e 6f 6e 6e 75 6c 6c 2d 63  void ([nonnull-c
0d20: 61 6e 76 61 73 20 63 61 6e 76 61 73 5d 20 5b 69  anvas canvas] [i
0d30: 6e 74 20 78 5d 20 5b 69 6e 74 20 79 5d 0a 09 09  nt x] [int y]...
0d40: 09 09 09 09 09 20 20 20 20 20 20 20 20 20 20 20  .....           
0d50: 20 20 20 20 20 20 20 20 20 20 20 20 5b 69 6e 74              [int
0d60: 20 77 69 64 74 68 5d 20 5b 69 6e 74 20 68 65 69   width] [int hei
0d70: 67 68 74 5d 20 20 5b 6e 6f 6e 6e 75 6c 6c 2d 62  ght]  [nonnull-b
0d80: 6c 6f 62 20 64 61 74 61 5d 29 0a 09 09 09 09 09  lob data])......
0d90: 09 09 20 20 22 63 6f 6e 73 74 20 69 6e 74 20 6e  ..  "const int n
0da0: 63 68 61 6e 73 20 3d 20 33 3b 5c 6e 22 0a 09 09  chans = 3;\n"...
0db0: 09 09 09 09 09 20 20 22 75 6e 73 69 67 6e 65 64  .....  "unsigned
0dc0: 20 63 68 61 72 20 63 68 61 6e 73 5b 6e 63 68 61   char chans[ncha
0dd0: 6e 73 5d 5b 77 69 64 74 68 20 2a 20 68 65 69 67  ns][width * heig
0de0: 68 74 5d 3b 5c 6e 22 0a 09 09 09 09 09 09 09 20  ht];\n"........ 
0df0: 20 22 69 6e 74 20 69 3b 5c 6e 22 0a 09 09 09 09   "int i;\n".....
0e00: 09 09 09 20 20 22 5c 6e 22 0a 09 09 09 09 09 09  ...  "\n".......
0e10: 09 20 20 22 63 64 43 61 6e 76 61 73 47 65 74 49  .  "cdCanvasGetI
0e20: 6d 61 67 65 52 47 42 28 5c 6e 22 0a 09 09 09 09  mageRGB(\n".....
0e30: 09 09 09 20 20 22 09 63 61 6e 76 61 73 2c 5c 6e  ...  ".canvas,\n
0e40: 22 0a 09 09 09 09 09 09 09 20 20 22 09 63 68 61  "........  ".cha
0e50: 6e 73 5b 30 5d 2c 20 63 68 61 6e 73 5b 31 5d 2c  ns[0], chans[1],
0e60: 20 63 68 61 6e 73 5b 32 5d 2c 5c 6e 22 0a 09 09   chans[2],\n"...
0e70: 09 09 09 09 09 20 20 22 09 78 2c 20 79 2c 20 77  .....  ".x, y, w
0e80: 69 64 74 68 2c 20 68 65 69 67 68 74 5c 6e 22 0a  idth, height\n".
0e90: 09 09 09 09 09 09 09 20 20 22 29 3b 5c 6e 22 0a  .......  ");\n".
0ea0: 09 09 09 09 09 09 09 20 20 22 5c 6e 22 0a 09 09  .......  "\n"...
0eb0: 09 09 09 09 09 20 20 22 66 6f 72 20 28 69 20 3d  .....  "for (i =
0ec0: 20 30 3b 20 69 20 3c 20 6e 63 68 61 6e 73 20 2a   0; i < nchans *
0ed0: 20 77 69 64 74 68 20 2a 20 68 65 69 67 68 74 3b   width * height;
0ee0: 20 2b 2b 69 29 5c 6e 22 0a 09 09 09 09 09 09 09   ++i)\n"........
0ef0: 20 20 22 09 64 61 74 61 5b 69 5d 20 3d 20 63 68    ".data[i] = ch
0f00: 61 6e 73 5b 69 20 25 20 6e 63 68 61 6e 73 5d 5b  ans[i % nchans][
0f10: 69 20 2f 20 6e 63 68 61 6e 73 5d 3b 5c 6e 22 29  i / nchans];\n")
0f20: 5d 29 0a 09 09 09 28 6c 61 6d 62 64 61 20 28 63  ])....(lambda (c
0f30: 61 6e 76 61 73 20 78 20 79 20 77 69 64 74 68 20  anvas x y width 
0f40: 68 65 69 67 68 74 29 0a 09 09 09 09 28 6c 65 74  height).....(let
0f50: 20 28 5b 64 61 74 61 20 28 6d 61 6b 65 2d 62 6c   ([data (make-bl
0f60: 6f 62 20 28 2a 20 33 20 77 69 64 74 68 20 68 65  ob (* 3 width he
0f70: 69 67 68 74 29 29 5d 29 0a 09 09 09 09 09 28 63  ight))])......(c
0f80: 61 6e 76 61 73 2d 69 6d 61 67 65 2f 72 67 62 2f  anvas-image/rgb/
0f90: 72 61 77 20 63 61 6e 76 61 73 20 78 20 79 20 77  raw canvas x y w
0fa0: 69 64 74 68 20 68 65 69 67 68 74 20 64 61 74 61  idth height data
0fb0: 29 0a 09 09 09 09 09 64 61 74 61 29 29 29 0a 09  )......data)))..
0fc0: 09 63 61 6e 76 61 73 2d 69 6d 61 67 65 2d 70 75  .canvas-image-pu
0fd0: 74 2f 72 67 62 21 29 29 0a 0a 3b 3b 20 7d 7d 7d  t/rgb!))..;; }}}
0fe0: 0a 0a 29 0a                                      ..).