001: /*
002: * Copyright (c) 2001-2006 JGoodies Karsten Lentzsch. 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 JGoodies Karsten Lentzsch 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:
031: package com.jgoodies.animation.renderer;
032:
033: import java.awt.Color;
034: import java.awt.Graphics2D;
035:
036: import com.jgoodies.animation.AnimationFunction;
037: import com.jgoodies.animation.AnimationFunctions;
038:
039: /**
040: * Renders the glyphs of a string with individual scaling, transform, and color.
041: *
042: * @author Karsten Lentzsch
043: * @version $Revision: 1.1 $
044: */
045: public final class GlyphRenderer extends AbstractTextRenderer {
046:
047: private final AnimationFunction colorFunction;
048: private final AnimationFunctions.FloatFunction scaleFunction;
049: private final long glyphDelay;
050:
051: private long time;
052:
053: // Instance Creation ******************************************************
054:
055: /**
056: * Constructs a <code>GlyphRenderer</code> that paints
057: * individual glyphs with different transforms.
058: *
059: * @param text the initial text
060: * @param scaleFunction maps times to glyph scales
061: * @param translateFunction maps times to glyph translations
062: * @param colorFunction maps times to colors
063: * @param glyphDelay a time delay between the glyph animations
064: */
065: public GlyphRenderer(String text, AnimationFunction scaleFunction,
066: AnimationFunction translateFunction,
067: AnimationFunction colorFunction, long glyphDelay) {
068: super (text);
069: this .scaleFunction = AnimationFunctions.asFloat(scaleFunction);
070: this .colorFunction = colorFunction;
071: this .glyphDelay = glyphDelay;
072: this .time = 0;
073: }
074:
075: // Accessors **************************************************************
076:
077: public long getTime() {
078: return time;
079: }
080:
081: public void setTime(long time) {
082: this .time = time;
083: }
084:
085: private long relativeTime(int glyphIndex) {
086: return Math.max(0, time - glyphDelay * glyphIndex);
087: }
088:
089: private float scaleAt(int glyphIndex) {
090: return scaleFunction.valueAt(relativeTime(glyphIndex));
091: }
092:
093: private Color colorAt(int glyphIndex) {
094: return (Color) colorFunction.valueAt(relativeTime(glyphIndex));
095: }
096:
097: /**
098: * Renders the text. Firstly, ensures a valid cache,
099: * then sets the color, and finally paints the cached glyph shaped,
100: * using individual transforms.
101: *
102: * @param g2 the graphics object to render on
103: * @param width the width of the graphics area
104: * @param height the height of the graphics area
105: */
106: public void render(Graphics2D g2, int width, int height) {
107: ensureValidCache(g2);
108:
109: int glyphCount = cachedGlyphShapes.length;
110: float offsetX = (width - cachedTextWidth) / 2.0f;
111: float offsetY = (height + cachedTextHeight) / 2.0f
112: - getAdjustedDescent();
113:
114: g2.translate(offsetX, offsetY);
115: for (int i = glyphCount - 1; i >= 0; i--) {
116: float scale = scaleAt(i);
117: //float translate = translateAt(i);
118:
119: g2.setColor(colorAt(i));
120: //g2.translate(translate, 0);
121:
122: double glyphX = cachedGlyphVector.getGlyphPosition(i)
123: .getX();
124: double glyphY = cachedGlyphVector.getGlyphVisualBounds(i)
125: .getBounds2D().getHeight();
126: double adjustX = -glyphX * (scale - 1.0f);
127: double adjustY = glyphY * (scale - 1.0f) / 2.0f;
128: g2.translate(adjustX, adjustY);
129: g2.scale(scale, scale);
130: g2.fill(cachedGlyphShapes[i]);
131: g2.scale(1.0f / scale, 1.0f / scale);
132: g2.translate(-adjustX, -adjustY);
133: //g2.translate(-translate, 0);
134: }
135: g2.translate(-offsetX, -offsetY);
136: }
137: }
|