diff --git a/pitfall/pitfall/kit/color.rkt b/pitfall/pitfall/kit/color.rkt index 40da59b9..5d227b5f 100644 --- a/pitfall/pitfall/kit/color.rkt +++ b/pitfall/pitfall/kit/color.rkt @@ -92,35 +92,24 @@ (public [@_doOpacity doOpacity]) (define (@_doOpacity fillOpacity strokeOpacity) (when (or fillOpacity strokeOpacity) - (when fillOpacity - (set! fillOpacity (max 0 (min 1 fillOpacity)))) - (when strokeOpacity - (set! strokeOpacity (max 0 (min 1 strokeOpacity)))) + (set! fillOpacity (and fillOpacity (bounded 0 fillOpacity 1))) + (set! strokeOpacity (and strokeOpacity (bounded 0 strokeOpacity 1))) (define key (format "~a_~a" (if fillOpacity (number fillOpacity) "") (if strokeOpacity (number strokeOpacity) ""))) - (define dictionary #f) - (define name #f) - (cond - [(hash-has-key? @_opacityRegistry key) - (match-define (list d n) (hash-ref @_opacityRegistry key)) - (set! dictionary d) - (set! name n)] - [else - (set! dictionary (mhash 'Type "ExtGState")) - (when fillOpacity - (hash-set! dictionary 'ca fillOpacity)) - (when strokeOpacity - (hash-set! dictionary 'CA strokeOpacity)) - - (set! dictionary (send this ref dictionary)) - (· dictionary end) - (++ @_opacityCount) - (define id @_opacityCount) - (set! name (format "Gs~a" id)) - (hash-set! @_opacityRegistry key (list dictionary name))]) + (match-define (list dictionary name) + (hash-ref! @_opacityRegistry key + (λ () + (define dictionary (mhash 'Type "ExtGState")) + (when fillOpacity + (hash-set! dictionary 'ca fillOpacity)) + (when strokeOpacity + (hash-set! dictionary 'CA strokeOpacity)) + (define dict-ref (send this ref dictionary)) + (· dict-ref end) + (list dict-ref (format "Gs~a" (++ @_opacityCount)))))) (hash-set! (· this page ext_gstates) name dictionary) (send this addContent (format "/~a gs" name)))) @@ -128,153 +117,153 @@ )) (define namedColors - (mhash "aliceblue" '(240 248 255) - "antiquewhite" '(250 235 215) - "aqua" '(0 255 255) - "aquamarine" '(127 255 212) - "azure" '(240 255 255) - "beige" '(245 245 220) - "bisque" '(255 228 196) - "black" '(0 0 0) - "blanchedalmond" '(255 235 205) - "blue" '(0 0 255) - "blueviolet" '(138 43 226) - "brown" '(165 42 42) - "burlywood" '(222 184 135) - "cadetblue" '(95 158 160) - "chartreuse" '(127 255 0) - "chocolate" '(210 105 30) - "coral" '(255 127 80) - "cornflowerblue" '(100 149 237) - "cornsilk" '(255 248 220) - "crimson" '(220 20 60) - "cyan" '(0 255 255) - "darkblue" '(0 0 139) - "darkcyan" '(0 139 139) - "darkgoldenrod" '(184 134 11) - "darkgray" '(169 169 169) - "darkgreen" '(0 100 0) - "darkgrey" '(169 169 169) - "darkkhaki" '(189 183 107) - "darkmagenta" '(139 0 139) - "darkolivegreen" '(85 107 47) - "darkorange" '(255 140 0) - "darkorchid" '(153 50 204) - "darkred" '(139 0 0) - "darksalmon" '(233 150 122) - "darkseagreen" '(143 188 143) - "darkslateblue" '(72 61 139) - "darkslategray" '(47 79 79) - "darkslategrey" '(47 79 79) - "darkturquoise" '(0 206 209) - "darkviolet" '(148 0 211) - "deeppink" '(255 20 147) - "deepskyblue" '(0 191 255) - "dimgray" '(105 105 105) - "dimgrey" '(105 105 105) - "dodgerblue" '(30 144 255) - "firebrick" '(178 34 34) - "floralwhite" '(255 250 240) - "forestgreen" '(34 139 34) - "fuchsia" '(255 0 255) - "gainsboro" '(220 220 220) - "ghostwhite" '(248 248 255) - "gold" '(255 215 0) - "goldenrod" '(218 165 32) - "gray" '(128 128 128) - "grey" '(128 128 128) - "green" '(0 128 0) - "greenyellow" '(173 255 47) - "honeydew" '(240 255 240) - "hotpink" '(255 105 180) - "indianred" '(205 92 92) - "indigo" '(75 0 130) - "ivory" '(255 255 240) - "khaki" '(240 230 140) - "lavender" '(230 230 250) - "lavenderblush" '(255 240 245) - "lawngreen" '(124 252 0) - "lemonchiffon" '(255 250 205) - "lightblue" '(173 216 230) - "lightcoral" '(240 128 128) - "lightcyan" '(224 255 255) - "lightgoldenrodyellow" '(250 250 210) - "lightgray" '(211 211 211) - "lightgreen" '(144 238 144) - "lightgrey" '(211 211 211) - "lightpink" '(255 182 193) - "lightsalmon" '(255 160 122) - "lightseagreen" '(32 178 170) - "lightskyblue" '(135 206 250) - "lightslategray" '(119 136 153) - "lightslategrey" '(119 136 153) - "lightsteelblue" '(176 196 222) - "lightyellow" '(255 255 224) - "lime" '(0 255 0) - "limegreen" '(50 205 50) - "linen" '(250 240 230) - "magenta" '(255 0 255) - "maroon" '(128 0 0) - "mediumaquamarine" '(102 205 170) - "mediumblue" '(0 0 205) - "mediumorchid" '(186 85 211) - "mediumpurple" '(147 112 219) - "mediumseagreen" '(60 179 113) - "mediumslateblue" '(123 104 238) - "mediumspringgreen" '(0 250 154) - "mediumturquoise" '(72 209 204) - "mediumvioletred" '(199 21 133) - "midnightblue" '(25 25 112) - "mintcream" '(245 255 250) - "mistyrose" '(255 228 225) - "moccasin" '(255 228 181) - "navajowhite" '(255 222 173) - "navy" '(0 0 128) - "oldlace" '(253 245 230) - "olive" '(128 128 0) - "olivedrab" '(107 142 35) - "orange" '(255 165 0) - "orangered" '(255 69 0) - "orchid" '(218 112 214) - "palegoldenrod" '(238 232 170) - "palegreen" '(152 251 152) - "paleturquoise" '(175 238 238) - "palevioletred" '(219 112 147) - "papayawhip" '(255 239 213) - "peachpuff" '(255 218 185) - "peru" '(205 133 63) - "pink" '(255 192 203) - "plum" '(221 160 221) - "powderblue" '(176 224 230) - "purple" '(128 0 128) - "red" '(255 0 0) - "rosybrown" '(188 143 143) - "royalblue" '(65 105 225) - "saddlebrown" '(139 69 19) - "salmon" '(250 128 114) - "sandybrown" '(244 164 96) - "seagreen" '(46 139 87) - "seashell" '(255 245 238) - "sienna" '(160 82 45) - "silver" '(192 192 192) - "skyblue" '(135 206 235) - "slateblue" '(106 90 205) - "slategray" '(112 128 144) - "slategrey" '(112 128 144) - "snow" '(255 250 250) - "springgreen" '(0 255 127) - "steelblue" '(70 130 180) - "tan" '(210 180 140) - "teal" '(0 128 128) - "thistle" '(216 191 216) - "tomato" '(255 99 71) - "turquoise" '(64 224 208) - "violet" '(238 130 238) - "wheat" '(245 222 179) - "white" '(255 255 255) - "whitesmoke" '(245 245 245) - "yellow" '(255 255 0) - "yellowgreen" '(154 205 50))) + (hash "aliceblue" '(240 248 255) + "antiquewhite" '(250 235 215) + "aqua" '(0 255 255) + "aquamarine" '(127 255 212) + "azure" '(240 255 255) + "beige" '(245 245 220) + "bisque" '(255 228 196) + "black" '(0 0 0) + "blanchedalmond" '(255 235 205) + "blue" '(0 0 255) + "blueviolet" '(138 43 226) + "brown" '(165 42 42) + "burlywood" '(222 184 135) + "cadetblue" '(95 158 160) + "chartreuse" '(127 255 0) + "chocolate" '(210 105 30) + "coral" '(255 127 80) + "cornflowerblue" '(100 149 237) + "cornsilk" '(255 248 220) + "crimson" '(220 20 60) + "cyan" '(0 255 255) + "darkblue" '(0 0 139) + "darkcyan" '(0 139 139) + "darkgoldenrod" '(184 134 11) + "darkgray" '(169 169 169) + "darkgreen" '(0 100 0) + "darkgrey" '(169 169 169) + "darkkhaki" '(189 183 107) + "darkmagenta" '(139 0 139) + "darkolivegreen" '(85 107 47) + "darkorange" '(255 140 0) + "darkorchid" '(153 50 204) + "darkred" '(139 0 0) + "darksalmon" '(233 150 122) + "darkseagreen" '(143 188 143) + "darkslateblue" '(72 61 139) + "darkslategray" '(47 79 79) + "darkslategrey" '(47 79 79) + "darkturquoise" '(0 206 209) + "darkviolet" '(148 0 211) + "deeppink" '(255 20 147) + "deepskyblue" '(0 191 255) + "dimgray" '(105 105 105) + "dimgrey" '(105 105 105) + "dodgerblue" '(30 144 255) + "firebrick" '(178 34 34) + "floralwhite" '(255 250 240) + "forestgreen" '(34 139 34) + "fuchsia" '(255 0 255) + "gainsboro" '(220 220 220) + "ghostwhite" '(248 248 255) + "gold" '(255 215 0) + "goldenrod" '(218 165 32) + "gray" '(128 128 128) + "grey" '(128 128 128) + "green" '(0 128 0) + "greenyellow" '(173 255 47) + "honeydew" '(240 255 240) + "hotpink" '(255 105 180) + "indianred" '(205 92 92) + "indigo" '(75 0 130) + "ivory" '(255 255 240) + "khaki" '(240 230 140) + "lavender" '(230 230 250) + "lavenderblush" '(255 240 245) + "lawngreen" '(124 252 0) + "lemonchiffon" '(255 250 205) + "lightblue" '(173 216 230) + "lightcoral" '(240 128 128) + "lightcyan" '(224 255 255) + "lightgoldenrodyellow" '(250 250 210) + "lightgray" '(211 211 211) + "lightgreen" '(144 238 144) + "lightgrey" '(211 211 211) + "lightpink" '(255 182 193) + "lightsalmon" '(255 160 122) + "lightseagreen" '(32 178 170) + "lightskyblue" '(135 206 250) + "lightslategray" '(119 136 153) + "lightslategrey" '(119 136 153) + "lightsteelblue" '(176 196 222) + "lightyellow" '(255 255 224) + "lime" '(0 255 0) + "limegreen" '(50 205 50) + "linen" '(250 240 230) + "magenta" '(255 0 255) + "maroon" '(128 0 0) + "mediumaquamarine" '(102 205 170) + "mediumblue" '(0 0 205) + "mediumorchid" '(186 85 211) + "mediumpurple" '(147 112 219) + "mediumseagreen" '(60 179 113) + "mediumslateblue" '(123 104 238) + "mediumspringgreen" '(0 250 154) + "mediumturquoise" '(72 209 204) + "mediumvioletred" '(199 21 133) + "midnightblue" '(25 25 112) + "mintcream" '(245 255 250) + "mistyrose" '(255 228 225) + "moccasin" '(255 228 181) + "navajowhite" '(255 222 173) + "navy" '(0 0 128) + "oldlace" '(253 245 230) + "olive" '(128 128 0) + "olivedrab" '(107 142 35) + "orange" '(255 165 0) + "orangered" '(255 69 0) + "orchid" '(218 112 214) + "palegoldenrod" '(238 232 170) + "palegreen" '(152 251 152) + "paleturquoise" '(175 238 238) + "palevioletred" '(219 112 147) + "papayawhip" '(255 239 213) + "peachpuff" '(255 218 185) + "peru" '(205 133 63) + "pink" '(255 192 203) + "plum" '(221 160 221) + "powderblue" '(176 224 230) + "purple" '(128 0 128) + "red" '(255 0 0) + "rosybrown" '(188 143 143) + "royalblue" '(65 105 225) + "saddlebrown" '(139 69 19) + "salmon" '(250 128 114) + "sandybrown" '(244 164 96) + "seagreen" '(46 139 87) + "seashell" '(255 245 238) + "sienna" '(160 82 45) + "silver" '(192 192 192) + "skyblue" '(135 206 235) + "slateblue" '(106 90 205) + "slategray" '(112 128 144) + "slategrey" '(112 128 144) + "snow" '(255 250 250) + "springgreen" '(0 255 127) + "steelblue" '(70 130 180) + "tan" '(210 180 140) + "teal" '(0 128 128) + "thistle" '(216 191 216) + "tomato" '(255 99 71) + "turquoise" '(64 224 208) + "violet" '(238 130 238) + "wheat" '(245 222 179) + "white" '(255 255 255) + "whitesmoke" '(245 245 245) + "yellow" '(255 255 0) + "yellowgreen" '(154 205 50))) (define c (new (color-mixin object%))) diff --git a/pitfall/pitfall/kit/helper.rkt b/pitfall/pitfall/kit/helper.rkt index 025fd062..2b8f921e 100644 --- a/pitfall/pitfall/kit/helper.rkt +++ b/pitfall/pitfall/kit/helper.rkt @@ -16,7 +16,7 @@ (syntax-case stx () [(_ ref xs) #'(for/list ([x (in-list xs)]) (· x ref))])) -(define-syntax-rule (+= id thing) (set! id (+ id thing))) +(define-syntax-rule (+= id thing) (begin (set! id (+ id thing)) id)) (define-syntax-rule (++ id) (+= id 1)) (define-syntax-rule (-- id) (+= id -1)) (define-syntax-rule (-= id thing) (+= id (- thing))) @@ -67,7 +67,7 @@ ;; fancy number->string. bounds are checked, inexact integers are coerced. (define (number x) - (unless (< -1e21 x 1e21) + (unless (and (number? x) (< -1e21 x 1e21)) (raise-argument-error 'number "valid number" x)) (let ([x (/ (round (* x 1e6)) 1e6)]) (number->string (if (integer? x) @@ -92,4 +92,18 @@ (field [sum 0]) (define/public (add x) (set! sum (+ sum x)) this))) (define sfo (new SFC)) - (check-equal? (get-field sum (send*/fold sfo [add 1] [add 2] [add 3])) 6)) \ No newline at end of file + (check-equal? (get-field sum (send*/fold sfo [add 1] [add 2] [add 3])) 6)) + +(define (bounded low x high) + (if (high . < . low) + (bounded high x low) + (max low (min high x)))) + +(module+ test + (check-equal? (bounded 0 2 1) 1) + (check-equal? (bounded 1 2 0) 1) + (check-equal? (bounded 0 -2 1) 0) + (check-equal? (bounded 1 -2 0) 0) + (check-equal? (bounded 0 .5 1) 0.5) + (check-equal? (bounded 0 0 1) 0) + (check-equal? (bounded 0 1 1) 1)) \ No newline at end of file