Index: vg-test.scm
==================================================================
--- vg-test.scm
+++ vg-test.scm
@@ -11,14 +11,16 @@
 
 (define d1 (vg:drawing-new))
 (define l1 (vg:lib-new))
 (define c1 (vg:comp-new))
 (define c2 (vg:comp-new))
+(define bt1 (vg:make-rect 10 40 20 50 text: "A long piece of text" font: "Helvetica, -10"))
+
 (let ((r1 (vg:make-rect 20 20 30 30 text: "r1" font: "Helvetica, -20"))
       (r2 (vg:make-rect 30 30 60 60 text: "r2" font: "Helvetica, -10"))
       (t1 (vg:make-text 60 60 "The middle" font: "Helvetica, -10")))
-  (vg:add-objs-to-comp c1 r1 r2 t1))
+  (vg:add-objs-to-comp c1 r1 r2 t1 bt1))
 
 ;; add the c1 component to lib l1 with name firstcomp
 (vg:add-comp-to-lib l1 "firstcomp" c1)
 (vg:add-comp-to-lib l1 "secondcomp" c2)
 
@@ -39,10 +41,14 @@
 ;; get extents of c1 and put a rectange around it
 ;;
 (define xtnts (apply vg:grow-rect 10 10 (vg:components-get-extents d1 c1)))
 (vg:add-objs-to-comp c1 (apply vg:make-rect xtnts))
 
+(define bt1xt (vg:obj-get-extents d1 bt1))
+(print "bt1xt: " bt1xt)
+(vg:add-objs-to-comp c1 (apply vg:make-rect bt1xt))
+
 ;; get extents of all objects and put rectangle around it
 ;;
 (define big-xtnts (vg:instances-get-extents d1))
 (vg:add-objs-to-comp c2 (apply vg:make-rect big-xtnts))
 (vg:instantiate d1 "firstlib" "secondcomp" "inst3" 0 0)

Index: vg.scm
==================================================================
--- vg.scm
+++ vg.scm
@@ -17,11 +17,11 @@
 (import canvas-draw-iup)
 ;; structs
 ;;
 (defstruct vg:lib     comps)
 (defstruct vg:comp    objs name file)
-(defstruct vg:obj     type pts fill-color text line-color call-back angle font attrib)
+(defstruct vg:obj     type pts fill-color text line-color call-back angle font attrib extents)
 (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
 ;;
@@ -100,11 +100,11 @@
 ;;    (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)(text #f)(font #f))
-  (make-vg:obj type: 'r pts: (list x1 y1 x2 y2) text: text font: font line-color: line-color fill-color: fill-color))
+  (make-vg:obj type: 'r pts: (list x1 y1 x2 y2) text: text font: font line-color: line-color fill-color: fill-color extents: #f))
 
 ;; make a text obj
 ;;
 (define (vg:make-text x1 y1 text #!key (line-color #f)(fill-color #f)
 		      (angle #f)(scale-with-zoom #f)(font #f)
@@ -330,11 +330,13 @@
 	 (llx        (car pts))
 	 (lly        (cadr pts))
 	 (ulx        (caddr pts))
 	 (uly        (cadddr pts))
 	 (w          (- ulx llx))
-	 (h          (- uly lly)))
+	 (h          (- uly lly))
+	 (text-xmax  #f)
+	 (text-ymax  #f))
     (if draw 
 	(let ((prev-background-color (canvas-background cnv))
 	      (prev-foreground-color (canvas-foreground cnv)))
 	  (if fill-color
 	      (begin
@@ -349,19 +351,32 @@
 	  (if text 
 	      (let* ((prev-font    (canvas-font cnv))
 		     (font-changed (and font (not (equal? font prev-font)))))
 		(if font-changed (canvas-font-set! cnv font))
 		(canvas-text! cnv (+ 2 llx)(+ 2 lly) text)
+		(let-values (((xmax ymax)(canvas-text-size cnv text)))
+		  (set! text-xmax xmax)(set! text-ymax ymax))
 		(if font-changed (canvas-font-set! cnv prev-font))))))
-    (if (not text)
-	pts
-	(if cnv
-	    (let-values (((xmax ymax)(canvas-text-size cnv text)))
-	      (list llx lly
-		    (max ulx (+ llx xmax))
-		    (max uly (+ lly ymax))))
-	    pts)))) ;; return extents 
+    (print "text-xmax: " text-xmax " text-ymax: " text-ymax)
+    (if (vg:obj-extents obj)
+	(vg:obj-extents obj)
+	(if (not text)
+	    pts
+	    (if (and text-xmax text-ymax)
+		(let ((xt (list llx lly
+				(max ulx (+ llx text-xmax))
+				(max uly (+ lly text-ymax)))))
+		  (vg:obj-extents-set! obj xt)
+		  xt)
+		(if cnv
+		    (let-values (((xmax ymax)(canvas-text-size cnv text)))
+		      (let ((xt (list llx lly
+				      (max ulx (+ llx xmax))
+				      (max uly (+ lly ymax)))))
+			(vg:obj-extents-set! obj xt)
+			xt))
+		    pts)))))) ;; return extents 
 
 ;; given a rect obj draw it on the canvas applying first the drawing
 ;; scale and offset
 ;;
 (define (vg:draw-text drawing obj #!key (draw #t))