From 0d279abbb72ae71510cdca5560b5ebe98d3a04cc Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Sun, 21 May 2017 21:48:10 -1000 Subject: [PATCH] refac --- pitfall/pitfall/png-reader.rkt | 47 +++++++++++++--------------------- 1 file changed, 18 insertions(+), 29 deletions(-) diff --git a/pitfall/pitfall/png-reader.rkt b/pitfall/pitfall/png-reader.rkt index 1dacec4f..398bcea8 100644 --- a/pitfall/pitfall/png-reader.rkt +++ b/pitfall/pitfall/png-reader.rkt @@ -86,6 +86,16 @@ Grab key chunks from PNG. Doesn't require heavy lifting from libpng. 0 (bytes-ref pixels (- c pixelBytes)))) + (define (upper-byte row col i) + (if (zero? row) + row + (bytes-ref pixels + (+ (* (sub1 row) scanlineLength) + (* col pixelBytes) + (modulo i pixelBytes))))) + + (define (get-col i) ((i . - . (modulo i pixelBytes)) . / . pixelBytes)) + (parameterize ([current-input-port (open-input-bytes (inflate imgData))]) (for/fold ([c 0]) ([row (in-naturals)] #:break (eof-object? (peek-byte))) @@ -107,42 +117,23 @@ Grab key chunks from PNG. Doesn't require heavy lifting from libpng. (for/fold ([c c]) ([i (in-range scanlineLength)] [byte (in-port read-byte)]) - (define col ((i . - . (modulo i pixelBytes)) . / . pixelBytes)) - (define upper (if (zero? row) - row - (bytes-ref pixels - (+ (* (sub1 row) scanlineLength) - (* col pixelBytes) - (modulo i pixelBytes))))) - (bytes-set! pixels c (modulo (+ upper byte) 256)) + (bytes-set! pixels c (modulo (+ (upper-byte row (get-col i) i) byte) 256)) (add1 c))] [(3) ; average (for/fold ([c c]) ([i (in-range scanlineLength)] [byte (in-port read-byte)]) - (define col ((i . - . (modulo i pixelBytes)) . / . pixelBytes)) - (define left (left-byte i c)) - (define upper (if (zero? row) - row - (bytes-ref pixels - (+ (* (sub1 row) scanlineLength) - (* col pixelBytes) - (modulo i pixelBytes))))) - (bytes-set! pixels c (modulo (+ byte (floor (/ (+ left upper) 2))) 256)) + (bytes-set! pixels c (modulo (+ byte (floor (/ (+ (left-byte i c) (upper-byte row (get-col i) i)) 2))) 256)) (add1 c))] [(4) ; paeth (for/fold ([c c]) ([i (in-range scanlineLength)] [byte (in-port read-byte)]) - (define col ((i . - . (modulo i pixelBytes)) . / . pixelBytes)) - (define left (left-byte i c)) + (define col (get-col i)) (match-define (list upper upperLeft) (cond [(zero? row) (list 0 0)] - [else (define upper (bytes-ref pixels - (+ (* (sub1 row) scanlineLength) - (* col pixelBytes) - (modulo i pixelBytes)))) + [else (define upper (upper-byte row col i)) (define upperLeft (if (zero? col) col (bytes-ref pixels @@ -151,10 +142,10 @@ Grab key chunks from PNG. Doesn't require heavy lifting from libpng. (modulo i pixelBytes))))) (list upper upperLeft)])) + (define left (left-byte i c)) (define p (+ left upper (- upperLeft))) - (define pa (abs (- p left))) - (define pb (abs (- p upper))) - (define pc (abs (- p upperLeft))) + (match-define (list pa pb pc) + (map (λ (x) (abs (- p x))) (list left upper upperLeft))) (define paeth (cond [((pa . <= . pb) . and . (pa . <= . pc)) left] @@ -162,9 +153,7 @@ Grab key chunks from PNG. Doesn't require heavy lifting from libpng. [else upperLeft])) (bytes-set! pixels c (modulo (+ byte paeth) 256)) - (add1 c) - - )] + (add1 c))] [else (error 'invalid-png-filter-algorithm )]))) pixels)