/*
* @(#)ClipImage.java 1.2 98/07/09
*
* Copyright (c) 1998 Sun Microsystems, Inc. All Rights Reserved.
*
* Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
* modify and redistribute this software in source and binary code form,
* provided that i) this copyright notice and license appear on all copies of
* the software; and ii) Licensee does not utilize the software in a manner
* which is disparaging to Sun.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
* IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
* LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
* OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
* LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
* OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* This software is not designed or intended for use in on-line control of
* aircraft, air traffic, aircraft navigation or aircraft communications; or in
* the design, construction, operation or maintenance of any nuclear
* facility. Licensee represents and warrants that it will not use or
* redistribute the Software for such purposes.
*/
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.event.WindowAdapter;
import java.awt.image.BufferedImage;
import java.net.URL;
/**
* Animated clipping of an image & shapes with alpha.
*/
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() {
setBackground(Color.white);
img = getImage(getURL("images/clouds.jpg"));
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();
}
}
|