Hello,
Selon Vladimir Sedach sedachv@cpsc.ucalgary.ca:
I've written a bit of code to shuffle between IMAGO images and SDL surfaces. It should be fast enough to do manipulations on small sprites in real-time on a reasonably fast machine.
Nice!
(defun convert-to-image (surface) "Given a 24 or 32-bit depth SDL surface, returns an IMAGO RGB image of the same width and height and RGB pixel contents." (assert (or (= 24 (sdl:pixel-format-bits-per-pixel (sdl:surface-format surface))) (= 32 (sdl:pixel-format-bits-per-pixel (sdl:surface-format surface))))) (let* ((width (sdl:surface-w surface)) (height (sdl:surface-h surface)) (image (make-instance 'imago:rgb-image :width width :height height)) (image-array (imago:image-pixels image))) ;; Note that on 32 bit machines, width and height are 32 bit ints (declare (type fixnum width height) (type (simple-array (unsigned-byte 32) (* *)) image-array)) (with-surface-lock surface (dotimes (y height) (declare (type fixnum y)) (dotimes (x width) (declare (type fixnum x)) (setf (aref image-array y x) (sdl:get-pixel surface x y))))) image))
A little note: using the IMAGO:DO-IMAGE-PIXELS macro could make the code a little bit more abstract as well as more efficient. Here is what the body of that function would look like:
(defun convert-to-image (surface) (let ((image (make-instance 'imago:rgb-image :width (sdl:surface-w surface) :height (sdl:surface-h surface)))) (with-surface-lock surface (imago:do-image-pixels (image pixel x y) (setf pixel (sdl:get-pixel surface x y))))) image))
-- Matthieu Villeneuve