FileDocCategorySizeDatePackage
GlyphProxy.javaAPI DocphoneME MR2 API (J2ME)5888Wed May 02 18:00:36 BST 2007com.sun.perseus.model

GlyphProxy.java

/*
 *
 *
 * Copyright  1990-2007 Sun Microsystems, Inc. All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version
 * 2 only, as published by the Free Software Foundation.
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License version 2 for more details (a copy is
 * included at /legal/license.txt).
 * 
 * You should have received a copy of the GNU General Public License
 * version 2 along with this work; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 * 
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
 * Clara, CA 95054 or visit www.sun.com if you need additional
 * information or have any questions.
 */
package com.sun.perseus.model;

import com.sun.perseus.j2d.Box;
import com.sun.perseus.j2d.RenderGraphics;
import com.sun.perseus.j2d.TextRenderingProperties;
import com.sun.perseus.j2d.Tile;
import com.sun.perseus.j2d.Transform;

/**
 * A <code>GlyphNodeProxy</code> delegates its rendering to a 
 * proxied <code>Glyph</code> object. 
 *
 * @version $Id: GlyphProxy.java,v 1.10 2006/06/29 10:47:31 ln156897 Exp $
 */
public final class GlyphProxy {
    /**
     * The origin of the glyph on the x axis.
     */
    protected float x;

    /**
     * The glyph's rotation
     */
    protected float rotate;

    /**
     * The proxied glyph.
     */
    protected Glyph proxied;

    /**
     * The next GlyphProxy sibling.
     */
    protected GlyphProxy nextSibling;

    /**
     * The previous GlyphProxy sibling.
     */
    protected GlyphProxy prevSibling;

    /**
     * @param proxied <code>Glyph</code> node to proxy. Should not
     * be null.
     */
    public GlyphProxy(final Glyph proxied) {
        this.proxied = proxied;
    }

    /**
     * @param pt the x/y coordinate. Should never be null and be
     *        of size two. If not, the behavior is unspecified. The point
     *        should be in user space.
     * @param trp the <tt>TextRenderingProperties</tt> containing the properties
     *        applicable to the hit detection operation. This is used
     *        because the same node may be referenced multiple times
     *        by different proxies. 
     * @return true if this node is hit by the input point. The input point
     * is in viewport space. This is invoked in the hit detection
     * process after the node's properties have been applied and the 
     * display value has been checked (i.e., the node is actually rendered).
     *  
     * @see #nodeHitAt
     */
    protected boolean isHit(final float[] pt, 
                            final TextRenderingProperties trp) {
        return proxied.isHit(pt, trp);
    }
    
    /**
     * @param bbox the bounding box to which this node's bounding box should be
     *        appended. That bounding box is in the target coordinate space. It 
     *        may be null, in which case this node should create a new one.
     * @param t the transform from the node coordinate system to the coordinate
     *        system into which the bounds should be computed.
     * @return the bounding box of this node, in the target coordinate space, 
     */
    Box addNodeBBox(final Box bbox, 
                    final Transform t) {
        return proxied.addNodeBBox(bbox, t);
    }

    /**
     * @param newX the new origin on the x-axis
     */
    public void setX(final float newX) {
        this.x = newX;
    }

    /**
     * @param newRotate the new glyph rotation
     */
    public void setRotate(final float newRotate) {
        this.rotate = newRotate;
    }

    /**
     * @return this node's rotation
     */
    public float getRotate() {
        return rotate;
    }

    /**
     * @return this node's origin on the x-axis
     */
    public float getX() {
        return x;
    }

    /**
     * Adds this glyph's bounds to the input tile. If the input tile.
     *
     * @param tile the Tile instance whose bounds should be set.
     * @param trp the TextRenderingProperties describing the nodes rendering 
     *        characteristics.
     * @param t the Transform to the requested tile space, from this node's user
     *        space.
     * @return the expanded tile.
     */
    protected Tile addRenderingTile(Tile tile, 
                                    final TextRenderingProperties trp,
                                    final Transform t) {
        return proxied.addRenderingTile(tile, trp, t);
    }

    /**
     * Apply this node's x/y translation.
     *
     * @param tx the <code>Transform</code> to add node transform to.
     *        This is guaranteed to be not null.
     */
    protected void applyTransform(final Transform tx) {
        // Add this node's x/y translation.
        tx.mTranslate(x, 0);

        // Rotate the glyph
        tx.mRotate(rotate);

        proxied.applyTransform(tx);
    }

    /**
     * Apply this node inverse additional transform.
     *
     * @param tx the <code>Transform</code> to add node transform to.
     *        This is guaranteed to be not null.
     */
    protected void applyInverseTransform(final Transform tx) {
        proxied.applyInverseTransform(tx);

        // Rotate the glyph
        tx.mRotate(-rotate);

        // Add this node's x/y translation.
        tx.mTranslate(-x, 0);
    }

    /**
     * @return a string description of this ElementNodeProxy
     */
    public String toString() {
        return "GlyphProxy[x=" + x + " rotate=" + rotate
            + " proxied=" + proxied + "][" + super.toString() + "]";
    }
}