Hi Johann,
Thanks, I applied your patch. It is now committed to the repository.
I think that the change to keywords you suggested is very sensible, and I will do it as soon as I have the time. I will be travelling until Tuesday though, so that is the earliest I can do it. In the meantime, if you feel you would like to do it and submit a patch, that would be very welcome.
Best,
Tamas
On Wed, May 28, 2008 at 01:58:55AM +0200, Johann Korndoerfer wrote:
hello
included is a diff for extending cl-cairo2 to support extracting pixel data (as a 1d array) from image surfaces via image-surface-get-data. it also fixes a minor glitch concerning error messages thrown when a symbol was not found in a table.
i also noticed something like (cl-cairo2:create-image-surface 'format-argb32 23 42)) will not work (complaining about not finding the symbol) since the symbol cl-user:format-argb32 obviously is not the same as cl:cairo2:format-argb32.
i therefore suggest using keyword symbols for the right halves of the tables as well if there is no reason to do otherwise.
johann
Index: tables.lisp
--- tables.lisp (revision 19) +++ tables.lisp (working copy) @@ -112,5 +112,5 @@ (defun lookup-enum (enum table) (let ((cairo-enum (car (rassoc enum table)))) (unless cairo-enum
(error "Could not find ~a in ~a." cairo-enum table))
cairo-enum))(error "Could not find ~a in ~a." enum table))
Index: surface.lisp
--- surface.lisp (revision 19) +++ surface.lisp (working copy) @@ -113,6 +113,25 @@ width height) width height t))
+(defun get-bytes-per-pixel (format)
- (case format
- (format-argb32 4)
- (format-rgb24 3)
- (format-a8 1)
- (otherwise (error (format nil "unknown format: ~a" format))))) ;todo: how does format-a1 fit in here?
+(defun image-surface-get-data (surface)
- (with-surface (surface pointer)
- (let* ((width (image-surface-get-width surface))
(height (image-surface-get-height surface))
(bytes-per-pixel (get-bytes-per-pixel (image-surface-get-format surface)))
(buffer (make-array (* width height bytes-per-pixel) :element-type '(unsigned-byte 8) :fill-pointer 0))
(data (cairo_image_surface_get_data pointer)))
(loop for i from 0 below (* width height bytes-per-pixel) do
(vector-push-extend (cffi:mem-ref data :uint8 i) buffer))
buffer)))
(defun image-surface-get-format (surface) (with-surface (surface pointer) (lookup-cairo-enum (cairo_image_surface_get_format pointer) table-format))) Index: package.lisp =================================================================== --- package.lisp (revision 19) +++ package.lisp (working copy) @@ -14,6 +14,7 @@ destroy create-ps-surface create-pdf-surface create-svg-surface create-image-surface image-surface-get-format image-surface-get-width image-surface-get-height
image-surface-get-data image-surface-create-from-png surface-write-to-png
;; context
cl-cairo2-devel mailing list cl-cairo2-devel@common-lisp.net http://common-lisp.net/cgi-bin/mailman/listinfo/cl-cairo2-devel