diff --git a/collects/mrlib/gif.ss b/collects/mrlib/gif.ss index 215255b5..7c6f323e 100644 --- a/collects/mrlib/gif.ss +++ b/collects/mrlib/gif.ss @@ -17,7 +17,7 @@ (cons (subbytes b offset (+ offset len)) (split-bytes b len (+ offset len))))) - (define (write-gifs bms delay filename one-at-a-time? last-frame-delay) + (define (write-gifs bms delay filename one-at-a-time? last-frame-delay loop?) (let* ([init (force-bm (car bms))] [w (send init get-width)] [h (send init get-height)]) @@ -38,7 +38,7 @@ filename (lambda (p) (let* ([gif (gif-start p w h 0 #f)]) - (when delay + (when loop? (gif-add-loop-control gif 0)) (let ([last-argb-thunk (last argb-thunks)]) (for-each (lambda (argb-thunk) @@ -74,11 +74,12 @@ (gif-end gif))))))))) (define (write-gif bm filename) - (write-gifs (list bm) #f filename #f #f)) + (write-gifs (list bm) #f filename #f #f #f)) (define (write-animated-gif bms delay filename #:one-at-a-time? [one-at-a-time? #f] - #:last-frame-delay [last-frame-delay #f]) - (write-gifs bms delay filename one-at-a-time? last-frame-delay)) + #:last-frame-delay [last-frame-delay #f] + #:loop? [loop? (and delay #t)]) + (write-gifs bms delay filename one-at-a-time? last-frame-delay loop?)) ) diff --git a/collects/mrlib/scribblings/gif.scrbl b/collects/mrlib/scribblings/gif.scrbl index db5ed168..0b4916ed 100644 --- a/collects/mrlib/scribblings/gif.scrbl +++ b/collects/mrlib/scribblings/gif.scrbl @@ -25,31 +25,34 @@ transparent pixels in the generated GIF image.} (-> (is-a?/c bitmap%))))] [delay-csec (integer-in 0 #xFFFFFFFF)] [filename path-string] + [#:loop loop? any/c (and delay-csec #t)] [#:one-at-a-time? one-at-a-time? any/c #f] [#:last-frame-delay last-frame-delay (or/c (integer-in 0 #xFFFFFFFF) false/c) #f]) void?]{ -Writes the bitmaps in @scheme[bitmap-list] to @scheme[filename] as an -animated GIF. The @scheme[bitmap-list] list can contain a mixture of +Writes the bitmaps in @scheme[bitmaps] to @scheme[filename] as an +animated GIF. The @scheme[bitmaps] list can contain a mixture of @scheme[bitmap%] objects and thunks (each called just once) that produce @scheme[bitmap%] objects. The @scheme[delay-csec] argument is the amount of time in 1/100s of a second to wait between transitions. +If @scheme[loop?] is a true value, then the GIF is marked as a looping +animation. If @scheme[one-at-a-time?] is @scheme[#f], then the content of all images is collected and quantized at once, to produce a single colortable; a drawback to this approach is that it uses more memory, and it allows less color variation among animation frames. Even when @scheme[one-at-a-time?] is @scheme[#f], the result of each thunk in -@scheme[bitmap-list] is converted to a byte-string one at a time +@scheme[bitmaps] is converted to a byte-string one at a time (which helps avoid bitmap-count limits under Windows). If @scheme[one-at-a-time?] is true, then the bitmaps are quantized and written to the file one at a time; that is, for each thunk in -@scheme[bitmap-list], its result is written and discarded before -another thunk is called. A drawback to this approach is that a -separate colortable is written for each frame in the animation, which -can make the resulting file large. +@scheme[bitmaps], its result is written and discarded before another +thunk is called. A drawback to this approach is that a separate +colortable is written for each frame in the animation, which can make +the resulting file large. If @scheme[last-frame-delay] is not false, a delay of -@scheme[last-frame-delay] (in 1/100s of a second) will be added to the -last frame.} \ No newline at end of file +@scheme[last-frame-delay] (in 1/100s of a second) is added to the last +frame. This extra delay is useful when @scheme[loop?] is true.}