package pt.tumba.parser.swf; import java.io.IOException; /** * A Placement holds the transformation and other values relating to the * "placement" of a Symbol Instance within a particular frame. * *@author unknown *@created 15 de Setembro de 2002 */ public class Placement { /** * Description of the Field */ protected boolean isAlteration; /** * Description of the Field */ protected boolean isReplacement; /** * Description of the Field */ protected int frameNumber; /** * Description of the Field */ protected Instance instance; /** * Description of the Field */ protected Transform matrix; /** * Description of the Field */ protected AlphaTransform cxform; /** * Description of the Field */ protected String name; /** * Description of the Field */ protected int ratio = -1; /** * Description of the Field */ protected int clipDepth = -1; /** * Description of the Field */ protected boolean isRemove = false; /** * Description of the Field */ protected Actions[] clipActions; /** * Return true if the placement is replacing the symbol at a given depth * with a new symbol * *@return The replacement value */ public boolean isReplacement() { return isReplacement; } /** * Return true if this placement is an alteration to an Instance that was * placed in a previous frame. * *@return The alteration value */ public boolean isAlteration() { return isAlteration; } /** * Get the number of the frame within which this placement takes place * *@return The frameNumber value */ public int getFrameNumber() { return frameNumber; } /** * Get the Symbol Instance represented by this Placement * *@return The instance value */ public Instance getInstance() { return instance; } /** * The transform may be null * *@return The transform value */ public Transform getTransform() { return matrix; } /** * The color transform may be null * *@return The colorTransform value */ public AlphaTransform getColorTransform() { return cxform; } /** * The name only relates to MovieClip instances and may be null. The name * is only present on the first Placement of an Instance. * *@return The name value */ public String getName() { return name; } /** * The ratio only relates to Morph Shapes and will be -1 otherwise. The * ratio is from zero to 65535 and denotes the degree of the morph from the * initial shape to the final shape. * *@return The ratio value */ public int getRatio() { return ratio; } /** * The clip depth defines the range of depths which will be clipped by this * symbol. All symbols placed at depths from depth+1 to clipDepth * (inclusive) will be clipped. If this symbol is not a clipping symbol * then the clip depth will be -1. The clip depth is only present on the * first Placement of an Instance. * *@return The clipDepth value */ public int getClipDepth() { return clipDepth; } /** * If true then this Placement denotes the removal of the Instance from the * stage. * *@return The remove value */ public boolean isRemove() { return isRemove; } /** * Get the actions for a movie clip * *@return The clipActions value */ public Actions[] getClipActions() { return clipActions; } /** * Set the actions for a movie clip * *@param clipActions The new clipActions value */ public void setClipActions(Actions[] clipActions) { this.clipActions = clipActions; } /** * Constructor for the Placement object * *@param instance Description of the Parameter *@param frameNumber Description of the Parameter */ protected Placement(Instance instance, int frameNumber) { this.instance = instance; this.frameNumber = frameNumber; this.isRemove = true; } /** * Constructor for the Placement object * *@param instance Description of the Parameter *@param matrix Description of the Parameter *@param cxform Description of the Parameter *@param name Description of the Parameter *@param ratio Description of the Parameter *@param clipDepth Description of the Parameter *@param frameNumber Description of the Parameter *@param alteration Description of the Parameter *@param replacement Description of the Parameter *@param clipActions Description of the Parameter */ protected Placement(Instance instance, Transform matrix, AlphaTransform cxform, String name, int ratio, int clipDepth, int frameNumber, boolean alteration, boolean replacement, Actions[] clipActions) { this.instance = instance; this.frameNumber = frameNumber; this.matrix = matrix; this.cxform = cxform; this.name = name; this.ratio = ratio; this.clipDepth = clipDepth; this.isRemove = false; this.isAlteration = alteration; this.isReplacement = replacement; this.clipActions = clipActions; } /** * Description of the Method * *@param movie Description of the Parameter *@param timelineWriter Description of the Parameter *@param definitionWriter Description of the Parameter *@exception IOException Description of the Exception */ protected void flushDefinitions(Movie movie, SWFTagTypes timelineWriter, SWFTagTypes definitionWriter) throws IOException { if ((!isAlteration) && !isRemove) { //--Make sure that the symbol is defined Symbol symbol = instance.getSymbol(); symbol.define(movie, timelineWriter, definitionWriter); } } /** * Description of the Method * *@param movie Description of the Parameter *@param movieTagWriter Description of the Parameter *@param timelineTagWriter Description of the Parameter *@exception IOException Description of the Exception */ protected void write(Movie movie, SWFTagTypes movieTagWriter, SWFTagTypes timelineTagWriter) throws IOException { int depth = instance.getDepth(); if (depth < 0) { return; } if (isRemove) { //--Remove the instance timelineTagWriter.tagRemoveObject2(depth); return; } //--Check whether the Instance has been placed if (!isAlteration) { //--Make sure that the symbol is defined Symbol symbol = instance.getSymbol(); int id = symbol.define(movie, timelineTagWriter, movieTagWriter); int flags = 0; if (clipActions != null && clipActions.length > 0) { for (int i = 0; i < clipActions.length; i++) { flags |= clipActions[i].getConditions(); } } SWFActions acts = timelineTagWriter.tagPlaceObject2( isReplacement, clipDepth, depth, id, matrix, cxform, ratio, name, flags); if (clipActions != null && clipActions.length > 0) { for (int i = 0; i < clipActions.length; i++) { acts.start(clipActions[i].getConditions()); acts.blob(clipActions[i].bytes); } acts.done(); } } else { //--Instance is placed - this is just a move timelineTagWriter.tagPlaceObject2(true, clipDepth, depth, -1, matrix, cxform, ratio, null, 0); } } }