Path: blob/master/src/demo/share/jfc/J2Ddemo/java2d/demos/Composite/FadeAnim.java
41175 views
/*1*2* Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.3*4* Redistribution and use in source and binary forms, with or without5* modification, are permitted provided that the following conditions6* are met:7*8* - Redistributions of source code must retain the above copyright9* notice, this list of conditions and the following disclaimer.10*11* - Redistributions in binary form must reproduce the above copyright12* notice, this list of conditions and the following disclaimer in the13* documentation and/or other materials provided with the distribution.14*15* - Neither the name of Oracle nor the names of its16* contributors may be used to endorse or promote products derived17* from this software without specific prior written permission.18*19* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS20* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,21* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR22* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR23* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,24* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,25* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR26* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF27* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING28* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS29* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.30*/31package java2d.demos.Composite;323334import static java.awt.Color.BLACK;35import static java.awt.Color.BLUE;36import static java.awt.Color.CYAN;37import static java.awt.Color.GREEN;38import static java.awt.Color.LIGHT_GRAY;39import static java.awt.Color.MAGENTA;40import static java.awt.Color.ORANGE;41import static java.awt.Color.PINK;42import static java.awt.Color.RED;43import static java.awt.Color.WHITE;44import static java.awt.Color.YELLOW;45import java.awt.AlphaComposite;46import java.awt.BasicStroke;47import java.awt.BorderLayout;48import java.awt.Color;49import java.awt.Component;50import java.awt.Dimension;51import java.awt.Font;52import java.awt.FontMetrics;53import java.awt.GradientPaint;54import java.awt.Graphics2D;55import java.awt.Image;56import java.awt.Paint;57import java.awt.Rectangle;58import java.awt.Shape;59import java.awt.TexturePaint;60import java.awt.geom.Arc2D;61import java.awt.geom.CubicCurve2D;62import java.awt.geom.Ellipse2D;63import java.awt.geom.GeneralPath;64import java.awt.geom.QuadCurve2D;65import java.awt.geom.Rectangle2D;66import java.awt.geom.RoundRectangle2D;67import java.awt.image.BufferedImage;68import java.util.ArrayList;69import java.util.List;70import java2d.AnimatingControlsSurface;71import java2d.CustomControls;72import javax.swing.Box;73import javax.swing.BoxLayout;74import javax.swing.JSlider;75import javax.swing.JToolBar;76import javax.swing.SwingConstants;77import javax.swing.border.EtchedBorder;78import javax.swing.border.TitledBorder;79import javax.swing.event.ChangeEvent;80import javax.swing.event.ChangeListener;818283/**84* Animation of compositing shapes, text and images fading in and out.85*/86@SuppressWarnings("serial")87public final class FadeAnim extends AnimatingControlsSurface {8889private static final TexturePaint texturePaint;9091static {92int w = 10;93int h = 10;94BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);95Graphics2D gi = bi.createGraphics();96Color oc = BLUE;97Color ic = GREEN;98gi.setPaint(new GradientPaint(0, 0, oc, w * .35f, h * .35f, ic));99gi.fillRect(0, 0, w / 2, h / 2);100gi.setPaint(new GradientPaint(w, 0, oc, w * .65f, h * .35f, ic));101gi.fillRect(w / 2, 0, w / 2, h / 2);102gi.setPaint(new GradientPaint(0, h, oc, w * .35f, h * .65f, ic));103gi.fillRect(0, h / 2, w / 2, h / 2);104gi.setPaint(new GradientPaint(w, h, oc, w * .65f, h * .65f, ic));105gi.fillRect(w / 2, h / 2, w / 2, h / 2);106texturePaint = new TexturePaint(bi, new Rectangle(0, 0, w, h));107}108private static BasicStroke bs = new BasicStroke(6);109private static Font[] fonts = {110new Font(Font.SERIF, Font.PLAIN, 64),111new Font(Font.SERIF, Font.BOLD | Font.ITALIC, 24),112new Font(Font.MONOSPACED, Font.BOLD, 36),113new Font(Font.SANS_SERIF, Font.BOLD | Font.ITALIC, 48),114new Font(Font.SANS_SERIF, Font.PLAIN, 52) };115private static String[] strings = {116"Alpha", "Composite", "Src", "SrcOver",117"SrcIn", "SrcOut", "Clear", "DstOver", "DstIn" };118private static String[] imgs = {119"jumptojavastrip.png", "duke.png", "star7.png" };120private static Paint[] paints = {121RED, BLUE, GREEN, MAGENTA,122ORANGE, PINK, CYAN, texturePaint,123YELLOW, LIGHT_GRAY, WHITE };124private List<ObjectData> objects = new ArrayList<ObjectData>(20);125private int numShapes, numStrings, numImages;126127public FadeAnim() {128setBackground(BLACK);129setStrings(2);130setImages(3);131setShapes(8);132setControls(new Component[] { new DemoControls(this) });133setConstraints(new String[] { BorderLayout.EAST });134}135136public void setImages(int num) {137138if (num < numImages) {139List<ObjectData> images = new ArrayList<ObjectData>(objects.size());140for (ObjectData obj : objects) {141if (obj.object instanceof Image) {142images.add(obj);143}144}145objects.removeAll(images.subList(num, images.size()));146} else {147Dimension d = getSize();148for (int i = numImages; i < num; i++) {149Object obj = getImage(imgs[i % imgs.length]);150if (imgs[i % imgs.length].equals("jumptojavastrip.png")) {151int iw = ((Image) obj).getWidth(null);152int ih = ((Image) obj).getHeight(null);153BufferedImage bimage = new BufferedImage(iw, ih,154BufferedImage.TYPE_INT_RGB);155bimage.createGraphics().drawImage((Image) obj, 0, 0, null);156obj = bimage;157}158ObjectData od = new ObjectData(obj, BLACK);159od.reset(d.width, d.height);160objects.add(od);161}162}163numImages = num;164}165166public void setStrings(int num) {167168if (num < numStrings) {169List<ObjectData> textDatas = new ArrayList<ObjectData>(170objects.size());171//for (int i = 0; i < objects.size(); i++) {172for (ObjectData obj : objects) {173if (obj.object instanceof TextData) {174textDatas.add(obj);175}176}177objects.removeAll(textDatas.subList(num, textDatas.size()));178} else {179Dimension d = getSize();180for (int i = numStrings; i < num; i++) {181int j = i % fonts.length;182int k = i % strings.length;183Object obj = new TextData(strings[k], fonts[j], this);184ObjectData od = new ObjectData(obj, paints[i % paints.length]);185od.reset(d.width, d.height);186objects.add(od);187}188}189numStrings = num;190}191192public void setShapes(int num) {193194if (num < numShapes) {195List<ObjectData> shapes = new ArrayList<ObjectData>(objects.size());196//for (int i = 0; i < objects.size(); i++) {197for (ObjectData obj : objects) {198if (obj.object instanceof Shape) {199shapes.add(obj);200}201}202objects.removeAll(shapes.subList(num, shapes.size()));203} else {204Dimension d = getSize();205for (int i = numShapes; i < num; i++) {206Object obj = null;207switch (i % 7) {208case 0:209obj = new GeneralPath();210break;211case 1:212obj = new Rectangle2D.Double();213break;214case 2:215obj = new Ellipse2D.Double();216break;217case 3:218obj = new Arc2D.Double();219break;220case 4:221obj = new RoundRectangle2D.Double();222break;223case 5:224obj = new CubicCurve2D.Double();225break;226case 6:227obj = new QuadCurve2D.Double();228break;229}230ObjectData od = new ObjectData(obj, paints[i % paints.length]);231od.reset(d.width, d.height);232objects.add(od);233}234}235numShapes = num;236}237238@Override239public void reset(int w, int h) {240for (int i = 0; i < objects.size(); i++) {241objects.get(i).reset(w, h);242}243}244245@Override246public void step(int w, int h) {247for (int i = 0; i < objects.size(); i++) {248objects.get(i).step(w, h);249}250}251252@Override253public void render(int w, int h, Graphics2D g2) {254for (int i = 0; i < objects.size(); i++) {255ObjectData od = objects.get(i);256AlphaComposite ac = AlphaComposite.getInstance(257AlphaComposite.SRC_OVER, od.alpha);258g2.setComposite(ac);259g2.setPaint(od.paint);260g2.translate(od.x, od.y);261262if (od.object instanceof Image) {263g2.drawImage((Image) od.object, 0, 0, this);264} else if (od.object instanceof TextData) {265g2.setFont(((TextData) od.object).font);266g2.drawString(((TextData) od.object).string, 0, 0);267} else if (od.object instanceof QuadCurve2D268|| od.object instanceof CubicCurve2D) {269g2.setStroke(bs);270g2.draw((Shape) od.object);271} else if (od.object instanceof Shape) {272g2.fill((Shape) od.object);273}274g2.translate(-od.x, -od.y);275}276}277278public static void main(String[] argv) {279createDemoFrame(new FadeAnim());280}281282283static class TextData extends Object {284285public String string;286public Font font;287public int width, height;288289public TextData(String str, Font font, Component cmp) {290string = str;291this.font = font;292FontMetrics fm = cmp.getFontMetrics(font);293width = fm.stringWidth(str);294height = fm.getHeight();295}296}297298299static class ObjectData extends Object {300301final int UP = 0;302final int DOWN = 1;303Object object;304BufferedImage bimg;305Paint paint;306double x, y;307float alpha;308int alphaDirection;309int imgX;310311public ObjectData(Object object, Paint paint) {312this.object = object;313this.paint = paint;314if (object instanceof BufferedImage) {315bimg = (BufferedImage) object;316this.object = bimg.getSubimage(0, 0, 80, 80);317}318getRandomXY(300, 250);319alpha = (float) Math.random();320alphaDirection = Math.random() > 0.5 ? UP : DOWN;321}322323private void getRandomXY(int w, int h) {324if (object instanceof TextData) {325x = Math.random() * (w - ((TextData) object).width);326y = Math.random() * h;327y = y < ((TextData) object).height ? ((TextData) object).height328: y;329} else if (object instanceof Image) {330x = Math.random() * (w - ((Image) object).getWidth(null));331y = Math.random() * (h - ((Image) object).getHeight(null));332} else if (object instanceof Shape) {333Rectangle bounds = ((Shape) object).getBounds();334x = Math.random() * (w - bounds.width);335y = Math.random() * (h - bounds.height);336}337}338339public void reset(int w, int h) {340getRandomXY(w, h);341double ww = 20 + Math.random() * ((w == 0 ? 400 : w) / 4);342double hh = 20 + Math.random() * ((h == 0 ? 300 : h) / 4);343if (object instanceof Ellipse2D) {344((Ellipse2D) object).setFrame(0, 0, ww, hh);345} else if (object instanceof Rectangle2D) {346((Rectangle2D) object).setRect(0, 0, ww, ww);347} else if (object instanceof RoundRectangle2D) {348((RoundRectangle2D) object).setRoundRect(0, 0, hh, hh, 20, 20);349} else if (object instanceof Arc2D) {350((Arc2D) object).setArc(0, 0, hh, hh, 45, 270, Arc2D.PIE);351} else if (object instanceof QuadCurve2D) {352((QuadCurve2D) object).setCurve(0, 0, w * .2, h * .4, w * .4, 0);353} else if (object instanceof CubicCurve2D) {354((CubicCurve2D) object).setCurve(0, 0, 30, -60, 60, 60, 90, 0);355} else if (object instanceof GeneralPath) {356GeneralPath p = new GeneralPath();357float size = (float) ww;358p.moveTo(-size / 2.0f, -size / 8.0f);359p.lineTo(+size / 2.0f, -size / 8.0f);360p.lineTo(-size / 4.0f, +size / 2.0f);361p.lineTo(+0.0f, -size / 2.0f);362p.lineTo(+size / 4.0f, +size / 2.0f);363p.closePath();364object = p;365}366}367368public void step(int w, int h) {369if (object instanceof BufferedImage) {370if ((imgX += 80) == 800) {371imgX = 0;372}373object = bimg.getSubimage(imgX, 0, 80, 80);374}375if (alphaDirection == UP) {376if ((alpha += 0.05) > .99) {377alphaDirection = DOWN;378alpha = 1.0f;379}380} else if (alphaDirection == DOWN) {381if ((alpha -= .05) < 0.01) {382alphaDirection = UP;383alpha = 0;384getRandomXY(w, h);385}386}387}388}389390391static class DemoControls extends CustomControls implements ChangeListener {392393FadeAnim demo;394JSlider shapeSlider, stringSlider, imageSlider;395Font font = new Font(Font.SERIF, Font.BOLD, 10);396397@SuppressWarnings("LeakingThisInConstructor")398public DemoControls(FadeAnim demo) {399super(demo.name);400this.demo = demo;401setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));402add(Box.createVerticalStrut(5));403404JToolBar toolbar = new JToolBar(SwingConstants.VERTICAL);405toolbar.setFloatable(false);406shapeSlider = new JSlider(SwingConstants.HORIZONTAL, 0, 20,407demo.numShapes);408shapeSlider.addChangeListener(this);409TitledBorder tb = new TitledBorder(new EtchedBorder());410tb.setTitleFont(font);411tb.setTitle(String.valueOf(demo.numShapes) + " Shapes");412shapeSlider.setBorder(tb);413shapeSlider.setPreferredSize(new Dimension(80, 45));414shapeSlider.setOpaque(true);415toolbar.addSeparator();416toolbar.add(shapeSlider);417toolbar.addSeparator();418419stringSlider = new JSlider(SwingConstants.HORIZONTAL, 0, 10,420demo.numStrings);421stringSlider.addChangeListener(this);422tb = new TitledBorder(new EtchedBorder());423tb.setTitleFont(font);424tb.setTitle(String.valueOf(demo.numStrings) + " Strings");425stringSlider.setBorder(tb);426stringSlider.setPreferredSize(new Dimension(80, 45));427stringSlider.setOpaque(true);428toolbar.add(stringSlider);429toolbar.addSeparator();430431imageSlider = new JSlider(SwingConstants.HORIZONTAL, 0, 10,432demo.numImages);433imageSlider.addChangeListener(this);434tb = new TitledBorder(new EtchedBorder());435tb.setTitleFont(font);436tb.setTitle(String.valueOf(demo.numImages) + " Images");437imageSlider.setBorder(tb);438imageSlider.setPreferredSize(new Dimension(80, 45));439imageSlider.setOpaque(true);440toolbar.add(imageSlider);441toolbar.addSeparator();442443add(toolbar);444}445446@Override447public void stateChanged(ChangeEvent e) {448JSlider slider = (JSlider) e.getSource();449int value = slider.getValue();450TitledBorder tb = (TitledBorder) slider.getBorder();451if (slider.equals(shapeSlider)) {452tb.setTitle(String.valueOf(value) + " Shapes");453demo.setShapes(value);454} else if (slider.equals(stringSlider)) {455tb.setTitle(String.valueOf(value) + " Strings");456demo.setStrings(value);457} else if (slider.equals(imageSlider)) {458tb.setTitle(String.valueOf(value) + " Images");459demo.setImages(value);460}461slider.repaint();462if (!demo.animating.running()) {463demo.repaint();464}465}466467@Override468public Dimension getPreferredSize() {469return new Dimension(80, 0);470}471472@Override473public void run() {474try {475Thread.sleep(999);476} catch (InterruptedException e) {477return;478}479shapeSlider.setValue((int) (Math.random() * 5));480stringSlider.setValue(10);481thread = null;482}483} // End DemoControls484} // End FadeAnim485486487488