plot bug fixes, including new images and a more forgiving image-equality test

This commit is contained in:
Matthew Flatt 2010-11-10 09:18:50 -07:00
parent 8d1827222c
commit 27752c4695
11 changed files with 98 additions and 54 deletions

View File

@ -47,16 +47,33 @@
(define _plflt _double*)
(define _plint _int)
(define (_list-of type . len?)
(let ([len (and (pair? len?) (car len?))])
(make-ctype _pointer
(lambda (l) (list->cblock l type))
(if len
(lambda (b) (cblock->list b type len))
(lambda (b) (error "this list type does not specify a size"))))))
;; While an array generated from a list is passed to an
;; plot library function, we might perform a GC through
;; the back-end drawing operation. So, arrays must be
;; allocated as non-moving objects
(define-fun-syntax _list/still
(lambda (stx)
(syntax-case stx (i)
[(_ i ty) #'(_list/still i ty 'atomic-interior)]
[(_ i ty mode)
#'(type: _pointer
pre: (x => (list->cblock/mode x ty mode)))])))
(define (_matrix-of type)
(_list-of (_list-of type)))
(define-fun-syntax _matrix-of
(lambda (stx)
(syntax-case stx (i)
[(_ ty)
#'(_list/still i (_list/still i ty) 'interior)])))
(define (list->cblock/mode l type mode)
(if (null? l)
#f ; null => NULL
(let ([cblock (malloc (length l) type mode)])
(let loop ([l l] [i 0])
(unless (null? l)
(ptr-set! cblock type i (car l))
(loop (cdr l) (add1 i))))
cblock)))
(define-syntax define*
(syntax-rules ()
@ -97,7 +114,7 @@
(define* pl-plot-line
(get-ffi-obj "c_plline" libplplot
(_fun _plint (x : (_list i _plflt)) (y : (_list i _plflt)) -> _void)))
(_fun _plint (x : (_list/still i _plflt)) (y : (_list/still i _plflt)) -> _void)))
(define* pl-plot-segment
(get-ffi-obj "c_pljoin" libplplot
@ -129,26 +146,26 @@
(define* pl-x-error-bars
(get-ffi-obj "c_plerrx" libplplot
(_fun _plint (_list i _plflt)
(_list i _plflt)
(_list i _plflt) -> _void)))
(_fun _plint (_list/still i _plflt)
(_list/still i _plflt)
(_list/still i _plflt) -> _void)))
(define* pl-y-error-bars
(get-ffi-obj "c_plerry" libplplot
(_fun _plint (_list i _plflt)
(_list i _plflt)
(_list i _plflt) -> _void)))
(_fun _plint (_list/still i _plflt)
(_list/still i _plflt)
(_list/still i _plflt) -> _void)))
(define* pl-plot-points
(get-ffi-obj "c_plpoin" libplplot
(_fun _plint (x : (_list i _plflt)) (y : (_list i _plflt)) _plint
(_fun _plint (x : (_list/still i _plflt)) (y : (_list/still i _plflt)) _plint
-> _void)))
(define* pl-fill
(get-ffi-obj "c_plfill" libplplot
(_fun (n : _plint = (length x-values))
(x-values : (_list i _plflt))
(y-values : (_list i _plflt))
(x-values : (_list/still i _plflt))
(y-values : (_list/still i _plflt))
-> _void)))
(define* pl-world-3d
@ -168,8 +185,8 @@
(define* pl-plot3d
(get-ffi-obj "c_plot3d" libplplot
(_fun
(x-values : (_list i _plflt))
(y-values : (_list i _plflt))
(x-values : (_list/still i _plflt))
(y-values : (_list/still i _plflt))
(z-values : (_matrix-of _plflt))
(nx : _int = (length x-values))
(ny : _int = (length y-values))
@ -180,8 +197,8 @@
(define* pl-mesh3d
(get-ffi-obj "c_plot3d" libplplot
(_fun
(x-values : (_list i _plflt))
(y-values : (_list i _plflt))
(x-values : (_list/still i _plflt))
(y-values : (_list/still i _plflt))
(z-values : (_matrix-of _plflt))
(nx : _int = (length x-values))
(ny : _int = (length y-values))
@ -193,8 +210,8 @@
; (get-ffi-obj "c_plpoin" libplplot
; (_fun
; (nx : _int = (length x-values))
; (x-values : (_list i _plflt))
; (y-values : (_list i _plflt))
; (x-values : (_list/still i _plflt))
; (y-values : (_list/still i _plflt))
; (code : _int))))
(define* pl-box3
@ -209,9 +226,9 @@
(get-ffi-obj "c_plline3" libplplot
(_fun
(n-points : _int = (length x-values))
(x-values : (_list i _plflt))
(y-values : (_list i _plflt))
(z-values : (_list i _plflt))
(x-values : (_list/still i _plflt))
(y-values : (_list/still i _plflt))
(z-values : (_list/still i _plflt))
-> _void)))
@ -219,10 +236,10 @@
(get-ffi-obj "c_plpoly3" libplplot
(_fun
(n-points : _int = (length x-values))
(x-values : (_list i _plflt))
(y-values : (_list i _plflt))
(z-values : (_list i _plflt))
(draw-mask : (_list i _int))
(x-values : (_list/still i _plflt))
(y-values : (_list/still i _plflt))
(z-values : (_list/still i _plflt))
(draw-mask : (_list/still i _int))
(direction : _int)
-> _void)))
@ -246,7 +263,7 @@
(t2 : _int = (PLcGrid-nx grid))
(t3 : _plint = 1)
(t4 : _int = (PLcGrid-ny grid))
(levels : (_list i _plflt))
(levels : (_list/still i _plflt))
(nlevels : _int = (length levels))
(pltr : _fpointer = (get-ffi-obj "pltr1" libplplot _fpointer))
(grid : _PLcGrid-pointer)
@ -270,7 +287,7 @@
(x_max : _plflt = 0)
(y_min : _plflt = 0)
(y_max : _plflt = 0)
(levels : (_list i _plflt))
(levels : (_list/still i _plflt))
(nlevels : _int = (length levels))
(fill_width : _int = 1)
(cont_col : _int = 1)
@ -299,23 +316,23 @@
(_fun
(itype : _plint)
(npts : _int = (length intencity))
(intencity : (_list i _plflt))
(coord1 : (_list i _plflt))
(coord2 : (_list i _plflt))
(coord3 : (_list i _plflt))
(intencity : (_list/still i _plflt))
(coord1 : (_list/still i _plflt))
(coord2 : (_list/still i _plflt))
(coord3 : (_list/still i _plflt))
(rev : _pointer = #f)
-> _void)))
(define pl-mesh3dc-int
(get-ffi-obj "c_plmeshc" libplplot
(_fun
(x-values : (_list i _plflt))
(y-values : (_list i _plflt))
(x-values : (_list/still i _plflt))
(y-values : (_list/still i _plflt))
(z-values : (_matrix-of _plflt))
(x-len : _int = (length x-values))
(y-len : _int = (length y-values))
(opts : _int)
(levels : (_list i _plflt))
(levels : (_list/still i _plflt))
(n-levels : _int = (length levels))
-> _void)))

View File

@ -67,9 +67,9 @@
(y-label "Y axis")
(title "")
(device 'dc)
(fgcolor '( 0 0 0))
(fgcolor '(0 0 0))
(bgcolor '(255 255 255))
(lncolor '(255 0 0 )))
(lncolor '(255 0 0)))
(define x-size 400)
(define y-size 300)
@ -120,13 +120,15 @@
(cond
[(eq? device 'dc)
(init-colors)
(pl-setup-page width height)
(pl-setup-page width height)
(pl-set-device "dc")
(let ([dev (pl-init-plot)])
(init-dev! dev (let ([dc (make-object bitmap-dc% bitmap)])
(send dc set-origin 0 height)
(send dc set-scale 1 -1)
(send dc set-smoothing 'aligned)
(send dc set-background (apply make-object color% bgcolor))
(send dc clear)
(new (class object%
(define/public (draw-line x1 y1 x2 y2)
(send dc draw-line x1 y1 x2 y2))
@ -137,7 +139,11 @@
(define/public (set-width n)
(send dc set-pen (send (send dc get-pen) get-color) n 'solid))
(define/public (set-index-color i)
(let ([color (make-object color% (symbol->string (car (list-ref colors i))))])
(let ([color (case i
[(0) (apply make-object color% bgcolor)]
[(1) (apply make-object color% fgcolor)]
[(15) (apply make-object color% lncolor)]
[else (make-object color% (symbol->string (car (list-ref colors i))))])])
(send dc set-pen color (send (send dc get-pen) get-width) 'solid)
(send dc set-brush color 'solid)))
(define/public (set-rgb-color r g b)
@ -148,7 +154,9 @@
(define/public (end-page) (void))
(define/public (end-doc)
(send dc set-bitmap #f))
(super-new))))))]
(super-new))))))
(set-line-color 'black)
(set-line-width 0)]
[else
(error "Incorrect device specified")]))
@ -157,6 +165,8 @@
(cond
[(eq? device 'dc)
(pl-finish-plot)
(when out-file
(send bitmap save-file out-file 'png))
(set-bitmap bitmap)]
[else
(error "Incorrect device specified")]))

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@ -3,7 +3,8 @@
exec gracket "$0" "$@"
|#
#lang scheme
(require plot file/md5 scheme/runtime-path)
(require plot file/md5 scheme/runtime-path
racket/draw)
(define-runtime-path here "./")
@ -18,14 +19,30 @@ exec gracket "$0" "$@"
[expected-file-name
(build-path here (string-append file-name ".png"))])
(plot args ... #:out-file result-file-name)
;; WILL COMPARE by MD5 hash.
(printf "testing \"~a\" ... " description)
(if (equal? (md5 (read-file result-file-name))
(md5 (read-file expected-file-name)))
(begin (display "passed\n") (delete-file result-file-name))
(printf "failed! expected results in ~a, plot produced results in ~a\n"
expected-file-name
result-file-name)))]))
(let* ([bm1 (read-bitmap result-file-name)]
[bm2 (read-bitmap expected-file-name)]
[w (send bm1 get-width)]
[h (send bm1 get-height)]
[s1 (make-bytes (* 4 w h))]
[s2 (make-bytes (* 4 w h))])
(send bm1 get-argb-pixels 0 0 w h s1)
(send bm2 get-argb-pixels 0 0 w h s2)
(if (and (= (send bm2 get-width) w)
(= (send bm2 get-width) h)
;; The generated and target images can be a little different,
;; but not much --- less than 1/255 difference average difference
;; over all RGB components (which is really pretty close)
((/ (for/fold ([diff 0]) ([i (in-range (* w h 4))])
(+ diff (abs (- (bytes-ref s1 i) (bytes-ref s2 i)))))
(* w h 4))
. <= .
1.0))
(begin (display "passed\n") (delete-file result-file-name))
(begin
(printf "failed! expected results in ~a, plot produced results in ~a\n"
expected-file-name
result-file-name)))))]))
(run-test "Line"
(plot (line (lambda (x) x) #:color 'red))

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 890 B

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 31 KiB