diff --git a/collects/racket/draw.rkt b/collects/racket/draw.rkt index 0ad58810ac..383075d37d 100644 --- a/collects/racket/draw.rkt +++ b/collects/racket/draw.rkt @@ -1,5 +1,8 @@ #lang racket/base -(require "draw/private/color.rkt" +(require racket/class + racket/contract/base + "draw/contracts.rkt" + "draw/private/color.rkt" "draw/private/point.rkt" "draw/private/font.rkt" "draw/private/font-dir.rkt" @@ -18,31 +21,37 @@ "draw/private/gl-config.rkt" "draw/private/gl-context.rkt") -(provide color% - color-database<%> the-color-database - point% - font% font-list% the-font-list make-font +(provide color-database<%> + the-color-database + font-list% the-font-list make-font font-name-directory<%> the-font-name-directory - pen% pen-list% the-pen-list - brush% brush-list% the-brush-list - linear-gradient% - radial-gradient% - region% - dc-path% + the-pen-list + the-brush-list dc<%> - bitmap-dc% record-dc% recorded-datum->procedure - post-script-dc% - pdf-dc% ps-setup% current-ps-setup - svg-dc% get-face-list get-family-builtin-face - gl-config% gl-context<%> - - bitmap% make-bitmap make-platform-bitmap read-bitmap make-monochrome-bitmap) + +(provide/contract [color% color%/c] + [point% point%/c] + [font% font%/c] + [pen% pen%/c] + [pen-list% pen-list%/c] + [brush% brush%/c] + [brush-list% brush-list%/c] + [bitmap-dc% bitmap-dc%/c] + [post-script-dc% post-script-dc%/c] + [pdf-dc% pdf-dc%/c] + [svg-dc% svg-dc%/c] + [linear-gradient% linear-gradient%/c] + [radial-gradient% radial-gradient%/c] + [region% region%/c] + [dc-path% dc-path%/c] + [gl-config% gl-config%/c] + [bitmap% bitmap%/c]) diff --git a/collects/racket/draw/contracts.rkt b/collects/racket/draw/contracts.rkt new file mode 100644 index 0000000000..3f2557e3af --- /dev/null +++ b/collects/racket/draw/contracts.rkt @@ -0,0 +1,517 @@ +#lang racket + +;; Contracts for racket/draw + +(require racket/class + "private/color.rkt" + "private/point.rkt" + "private/font.rkt" + "private/font-dir.rkt" + "private/pen.rkt" + "private/brush.rkt" + "private/gradient.rkt" + "private/region.rkt" + "private/bitmap.rkt" + "private/dc-path.rkt" + "private/dc-intf.rkt" + "private/bitmap-dc.rkt" + "private/post-script-dc.rkt" + "private/ps-setup.rkt" + "private/svg-dc.rkt" + "private/gl-config.rkt" + "private/gl-context.rkt") + +(provide (all-defined-out)) + +(define brush-style/c + (one-of/c 'transparent 'solid 'opaque + 'xor 'hilite 'panel + 'bdiagonal-hatch 'crossdiag-hatch + 'fdiagonal-hatch 'cross-hatch + 'horizontal-hatch 'vertical-hatch)) + +(define pen-cap-style/c + (one-of/c 'round 'projecting 'butt)) + +(define pen-join-style/c + (one-of/c 'round 'bevel 'miter)) + +(define pen-style/c + (one-of/c 'transparent 'solid 'xor 'hilite + 'dot 'long-dash 'short-dash 'dot-dash + 'xor-dot 'xor-long-dash 'xor-short-dash + 'xor-dot-dash)) + + +(define dc<%>/c + (class/c + [cache-font-metrics-key (->m exact-integer?)] + [clear (->m void?)] + [copy (->m real? real? + (and/c real? (not/c negative?)) + (and/c real? (not/c negative?)) + real? real? + void?)] + [draw-arc (->m real? real? + (and/c real? (not/c negative?)) + (and/c real? (not/c negative?)) + real? real? + void?)] + [draw-bitmap (->*m ((is-a?/c bitmap%) + real? real?) + ((one-of/c 'solid 'opaque 'xor) + (is-a?/c color%) + (or/c (is-a?/c bitmap%) #f)) + boolean?)] + [draw-bitmap-section (->*m ((is-a?/c bitmap%) + real? real? + real? real? + (and/c real? (not/c negative?)) + (and/c real? (not/c negative?))) + ((one-of/c 'solid 'opaque 'xor) + (is-a?/c color%) + (or/c (is-a?/c bitmap%) #f)) + boolean?)] + [draw-ellipse (->m real? real? + (and/c real? (not/c negative?)) + (and/c real? (not/c negative?)) + void?)] + [draw-line (->m real? real? + real? real? + void?)] + [draw-lines (->*m ((or/c (listof (is-a?/c point%)) + (listof (cons/c real? real?)))) + (real? real?) + void?)] + [draw-path (->*m ((is-a?/c dc-path%)) + (real? real? (one-of/c 'odd-even 'winding)) + void?)] + [draw-point (->m real? real? void?)] + [draw-polygon (->*m ((or/c (listof (is-a?/c point%)) + (listof (cons/c real? real?)))) + (real? real? (one-of/c 'odd-even 'winding)) + void?)] + [draw-rectangle (->m real? real? + (and/c real? (not/c negative?)) + (and/c real? (not/c negative?)) + void?)] + [draw-rounded-rectangle (->*m (real? real? + (and/c real? (not/c negative?)) + (and/c real? (not/c negative?))) + (real?) + void?)] + [draw-spline (->m real? real? real? + real? real? real? + void?)] + [draw-text (->*m (string? real? real?) + (any/c exact-nonnegative-integer? real?) + void?)] + [end-doc (->m void?)] + [end-page (->m void?)] + [erase (->m void?)] + [flush (->m void?)] + [get-alpha (->m real?)] + [get-background (->m (is-a?/c color%))] + [get-brush (->m (is-a?/c brush%))] + [get-char-height (->m (and/c real? (not/c negative?)))] + [get-char-width (->m (and/c real? (not/c negative?)))] + [get-clipping-region (->m (or/c (is-a?/c region%) #f))] + ;; Missing in this version, but fixed in master + ;[get-device-scale (->m (values (and/c real? (not/c negative?)) + ; (and/c real? (not/c negative?))))] + [get-font (->m (is-a?/c font%))] + [get-gl-context (->m (or/c (is-a?/c gl-context<%>) #f))] + [get-initial-matrix (->m (vector/c real? real? real? + real? real? real?))] + [get-origin (->m (values real? real?))] + [get-pen (->m (is-a?/c pen%))] + [get-rotation (->m real?)] + [get-scale (->m (values real? real?))] + [get-size (->m (values (and/c real? (not/c negative?)) + (and/c real? (not/c negative?))))] + [get-smoothing (->m (one-of/c 'unsmoothed 'smoothed 'aligned))] + [get-text-background (->m (is-a?/c color%))] + [get-text-extent (->*m (string?) + ((or/c (is-a?/c font%) #f) + any/c + exact-nonnegative-integer?) + (values + (and/c real? (not/c negative?)) + (and/c real? (not/c negative?)) + (and/c real? (not/c negative?)) + (and/c real? (not/c negative?))))] + [get-text-foreground (->m (is-a?/c color%))] + [get-text-mode (->m (one-of/c 'solid 'transparent))] + [get-transformation (->m (vector/c (vector/c real? real? real? + real? real? real?) + real? real? real? real? real?))] + [glyph-exists? (->m char? boolean?)] + [ok? (->m boolean?)] + [resume-flush (->m void?)] + [rotate (->m real? void?)] + [scale (->m real? real? void?)] + [set-alpha (->m real? void?)] + [set-background (->m (or/c (is-a?/c color%) string?) void?)] + [set-brush (case->m (-> (is-a?/c brush%) void?) + (-> (or/c (is-a?/c color%) string?) + brush-style/c + void?))] + [set-clipping-rect (->m real? real? + (and/c real? (not/c negative?)) + (and/c real? (not/c negative?)) + void?)] + [set-clipping-region (->m (or/c (is-a?/c region%) #f) void?)] + [set-font (->m (is-a?/c font%) void?)] + [set-initial-matrix (->m (vector/c real? real? real? + real? real? real?) + void?)] + [set-origin (->m real? real? void?)] + [set-pen (case->m (-> (is-a?/c pen%) void?) + (-> (or/c (is-a?/c color%) string?) + real? + pen-style/c + void?))] + [set-rotation (->m real? void?)] + [set-scale (->m real? real? void?)] + [set-smoothing (->m (one-of/c 'unsmoothed 'smoothed 'aligned) void?)] + [set-text-background (->m (or/c (is-a?/c color%) string?) void?)] + [set-text-foreground (->m (or/c (is-a?/c color%) string?) void?)] + [set-text-mode (->m (one-of/c 'solid 'transparent) void?)] + [set-transformation (->m (vector/c (vector/c real? real? real? + real? real? real?) + real? real? real? real? real?) + void?)] + [start-doc (->m string? void?)] + [start-page (->m void?)] + [suspend-flush (->m void?)] + [transform (->m (vector/c real? real? real? real? real? real?) + void?)] + [translate (->m real? real? void?)] + [try-color (->m (is-a?/c color%) (is-a?/c color%) void?)])) + +(define color%/c + (class/c + (red (->m (integer-in 0 255))) + (blue (->m (integer-in 0 255))) + (green (->m (integer-in 0 255))) + (copy-from (->m (is-a?/c color%) (is-a?/c color%))) + (ok? (->m boolean?)) + (set (->m (integer-in 0 255) + (integer-in 0 255) + (integer-in 0 255) + void?)))) + +(define point%/c + (class/c + (get-x (->m real?)) + (get-y (->m real?)) + (set-x (->m real? void?)) + (set-y (->m real? void?)))) + +(define font%/c + (class/c + (get-face (->m (or/c string? false/c))) + (get-family (->m (one-of/c 'default 'decorative 'roman 'script + 'swiss 'modern 'symbol 'system))) + (get-font-id (->m exact-integer?)) + (get-point-size (->m (integer-in 1 255))) + (get-size-in-pixels (->m boolean?)) + (get-smoothing (->m (one-of/c 'default 'partly-smoothed + 'smoothed 'unsmoothed))) + (get-style (->m (one-of/c 'normal 'italic 'slant))) + (get-underlined (->m boolean?)) + (get-weight (->m (one-of/c 'normal 'bold 'light))) + (screen-glyph-exists? (->*m (char?) (any/c) boolean?)))) + +(define pen%/c + (class/c + (get-cap (->m pen-cap-style/c)) + (get-color (->m (is-a?/c color%))) + (get-join (->m pen-join-style/c)) + (get-stipple (->m (or/c (is-a?/c bitmap%) false/c))) + (get-style (->m pen-style/c)) + (get-width (->m (real-in 0 255))) + (set-cap (->m pen-cap-style/c void?)) + (set-color (case->m + (-> (or/c (is-a?/c color%) string?) void?) + (-> (integer-in 0 255) + (integer-in 0 255) + (integer-in 0 255) + void?))) + (set-join (->m pen-join-style/c void?)) + (set-stipple (->m (or/c (is-a?/c bitmap%) false/c) void?)) + (set-style (->m pen-style/c void?)) + (set-width (->m (real-in 0 255) void?)))) + +(define pen-list%/c + (class/c + (find-or-create-pen + (->*m ((or/c (is-a?/c color%) string?) + real? + pen-style/c) + (pen-cap-style/c + pen-join-style/c) + (or/c (is-a?/c pen%) #f))))) + +(define brush%/c + (class/c + (get-color (->m (is-a?/c color%))) + (get-stipple (->m (or/c (is-a?/c bitmap%) false/c))) + (get-style (->m brush-style/c)) + (set-color (case->m + (-> (or/c (is-a?/c color%) string?) void?) + (-> (integer-in 0 255) + (integer-in 0 255) + (integer-in 0 255) + void?))) + (set-stipple (->m (or/c (is-a?/c bitmap%) false/c) void?)) + (set-style (->m brush-style/c void?)))) + +(define brush-list%/c + (class/c + (find-or-create-brush + (->m (or/c (is-a?/c color%) string?) + brush-style/c + (or/c (is-a?/c brush%) #f))))) + +(define linear-gradient%/c + (class/c + (init + [x0 real?] + [y0 real?] + [x1 real?] + [y1 real?] + [stops (listof (list/c real? (is-a?/c color%)))]) + [get-line (->m (values real? real? real? real?))] + [get-stops (->m (listof (list/c real? (is-a?/c color%))))])) + +(define radial-gradient%/c + (class/c + (init + [x0 real?] + [y0 real?] + [r0 real?] + [x1 real?] + [y1 real?] + [r1 real?] + [stops (listof (list/c real? (is-a?/c color%)))]) + [get-circles (->m (values real? real? real? real? real? real?))] + [get-stops (->m (listof (list/c real? (is-a?/c color%))))])) + +(define bitmap-dc%/c + (and/c dc<%>/c + (class/c + (init [bitmap (or/c (is-a?/c bitmap%) #f)]) + [draw-bitmap-section-smooth + (->m (is-a?/c bitmap%) + real? real? + (and/c real? (not/c negative?)) + (and/c real? (not/c negative?)) + real? real? + (and/c real? (not/c negative?)) + (and/c real? (not/c negative?)) + (or/c (is-a?/c bitmap%) #f) + boolean?)] + [get-argb-pixels + (->*m (real? real? + exact-nonnegative-integer? + exact-nonnegative-integer? + (and/c bytes? (not/c immutable?))) + (any/c) + void?)] + [get-bitmap (->m (or/c (is-a?/c bitmap%) #f))] + [get-pixel (->m real? real? (is-a?/c color%) boolean?)] + [set-argb-pixels + (->*m (real? real? + exact-nonnegative-integer? + exact-nonnegative-integer? + bytes?) + (any/c) + void?)] + [set-bitmap (->m (or/c (is-a?/c bitmap%) #f) void?)] + [set-pixel (->m real? real? (is-a?/c color%) void?)]))) + +(define post-script-dc%/c + (and/c dc<%>/c + (class/c + (init [interactive any/c] + ;; this doesn't work due to a cyclic dependency + ;[parent (or/c (is-a?/c frame%) (is-a?/c dialog%) #f)] + [use-paper-bbox any/c] + [as-eps any/c] + [width (or/c (and/c real? (not/c negative?)) #f)] + [height (or/c (and/c real? (not/c negative?)) #f)] + [output (or/c path-string? output-port? #f)])))) + +(define pdf-dc%/c + (and/c dc<%>/c + (class/c + (init [interactive any/c] + ;; see above + ;[parent (or/c (is-a?/c frame%) (is-a?/c dialog%) #f)] + [use-paper-bbox any/c] + [as-eps any/c] + [width (or/c (and/c real? (not/c negative?)) #f)] + [height (or/c (and/c real? (not/c negative?)) #f)] + [output (or/c path-string? output-port? #f)])))) + +(define svg-dc%/c + (and/c dc<%>/c + (class/c + (init [width (or/c (and/c real? (not/c negative?)) #f)] + [height (or/c (and/c real? (not/c negative?)) #f)] + [output (or/c path-string? output-port? #f)] + [exists (or/c 'error 'append 'update 'can-update + 'replace 'truncate + 'must-truncate 'truncate/replace)])))) + +(define record-dc%/c + (and/c dc<%>/c + (class/c + (init [width (>=/c 0)] + [height (>=/c 0)]) + [get-recorded-datum (->m any/c)] + [get-recorded-procedure (->m ((is-a?/c dc<%>) . -> . void?))]))) + +(define region%/c + (class/c + (init [dc (or/c (is-a?/c dc<%>) #f)]) + (get-bounding-box (->m (values real? real? real? real?))) + (get-dc (->m (is-a?/c dc<%>))) + (in-region? (->m real? real? boolean?)) + (intersect (->m (is-a?/c region%) void?)) + (is-empty? (->m boolean?)) + (set-arc (->m real? + real? + (and/c real? (not/c negative?)) + (and/c real? (not/c negative?)) + real? + real? + void?)) + (set-ellipse (->m real? + real? + (and/c real? (not/c negative?)) + (and/c real? (not/c negative?)) + void?)) + (set-path (->*m ((is-a?/c dc-path%)) + (real? + real? + (one-of/c 'odd-even 'winding)) + void?)) + (set-polygon (->*m ((listof (is-a?/c point%))) + (real? + real? + (one-of/c 'odd-even 'winding)) + void?)) + (set-rectangle (->m real? + real? + (and/c real? (not/c negative?)) + (and/c real? (not/c negative?)) + void?)) + (set-rounded-rectangle (->*m (real? + real? + (and/c real? (not/c negative?)) + (and/c real? (not/c negative?))) + (real?) + void?)) + (subtract (->m (is-a?/c region%) void?)) + (union (->m (is-a?/c region%) void?)) + (xor (->m (is-a?/c region%) void?)))) + +(define dc-path%/c + (class/c + (append (->m (is-a?/c dc-path%) void?)) + (arc (->*m (real? + real? + (and/c real? (not/c negative?)) + (and/c real? (not/c negative?)) + real? + real?) + (any/c) + void?)) + (close (->m void?)) + (curve-to (->m real? real? real? real? real? real? void?)) + (ellipse (->m real? + real? + (and/c real? (not/c negative?)) + (and/c real? (not/c negative?)) + void?)) + (get-bounding-box (->m (values real? real? real? real?))) + (line-to (->m real? real? void?)) + (lines (->*m ((listof (is-a?/c point%))) + (real? real?) + void?)) + (move-to (->m real? real? void?)) + (open? (->m boolean?)) + (rectangle (->m real? + real? + (and/c real? (not/c negative?)) + (and/c real? (not/c negative?)) + void?)) + (reset (->m void?)) + (reverse (->m void?)) + (rotate (->m real? void?)) + (rounded-rectangle (->*m (real? + real? + (and/c real? (not/c negative?)) + (and/c real? (not/c negative?))) + (real?) + void?)) + (scale (->m real? real? void?)) + (translate (->m real? real? void?)))) + +(define gl-config%/c + (class/c + (get-accum-size (->m (integer-in 0 256))) + (get-depth-size (->m (integer-in 0 256))) + (get-double-buffered (->m boolean?)) + (get-multisample-size (->m (integer-in 0 256))) + (get-stencil-size (->m (integer-in 0 256))) + (get-stereo (->m boolean?)) + (set-accum-size (->m (integer-in 0 256) void?)) + (set-depth-size (->m (integer-in 0 256) void?)) + (set-double-buffered (->m any/c void?)) + (set-multisample-size (->m (integer-in 0 256) void?)) + (set-stencil-size (->m (integer-in 0 256) void?)) + (set-stereo (->m any/c void?)))) + +(define bitmap%/c + (class/c + (get-argb-pixels (->*m + (real? + real? + exact-nonnegative-integer? + exact-nonnegative-integer? + (and/c bytes? (not/c immutable?))) + (any/c any/c) + void?)) + (get-depth (->m exact-nonnegative-integer?)) + (get-height (->m exact-nonnegative-integer?)) + (get-loaded-mask (->m (or/c (is-a?/c bitmap%) false/c))) + (get-width (->m exact-nonnegative-integer?)) + (has-alpha-channel? (->m boolean?)) + (is-color? (->m boolean?)) + (load-file (->*m ((or/c path-string? input-port?)) + ((one-of/c 'unknown 'unknown/mask 'unknown/alpha + 'gif 'gif/mask 'gif/alpha + 'jpeg 'jpeg/alpha + 'png 'png/mask 'png/alpha + 'xbm 'xbm/alpha 'xpm 'xpm/alpha + 'bmp 'bmp/alpha) + (or/c (is-a?/c color%) false/c) + any/c) + boolean?)) + (ok? (->m boolean?)) + (save-file (->*m ((or/c path-string? output-port?) + (one-of/c 'png 'jpeg 'xbm 'xpm 'bmp)) + ((integer-in 0 100)) + boolean?)) + (set-argb-pixels (->*m + (real? + real? + exact-nonnegative-integer? + exact-nonnegative-integer? + bytes?) + (any/c any/c) + void?)) + (set-loaded-mask (->m (is-a?/c bitmap%) void?))))