public void captureComponents(List<Component> comps) {
		Rectangle rect = computeBounds(comps);
		BufferedImage combinedImage =
			new BufferedImage(rect.width, rect.height, BufferedImage.TYPE_INT_ARGB);
		Graphics g = combinedImage.getGraphics();
		g.setColor(Palette.WHITE);
		g.fillRect(0, 0, rect.width, rect.height);

		for (Component component : comps) {
			int pad = 6;
			Point p = component.getLocationOnScreen();
			g.setColor(ColorUtils.getOpaqueColor(0xfafafa)); // just slightly not white
			g.fillRoundRect(p.x - rect.x - pad, p.y - rect.y - pad, component.getWidth() + pad * 2,
				component.getHeight() + pad * 2, pad * 2, pad * 2);
		}
		for (Component component : comps) {
			int pad = 3;
			Point p = component.getLocationOnScreen();
			g.setColor(ColorUtils.getOpaqueColor(0xf0f0f0)); // faint gray
			g.fillRoundRect(p.x - rect.x - pad, p.y - rect.y - pad, component.getWidth() + pad * 2,
				component.getHeight() + pad * 2, pad * 2, pad * 2);
		}

		for (Component component : comps) {
			image = captureComponent(component);
			Point p = component.getLocationOnScreen();
			g.drawImage(image, p.x - rect.x, p.y - rect.y, null);
		}
		ImageUtils.waitForImage(null, combinedImage);
		image = combinedImage;
	}
Captures the window, including decorations. This will use a {@link Robot} to create a screen
capture, which has the effect of getting all items within the window bounds. This method is
needed if you wish to capture child windows, like popups/hovers.

<P>
Other capture methods will not use the screen capture mechanism, but rather will directly
render the given component. In this case, subordinate windows will not be captured. For
example, see {@link #captureProvider(Class)}.

@param provider the provider's name
@param width the desired width
@param height the desired height
Ghidra/Features/Base/src/main/java/help/screenshot/AbstractScreenShotGenerator.java