X-Git-Url: https://git.distorted.org.uk/~mdw/clg/blobdiff_plain/e4251a293459eb4ffaf4b943df01155d39cfa9ea..e7f1852fd2ddecf0fe99df30c3fd1f8a90c13607:/gdk/gdk.lisp diff --git a/gdk/gdk.lisp b/gdk/gdk.lisp index 04467b1..cc1af87 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.25 2006-04-11 18:28:38 espen Exp $ (in-package "GDK") @@ -503,13 +503,24 @@ ;;; 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-allocated-memory (location #.(foreign-size (find-class 'color))) + (%color-copy location))) + (defun %scale-value (value) (etypecase value (integer value) (float (truncate (* value 65535))))) (defmethod initialize-instance ((color color) &rest initargs - &key red green blue) + &key (red 0.0) (green 0.0) (blue 0.0)) (declare (ignore initargs)) (call-next-method) (with-slots ((%red red) (%green green) (%blue blue)) color @@ -518,15 +529,25 @@ %green (%scale-value green) %blue (%scale-value blue)))) +(defbinding %color-parse () boolean + (spec string) + (color color :return)) + +(defun color-parse (spec &optional (color (make-instance 'color))) + (multiple-value-bind (succeeded-p color) (%color-parse spec color) + (if succeeded-p + color + (error "Parsing color specification ~S failed." spec)))) + (defun ensure-color (color) (etypecase color (null nil) (color color) + (string (color-parse 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))))) + ;;; Drawable