private void fixate(Object[] nodes, int start, int end, Rectangle bounds, boolean left, boolean top, int border) {
		if (start > end) {
			return;
		}

		boolean vertical = bounds.height > bounds.width;
		int offset = 0;
		double delta = 0;
		double size = size(nodes, start, end);

		for (int i = start; i < end; i++) {
			if (vertical) {
				double exactHeight = bounds.height * content.getSize(nodes[i]) / size;
				int height = (int) Math.round(exactHeight - delta);
				Rectangle rect = new Rectangle(bounds.x, bounds.y + offset, bounds.width, height);
				layout(nodes[i], rect, left, top && i == start, border);
				offset += height;
				delta += height - exactHeight;	// abs(dNew) = abs(dOld+h-e) = abs(h-(e-dOld)) <= 0.5 since h = round(e-dOld)
			} else {
				double exactWidth = bounds.width * content.getSize(nodes[i]) / size;
				int width = (int) Math.round(exactWidth - delta);
				Rectangle rect = new Rectangle(bounds.x + offset, bounds.y, width, bounds.height);
				layout(nodes[i], rect, left && i == start, top, border);
				offset += width;
				delta += width - exactWidth;
			}
		}

		if (vertical) {
			Rectangle rect = new Rectangle(bounds.x, bounds.y + offset, bounds.width, bounds.height - offset);
			layout(nodes[end], rect, left, top && start == end, border);
		} else {
			Rectangle rect = new Rectangle(bounds.x + offset, bounds.y, bounds.width - offset, bounds.height);
			layout(nodes[end], rect, left && start == end, top, border);
		}
	}