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

AbstractRenderingNode

public abstract class AbstractRenderingNode extends CompositeGraphicsNode implements Transformable
Typical base class for nodes which render something (shapes and images).
version
$Id: AbstractRenderingNode.java,v 1.13 2006/06/29 10:47:28 ln156897 Exp $

Fields Summary
protected com.sun.perseus.j2d.Transform
transform
The Transform applied to this node.
protected com.sun.perseus.j2d.Transform
motion
The motion transform applied to this node. This is typically used for animateMotion, but it can be used as a regular trait as well.
protected RenderingManager
renderingManager
Used to track the node's rendering area and the rendered areas.
Constructors Summary
public AbstractRenderingNode(DocumentNode ownerDocument)
Constructor.

param
ownerDocument this element's owner DocumentNode

        super(ownerDocument);

        if (DirtyAreaManager.ON) {
            renderingManager = new RenderingManager(this);
        }
    
Methods Summary
com.sun.perseus.j2d.BoxaddBBox(com.sun.perseus.j2d.Box bbox, com.sun.perseus.j2d.Transform t)

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 to apply from the node's coordinate space to the target coordinate space. May be null for the identity transform.
return
the node's bounding box in the target coordinate space.

        return addNodeBBox(bbox, t);
    
protected com.sun.perseus.j2d.TransformappendTransform(com.sun.perseus.j2d.Transform tx, com.sun.perseus.j2d.Transform workTx)
Appends this node's transform, if it is not null.

param
tx the Transform to apply additional node transforms to. This may be null.
param
workTx a Transform which can be re-used if a new Transform needs to be created and workTx is not the same instance as tx.
return
a transform with this node's transform added.

        if (transform == null && motion == null) {
            return tx;
        } 

        tx = recycleTransform(tx, workTx);
        
        if (motion != null) {
            tx.mMultiply(motion);
        }

        if (transform != null) {
            tx.mMultiply(transform);
        }

        return tx;
    
ElementNodeProxybuildProxy()

return
an adequate ElementNodeProxy for this node.

        return new AbstractRenderingNodeProxy(this);
    
protected voidclearLastRenderedTile()
After calling this method, getLastRenderedTile should always return null.

        renderingManager.clearLastRenderedTile();
    
protected voidclearLayouts()
Clears the text layouts, if any exist. This is typically called when the font selection has changed and nodes such as Text should recompute their layouts. This should recursively call clearLayouts on children node or expanded content, if any.

    
protected final voidcomputeRenderingTile(com.sun.perseus.j2d.Tile tile)
Computes this node's rendering tile.

param
tile the Tile instance whose bounds should be set.
return
the device space rendering tile.

        computeRenderingTile(tile, txf, this);
    
abstract voidcomputeRenderingTile(com.sun.perseus.j2d.Tile tile, com.sun.perseus.j2d.Transform t, com.sun.perseus.j2d.GraphicsProperties gp)
Computes the rendering tile for the given set of GraphicsProperties.

param
tile the Tile instance whose bounds should be set.
param
t the Transform to the requested tile space, from this node's user space.
param
gp the GraphicsProperties for which the tile should be computed.
return
the screen bounding box when this node is rendered with the given render context.

TraitAnimcreateTraitAnimImpl(java.lang.String traitName)

param
traitName the trait name.

        if (SVGConstants.SVG_TRANSFORM_ATTRIBUTE == traitName) {
            return new TransformTraitAnim(this, traitName);
        } else if (SVGConstants.SVG_MOTION_PSEUDO_ATTRIBUTE == traitName) {
            return new MotionTraitAnim(this, traitName);
        } else {
            return super.createTraitAnimImpl(traitName);
        }
    
public org.w3c.dom.svg.SVGRectgetBBox()

return
the tight bounding box in current user coordinate space.

        return addNodeBBox(null, null);
    
protected com.sun.perseus.j2d.TilegetLastRenderedTile()

return
the tile which encompasses the node's last actual rendering. If this node's hasRendering method returns false, then this method should return null. By default, this method returns null because hasNodeRendering returns null by default.

        return renderingManager.getLastRenderedTile();
    
org.w3c.dom.svg.SVGMatrixgetMatrixTraitImpl(java.lang.String name)
AbstractShapeNode handles the transform attribute. Other attributes are handled by the super class.

param
name matrix trait name.
return
the trait value corresponding to name as SVGMatrix.
throws
DOMException with error code NOT_SUPPORTED_ERROR if the requested trait is not supported on this element or null.
throws
DOMException with error code TYPE_MISMATCH_ERR if requested trait's computed value cannot be converted to {@link org.w3c.dom.svg.SVGMatrix SVGMatrix}

        if (SVGConstants.SVG_TRANSFORM_ATTRIBUTE.equals(name)) {
            return toSVGMatrixTrait(transform);
        } else if (SVGConstants.SVG_MOTION_PSEUDO_ATTRIBUTE.equals(name)) {
            return toSVGMatrixTrait(motion);
        } else {
            return super.getMatrixTraitImpl(name);
        }
    
public com.sun.perseus.j2d.TransformgetMotion()

return
This node's motion transform.

        return motion;
    
public intgetNumberOfProperties()

return
the number of properties on this node.

        return NUMBER_OF_PROPERTIES;
    
protected com.sun.perseus.j2d.TilegetRenderingTile()

return
the bounding box, in screen coordinate, which encompasses the node's rendering.

        return renderingManager.getRenderingTile();
    
public org.w3c.dom.svg.SVGRectgetScreenBBox()

return
the tight bounding box in screen coordinate space.

        // There is no screen bounding box if the element is not hooked
        // into the main tree.
        if (!inDocumentTree()) {
            return null;
        }

        return addNodeBBox(null, txf);
    
public java.lang.StringgetTraitImpl(java.lang.String name)
AbstractShapeNode handles the transform attribute. Other attributes are handled by the super class.

param
name the name of the requested trait.
return
the value of the requested trait, as a string.
throws
DOMException with error code NOT_SUPPORTED_ERROR if the requested trait is not supported on this element or null.
throws
DOMException with error code TYPE_MISMATCH_ERR if requested trait's computed value cannot be converted to a String (SVG Tiny only).

        if (SVGConstants.SVG_TRANSFORM_ATTRIBUTE == name) {
            return toStringTrait(transform);
        } else if (SVGConstants.SVG_MOTION_PSEUDO_ATTRIBUTE == name) {
            return toStringTrait(motion);
        } else {
            return super.getTraitImpl(name);
        }
    
public com.sun.perseus.j2d.TransformgetTransform()

return
This Transformable's transform.

        return transform;
    
public booleanhasNodeRendering()
An AbstractRenderingNode has something to render

return
true

        return true;
    
abstract booleanisHitVP(float[] pt)
Returns true if this node is hit by the input point. The input point is in viewport space.

return
true if the node is hit by the input point.
see
#nodeHitAt

abstract booleanisProxyHitVP(float[] pt, AbstractRenderingNodeProxy proxy)
Returns true if this proxy node is hit by the input point. The input point is in viewport space.

param
pt the x/y coordinate. Should never be null and be of size two. If not, the behavior is unspecified. The x/y coordinate is in viewport space.
param
proxy the tested ElementNodeProxy.
return
true if the node is hit by the input point.
see
#isHitVP

public ModelNodenodeHitAt(float[] pt)
Returns the ModelNode, if any, hit by the point at coordinate x/y.

param
pt the x/y coordinate. Should never be null and be of size two. If not, the behavior is unspecified. The coordinates are in viewport space.
return
the ModelNode hit at the given point or null if none was hit.

        // If a node does not render, it is never hit
        if ((canRenderState != 0) || !isHitVP(pt)) {
            return null;
        }

        return this;
    
voidnodeHookedInDocumentTree()
To be overriddent by derived classes, such as TimedElementNode, if they need to do special operations when hooked into the document tree.

        super.nodeHookedInDocumentTree();
        renderingDirty();
    
protected voidnodeRendered()
Simply notifies the RenderingManager.

        if (DirtyAreaManager.ON) {
            renderingManager.rendered();
        }
    
