Rectangle2D getBoundsRecurse(int level, AffineTransform t)
	{
		Rectangle2D rUnion = null;
		boolean allTooSmall = true;
		{
			Iterator i = fractalShape.elementShapes.iterator();
			if (i.hasNext())
			{
				rUnion = ((ElementShape) i.next()).getBounds(t);
				if (!rectTooSmall(rUnion, smallestScale))
					allTooSmall = false;
			}
			while (i.hasNext())
			{
				Rectangle2D r = ((ElementShape) i.next()).getBounds(t);
				Rectangle2D.union(rUnion, r, rUnion);
				if (!rectTooSmall(r, smallestScale))
					allTooSmall = false;
			}
		}

		if (level++ < fractalShape.level && !allTooSmall)
		{
			Iterator i = fractalShape.transforms.iterator();
			while (i.hasNext())
			{
				TransformationSequence ts = (TransformationSequence) i.next();
				if (!ts.recurse)
					continue;
				AffineTransform subT = new AffineTransform(t);

				subT.concatenate(ts.totalTransform);

				Rectangle2D r = getBoundsRecurse(level, subT);
				Rectangle2D.union(rUnion, r, rUnion);
			}
		}
		return rUnion;
	}