001: /*
002: *
003: *
004: * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026: package com.sun.perseus.model;
027:
028: import com.sun.perseus.j2d.Box;
029: import com.sun.perseus.j2d.RenderGraphics;
030: import com.sun.perseus.j2d.TextRenderingProperties;
031: import com.sun.perseus.j2d.Tile;
032: import com.sun.perseus.j2d.Transform;
033:
034: /**
035: * A <code>GlyphNodeProxy</code> delegates its rendering to a
036: * proxied <code>Glyph</code> object.
037: *
038: * @version $Id: GlyphProxy.java,v 1.10 2006/06/29 10:47:31 ln156897 Exp $
039: */
040: public final class GlyphProxy {
041: /**
042: * The origin of the glyph on the x axis.
043: */
044: protected float x;
045:
046: /**
047: * The glyph's rotation
048: */
049: protected float rotate;
050:
051: /**
052: * The proxied glyph.
053: */
054: protected Glyph proxied;
055:
056: /**
057: * The next GlyphProxy sibling.
058: */
059: protected GlyphProxy nextSibling;
060:
061: /**
062: * The previous GlyphProxy sibling.
063: */
064: protected GlyphProxy prevSibling;
065:
066: /**
067: * @param proxied <code>Glyph</code> node to proxy. Should not
068: * be null.
069: */
070: public GlyphProxy(final Glyph proxied) {
071: this .proxied = proxied;
072: }
073:
074: /**
075: * @param pt the x/y coordinate. Should never be null and be
076: * of size two. If not, the behavior is unspecified. The point
077: * should be in user space.
078: * @param trp the <tt>TextRenderingProperties</tt> containing the properties
079: * applicable to the hit detection operation. This is used
080: * because the same node may be referenced multiple times
081: * by different proxies.
082: * @return true if this node is hit by the input point. The input point
083: * is in viewport space. This is invoked in the hit detection
084: * process after the node's properties have been applied and the
085: * display value has been checked (i.e., the node is actually rendered).
086: *
087: * @see #nodeHitAt
088: */
089: protected boolean isHit(final float[] pt,
090: final TextRenderingProperties trp) {
091: return proxied.isHit(pt, trp);
092: }
093:
094: /**
095: * @param bbox the bounding box to which this node's bounding box should be
096: * appended. That bounding box is in the target coordinate space. It
097: * may be null, in which case this node should create a new one.
098: * @param t the transform from the node coordinate system to the coordinate
099: * system into which the bounds should be computed.
100: * @return the bounding box of this node, in the target coordinate space,
101: */
102: Box addNodeBBox(final Box bbox, final Transform t) {
103: return proxied.addNodeBBox(bbox, t);
104: }
105:
106: /**
107: * @param newX the new origin on the x-axis
108: */
109: public void setX(final float newX) {
110: this .x = newX;
111: }
112:
113: /**
114: * @param newRotate the new glyph rotation
115: */
116: public void setRotate(final float newRotate) {
117: this .rotate = newRotate;
118: }
119:
120: /**
121: * @return this node's rotation
122: */
123: public float getRotate() {
124: return rotate;
125: }
126:
127: /**
128: * @return this node's origin on the x-axis
129: */
130: public float getX() {
131: return x;
132: }
133:
134: /**
135: * Adds this glyph's bounds to the input tile. If the input tile.
136: *
137: * @param tile the Tile instance whose bounds should be set.
138: * @param trp the TextRenderingProperties describing the nodes rendering
139: * characteristics.
140: * @param t the Transform to the requested tile space, from this node's user
141: * space.
142: * @return the expanded tile.
143: */
144: protected Tile addRenderingTile(Tile tile,
145: final TextRenderingProperties trp, final Transform t) {
146: return proxied.addRenderingTile(tile, trp, t);
147: }
148:
149: /**
150: * Apply this node's x/y translation.
151: *
152: * @param tx the <code>Transform</code> to add node transform to.
153: * This is guaranteed to be not null.
154: */
155: protected void applyTransform(final Transform tx) {
156: // Add this node's x/y translation.
157: tx.mTranslate(x, 0);
158:
159: // Rotate the glyph
160: tx.mRotate(rotate);
161:
162: proxied.applyTransform(tx);
163: }
164:
165: /**
166: * Apply this node inverse additional transform.
167: *
168: * @param tx the <code>Transform</code> to add node transform to.
169: * This is guaranteed to be not null.
170: */
171: protected void applyInverseTransform(final Transform tx) {
172: proxied.applyInverseTransform(tx);
173:
174: // Rotate the glyph
175: tx.mRotate(-rotate);
176:
177: // Add this node's x/y translation.
178: tx.mTranslate(-x, 0);
179: }
180:
181: /**
182: * @return a string description of this ElementNodeProxy
183: */
184: public String toString() {
185: return "GlyphProxy[x=" + x + " rotate=" + rotate + " proxied="
186: + proxied + "][" + super .toString() + "]";
187: }
188: }
|