(in-package :clim-user)
(defun t1 () ;; works same on mcclim and lw (let* ((a (make-translation-transformation 10 10)) (b (make-scaling-transformation 2 2))) (multiple-value-bind (x y) ;; Spec says; ;; b (scaling) first, then a (translation) (transform-position (compose-transformations a b) 1 1)) (format t "T1 => ~a ~a~%" x y) (assert (= 12 x y))))
(defun t2 () ;; LW CLIM gives (values 12 12), McCLIM gives (values 22 22) ?? (let ((a (compose-transformation-with-translation ;; Spec says; ;; transformation (scaling) first, then translation (make-scaling-transformation 2 2) 10 10))) (multiple-value-bind (x y)(transform-position a 1 1) (format t "T2 => ~a ~a~%" x y) (assert (= 12 x y)))))
#+bugged-McCLIM definition ;;; oops, order is reversed! (defun compose-transformation-with-translation (transformation dx dy) (compose-transformations transformation (make-translation-transformation dx dy)))
;;;;; Proposed fixes
#+McCLIM (progn (defun compose-translation-with-transformation (transformation dx dy) (compose-transformations transformation (make-translation-transformation dx dy)))
(defun compose-scaling-with-transformation (transformation sx sy &optional origin) (compose-transformations transformation (make-scaling-transformation sx sy origin)))
(defun compose-rotation-with-transformation (transformation angle &optional origin) (compose-transformations transformation (make-rotation-transformation angle origin)))
(defun compose-transformation-with-translation (transformation dx dy) (compose-transformations (make-translation-transformation dx dy) transformation))
(defun compose-transformation-with-scaling (transformation sx sy &optional origin) (compose-transformations (make-scaling-transformation sx sy origin) transformation))
(defun compose-transformation-with-rotation (transformation angle &optional origin) (compose-transformations (make-rotation-transformation angle origin) transformation)) ) ;;;;