[cl-cairo2-devel] patch for image-surface-get-data
Tamas K Papp
tpapp at Princeton.EDU
Wed May 28 01:36:23 UTC 2008
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))
> + (error "Could not find ~a in ~a." enum table))
> cairo-enum))
> 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 at common-lisp.net
> http://common-lisp.net/cgi-bin/mailman/listinfo/cl-cairo2-devel
More information about the Cl-cairo2-devel
mailing list