#!/local/gauche/bin/gosh (use srfi-1) (use srfi-13) (use gauche.uvector) (define (string->dim s) (let ((x (string->number s))) (cond ((<= x 0) (error "Dimension less than or equal to zero:" x)) ((> x 5000) (error "Dimension suspiciously large:" x)) ) x ) ) (define (get-width-height hdr-line) (let ((dim-list (map string->dim (string-tokenize hdr-line)))) (values (first dim-list) (second dim-list)) ) ) (define (traverse-height maxval img-data y height x width) (if (< y height) (let ((pos (* (+ (* y width) x) 3))) (if (and (= (u16vector-ref img-data pos) maxval) (= (u16vector-ref img-data (+ pos 1)) 0) (= (u16vector-ref img-data (+ pos 2)) 0)) (print x " " y) ) (traverse-height maxval img-data (+ y 1) height x width) ) ) ) (define (traverse-width maxval img-data x width height) (if (< x width) (begin (traverse-height maxval img-data 0 height x width) (traverse-width maxval img-data (+ x 1) width height) ) ) ) (define (find-red maxval img-data width height) (let ((rv (read-block! img-data))) (if (= rv (* width height 3)) (traverse-width maxval img-data 0 width height) (error "Should've read " (* width height 3) " but read " rv) ) ) ) (define (main args) (if (not (string=? (read-line) "P6")) (error "Incorrect signature")) (let ((dim-line (read-line)) (maxval (string->number (read-line)))) (receive (width height) (get-width-height dim-line) (find-red maxval (cond ((= maxval 65535) (make-u16vector (* width height 3))) ((= maxval 255) (make-u8vector (* width height 3))) (else (error "Don't know how to deal with maxval of " maxval)) ) width height) ) ) )