📄 fsif.java
字号:
/*
* FSIf.java
* Transform
*
* Copyright (c) 2001-2006 Flagstone Software Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither the name of Flagstone Software Ltd. nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.flagstone.transform;
/**
The FSIf action is used to perform a conditional branch to control the actions executed
by the Flash Player.
<p>When executed, the FSIf action pops a value from the stack and evaluates it to see whether it evaluates as true or false. If the boolean value is true the offset attribute of the FSIf action is added to the Flash Player's instruction pointer and execution of the stream of actions continues from that location. If the boolean value is false then no branch is taken.</p>
<p>Although the Flash Player contains an instruction pointer it does not support an explicit address space. The instruction pointer is used to reference actions within the current stream of actions being executed whether they are associated with a given frame, button or movie clip. The value contained in the instruction pointer is the address relative to the start of the current stream.</p>
<table class="datasheet">
<tr><th align="left" colspan="2">Attributes</th></tr>
<tr>
<td><a name="FSIf_0">type</a></td>
<td>Identifies the action when it is encoded. Read-only.</td>
</tr>
<tr>
<td><a name="FSIf_1">offset</a></td>
<td>The offset, relative to the current instruction pointer, to jump to if the value on the Stack evaluates to true.</td>
</tr>
</table>
<p>The offset is a signed number, allowing branches up to -32768 to 32767 bytes. The instruction pointer points to the next instruction in the stream of actions being executed so specifying an offset of zero will have no effect on the sequence of instructions executed.</p>
<p>If the value popped off the stack is a number it is evaluated as true if it is non-zero. If the value is a string it is evaluated to true if it is not an empty string ("") or the strings "0" or "false".</p>
<pre>
FSDoAction actions = new FSDoAction();
actions.add(new FSPush("a"));
actions.add(FSAction.GetVariable());
actions.add(new FSPush(3));
actions.add(FSAction.Equals());
actions.add(new FSIf(32));
</pre>
<h1 class="datasheet">History</h1>
<p>The FSIf class represents the ActionIf action of the Macromedia Flash (SWF) File Format Specification. It was introduced in Flash 4.</p>
*/
public class FSIf extends FSActionObject
{
private int offset = 0;
/**
* Construct an FSIf object, initalizing it with values decoded from an
* encoded object.
*
* @param coder an FSCoder containing the binary data.
*/
public FSIf(FSCoder coder)
{
super(If);
decode(coder);
}
/** Constructs an if action with the specified offset. The offset must be in the range -32768..32767.
@param anOffset the number of bytes to add to the instruction pointer if the value popped off the stack evaluates to true.
*/
public FSIf(int anOffset)
{
super(If);
setOffset(anOffset);
}
/**
* Constructs an FSIf object by copying values from an existing object.
*
* @param obj an FSIf object.
*/
public FSIf(FSIf obj)
{
super(obj);
offset = obj.offset;
}
/** Gets the offset that will be added to the instruction pointer if the value at the top of the stack evaluates to true (non-zero).
@return the number of bytes representing the offset.
*/
public int getOffset() { return offset; }
/** Sets the offset to add to the instruction pointer if the value at the top of the stack evaluates to true (non-zero). The offset must be in the range -32768..32767.
@param aNumber the number of bytes to add to the instruction pointer.
*/
public void setOffset(int aNumber)
{
offset = aNumber;
}
public boolean equals(Object anObject)
{
boolean result = false;
if (super.equals(anObject))
result = offset == ((FSIf)anObject).getOffset();
return result;
}
public void appendDescription(StringBuffer buffer, int depth)
{
buffer.append(name());
if (depth > 0)
{
buffer.append(": { ");
Transform.append(buffer, "offset", offset);
buffer.append("}");
}
}
public int length(FSCoder coder)
{
super.length(coder);
length += 2;
return length;
}
public void encode(FSCoder coder)
{
super.encode(coder);
coder.writeWord(offset, 2);
coder.endObject(name());
}
public void decode(FSCoder coder)
{
super.decode(coder);
offset = coder.readWord(2, true);
coder.endObject(name());
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -