Path: blob/master/src/demo/share/jfc/J2Ddemo/java2d/demos/Composite/ACrules.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.AlphaComposite.Clear;35import static java.awt.AlphaComposite.Dst;36import static java.awt.AlphaComposite.DstAtop;37import static java.awt.AlphaComposite.DstIn;38import static java.awt.AlphaComposite.DstOut;39import static java.awt.AlphaComposite.DstOver;40import static java.awt.AlphaComposite.Src;41import static java.awt.AlphaComposite.SrcAtop;42import static java.awt.AlphaComposite.SrcIn;43import static java.awt.AlphaComposite.SrcOut;44import static java.awt.AlphaComposite.SrcOver;45import static java.awt.AlphaComposite.Xor;46import java.awt.AlphaComposite;47import java.awt.Color;48import java.awt.Font;49import java.awt.GradientPaint;50import java.awt.Graphics2D;51import java.awt.RenderingHints;52import java.awt.font.FontRenderContext;53import java.awt.font.LineMetrics;54import java.awt.font.TextLayout;55import java.awt.geom.GeneralPath;56import java.awt.image.BufferedImage;57import java2d.AnimatingSurface;585960/**61* All the AlphaCompositing Rules demonstrated.62*/63@SuppressWarnings("serial")64public class ACrules extends AnimatingSurface {6566private static String[] compNames = {67"Src",68"SrcOver",69"SrcIn",70"SrcOut",71"SrcAtop",72"Clear",73"Dst",74"DstOver",75"DstIn",76"DstOut",77"DstAtop",78"Xor", };79private static final AlphaComposite[] compObjs = {80Src, SrcOver, SrcIn, SrcOut, SrcAtop, Clear,81Dst, DstOver, DstIn, DstOut, DstAtop, Xor, };82private static final int NUM_RULES = compObjs.length;83private static final int HALF_NUM_RULES = NUM_RULES / 2;84private int fadeIndex;85private static float[][] fadeValues = {86{ 1.0f, -0.1f, 0.0f, 1.0f, 0.0f, 1.0f },87{ 0.0f, 0.1f, 1.0f, 1.0f, -0.1f, 0.0f },88{ 1.0f, 0.0f, 1.0f, 0.0f, 0.1f, 1.0f }, };89private static String[] fadeNames = {90"Src => transparent, Dest opaque",91"Src => opaque, Dest => transparent",92"Src opaque, Dest => opaque", };93private static Font f = new Font("serif", Font.PLAIN, 10);94private float srca = fadeValues[fadeIndex][0];95private float dsta = fadeValues[fadeIndex][3];96private String fadeLabel = fadeNames[0];97private BufferedImage statBI, animBI;98private int PADLEFT, PADRIGHT, HPAD;99private int PADABOVE, PADBELOW, VPAD;100private int RECTWIDTH, RECTHEIGHT;101private int PADDEDHEIGHT;102private GeneralPath srcpath = new GeneralPath();103private GeneralPath dstpath = new GeneralPath();104private LineMetrics lm;105private BufferedImage dBI, sBI;106private GradientPaint gradientDst, gradientSrc;107108public ACrules() {109setBackground(Color.white);110}111112@Override113public void reset(int w, int h) {114setSleepAmount(400);115FontRenderContext frc = new FontRenderContext(null, false, false);116lm = f.getLineMetrics(compNames[0], frc);117118PADLEFT = (w < 150) ? 10 : 15;119PADRIGHT = (w < 150) ? 10 : 15;120HPAD = (PADLEFT + PADRIGHT);121PADBELOW = (h < 250) ? 1 : 2;122PADABOVE = PADBELOW + (int) lm.getHeight();123VPAD = (PADABOVE + PADBELOW);124RECTWIDTH = w / 4 - HPAD;125RECTWIDTH = (RECTWIDTH < 6) ? 6 : RECTWIDTH;126RECTHEIGHT = (h - VPAD) / HALF_NUM_RULES - VPAD;127RECTHEIGHT = (RECTHEIGHT < 6) ? 6 : RECTHEIGHT;128PADDEDHEIGHT = (RECTHEIGHT + VPAD);129130srcpath.reset();131srcpath.moveTo(0, 0);132srcpath.lineTo(RECTWIDTH, 0);133srcpath.lineTo(0, RECTHEIGHT);134srcpath.closePath();135136dstpath.reset();137dstpath.moveTo(0, 0);138dstpath.lineTo(RECTWIDTH, RECTHEIGHT);139dstpath.lineTo(RECTWIDTH, 0);140dstpath.closePath();141142dBI = new BufferedImage(RECTWIDTH, RECTHEIGHT,143BufferedImage.TYPE_INT_ARGB);144sBI = new BufferedImage(RECTWIDTH, RECTHEIGHT,145BufferedImage.TYPE_INT_ARGB);146gradientDst = new GradientPaint(0, 0,147new Color(1.0f, 0.0f, 0.0f, 1.0f),1480, RECTHEIGHT,149new Color(1.0f, 0.0f, 0.0f, 0.0f));150gradientSrc = new GradientPaint(0, 0,151new Color(0.0f, 0.0f, 1.0f, 1.0f),152RECTWIDTH, 0,153new Color(0.0f, 0.0f, 1.0f, 0.0f));154statBI = new BufferedImage(w / 2, h, BufferedImage.TYPE_INT_RGB);155statBI = drawCompBI(statBI, true);156animBI = new BufferedImage(w / 2, h, BufferedImage.TYPE_INT_RGB);157}158159@Override160public void step(int w, int h) {161if (getSleepAmount() == 5000) {162setSleepAmount(200);163}164165srca = srca + fadeValues[fadeIndex][1];166dsta = dsta + fadeValues[fadeIndex][4];167fadeLabel = fadeNames[fadeIndex];168if (srca < 0 || srca > 1.0 || dsta < 0 || dsta > 1.0) {169setSleepAmount(5000);170srca = fadeValues[fadeIndex][2];171dsta = fadeValues[fadeIndex][5];172if (fadeIndex++ == fadeValues.length - 1) {173fadeIndex = 0;174}175}176}177178@Override179public void render(int w, int h, Graphics2D g2) {180181if (statBI == null || animBI == null) {182return;183}184g2.drawImage(statBI, 0, 0, null);185g2.drawImage(drawCompBI(animBI, false), w / 2, 0, null);186187g2.setColor(Color.black);188FontRenderContext frc = g2.getFontRenderContext();189TextLayout tl = new TextLayout("AC Rules", g2.getFont(), frc);190tl.draw(g2, 15.0f, (float) tl.getBounds().getHeight() + 3.0f);191192tl = new TextLayout(fadeLabel, f, frc);193float x = (float) (w * 0.75 - tl.getBounds().getWidth() / 2);194if ((x + tl.getBounds().getWidth()) > w) {195x = (float) (w - tl.getBounds().getWidth());196}197tl.draw(g2, x, (float) tl.getBounds().getHeight() + 3.0f);198}199200private BufferedImage drawCompBI(BufferedImage bi, boolean doGradient) {201Graphics2D big = bi.createGraphics();202big.setColor(getBackground());203big.fillRect(0, 0, bi.getWidth(), bi.getHeight());204big.setRenderingHint(RenderingHints.KEY_ANTIALIASING, AntiAlias);205big.setFont(f);206207Graphics2D gD = dBI.createGraphics();208gD.setRenderingHint(RenderingHints.KEY_ANTIALIASING, AntiAlias);209Graphics2D gS = sBI.createGraphics();210gS.setRenderingHint(RenderingHints.KEY_ANTIALIASING, AntiAlias);211212int x = 0, y = 0;213int yy = (int) lm.getHeight() + VPAD;214215for (int i = 0; i < compNames.length; i++) {216y = (i == 0 || i == HALF_NUM_RULES) ? yy : y + PADDEDHEIGHT;217x = (i >= HALF_NUM_RULES) ? bi.getWidth() / 2 + PADLEFT : PADLEFT;218big.translate(x, y);219220gD.setComposite(Clear);221gD.fillRect(0, 0, RECTWIDTH, RECTHEIGHT);222gD.setComposite(Src);223if (doGradient) {224gD.setPaint(gradientDst);225gD.fillRect(0, 0, RECTWIDTH, RECTHEIGHT);226} else {227gD.setPaint(new Color(1.0f, 0.0f, 0.0f, dsta));228gD.fill(dstpath);229}230231gS.setComposite(Clear);232gS.fillRect(0, 0, RECTWIDTH, RECTHEIGHT);233gS.setComposite(Src);234if (doGradient) {235gS.setPaint(gradientSrc);236gS.fillRect(0, 0, RECTWIDTH, RECTHEIGHT);237} else {238gS.setPaint(new Color(0.0f, 0.0f, 1.0f, srca));239gS.fill(srcpath);240}241242gD.setComposite(compObjs[i]);243gD.drawImage(sBI, 0, 0, null);244245big.drawImage(dBI, 0, 0, null);246big.setColor(Color.black);247big.drawString(compNames[i], 0, -lm.getDescent());248big.drawRect(0, 0, RECTWIDTH, RECTHEIGHT);249big.translate(-x, -y);250}251252gD.dispose();253gS.dispose();254big.dispose();255256return bi;257}258259public static void main(String[] argv) {260createDemoFrame(new ACrules());261}262}263264265