voidnodeUnhookedFromDocumentTree()
To be overriddent by derived classes, such as TimedElementNode, if they need to do special operations when unhooked from the document tree.

        super.nodeUnhookedFromDocumentTree();
        renderingDirty();
    
public voidpaint(com.sun.perseus.j2d.RenderGraphics rg)
Paints this node into the input RenderGraphics.

param
rg the RenderGraphics where the node should paint itself

        if ((canRenderState != 0)) {
            return;
        }

        if (DirtyAreaManager.ON) {
            Tile primitiveTile = getRenderingTile();
            if (primitiveTile == null 
                || 
                rg.getRenderingTile().isHit(primitiveTile)) {
                // rg.setPrimitiveTile(primitiveTile);
                paintRendered(rg, this, this, txf);

                // nodeRendered is called seperately from paintRendered
                // because paintRendered is used in different contexts,
                // for example by proxy nodes to render, using their
                // proxied node's paintRendered method.
                nodeRendered();
            }
        } else {
            paintRendered(rg, this, this, txf);
        }
    
abstract voidpaintRendered(com.sun.perseus.j2d.RenderGraphics rg, com.sun.perseus.j2d.GraphicsProperties gp, com.sun.perseus.j2d.PaintTarget pt, com.sun.perseus.j2d.Transform tx)
Paints this node into the input RenderGraphics.

param
rg this node is painted into this RenderGraphics
param
gp the GraphicsProperties controlling the operation's rendering
param
pt the PaintTarget for the paint operation.
param
txf the Transform from user space to device space for the paint operation.

protected voidpropagateFloatPropertyState(int propertyIndex, float parentPropertyValue)
Called when the computed value of the given float property has changed. On a rendering node, as we do not render regular children nor expanded content, we do not propagate property state changes.

param
propertyIndex index for the property whose value has changed.
param
parentPropertyValue the value that children of this node should now inherit.

        // Propagate to proxies.
        if (firstProxy != null) {
            ElementNodeProxy proxy = firstProxy;
            while (proxy != null) {
                ((CompositeGraphicsNodeProxy) proxy)
                    .proxiedFloatPropertyStateChange(propertyIndex, 
                                                     parentPropertyValue);
                proxy = proxy.nextProxy;
            }
        }
    
protected voidpropagatePackedPropertyState(int propertyIndex, int parentPropertyValue)
Called when the computed value of the given packed property has changed. On a rendering node, as we do not render regular children nor expanded content, we do not propagate property state changes.

param
propertyIndex index for the property whose value has changed.
param
parentPropertyValue the value that children of this node should now inherit.

        // Propagate to proxies.
        if (firstProxy != null) {
            ElementNodeProxy proxy = firstProxy;
            while (proxy != null) {
                ((CompositeGraphicsNodeProxy) proxy)
                    .proxiedPackedPropertyStateChange(propertyIndex, 
                                                      parentPropertyValue);
                proxy = proxy.nextProxy;
            }
        }
    
protected voidpropagatePropertyState(int propertyIndex, java.lang.Object parentPropertyValue)
Called when the computed value of the given property has changed. On a rendering node, as we do not render regular children nor expanded content, we do not propagate property state changes.

param
propertyIndex index for the property whose value has changed.
param
parentPropertyValue the value that children of this node should now inherit.

        // Propagate to proxies.
        if (firstProxy != null) {
            ElementNodeProxy proxy = firstProxy;
            while (proxy != null) {
                ((CompositeGraphicsNodeProxy) proxy).proxiedPropertyStateChange(
                        propertyIndex, 
                        parentPropertyValue);
                proxy = proxy.nextProxy;
            }
        }
    
ModelNodeproxyNodeHitAt(float[] pt, ElementNodeProxy proxy)
Returns the ModelNode, if any, hit by the point at coordinate x/y in the proxy tree starting at proxy.

param
pt the x/y coordinate. Should never be null and be of size two. If not, the behavior is unspecified. The coordinates are in viewport space.
param
proxy the root of the proxy tree to test.
return
the ModelNode hit at the given point or null if none was hit.

        // If a node does not render, it is never hit
        if ((canRenderState != 0) || 
                !isProxyHitVP(pt, (AbstractRenderingNodeProxy) proxy)) {
            return null;
        }

        return proxy;
    
