@Override
		public void paint(GGlassPane glassPane, Graphics graphics) {
			Graphics2D g2d = (Graphics2D) graphics;

			g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
				RenderingHints.VALUE_INTERPOLATION_BILINEAR);

			//
			// At 0%, paint the start component with 100% opacity; paint the end component with
			// 0% opacity. 
			//
			Composite originalComposite = g2d.getComposite();
			AlphaComposite alphaComposite = AlphaComposite.getInstance(
				AlphaComposite.SrcOver.getRule(), (float) (1 - percentComplete));
			g2d.setComposite(alphaComposite);

			//
			// Morph the size of the start component to that of the end component, based upon the
			// percent complete
			//
			Rectangle startBounds = startComponent.getBounds();
			startBounds =
				SwingUtilities.convertRectangle(startComponent.getParent(), startBounds, glassPane);

			Rectangle endBounds = endComponent.getBounds();
			endBounds =
				SwingUtilities.convertRectangle(endComponent.getParent(), endBounds, glassPane);

			Point startPoint = startBounds.getLocation();
			Point endPoint = endBounds.getLocation();
			int distanceX = endPoint.x - startPoint.x;
			int distanceY = endPoint.y - startPoint.y;

			double transition = 1 - percentComplete;
			double currentX = endPoint.x - (distanceX * transition);
			double currentY = endPoint.y - (distanceY * transition);

			int scaledWidth = (int) (startBounds.width * transition);
			int scaledHeight = (int) (startBounds.height * transition);

			if (endBounds.width < startBounds.width) {
				// don't go smaller than the destination component
				scaledWidth = Math.max(scaledWidth, endBounds.width);
			}
			else {
				// don't go larger than the destination component
				scaledWidth = Math.min(scaledWidth, endBounds.width);
			}

			if (endBounds.height < startBounds.height) {
				// don't go smaller than the destination component
				scaledHeight = Math.max(scaledHeight, endBounds.height);
			}
			else {
				// don't go larger than the destination component
				scaledHeight = Math.min(scaledHeight, endBounds.height);
			}

			g2d.drawImage(startImage, (int) currentX, (int) currentY, scaledWidth, scaledHeight,
				null);

			//
			// Change the transparency to that which will slowly become more visible as 
			// we progress.
			// 
			alphaComposite = AlphaComposite.getInstance(AlphaComposite.SrcOver.getRule(),
				(float) percentComplete);
			g2d.setComposite(alphaComposite);

			currentX = endPoint.x - (distanceX * transition);
			currentY = endPoint.y - (distanceY * transition);
			scaledWidth = (int) (endBounds.width * percentComplete);
			scaledHeight = (int) (endBounds.height * percentComplete);
			g2d.drawImage(endImage, (int) currentX, (int) currentY, scaledWidth, scaledHeight,
				null);

			g2d.setComposite(originalComposite);
		}
Returns the {@link GGlassPane} for the given component

@param c the component
@return the glass pane
Ghidra/Framework/Docking/src/main/java/docking/util/AnimationUtils.java