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.Graphics2D;
034:
035: /**
036: * Renders a text with modifiable scaling, color, glyph spacing and position.
037: *
038: * @author Karsten Lentzsch
039: * @version $Revision: 1.1 $
040: */
041: public final class BasicTextRenderer extends AbstractTextRenderer {
042:
043: private float offsetX = 0.0f;
044: private float offsetY = 0.0f;
045: private float scaleX = 1.0f;
046: private float scaleY = 1.0f;
047: private float space = 0.0f;
048:
049: /**
050: * Constructs a renderer for a text that can be scaled, moved, and
051: * change inter-glyph space.
052: *
053: * @param text the text to be displayed
054: */
055: public BasicTextRenderer(String text) {
056: super (text);
057: }
058:
059: public float getOffsetX() {
060: return offsetX;
061: }
062:
063: public float getOffsetY() {
064: return offsetY;
065: }
066:
067: public float getSpace() {
068: return space;
069: }
070:
071: public void setOffsetX(float offsetX) {
072: this .offsetX = offsetX;
073: }
074:
075: public void setOffsetY(float offsetY) {
076: this .offsetY = offsetY;
077: }
078:
079: public void setSpace(float space) {
080: this .space = space;
081: }
082:
083: public float getScaleX() {
084: return scaleX;
085: }
086:
087: public float getScaleY() {
088: return scaleY;
089: }
090:
091: public void setScaleX(float scaleX) {
092: if (scaleX <= 0.0f)
093: throw new IllegalArgumentException(
094: "scaleX must be positive.");
095:
096: this .scaleX = scaleX;
097: }
098:
099: public void setScaleY(float scaleY) {
100: if (scaleY <= 0.0f)
101: throw new IllegalArgumentException(
102: "scaleY must be positive.");
103:
104: this .scaleY = scaleY;
105: }
106:
107: /**
108: * Renders the text. Firstly ensures a valid cache, then sets
109: * the color, and finally paints the cached glyph shapes.
110: *
111: * @param g2 the graphics context to render on
112: * @param width the width of the drawing surface
113: * @param height the height of the drawing surface
114: */
115: public void render(Graphics2D g2, int width, int height) {
116: ensureValidCache(g2);
117:
118: int glyphCount = cachedGlyphShapes.length;
119: float totalSpace = (glyphCount - 1) * space;
120: float totalWidth = cachedTextWidth + totalSpace;
121: float textHeight = getAdjustedAscent();
122: float xOffset = getOffsetX() + (width - totalWidth * scaleX)
123: / 2.0f;
124: float yOffset = getOffsetY() + (height + textHeight * scaleY)
125: / 2.0f - getAdjustedDescent();
126:
127: g2.setColor(getColor());
128: g2.translate(xOffset, yOffset);
129: g2.scale(scaleX, scaleY);
130: for (int i = 0; i < glyphCount; i++) {
131: g2.fill(cachedGlyphShapes[i]);
132: g2.translate(space, 0);
133: }
134: g2.scale(1.0f / scaleX, 1.0f / scaleY);
135: g2.translate(-totalSpace - xOffset, -yOffset);
136: }
137:
138: }
|