#lang typed-scheme
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; gif.ss
;; typed-scheme wrapper on file/gif
;; yc 2009/2/25
;; licensed in LGPL, the same license as PLT Scheme itself.

(define-type-alias Path-String (U Path String))

(require/opaque-type Argb-Bytes argb-bytes? file/gif)
(require/opaque-type Gif-Stream gif-stream? file/gif)
(require/opaque-type Image-Ready-Gif-Stream image-ready-gif-stream? file/gif)
(require/opaque-type Image-Or-Control-Ready-Gif-Stream image-or-control-ready-gif-stream? file/gif)
(require/opaque-type Empty-Gif-Stream empty-gif-stream? file/gif)
(require/opaque-type Gif-Colormap gif-colormap? file/gif)
(require/opaque-type Color color? file/gif)
(require/opaque-type Dimension dimension? file/gif)

(require/typed file/gif
               (gif-state (Gif-Stream -> Any))
               (gif-start (Output-Port Dimension Dimension Color (Option Gif-Colormap) -> Gif-Stream))
               (gif-add-image (Image-Ready-Gif-Stream
                               Dimension
                               Dimension
                               Dimension
                               Dimension
                               Any
                               (Option Gif-Colormap)
                               Bytes
                               ->
                               Void))
               (gif-add-control (Image-Or-Control-Ready-Gif-Stream
                                 (U 'any 'keep 'restore-bg 'restore-prev)
                                 Any
                                 Dimension
                                 (Option Color)
                                 ->
                                 Void))
               (gif-add-loop-control (Empty-Gif-Stream
                                      Dimension
                                      ->
                                      Void))
               (gif-add-comment (Image-Or-Control-Ready-Gif-Stream
                                 Bytes
                                 ->
                                 Void))
               (gif-end (Image-Or-Control-Ready-Gif-Stream -> Void))
               (quantize (Argb-Bytes -> (values Bytes Gif-Colormap (Option Color))))
               )

(provide gif-stream?
         image-ready-gif-stream?
         image-or-control-ready-gif-stream?
         empty-gif-stream?
         gif-colormap?
         color?
         dimension?
         gif-state
         gif-start
         gif-add-image
         gif-add-control
         gif-add-loop-control
         argb-bytes?
         quantize
         )