• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * ProGuard -- shrinking, optimization, obfuscation, and preverification
3  *             of Java bytecode.
4  *
5  * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu)
6  *
7  * This program is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by the Free
9  * Software Foundation; either version 2 of the License, or (at your option)
10  * any later version.
11  *
12  * This program is distributed in the hope that it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15  * more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, write to the Free Software Foundation, Inc.,
19  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20  */
21 package proguard.gui.splash;
22 
23 import java.awt.*;
24 import java.awt.image.BufferedImage;
25 
26 /**
27  * This Sprite encapsulates another Sprite, which is then buffered in an Image.
28  *
29  * @author Eric Lafortune
30  */
31 public class BufferedSprite implements Sprite
32 {
33     private final int         bufferX;
34     private final int         bufferY;
35     private final Image       bufferImage;
36     private final Color       backgroundColor;
37     private final Sprite      sprite;
38     private final VariableInt x;
39     private final VariableInt y;
40 
41     private long cachedTime = -1;
42 
43 
44     /**
45      * Creates a new BufferedSprite with an ABGR image.
46      * @param bufferX the x offset of the buffer image.
47      * @param bufferY the y offset of the buffer image.
48      * @param width   the width of the buffer image.
49      * @param height  the height of the buffer image.
50      * @param sprite  the Sprite that is painted in the buffer.
51      * @param x       the variable x ordinate of the image buffer for painting.
52      * @param y       the variable y ordinate of the image buffer for painting.
53      *
54      */
BufferedSprite(int bufferX, int bufferY, int width, int height, Sprite sprite, VariableInt x, VariableInt y)55     public BufferedSprite(int         bufferX,
56                           int         bufferY,
57                           int         width,
58                           int         height,
59                           Sprite      sprite,
60                           VariableInt x,
61                           VariableInt y)
62     {
63 
64         this(bufferX,
65              bufferY,
66              new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR),
67              null,
68              sprite,
69              x,
70              y);
71     }
72 
73 
74     /**
75      * Creates a new BufferedSprite with the given image.
76      * @param bufferX         the x offset of the buffer image.
77      * @param bufferY         the y offset of the buffer image.
78      * @param bufferImage     the Image that is used for the buffering.
79      * @param backgroundColor the background color that is used for the buffer.
80      * @param sprite          the Sprite that is painted in the buffer.
81      * @param x               the variable x ordinate of the image buffer for
82      *                        painting.
83      * @param y               the variable y ordinate of the image buffer for
84      *                        painting.
85      */
BufferedSprite(int bufferX, int bufferY, Image bufferImage, Color backgroundColor, Sprite sprite, VariableInt x, VariableInt y)86     public BufferedSprite(int         bufferX,
87                           int         bufferY,
88                           Image       bufferImage,
89                           Color       backgroundColor,
90                           Sprite      sprite,
91                           VariableInt x,
92                           VariableInt y)
93     {
94         this.bufferX         = bufferX;
95         this.bufferY         = bufferY;
96         this.bufferImage     = bufferImage;
97         this.backgroundColor = backgroundColor;
98         this.sprite          = sprite;
99         this.x               = x;
100         this.y               = y;
101     }
102 
103 
104    // Implementation for Sprite.
105 
paint(Graphics graphics, long time)106     public void paint(Graphics graphics, long time)
107     {
108         if (time != cachedTime)
109         {
110             Graphics bufferGraphics = bufferImage.getGraphics();
111 
112             // Clear the background.
113             if (backgroundColor != null)
114             {
115                 Graphics2D bufferGraphics2D = (Graphics2D)bufferGraphics;
116                 bufferGraphics2D.setComposite(AlphaComposite.Clear);
117                 bufferGraphics.fillRect(0, 0, bufferImage.getWidth(null), bufferImage.getHeight(null));
118                 bufferGraphics2D.setComposite(AlphaComposite.Src);
119             }
120             else
121             {
122                 bufferGraphics.setColor(backgroundColor);
123                 bufferGraphics.fillRect(0, 0, bufferImage.getWidth(null), bufferImage.getHeight(null));
124             }
125 
126             // Set up the buffer graphics.
127             bufferGraphics.translate(-bufferX, -bufferY);
128             bufferGraphics.setColor(graphics.getColor());
129             bufferGraphics.setFont(graphics.getFont());
130 
131             // Draw the sprite.
132             sprite.paint(bufferGraphics, time);
133 
134             bufferGraphics.dispose();
135 
136             cachedTime = time;
137         }
138 
139         // Draw the buffer image.
140         graphics.drawImage(bufferImage,
141                            bufferX + x.getInt(time),
142                            bufferY + y.getInt(time),
143                            null);
144     }
145 }
146