Artifact 799196508db45b0bf23e1c8b4d7d316faa22b1b0:


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 66 66 69 2f 75 6e 73 61 66  quire. ffi/unsaf
0020: 65 0a 20 22 62 61 73 65 2e 72 6b 74 22 29 0a 0a  e. "base.rkt")..
0030: 28 64 65 66 69 6e 65 20 6c 69 62 63 64 0a 20 20  (define libcd.  
0040: 28 63 61 73 65 20 28 73 79 73 74 65 6d 2d 74 79  (case (system-ty
0050: 70 65 20 27 6f 73 29 0a 20 20 20 20 5b 28 77 69  pe 'os).    [(wi
0060: 6e 64 6f 77 73 29 0a 20 20 20 20 20 28 66 66 69  ndows).     (ffi
0070: 2d 6c 69 62 20 22 63 64 22 29 5d 0a 20 20 20 20  -lib "cd")].    
0080: 5b 65 6c 73 65 0a 20 20 20 20 20 28 66 66 69 2d  [else.     (ffi-
0090: 6c 69 62 20 22 6c 69 62 63 64 22 29 5d 29 29 0a  lib "libcd")])).
00a0: 0a 3b 3b 20 7b 7b 7b 20 43 6f 6e 74 65 78 74 20  .;; {{{ Context 
00b0: 63 6f 6e 74 65 6e 74 20 70 6c 61 79 62 61 63 6b  content playback
00c0: 0a 0a 28 64 65 66 69 6e 65 20 63 61 6e 76 61 73  ..(define canvas
00d0: 2d 70 6c 61 79 2f 70 74 72 21 0a 20 20 28 67 65  -play/ptr!.  (ge
00e0: 74 2d 66 66 69 2d 6f 62 6a 0a 20 20 20 22 63 64  t-ffi-obj.   "cd
00f0: 43 61 6e 76 61 73 50 6c 61 79 22 20 6c 69 62 63  CanvasPlay" libc
0100: 64 0a 20 20 20 28 5f 66 75 6e 20 5b 63 61 6e 76  d.   (_fun [canv
0110: 61 73 20 3a 20 5f 63 61 6e 76 61 73 5d 20 5b 63  as : _canvas] [c
0120: 6f 6e 74 65 78 74 20 3a 20 5f 63 6f 6e 74 65 78  ontext : _contex
0130: 74 5d 0a 20 20 20 20 20 20 20 20 20 5b 78 30 20  t].         [x0 
0140: 3a 20 5f 69 6e 74 5d 20 5b 78 31 20 3a 20 5f 69  : _int] [x1 : _i
0150: 6e 74 5d 20 5b 79 30 20 3a 20 5f 69 6e 74 5d 20  nt] [y0 : _int] 
0160: 5b 79 31 20 3a 20 5f 69 6e 74 5d 0a 20 20 20 20  [y1 : _int].    
0170: 20 20 20 20 20 5b 64 61 74 61 20 3a 20 5f 70 6f       [data : _po
0180: 69 6e 74 65 72 5d 0a 20 20 20 20 20 20 20 20 20  inter].         
0190: 2d 3e 20 5b 72 63 20 3a 20 5f 69 6e 74 5d 29 29  -> [rc : _int]))
01a0: 29 0a 0a 28 64 65 66 69 6e 65 20 63 61 6e 76 61  )..(define canva
01b0: 73 2d 70 6c 61 79 2f 73 74 72 69 6e 67 21 0a 20  s-play/string!. 
01c0: 20 28 67 65 74 2d 66 66 69 2d 6f 62 6a 0a 20 20   (get-ffi-obj.  
01d0: 20 22 63 64 43 61 6e 76 61 73 50 6c 61 79 22 20   "cdCanvasPlay" 
01e0: 6c 69 62 63 64 0a 20 20 20 28 5f 66 75 6e 20 5b  libcd.   (_fun [
01f0: 63 61 6e 76 61 73 20 3a 20 5f 63 61 6e 76 61 73  canvas : _canvas
0200: 5d 20 5b 63 6f 6e 74 65 78 74 20 3a 20 5f 63 6f  ] [context : _co
0210: 6e 74 65 78 74 5d 0a 20 20 20 20 20 20 20 20 20  ntext].         
0220: 5b 78 30 20 3a 20 5f 69 6e 74 5d 20 5b 78 31 20  [x0 : _int] [x1 
0230: 3a 20 5f 69 6e 74 5d 20 5b 79 30 20 3a 20 5f 69  : _int] [y0 : _i
0240: 6e 74 5d 20 5b 79 31 20 3a 20 5f 69 6e 74 5d 0a  nt] [y1 : _int].
0250: 20 20 20 20 20 20 20 20 20 5b 64 61 74 61 20 3a           [data :
0260: 20 5f 73 74 72 69 6e 67 2f 75 74 66 2d 38 5d 0a   _string/utf-8].
0270: 20 20 20 20 20 20 20 20 20 2d 3e 20 5b 72 63 20           -> [rc 
0280: 3a 20 5f 69 6e 74 5d 29 29 29 0a 0a 28 64 65 66  : _int])))..(def
0290: 69 6e 65 20 28 63 61 6e 76 61 73 2d 70 6c 61 79  ine (canvas-play
02a0: 21 20 63 61 6e 76 61 73 20 63 6f 6e 74 65 78 74  ! canvas context
02b0: 20 78 30 20 78 31 20 79 30 20 79 31 20 64 61 74   x0 x1 y0 y1 dat
02c0: 61 29 0a 20 20 28 6c 65 74 20 28 5b 63 61 6e 76  a).  (let ([canv
02d0: 61 73 2d 70 6c 61 79 2f 64 61 74 61 21 20 28 69  as-play/data! (i
02e0: 66 20 28 73 74 72 69 6e 67 3f 20 64 61 74 61 29  f (string? data)
02f0: 20 63 61 6e 76 61 73 2d 70 6c 61 79 2f 73 74 72   canvas-play/str
0300: 69 6e 67 21 20 63 61 6e 76 61 73 2d 70 6c 61 79  ing! canvas-play
0310: 2f 70 74 72 21 29 5d 29 0a 20 20 20 20 28 75 6e  /ptr!)]).    (un
0320: 6c 65 73 73 20 28 7a 65 72 6f 3f 20 28 63 61 6e  less (zero? (can
0330: 76 61 73 2d 70 6c 61 79 2f 64 61 74 61 21 20 63  vas-play/data! c
0340: 61 6e 76 61 73 20 63 6f 6e 74 65 78 74 20 78 30  anvas context x0
0350: 20 78 31 20 79 30 20 79 31 20 64 61 74 61 29 29   x1 y0 y1 data))
0360: 0a 20 20 20 20 20 20 28 65 72 72 6f 72 20 27 63  .      (error 'c
0370: 61 6e 76 61 73 2d 70 6c 61 79 21 20 22 66 61 69  anvas-play! "fai
0380: 6c 65 64 20 74 6f 20 72 65 70 6c 61 79 20 67 72  led to replay gr
0390: 61 70 68 69 63 73 22 29 29 29 29 0a 0a 28 70 72  aphics"))))..(pr
03a0: 6f 76 69 64 65 0a 20 63 61 6e 76 61 73 2d 70 6c  ovide. canvas-pl
03b0: 61 79 21 29 0a 0a 3b 3b 20 7d 7d 7d 0a           ay!)..;; }}}.