001: /*
002: * Copyright (c) 2005-2008 Substance Kirill Grouchnikov. All Rights Reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, are permitted provided that the following conditions are met:
006: *
007: * o Redistributions of source code must retain the above copyright notice,
008: * this list of conditions and the following disclaimer.
009: *
010: * o Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: *
014: * o Neither the name of Substance Kirill Grouchnikov nor the names of
015: * its contributors may be used to endorse or promote products derived
016: * from this software without specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
020: * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
021: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
022: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
023: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
024: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
025: * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
026: * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
027: * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
028: * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029: */
030: package test.check;
031:
032: import java.awt.*;
033: import java.awt.geom.AffineTransform;
034: import java.awt.geom.GeneralPath;
035:
036: import org.jvnet.substance.SubstanceLookAndFeel;
037: import org.jvnet.substance.utils.SubstanceCoreUtilities;
038: import org.jvnet.substance.watermark.SubstanceWatermark;
039:
040: /**
041: * Implementation of {@link org.jvnet.substance.watermark.SubstanceWatermark},
042: * drawing random coffee beans as watermark.
043: *
044: * @author Kirill Grouchnikov
045: */
046: public class SubstanceCoffeeBeansWatermark implements
047: SubstanceWatermark {
048: /**
049: * Watermark image (screen-sized).
050: */
051: private static Image watermarkImage = null;
052:
053: /*
054: * (non-Javadoc)
055: *
056: * @see org.jvnet.substance.watermark.SubstanceWatermark#drawWatermarkImage(java.awt.Graphics,
057: * int, int, int, int)
058: */
059: public void drawWatermarkImage(Graphics graphics, Component c,
060: int x, int y, int width, int height) {
061: int dx = c.getLocationOnScreen().x;
062: int dy = c.getLocationOnScreen().y;
063: graphics.drawImage(
064: SubstanceCoffeeBeansWatermark.watermarkImage, x, y, x
065: + width, y + height, x + dx, y + dy, x + dx
066: + width, y + dy + height, null);
067: }
068:
069: /*
070: * (non-Javadoc)
071: *
072: * @see org.jvnet.substance.watermark.SubstanceWatermark#updateWatermarkImage()
073: */
074: public boolean updateWatermarkImage() {
075: Dimension screenDim = Toolkit.getDefaultToolkit()
076: .getScreenSize();
077: int screenWidth = screenDim.width;
078: int screenHeight = screenDim.height;
079: SubstanceCoffeeBeansWatermark.watermarkImage = SubstanceCoreUtilities
080: .getBlankImage(screenWidth, screenHeight);
081:
082: Graphics2D graphics = (Graphics2D) SubstanceCoffeeBeansWatermark.watermarkImage
083: .getGraphics().create();
084:
085: boolean status = this .drawWatermarkImage(graphics, 0, 0,
086: screenWidth, screenHeight);
087: graphics.dispose();
088: return status;
089: }
090:
091: /*
092: * (non-Javadoc)
093: *
094: * @see org.jvnet.substance.watermark.SubstanceWatermark#previewWatermark(java.awt.Graphics,
095: * int, int, int, int)
096: */
097: public void previewWatermark(Graphics g, int x, int y, int width,
098: int height) {
099: this .drawWatermarkImage((Graphics2D) g, x, y, width, height);
100: }
101:
102: /**
103: * Draws the watermark image.
104: *
105: * @param graphics
106: * Graphics context.
107: * @param x
108: * Starting X position.
109: * @param y
110: * Starting Y position.
111: * @param width
112: * Width.
113: * @param height
114: * Height.
115: * @return <code>true</code> if the drawing succeeded, <code>false</code>
116: * otherwise.
117: */
118: private boolean drawWatermarkImage(Graphics2D graphics, int x,
119: int y, int width, int height) {
120: Color stampColor = SubstanceCoreUtilities
121: .isThemeDark(SubstanceLookAndFeel.getTheme()) ? new Color(
122: 255, 255, 255, 25)
123: : new Color(0, 0, 0, 15);
124:
125: int minBubbleRadius = 10;
126: int maxBubbleRadius = 20;
127:
128: int cellSize = (minBubbleRadius + maxBubbleRadius);
129: int rowCount = height / cellSize;
130: int columnCount = width / cellSize;
131:
132: graphics.setColor(stampColor);
133: graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
134: RenderingHints.VALUE_ANTIALIAS_ON);
135: for (int col = 0; col <= columnCount; col++) {
136: for (int row = 0; row <= rowCount; row++) {
137: // location
138: int xc = x
139: + (int) (col * cellSize + cellSize
140: * Math.random());
141: int yc = y
142: + (int) (row * cellSize + cellSize
143: * Math.random());
144: int r = minBubbleRadius
145: + (int) (Math.random() * (maxBubbleRadius - minBubbleRadius));
146:
147: AffineTransform oldTransform = graphics.getTransform();
148: graphics.setTransform(AffineTransform
149: .getRotateInstance(2.0 * Math.PI
150: * Math.random(), xc, yc));
151:
152: GeneralPath bean = new GeneralPath();
153: bean.moveTo(xc - r, yc - 0.1f * r);
154: bean.quadTo(xc - r, yc - 0.6f * r, xc, yc - 0.6f * r);
155: bean.quadTo(xc + r, yc - 0.6f * r, xc + r, yc - 0.1f
156: * r);
157: bean.lineTo(xc + r, yc + 0.1f * r);
158: bean.quadTo(xc + r, yc + 0.6f * r, xc, yc + 0.6f * r);
159: bean.quadTo(xc - r, yc + 0.6f * r, xc - r, yc + 0.1f
160: * r);
161: bean.lineTo(xc - r, yc - 0.1f * r);
162: bean.lineTo(xc + r, yc - 0.1f * r);
163: bean.lineTo(xc + r, yc + 0.1f * r);
164: bean.lineTo(xc - r, yc + 0.1f * r);
165: graphics.draw(bean);
166:
167: graphics.setTransform(oldTransform);
168: }
169: }
170:
171: graphics.dispose();
172: return true;
173: }
174:
175: /*
176: * (non-Javadoc)
177: *
178: * @see org.jvnet.substance.watermark.SubstanceWatermark#getDisplayName()
179: */
180: public String getDisplayName() {
181: return "Coffee Beans";
182: }
183:
184: /*
185: * (non-Javadoc)
186: *
187: * @see org.jvnet.substance.watermark.SubstanceWatermark#isDependingOnTheme()
188: */
189: public boolean isDependingOnTheme() {
190: return true;
191: }
192:
193: /*
194: * (non-Javadoc)
195: *
196: * @see org.jvnet.substance.watermark.SubstanceWatermark#dispose()
197: */
198: public void dispose() {
199: watermarkImage = null;
200: }
201: }
|