1 /*
   2  *
   3  * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
   4  *
   5  * Redistribution and use in source and binary forms, with or without
   6  * modification, are permitted provided that the following conditions
   7  * are met:
   8  *
   9  *   - Redistributions of source code must retain the above copyright
  10  *     notice, this list of conditions and the following disclaimer.
  11  *
  12  *   - Redistributions in binary form must reproduce the above copyright
  13  *     notice, this list of conditions and the following disclaimer in the
  14  *     documentation and/or other materials provided with the distribution.
  15  *
  16  *   - Neither the name of Oracle nor the names of its
  17  *     contributors may be used to endorse or promote products derived
  18  *     from this software without specific prior written permission.
  19  *
  20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
  21  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  23  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  28  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  29  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31  */
  32 package java2d.demos.Composite;
  33 
  34 
  35 import static java.awt.AlphaComposite.Clear;
  36 import static java.awt.AlphaComposite.Dst;
  37 import static java.awt.AlphaComposite.DstAtop;
  38 import static java.awt.AlphaComposite.DstIn;
  39 import static java.awt.AlphaComposite.DstOut;
  40 import static java.awt.AlphaComposite.DstOver;
  41 import static java.awt.AlphaComposite.Src;
  42 import static java.awt.AlphaComposite.SrcAtop;
  43 import static java.awt.AlphaComposite.SrcIn;
  44 import static java.awt.AlphaComposite.SrcOut;
  45 import static java.awt.AlphaComposite.SrcOver;
  46 import static java.awt.AlphaComposite.Xor;
  47 import java.awt.AlphaComposite;
  48 import java.awt.Color;
  49 import java.awt.Font;
  50 import java.awt.GradientPaint;
  51 import java.awt.Graphics2D;
  52 import java.awt.RenderingHints;
  53 import java.awt.font.FontRenderContext;
  54 import java.awt.font.LineMetrics;
  55 import java.awt.font.TextLayout;
  56 import java.awt.geom.GeneralPath;
  57 import java.awt.image.BufferedImage;
  58 import java2d.AnimatingSurface;
  59 
  60 
  61 /**
  62  * All the AlphaCompositing Rules demonstrated.
  63  */
  64 @SuppressWarnings("serial")
  65 public class ACrules extends AnimatingSurface {
  66 
  67     private static String compNames[] = {
  68         "Src",
  69         "SrcOver",
  70         "SrcIn",
  71         "SrcOut",
  72         "SrcAtop",
  73         "Clear",
  74         "Dst",
  75         "DstOver",
  76         "DstIn",
  77         "DstOut",
  78         "DstAtop",
  79         "Xor", };
  80     private static final AlphaComposite compObjs[] = {
  81         Src, SrcOver, SrcIn, SrcOut, SrcAtop, Clear,
  82         Dst, DstOver, DstIn, DstOut, DstAtop, Xor, };
  83     private static final int NUM_RULES = compObjs.length;
  84     private static final int HALF_NUM_RULES = NUM_RULES / 2;
  85     private int fadeIndex;
  86     private static float fadeValues[][] = {
  87         { 1.0f, -0.1f, 0.0f, 1.0f, 0.0f, 1.0f },
  88         { 0.0f, 0.1f, 1.0f, 1.0f, -0.1f, 0.0f },
  89         { 1.0f, 0.0f, 1.0f, 0.0f, 0.1f, 1.0f }, };
  90     private static String fadeNames[] = {
  91         "Src => transparent, Dest opaque",
  92         "Src => opaque, Dest => transparent",
  93         "Src opaque, Dest => opaque", };
  94     private static Font f = new Font("serif", Font.PLAIN, 10);
  95     private float srca = fadeValues[fadeIndex][0];
  96     private float dsta = fadeValues[fadeIndex][3];
  97     private String fadeLabel = fadeNames[0];
  98     private BufferedImage statBI, animBI;
  99     private int PADLEFT, PADRIGHT, HPAD;
 100     private int PADABOVE, PADBELOW, VPAD;
 101     private int RECTWIDTH, RECTHEIGHT;
 102     private int PADDEDHEIGHT;
 103     private GeneralPath srcpath = new GeneralPath();
 104     private GeneralPath dstpath = new GeneralPath();
 105     private LineMetrics lm;
 106     private BufferedImage dBI, sBI;
 107     private GradientPaint gradientDst, gradientSrc;
 108 
 109     public ACrules() {
 110         setBackground(Color.white);
 111     }
 112 
 113     @Override
 114     public void reset(int w, int h) {
 115         setSleepAmount(400);
 116         FontRenderContext frc = new FontRenderContext(null, false, false);
 117         lm = f.getLineMetrics(compNames[0], frc);
 118 
 119         PADLEFT = (w < 150) ? 10 : 15;
 120         PADRIGHT = (w < 150) ? 10 : 15;
 121         HPAD = (PADLEFT + PADRIGHT);
 122         PADBELOW = (h < 250) ? 1 : 2;
 123         PADABOVE = PADBELOW + (int) lm.getHeight();
 124         VPAD = (PADABOVE + PADBELOW);
 125         RECTWIDTH = w / 4 - HPAD;
 126         RECTWIDTH = (RECTWIDTH < 6) ? 6 : RECTWIDTH;
 127         RECTHEIGHT = (h - VPAD) / HALF_NUM_RULES - VPAD;
 128         RECTHEIGHT = (RECTHEIGHT < 6) ? 6 : RECTHEIGHT;
 129         PADDEDHEIGHT = (RECTHEIGHT + VPAD);
 130 
 131         srcpath.reset();
 132         srcpath.moveTo(0, 0);
 133         srcpath.lineTo(RECTWIDTH, 0);
 134         srcpath.lineTo(0, RECTHEIGHT);
 135         srcpath.closePath();
 136 
 137         dstpath.reset();
 138         dstpath.moveTo(0, 0);
 139         dstpath.lineTo(RECTWIDTH, RECTHEIGHT);
 140         dstpath.lineTo(RECTWIDTH, 0);
 141         dstpath.closePath();
 142 
 143         dBI = new BufferedImage(RECTWIDTH, RECTHEIGHT,
 144                 BufferedImage.TYPE_INT_ARGB);
 145         sBI = new BufferedImage(RECTWIDTH, RECTHEIGHT,
 146                 BufferedImage.TYPE_INT_ARGB);
 147         gradientDst = new GradientPaint(0, 0,
 148                 new Color(1.0f, 0.0f, 0.0f, 1.0f),
 149                 0, RECTHEIGHT,
 150                 new Color(1.0f, 0.0f, 0.0f, 0.0f));
 151         gradientSrc = new GradientPaint(0, 0,
 152                 new Color(0.0f, 0.0f, 1.0f, 1.0f),
 153                 RECTWIDTH, 0,
 154                 new Color(0.0f, 0.0f, 1.0f, 0.0f));
 155         statBI = new BufferedImage(w / 2, h, BufferedImage.TYPE_INT_RGB);
 156         statBI = drawCompBI(statBI, true);
 157         animBI = new BufferedImage(w / 2, h, BufferedImage.TYPE_INT_RGB);
 158     }
 159 
 160     @Override
 161     public void step(int w, int h) {
 162         if (getSleepAmount() == 5000) {
 163             setSleepAmount(200);
 164         }
 165 
 166         srca = srca + fadeValues[fadeIndex][1];
 167         dsta = dsta + fadeValues[fadeIndex][4];
 168         fadeLabel = fadeNames[fadeIndex];
 169         if (srca < 0 || srca > 1.0 || dsta < 0 || dsta > 1.0) {
 170             setSleepAmount(5000);
 171             srca = fadeValues[fadeIndex][2];
 172             dsta = fadeValues[fadeIndex][5];
 173             if (fadeIndex++ == fadeValues.length - 1) {
 174                 fadeIndex = 0;
 175             }
 176         }
 177     }
 178 
 179     @Override
 180     public void render(int w, int h, Graphics2D g2) {
 181 
 182         if (statBI == null || animBI == null) {
 183             return;
 184         }
 185         g2.drawImage(statBI, 0, 0, null);
 186         g2.drawImage(drawCompBI(animBI, false), w / 2, 0, null);
 187 
 188         g2.setColor(Color.black);
 189         FontRenderContext frc = g2.getFontRenderContext();
 190         TextLayout tl = new TextLayout("AC Rules", g2.getFont(), frc);
 191         tl.draw(g2, 15.0f, (float) tl.getBounds().getHeight() + 3.0f);
 192 
 193         tl = new TextLayout(fadeLabel, f, frc);
 194         float x = (float) (w * 0.75 - tl.getBounds().getWidth() / 2);
 195         if ((x + tl.getBounds().getWidth()) > w) {
 196             x = (float) (w - tl.getBounds().getWidth());
 197         }
 198         tl.draw(g2, x, (float) tl.getBounds().getHeight() + 3.0f);
 199     }
 200 
 201     private BufferedImage drawCompBI(BufferedImage bi, boolean doGradient) {
 202         Graphics2D big = bi.createGraphics();
 203         big.setColor(getBackground());
 204         big.fillRect(0, 0, bi.getWidth(), bi.getHeight());
 205         big.setRenderingHint(RenderingHints.KEY_ANTIALIASING, AntiAlias);
 206         big.setFont(f);
 207 
 208         Graphics2D gD = dBI.createGraphics();
 209         gD.setRenderingHint(RenderingHints.KEY_ANTIALIASING, AntiAlias);
 210         Graphics2D gS = sBI.createGraphics();
 211         gS.setRenderingHint(RenderingHints.KEY_ANTIALIASING, AntiAlias);
 212 
 213         int x = 0, y = 0;
 214         int yy = (int) lm.getHeight() + VPAD;
 215 
 216         for (int i = 0; i < compNames.length; i++) {
 217             y = (i == 0 || i == HALF_NUM_RULES) ? yy : y + PADDEDHEIGHT;
 218             x = (i >= HALF_NUM_RULES) ? bi.getWidth() / 2 + PADLEFT : PADLEFT;
 219             big.translate(x, y);
 220 
 221             gD.setComposite(Clear);
 222             gD.fillRect(0, 0, RECTWIDTH, RECTHEIGHT);
 223             gD.setComposite(Src);
 224             if (doGradient) {
 225                 gD.setPaint(gradientDst);
 226                 gD.fillRect(0, 0, RECTWIDTH, RECTHEIGHT);
 227             } else {
 228                 gD.setPaint(new Color(1.0f, 0.0f, 0.0f, dsta));
 229                 gD.fill(dstpath);
 230             }
 231 
 232             gS.setComposite(Clear);
 233             gS.fillRect(0, 0, RECTWIDTH, RECTHEIGHT);
 234             gS.setComposite(Src);
 235             if (doGradient) {
 236                 gS.setPaint(gradientSrc);
 237                 gS.fillRect(0, 0, RECTWIDTH, RECTHEIGHT);
 238             } else {
 239                 gS.setPaint(new Color(0.0f, 0.0f, 1.0f, srca));
 240                 gS.fill(srcpath);
 241             }
 242 
 243             gD.setComposite(compObjs[i]);
 244             gD.drawImage(sBI, 0, 0, null);
 245 
 246             big.drawImage(dBI, 0, 0, null);
 247             big.setColor(Color.black);
 248             big.drawString(compNames[i], 0, -lm.getDescent());
 249             big.drawRect(0, 0, RECTWIDTH, RECTHEIGHT);
 250             big.translate(-x, -y);
 251         }
 252 
 253         gD.dispose();
 254         gS.dispose();
 255         big.dispose();
 256 
 257         return bi;
 258     }
 259 
 260     public static void main(String argv[]) {
 261         createDemoFrame(new ACrules());
 262     }
 263 }