protected voidrecomputeTransformState(com.sun.perseus.j2d.Transform parentTransform)
Recomputes the transform cache, if one exists. This should recursively call recomputeTransformState on children node or expanded content, if any child is rendered down below.

param
parentTransform the Transform applied to this node's parent.

        txf = appendTransform(parentTransform, txf);
        inverseTxf = null;
        computeCanRenderTransformBit(txf);
        renderingDirty();
    
final voidrenderingDirty()
Should be called whenever this node's rendering becomes dirty.

        if (DirtyAreaManager.ON) {
            renderingManager.dirty();
        }
    
voidsetComputedDisplay(boolean newDisplay)

param
newDisplay the new computed display value

        super.setComputedDisplay(newDisplay);

        renderingDirty();
    
voidsetComputedVisibility(boolean newVisibility)

param
newVisibility the new computed visibility property.

        super.setComputedVisibility(newVisibility);

        renderingDirty();
    
voidsetFloatArrayTrait(java.lang.String name, float[][] value)
Set the trait value as float array.

param
name the trait's name.
param
value the trait's value.
throws
DOMException with error code NOT_SUPPORTED_ERROR if the requested trait is not supported on this element.
throws
DOMException with error code TYPE_MISMATCH_ERR if the requested trait's value cannot be specified as a float
throws
DOMException with error code INVALID_ACCESS_ERR if the input value is an invalid value for the given trait.

        if (SVGConstants.SVG_TRANSFORM_ATTRIBUTE == name) {
            if (transform == null) {
                modifyingNode();
                transform = new Transform(value[0][0],
                                          value[1][0],
                                          value[2][0],
                                          value[3][0],
                                          value[4][0],
                                          value[5][0]);
            } else {
                if (!transform.equals(value)) {
                    modifyingNode();
                    transform.setTransform(value[0][0],
                                           value[1][0],
                                           value[2][0],
                                           value[3][0],
                                           value[4][0],
                                           value[5][0]);
                } else {
                    return;
                }
            }
            recomputeTransformState();
            recomputeProxyTransformState();
            modifiedNode();
        } else if (SVGConstants.SVG_MOTION_PSEUDO_ATTRIBUTE == name) {
            if (motion == null) {
                modifyingNode();
                motion = new Transform(value[0][0],
                                       value[1][0],
                                       value[2][0],
                                       value[3][0],
                                       value[4][0],
                                       value[5][0]);
            } else {
                if (!motion.equals(value)) {
                    modifyingNode();
                    motion.setTransform(value[0][0],
                                        value[1][0],
                                        value[2][0],
                                        value[3][0],
                                        value[4][0],
                                        value[5][0]);
                } else {
                    return;
                }
            }
            recomputeTransformState();
            recomputeProxyTransformState();
            modifiedNode();
        } else {
            super.setFloatArrayTrait(name, value);
        }    
    
voidsetMatrixTraitImpl(java.lang.String name, com.sun.perseus.j2d.Transform matrix)
AbstractShapeNode handles the transform attribute. Other attributes are handled by the super class.

param
name name of trait to set
param
matrix Transform value of trait
throws
DOMException with error code NOT_SUPPORTED_ERROR if the requested trait is not supported on this element or null.
throws
DOMException with error code TYPE_MISMATCH_ERR if the requested trait's value cannot be specified as an {@link org.w3c.dom.svg.SVGMatrix SVGMatrix}
throws
DOMException with error code INVALID_ACCESS_ERR if the input value is an invalid value for the given trait or null.
throws
DOMException with error code NO_MODIFICATION_ALLOWED_ERR: if attempt is made to change readonly trait.

        // We use .equals for the transform attribute as the string may not
        // have been interned. We use == for the motion pseudo attribute because
        // it is only used internally and from the SVGConstants strings.
        if (SVGConstants.SVG_TRANSFORM_ATTRIBUTE.equals(name)) {
            setTransform(matrix);
        } else if (SVGConstants.SVG_MOTION_PSEUDO_ATTRIBUTE == name) {
            setMotion(matrix);
        } else {
            super.setMatrixTraitImpl(name, matrix);
        }
    
