001: /*
002: * Copyright (c) 2004 JETA Software, Inc. All rights reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without modification,
005: * 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 JETA Software nor the names of its contributors may
015: * be used to endorse or promote products derived from this software without
016: * 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, THE
020: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
021: * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
022: * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
023: * INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
024: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
025: * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
026: * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
027: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
028: */
029:
030: package com.jeta.forms.gui.effects;
031:
032: import java.awt.Component;
033: import java.awt.Graphics;
034: import java.awt.Graphics2D;
035: import java.awt.Paint;
036: import java.awt.Rectangle;
037: import java.awt.TexturePaint;
038: import java.awt.image.BufferedImage;
039:
040: import com.jeta.forms.store.properties.effects.TextureProperty;
041:
042: /**
043: * This class is an implementation of a Painter that renders a texture on a
044: * canvas or component. The caller specifies an image for the texture with a
045: * TextureProperty. The standard Java Graphics APIs are used to render the
046: * texture. See: {@link java.awt.TexturePaint}
047: *
048: * @author Jeff Tassin
049: */
050: public class TexturePainter implements Painter {
051: /**
052: * The property that defines the image and texture properties.
053: */
054: private TextureProperty m_texture_prop;
055:
056: /**
057: * A paint object derived from the texture property. It is cached so we
058: * don't have to re-instantiate with every paint.
059: */
060: private Paint m_cached_paint;
061:
062: /**
063: * A rectangle used as a basis for the texture paint paint. This value is
064: * checked everytime the paint method is called. If the paint area has
065: * changed, we regenerate the Paint object.
066: */
067: private Rectangle m_last_rect;
068:
069: /**
070: * Creates a <code>TexturePainter</code> instance with no paint
071: * attributes.
072: */
073: public TexturePainter() {
074:
075: }
076:
077: /**
078: * Creates a <code>TexturePainter</code> instance with the specified
079: * texture properties.
080: */
081: public TexturePainter(TextureProperty prop) {
082: m_texture_prop = prop;
083: }
084:
085: /**
086: * Creates a paint object based on the given texture property.
087: *
088: * @param tp
089: * the texture property used to create the paint. This object
090: * specifies the image for the texture.
091: * @return the Paint object used to render the texture.
092: */
093: private Paint createPaint(Rectangle rect, TextureProperty tp) {
094: BufferedImage bi = tp.getBufferedImage();
095: rect = new Rectangle(0, 0, bi.getWidth(), bi.getHeight());
096: return new TexturePaint(bi, rect);
097: }
098:
099: /**
100: * Painter implementation. Paints a texture pattern on a given graphics
101: * context.
102: *
103: * @param g
104: * the graphics context
105: * @param rect
106: * the rectangle that defines the region to paint. Note, that
107: * this is different than the clipping rectangle.
108: */
109: public void paint(Component c, Graphics g, Rectangle rect) {
110: if (rect == null || m_texture_prop == null)
111: return;
112:
113: Graphics2D g2 = (Graphics2D) g;
114: Paint old_paint = g2.getPaint();
115:
116: if (m_cached_paint == null || !rect.equals(m_last_rect)) {
117: m_last_rect = rect;
118: m_cached_paint = createPaint(rect, m_texture_prop);
119: }
120: g2.setPaint(m_cached_paint);
121: g2.translate(rect.x, rect.y);
122: g.fillRect(0, 0, rect.width, rect.height);
123: g2.translate(-rect.x, -rect.y);
124: g2.setPaint(old_paint);
125: }
126:
127: /**
128: * Sets the texture attributes for this painter
129: *
130: * @param prop
131: * the texture property to set.
132: */
133: public void setTextureProperty(TextureProperty prop) {
134: m_cached_paint = null;
135: m_texture_prop = prop;
136: }
137: }
|