From: espen Date: Mon, 10 Apr 2006 18:27:58 +0000 (+0000) Subject: Bug fixes and enhancements to the color type X-Git-Tag: clg-0-92-1~9 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/clg/commitdiff_plain/2e10ba8b62e9a1683282f97cc233702b4e13cb77 Bug fixes and enhancements to the color type --- diff --git a/gdk/gdk.lisp b/gdk/gdk.lisp index 3425d11..5012e40 100644 --- a/gdk/gdk.lisp +++ b/gdk/gdk.lisp @@ -20,7 +20,7 @@ ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -;; $Id: gdk.lisp,v 1.22 2006/02/26 15:09:44 espen Exp $ +;; $Id: gdk.lisp,v 1.23 2006/04/10 18:27:58 espen Exp $ (in-package "GDK") @@ -503,6 +503,17 @@ (defun pixmap-create (source &key color window colormap) ;;; Color +(defbinding %color-copy () pointer + (location pointer)) + +(defmethod allocate-foreign ((color color) &rest initargs) + (declare (ignore color initargs)) + ;; Color structs are allocated as memory chunks by gdk, and since + ;; there is no gdk_color_new we have to use this hack to get a new + ;; color chunk + (with-memory (location #.(foreign-size (find-class 'color))) + (%color-copy location))) + (defun %scale-value (value) (etypecase value (integer value) @@ -518,14 +529,22 @@ (defmethod initialize-instance ((color color) &rest initargs %green (%scale-value green) %blue (%scale-value blue)))) +(defbinding color-parse (spec &optional (make-instance 'color)) boolean + (spec string) + (color color :in/return)) + (defun ensure-color (color) (etypecase color (null nil) (color color) (vector - (make-instance - 'color :red (svref color 0) :green (svref color 1) - :blue (svref color 2))))) + (make-instance 'color + :red (svref color 0) :green (svref color 1) :blue (svref color 2))) + (string + (multiple-value-bind (succeeded-p color) (parse-color color) + (if succeeded-p + color + (error "Parsing color specification ~S failed." color))))))