public voidsetMotion(com.sun.perseus.j2d.Transform newMotion)

param
newMotion The new motion transform.

        if (equal(newMotion, motion)) {
            return;
        }

        modifyingNode();
        this.motion = newMotion;
        recomputeTransformState();
        recomputeProxyTransformState();
        modifiedNode();
    
public voidsetTraitImpl(java.lang.String name, java.lang.String value)
AbstractShapeNode handles the transform attribute. Other attributes are handled by the super class.

param
name the name of the trait to set
param
value the string value for the trait to set.
throws
DOMException with error code NOT_SUPPORTED_ERROR if the requested trait is not supported on this element or null.
throws
DOMException with error code TYPE_MISMATCH_ERR if the requested trait's value cannot be specified as a String
throws
DOMException with error code INVALID_ACCESS_ERR if the input value is an invalid value for the given trait or null.
throws
DOMException with error code NO_MODIFICATION_ALLOWED_ERR: if attempt is made to change readonly trait.

        if (SVGConstants.SVG_TRANSFORM_ATTRIBUTE == name) {
            setTransform(parseTransformTrait(name, value));
        } else if (SVGConstants.SVG_MOTION_PSEUDO_ATTRIBUTE == name) {
            setMotion(parseTransformTrait(name, value));
        } else {
            super.setTraitImpl(name, value);
        }
    
public voidsetTransform(com.sun.perseus.j2d.Transform newTransform)

param
newTransform The new Transformable's transform.

        if (equal(transform, newTransform)) {
            return;
        }
        modifyingNode();
        this.transform = newTransform;
        recomputeTransformState();
        recomputeProxyTransformState();
        modifiedNode();
    
booleansupportsTrait(java.lang.String traitName)
AbstractShapeNode handles the transform attribute.

param
traitName the name of the trait which the element may support.
return
true if this element supports the given trait in one of the trait accessor methods.

        if (SVGConstants.SVG_TRANSFORM_ATTRIBUTE == traitName
            ||
            SVGConstants.SVG_MOTION_PSEUDO_ATTRIBUTE == traitName) {
            return true;
        } else {
            return super.supportsTrait(traitName);
        }
    
java.lang.StringtoStringTrait(java.lang.String name, float[][] value)

param
name the name of the trait to convert.
param
value the float trait value to convert.

        if (SVGConstants.SVG_TRANSFORM_ATTRIBUTE == name) {
            Transform transform = new Transform(value[0][0],
                                                value[1][0],
                                                value[2][0],
                                                value[3][0],
                                                value[4][0],
                                                value[5][0]);
            return toStringTrait(transform);
        } else {
            return super.toStringTrait(name, value);
        }
    
public float[][]validateFloatArrayTrait(java.lang.String traitName, java.lang.String value, java.lang.String reqNamespaceURI, java.lang.String reqLocalName, java.lang.String reqTraitNamespace, java.lang.String reqTraitName)
Validates the input trait value.

param
traitName the name of the trait to be validated.
param
value the value to be validated
param
reqNamespaceURI the namespace of the element requesting validation.
param
reqLocalName the local name of the element requesting validation.
param
reqTraitNamespace the namespace of the trait which has the values value on the requesting element.
param
reqTraitName the name of the trait which has the values value on the requesting element.
throws
DOMException with error code INVALID_ACCESS_ERR if the input value is incompatible with the given trait.

        if (SVGConstants.SVG_TRANSFORM_ATTRIBUTE == traitName
            ||
            SVGConstants.SVG_MOTION_PSEUDO_ATTRIBUTE == traitName) {
            Transform txf = parseTransformTrait(traitName, value);
            return new float[][] {{(float) txf.getComponent(0)},
                                  {(float) txf.getComponent(1)},
                                  {(float) txf.getComponent(2)},
                                  {(float) txf.getComponent(3)},
                                  {(float) txf.getComponent(4)},
                                  {(float) txf.getComponent(5)}};
        } else {
            return super.validateFloatArrayTrait(traitName,
                                                 value,
                                                 reqNamespaceURI,
                                                 reqLocalName,
                                                 reqTraitNamespace,
                                                 reqTraitName);
        }