public synchronized void redraw () {
//        Rectangle drawArea;
//        if (savedClipRect != null) {
//            // transform the coordinates of the damaged area
//            drawArea = savedClipRect;
//        } else {
//            drawArea = getBoundingBox();
//        }
//        Graphics2D g = (Graphics2D) buffer.getGraphics();
//        g.setColor(canvas.getBackground());
//        g.fill(drawArea);
//        ListIterator<GraphicalObject> iter = children.listIterator();
//        while (iter.hasNext()) {
//            GraphicalObject gobj = iter.next();
//            BoundaryRectangle r = gobj.getBoundingBox();
//            if (r.intersects(drawArea)) {
//                gobj.draw(g, drawArea);
//            }
//        }
//        savedClipRect = null;
        
    	if (savedClipRect != null) {
    	    Graphics2D g = (Graphics2D) buffer.getGraphics();
            g.setColor(canvas.getBackground());
            g.fill (savedClipRect);
            Rectangle area = canvas.getBounds();
            synchronized (children) {
        	    for (GraphicalObject gobj : children) {
        	    	BoundaryRectangle r = gobj.getBoundingBox();
        	    	// gobj.draw(g, r);
        	    	// if (r.intersects(savedClipRect))
        	    	// 	gobj.draw(g, savedClipRect);
        	    	if (r.intersects(area))
                        gobj.draw(g, area);
        	    }
            }
    	    savedClipRect = null;
    	} else {
    	    // println("no clip rectangle");
    	}
    }