Java Code:
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.RenderingHints;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.geom.AffineTransform;
import java.awt.geom.Arc2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.GeneralPath;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.net.URL;

import javax.swing.JApplet;
import javax.swing.JFrame;

public class ClipImage extends JApplet implements Runnable {

  private Image img;

  private final double OINC[] = { 5.0, 3.0 };

  private final double SINC[] = { 5.0, 5.0 };

  private double x, y;

  private double ix = OINC[0];

  private double iy = OINC[1];

  private double iw = SINC[0];

  private double ih = SINC[1];

  private double ew, eh; // ellipse width & height

  private GeneralPath p = new GeneralPath();

  private AffineTransform at = new AffineTransform();

  private BasicStroke bs = new BasicStroke(20.0f);

  private Arc2D arc = new Arc2D.Float();

  private Ellipse2D ellipse = new Ellipse2D.Float();

  private RoundRectangle2D roundRect = new RoundRectangle2D.Float();

  private Rectangle2D rect = new Rectangle2D.Float();

  private Color redBlend = new Color(255, 0, 0, 120);

  private Color greenBlend = new Color(0, 255, 0, 120);

  private Thread thread;

  private BufferedImage offImg;

  private int w, h;

  private boolean newBufferedImage;

  public void init() {
    img = getImage(getURL("largeJava2sLogo.GIF"));
    try {
      MediaTracker tracker = new MediaTracker(this);
      tracker.addImage(img, 0);
      tracker.waitForID(0);
    } catch (Exception e) {
    }
  }

  public void drawDemo(Graphics2D g2) {
    if (newBufferedImage) {
      x = Math.random() * w;
      y = Math.random() * h;
      ew = (Math.random() * w) / 2;
      eh = (Math.random() * h) / 2;
    }
    x += ix;
    y += iy;
    ew += iw;
    eh += ih;
    if (ew > w / 2) {
      ew = w / 2;
      iw = Math.random() * -w / 16 - 1;
    }
    if (ew < w / 8) {
      ew = w / 8;
      iw = Math.random() * w / 16 + 1;
    }
    if (eh > h / 2) {
      eh = h / 2;
      ih = Math.random() * -h / 16 - 1;
    }
    if (eh < h / 8) {
      eh = h / 8;
      ih = Math.random() * h / 16 + 1;
    }
    if ((x + ew) > w) {
      x = (w - ew) - 1;
      ix = Math.random() * -w / 32 - 1;
    }
    if (x < 0) {
      x = 2;
      ix = Math.random() * w / 32 + 1;
    }
    if ((y + eh) > h) {
      y = (h - eh) - 2;
      iy = Math.random() * -h / 32 - 1;
    }
    if (y < 0) {
      y = 2;
      iy = Math.random() * h / 32 + 1;
    }

    ellipse.setFrame(x, y, ew, eh);
    g2.setClip(ellipse);

    rect.setRect(x + 5, y + 5, ew - 10, eh - 10);
    g2.clip(rect);

    g2.drawImage(img, 0, 0, w, h, this);

    p.reset();
    p.moveTo(-w / 2.0f, -h / 8.0f);
    p.lineTo(+w / 2.0f, -h / 8.0f);
    p.lineTo(-w / 4.0f, +h / 2.0f);
    p.lineTo(+0.0f, -h / 2.0f);
    p.lineTo(+w / 4.0f, +h / 2.0f);
    p.closePath();

    at.setToIdentity();
    at.translate(w * .5f, h * .5f);
    g2.transform(at);
    g2.setStroke(bs);
    g2.setPaint(redBlend);
    g2.draw(p);

    at.setToIdentity();
    g2.setTransform(at);

    g2.setPaint(greenBlend);

    for (int yy = 0; yy < h; yy += 50) {
      for (int xx = 0, i = 0; xx < w; i++, xx += 50) {
        switch (i) {
        case 0:
          arc.setArc(xx, yy, 25, 25, 45, 270, Arc2D.PIE);
          g2.fill(arc);
          break;
        case 1:
          ellipse.setFrame(xx, yy, 25, 25);
          g2.fill(ellipse);
          break;
        case 2:
          roundRect.setRoundRect(xx, yy, 25, 25, 4, 4);
          g2.fill(roundRect);
          break;
        case 3:
          rect.setRect(xx, yy, 25, 25);
          g2.fill(rect);
          i = -1;
        }

      }
    }
  }

  public Graphics2D createDemoGraphics2D(Graphics g) {
    Graphics2D g2 = null;

    if (offImg == null || offImg.getWidth() != w || offImg.getHeight() != h) {
      offImg = (BufferedImage) createImage(w, h);
      newBufferedImage = true;
    }

    if (offImg != null) {
      g2 = offImg.createGraphics();
      g2.setBackground(getBackground());
    }

    // .. set attributes ..
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
        RenderingHints.VALUE_ANTIALIAS_ON);
    g2.setRenderingHint(RenderingHints.KEY_RENDERING,
        RenderingHints.VALUE_RENDER_QUALITY);
    // .. clear canvas ..
    g2.clearRect(0, 0, w, h);
    return g2;
  }

  public void paint(Graphics g) {
    w = getWidth();
    h = getHeight();

    if (w <= 0 || h <= 0)
      return;

    Graphics2D g2 = createDemoGraphics2D(g);
    drawDemo(g2);
    g2.dispose();

    if (offImg != null && isShowing()) {
      g.drawImage(offImg, 0, 0, this);
    }

    newBufferedImage = false;
  }

  public void start() {
    thread = new Thread(this);
    thread.start();
  }

  public synchronized void stop() {
    thread = null;
  }

  public void run() {
    Thread me = Thread.currentThread();
    while (thread == me && isShowing()) {
      Graphics g = getGraphics();
      paint(g);
      g.dispose();
      thread.yield();
    }
    thread = null;
  }

  protected URL getURL(String filename) {
    URL codeBase = this.getCodeBase();
    URL url = null;

    try {
      url = new URL(codeBase, filename);
    } catch (java.net.MalformedURLException e) {
      System.out.println("Couldn't create image: "
          + "badly specified URL");
      return null;
    }
    return url;
  }

  public static void main(String s[]) {
    final ClipImage demo = new ClipImage();
    WindowListener l = new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }

      public void windowDeiconified(WindowEvent e) {
        demo.start();
      }

      public void windowIconified(WindowEvent e) {
        demo.stop();
      }
    };
    JFrame f = new JFrame("Java 2D Demo - ClipImage");
    f.addWindowListener(l);
    f.getContentPane().add("Center", demo);
    f.setSize(new Dimension(400, 300));
    f.show();
    demo.start();
  }
}