[ab] Feature suggestion -- support subsurface blitting
Anthony Fairchild
anthonyf at blarg.net
Sat Mar 17 00:42:40 CST 2007
Hello again,
I finally got back to working on my lispy jigsaw puzzle game and I've made a
few changes to the code to clean things up and make it more manageable. In
the first implementation I made a new surface for every puzzle piece and
rotation. This generated a very large number of surfaces. The cleaner
solution involves using a single surface containing an image array of each
puzzle piece. See this link for an example:
http://img395.imageshack.us/my.php?image=leaveshb1.png
To blit the images on the screen I have to use SDL-BASE::BLIT-SURFACE
because it take a source and destination rectangle. I created my own
blitting function to wrap the low level foreign pointer stuff, and it
initially looked like this:
(defun blit (src dst sx sy dx dy w h)
(sdl-base::blit-surface (sdl:fp src) (sdl:fp dst)
(sdl:fp (sdl:rectangle :x sx :y sy
:w w :h h))
(sdl:fp (sdl:rectangle
:x dx :y dy
:w w :h h))))
But this function is very slow because calling SDL:RECTANGLE conses a lot,
so much that the GC was kicking in during my paints!. To fix it I had to
create some global variables to hold reusable rectangles. Here's the ugly
fast code:
;; Use these globals to hold reusable rectangles for BLIT-FAST to
;; avoid consing. This is ugly and not thread safe. Is there a better
;; way to do this??
(defparameter *blit-r-src* (sdl:rectangle :x 0 :y 0 :w 0 :h 0))
(defparameter *blit-r-dst* (sdl:rectangle :x 0 :y 0 :w 0 :h 0))
(defun blit-fast (src dst sx sy dx dy w h)
(setf (sdl:x *blit-r-src*) sx)(setf (sdl:y *blit-r-src*) sy)
(setf (sdl:width *blit-r-src*) w)(setf (sdl:height *blit-r-src*) h)
(setf (sdl:x *blit-r-dst*) dx)(setf (sdl:y *blit-r-dst*) dy)
(setf (sdl:width *blit-r-dst*) w)(setf (sdl:height *blit-r-dst*) h)
(sdl-base::blit-surface (sdl:fp src) (sdl:fp dst)
(sdl:fp *blit-r-src*)
(sdl:fp *blit-r-dst*)))
It seems like there is a better way of doing that. Any suggestions? Also,
I would like to propose another DRAW-SURFACE-* type function which takes a
source rectangle (or position) as well as the destination rectangle.
Thoughts?
Thanks,
Anthony
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.lispniks.com/pipermail/application-builder/attachments/20070316/93ce589b/attachment.html
More information about the application-builder
mailing list