[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Graphics to Bitmaps
The task of the week is to perform simple bitmap-driven animation on the Symbolics.
A standard way to do this is to have a bitmap buffer, draw graphics and bitblt
bitmap patches into the buffer, and then bitblt the buffer to the screen.
This requires the ability to draw graphics onto a bit array. The function
(tv:with-output-to-bitmap (dummy-stream) body-using-dummy-stream) allocates
and returns its own bitmap. The documentation for a different function,
(tv:with-output-to-bitmap-stream (bitmap-stream) body-using-bitmap-stream),
says that bitmap-stream is "A stream that is a raster array intended to hold
the image generated by body." Thus the sequence
(setq my-array (graphics:make-raster-array-with-correct-width my-width my-height
:element-type '(unsigned-byte 1)))
...
(tv:with-output-to-bitmap-stream (my-array)
(graphics:draw-circle 10 10 5 :stream my-array))
was expected to produce the right behavior. It didn't. Apparently
tv:with-output-to-bitmap-stream also insists on allocating its own array.
What is the right sequence to do what I want to do? The current
work-around is to accept the new array from tv:with-output-to-bitmap
and then bitblt copy it into my personal array buffer (instead of
drawing the graphics there directly). This is inefficient.
Assuming I can draw graphics directly into a bitmap, do the graphics
clip to the edges of the bitmap automatically?
The manual recommends (tv:make-sheet-bit-array) for allocating arrays.
(tv:make-sheet-bit-array *standard-output* 10 10) barfs with "<stream>
not an instance". What's the difference between a sheet-bit-array and
a regular bit-array--is one faster? make-raster-array-with-correct-width
seems to work O.K. now--can I improve its speed by shifting to "sheet arrays"?
Currently I do output with (send my-window :bitblt tv:alu-seta width height
my-bitmap 0 0 target-x target-y). There is also the plain (bitblt) function,
some kind of ":draw-1-bit-raster" method, and the (graphics:draw-image)
function. What do most people use for fast, vanilla b&w output to a screen?
Bonus problem: How to draw a bitmap at your current place in a Lisp Listener.
(graphics:wih-room-for-graphics (stream)
(graphics:with-graphics-scale (stream 1.0 -1.0)
(graphics:draw-image my-bitmap 0 0 :stream stream)))
almost works but runs into the infamous "ha ha, you left the cursor up
at the top of with-room-for-graphics" problem, it prints a white line and
wipes out part of the bitmap. I forget the magic to take care of this.
Is there a clean way around it or a cleaner way of doing it?
Any and all help appreciated,
John Myers myers@atr-la.atr.co.jp