Index: vg-test.scm
==================================================================
--- vg-test.scm
+++ vg-test.scm
@@ -4,23 +4,24 @@
 (load "vg.scm")
 
 (define d1 (vg:drawing-new))
 (define l1 (vg:lib-new))
 (define c1 (vg:comp-new))
-(let ((r1 (vg:make-rect 10 10 100 80))
-      (r2 (vg:make-rect 100 80 190 150)))
+(let ((r1 (vg:make-rect 20 20 40 40))
+      (r2 (vg:make-rect 40 40 80 80)))
   (vg:add-objs-to-comp c1 r1 r2))
 
 ;; add the c1 component to lib l1 with name firstcomp
 (vg:add-comp-to-lib l1 "firstcomp" c1)
 
 ;; add the l1 lib to drawing with name firstlib
 (vg:add-lib d1 "firstlib" l1)
 
 ;; instantiate firstlib/firstcomp as inst1 in drawing d1 at 0,0
-(vg:instantiate d1 "firstlib" "firstcomp" "inst1" 0 0 0)
-(vg:instantiate d1 "firstlib" "firstcomp" "inst2" 200 200 0)
+(vg:instantiate d1 "firstlib" "firstcomp" "inst1" 0 0)
+(vg:instantiate d1 "firstlib" "firstcomp" "inst2" 200 200)
+;; (vg:drawing-scalex-set! d1 2)
 
 (define cnv #f)
 (define the-cnv (canvas 
 		 #:size "500x400"
 		 #:expand "YES"

Index: vg.scm
==================================================================
--- vg.scm
+++ vg.scm
@@ -18,12 +18,12 @@
 ;; structs
 ;;
 (defstruct vg:lib     comps)
 (defstruct vg:comp    objs name file)
 (defstruct vg:obj     type pts fill-color text line-color call-back font)
-(defstruct vg:inst    libname compname theta xoff yoff scalex scaley mirrx mirry call-back)
-(defstruct vg:drawing libs insts scalex scaley xoff yoff cnv) ;; libs: hash of name->lib, insts: hash of instname->inst
+(defstruct vg:inst    libname compname theta xoff yoff scalex scaley mirrx mirry call-back cache)
+(defstruct vg:drawing libs insts scalex scaley xoff yoff cnv cache) ;; libs: hash of name->lib, insts: hash of instname->inst
 
 ;; inits
 ;;
 (define (vg:comp-new)
   (make-vg:comp objs: '() name: #f file: #f))
@@ -30,18 +30,25 @@
 
 (define (vg:lib-new)
   (make-vg:lib comps: (make-hash-table)))
 
 (define (vg:drawing-new)
-  (make-vg:drawing scalex: 1 scaley: 1 xoff: 0 yoff: 0 libs: (make-hash-table) insts: (make-hash-table)))
+  (make-vg:drawing scalex: 1 
+		   scaley: 1 
+		   xoff: 0 
+		   yoff: 0 
+		   libs: (make-hash-table) 
+		   insts: (make-hash-table)
+		   cache: '()))
 
 ;;======================================================================
 ;; scaling and offsets
 ;;======================================================================
 
 (define-inline (vg:scale-offset val s o)
   (+ o (* val s)))
+  ;; (* (+ o val) s))
 
 ;; apply scale and offset to a list of x y values
 ;;
 (define (vg:scale-offset-xy lstxy sx sy ox oy)
   (if (> (length lstxy) 1) ;; have at least one xy pair
@@ -78,13 +85,17 @@
    (vg:inst-yoff   inst)))
 
 ;; apply both drawing and instance scaling to a list of xy points
 ;; 
 (define (vg:drawing-inst-apply-scale-offset drawing inst lstxy)
-  (vg:inst-apply-scale 
-   inst
-   (vg:drawing-apply-scale drawing lstxy)))
+  (vg:drawing-apply-scale 
+   drawing
+   (vg:inst-apply-scale inst lstxy)))
+
+;;   (vg:inst-apply-scale 
+;;    inst
+;;    (vg:drawing-apply-scale drawing lstxy)))
 
 ;; make a rectangle obj
 ;;
 (define (vg:make-rect x1 y1 x2 y2 #!key (line-color #f)(fill-color #f))
   (make-vg:obj type: 'r pts: (list x1 y1 x2 y2) text: #f line-color: line-color fill-color: fill-color))
@@ -118,12 +129,12 @@
 (define (vg:add-comp-to-lib lib compname comp)
   (hash-table-set! (vg:lib-comps lib) compname comp))
 
 ;; instanciate component in drawing
 ;;
-(define (vg:instantiate drawing libname compname instname xoff yoff t #!key (scalex 1)(scaley 1)(mirrx #f)(mirry #f))
-  (let ((inst (make-vg:inst libname: libname compname: compname xoff: xoff yoff: yoff theta: t scalex: scalex scaley: scaley mirrx: mirrx mirry: mirry)) )
+(define (vg:instantiate drawing libname compname instname xoff yoff #!key (theta 0)(scalex 1)(scaley 1)(mirrx #f)(mirry #f))
+  (let ((inst (make-vg:inst libname: libname compname: compname xoff: xoff yoff: yoff theta: theta scalex: scalex scaley: scaley mirrx: mirrx mirry: mirry)) )
     (hash-table-set! (vg:drawing-insts drawing) instname inst)))
 
 ;; get component from drawing (look in apropriate lib) given libname and compname
 (define (vg:get-component drawing libname compname)
   (let* ((lib  (hash-table-ref (vg:drawing-libs drawing) libname))
@@ -191,10 +202,11 @@
 			  text:       (vg:obj-text       obj)
 			  line-color: (vg:obj-line-color obj)
 			  font:       (vg:obj-font       obj)))
 	(pts (vg:obj-pts obj)))
     (vg:obj-pts-set! res (vg:drawing-inst-apply-scale-offset drawing inst pts))
+    (vg:drawing-cache-set! drawing (cons res (vg:drawing-cache drawing) ))
     res))
 
 ;;======================================================================
 ;; Unravel and draw the objects
 ;;======================================================================
@@ -202,14 +214,22 @@
 (define (vg:draw-obj drawing obj)
   (print "obj type: " (vg:obj-type obj))
   (case (vg:obj-type obj)
     ((r)(vg:draw-rect drawing obj))))
 
+;; given a rect obj draw it on the canvas applying first the drawing
+;; scale and offset
+;;
 (define (vg:draw-rect drawing obj)
   (let* ((cnv (vg:drawing-cnv drawing))
-	 (pts (vg:drawing-apply-scale drawing (vg:obj-pts obj))))
-    (apply canvas-rectangle! cnv pts)))
+	 (pts (vg:drawing-apply-scale drawing (vg:obj-pts obj)))
+	 (llx (car pts))
+	 (lly (cadr pts))
+	 (ulx (caddr pts))
+	 (uly (cadddr pts)))
+    (print "pts: " pts)
+    (canvas-rectangle! cnv llx ulx lly uly)))
 
 (define (vg:draw drawing)
   (let ((insts (vg:drawing-insts drawing)))
     (for-each 
      (lambda (inst)
@@ -217,9 +237,11 @@
 	      (compname (vg:inst-compname inst))
 	      (comp     (vg:get-component drawing libname compname)))
 	 (print "comp: " comp)
 	 (for-each
 	  (lambda (obj)
-	    (print "obj: " obj)
-	    (vg:draw-obj drawing (vg:map-obj drawing inst obj)))
+	    (print "obj: " (vg:obj-pts obj))
+	    (let ((obj-xfrmd (vg:map-obj drawing inst obj)))
+	      (print "obj-xfrmd: " (vg:obj-pts obj-xfrmd))
+	      (vg:draw-obj drawing obj-xfrmd))) ;;
 	  (vg:comp-objs comp))))
     (hash-table-values insts))))