mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-05-29 18:34:42 +00:00
Timeline package documentation.
This commit is contained in:
@@ -26,25 +26,54 @@ import java.util.Map;
|
||||
import java.util.TreeMap;
|
||||
|
||||
/**
|
||||
*
|
||||
* ActionScript 2 package TreeItem.
|
||||
* @author JPEXS
|
||||
*/
|
||||
public class AS2Package implements TreeItem {
|
||||
|
||||
/**
|
||||
* SWF this package resides in.
|
||||
*/
|
||||
private final SWF swf;
|
||||
|
||||
/**
|
||||
* Name.
|
||||
*/
|
||||
private final String name;
|
||||
|
||||
/**
|
||||
* Parent package.
|
||||
*/
|
||||
private final AS2Package parent;
|
||||
|
||||
/**
|
||||
* Subpackges.
|
||||
*/
|
||||
public Map<String, AS2Package> subPackages = new TreeMap<>();
|
||||
|
||||
/**
|
||||
* Scripts in this package.
|
||||
*/
|
||||
public Map<String, ASMSource> scripts = new TreeMap<>();
|
||||
|
||||
private boolean flat;
|
||||
/**
|
||||
* Whether the package is flat = in the format "mypkg.sub1.sub2" instead of "sub1".
|
||||
*/
|
||||
private final boolean flat;
|
||||
|
||||
private boolean defaultPackage;
|
||||
/**
|
||||
* Whether this is default package.
|
||||
*/
|
||||
private final boolean defaultPackage;
|
||||
|
||||
/**
|
||||
* Constructs AS2Package
|
||||
* @param name Name
|
||||
* @param parent Parent package
|
||||
* @param swf SWF this package resides in
|
||||
* @param flat Whether the package is flat = in the format "mypkg.sub1.sub2" instead of "sub1"
|
||||
* @param defaultPackage
|
||||
*/
|
||||
public AS2Package(String name, AS2Package parent, SWF swf, boolean flat, boolean defaultPackage) {
|
||||
this.name = name;
|
||||
this.parent = parent;
|
||||
@@ -53,15 +82,27 @@ public class AS2Package implements TreeItem {
|
||||
this.defaultPackage = defaultPackage;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether it is default package.
|
||||
* @return
|
||||
*/
|
||||
public boolean isDefaultPackage() {
|
||||
return defaultPackage;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets openable.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public Openable getOpenable() {
|
||||
return swf;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all subpackages and subscripts.
|
||||
* @return
|
||||
*/
|
||||
public List<TreeItem> getAllChildren() {
|
||||
List<TreeItem> result = new ArrayList<>(getChildCount());
|
||||
result.addAll(subPackages.values());
|
||||
@@ -69,6 +110,11 @@ public class AS2Package implements TreeItem {
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets child at index.
|
||||
* @param index
|
||||
* @return
|
||||
*/
|
||||
public TreeItem getChild(int index) {
|
||||
if (index < subPackages.size()) {
|
||||
for (AS2Package subPackage : subPackages.values()) {
|
||||
@@ -93,10 +139,19 @@ public class AS2Package implements TreeItem {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets child count.
|
||||
* @return
|
||||
*/
|
||||
public int getChildCount() {
|
||||
return subPackages.size() + scripts.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets index of child.
|
||||
* @param child
|
||||
* @return
|
||||
*/
|
||||
public int getIndexOfChild(TreeItem child) {
|
||||
int res = 0;
|
||||
if (child instanceof AS2Package) {
|
||||
@@ -120,15 +175,27 @@ public class AS2Package implements TreeItem {
|
||||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* ToString.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets package name.
|
||||
* @return
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets modified flag.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean isModified() {
|
||||
for (ASMSource s : scripts.values()) {
|
||||
@@ -143,7 +210,13 @@ public class AS2Package implements TreeItem {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Checks whether the package is flat.
|
||||
* Flat = in the format "mypkg.sub1.sub2" instead of "sub1".
|
||||
* @return
|
||||
*/
|
||||
public boolean isFlat() {
|
||||
return flat;
|
||||
}
|
||||
|
||||
@@ -29,37 +29,83 @@ import java.util.TreeMap;
|
||||
import natorder.NaturalOrderComparator;
|
||||
|
||||
/**
|
||||
*
|
||||
* ActionScript 3 package AS3ClassTreeItem
|
||||
* @author JPEXS
|
||||
*/
|
||||
public class AS3Package extends AS3ClassTreeItem {
|
||||
|
||||
/**
|
||||
* Openable.
|
||||
*/
|
||||
private final Openable openable;
|
||||
|
||||
/**
|
||||
* Package name.
|
||||
*/
|
||||
public String packageName;
|
||||
|
||||
/**
|
||||
* All subPackages.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
private final Map<String, AS3Package> subPackages = new TreeMap<>(new NaturalOrderComparator());
|
||||
|
||||
/**
|
||||
* All scripts in this package
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
private final Map<String, ScriptPack> scripts = new TreeMap<>(new NaturalOrderComparator());
|
||||
|
||||
/**
|
||||
* Sorted packages.
|
||||
*/
|
||||
private List<AS3Package> sortedPackages;
|
||||
|
||||
/**
|
||||
* Sorted scripts.
|
||||
*/
|
||||
private List<ScriptPack> sortedScripts;
|
||||
|
||||
private boolean flat;
|
||||
/**
|
||||
* Whether the package is flat = in the format "mypkg.sub1.sub2" instead of "sub1".
|
||||
*/
|
||||
private final boolean flat;
|
||||
|
||||
private boolean defaultPackage;
|
||||
/**
|
||||
* Whether this is default package.
|
||||
*/
|
||||
private final boolean defaultPackage;
|
||||
|
||||
private Integer compoundScriptIndex;
|
||||
/**
|
||||
* If this package is compound script package itself, index of scriptInfo
|
||||
*/
|
||||
private final Integer compoundScriptIndex;
|
||||
|
||||
private ABC abc;
|
||||
/**
|
||||
* ABC.
|
||||
*/
|
||||
private final ABC abc;
|
||||
|
||||
/**
|
||||
* ScriptPack with compound script initializer.
|
||||
*/
|
||||
private ScriptPack compoundInitializerPack = null;
|
||||
|
||||
private boolean partOfCompoundScript;
|
||||
/**
|
||||
* Whether this package is part of compound script.
|
||||
*/
|
||||
private final boolean partOfCompoundScript;
|
||||
|
||||
/**
|
||||
*
|
||||
* @param packageName Package name
|
||||
* @param openable Openable
|
||||
* @param flat Whether the package is flat = in the format "mypkg.sub1.sub2" instead of "sub1"
|
||||
* @param defaultPackage Whether this is default package
|
||||
* @param abc ABC of this package
|
||||
* @param partOfCompoundScript Whether this package is part of compound script
|
||||
* @param compoundScriptIndex If this package is compound script package itself, index of scriptInfo
|
||||
*/
|
||||
public AS3Package(String packageName, Openable openable, boolean flat, boolean defaultPackage, ABC abc, boolean partOfCompoundScript, Integer compoundScriptIndex) {
|
||||
super(packageName, "", null);
|
||||
this.flat = flat;
|
||||
@@ -70,44 +116,86 @@ public class AS3Package extends AS3ClassTreeItem {
|
||||
this.abc = abc;
|
||||
this.partOfCompoundScript = partOfCompoundScript;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Checks whether this package is part of compound script.
|
||||
* @return
|
||||
*/
|
||||
public boolean isPartOfCompoundScript() {
|
||||
return partOfCompoundScript;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets ScriptPack with compound script initializer.
|
||||
* @param compoundInitializerPack
|
||||
*/
|
||||
public void setCompoundInitializerPack(ScriptPack compoundInitializerPack) {
|
||||
this.compoundInitializerPack = compoundInitializerPack;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets ScriptPack with compound script initializer.
|
||||
* @return
|
||||
*/
|
||||
public ScriptPack getCompoundInitializerPack() {
|
||||
return compoundInitializerPack;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether it is default package.
|
||||
* @return
|
||||
*/
|
||||
public boolean isDefaultPackage() {
|
||||
return defaultPackage;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the package is flat.
|
||||
* Flat = in the format "mypkg.sub1.sub2" instead of "sub1".
|
||||
* @return
|
||||
*/
|
||||
public boolean isFlat() {
|
||||
return flat;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether it is a compound script.
|
||||
* Not just a part of it.
|
||||
* @return
|
||||
*/
|
||||
public boolean isCompoundScript() {
|
||||
return compoundScriptIndex != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets index of compound scriptInfo.
|
||||
* @return
|
||||
*/
|
||||
public Integer getCompoundScriptIndex() {
|
||||
return compoundScriptIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets ABC.
|
||||
* @return
|
||||
*/
|
||||
public ABC getAbc() {
|
||||
return abc;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets Openable.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public Openable getOpenable() {
|
||||
return openable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets subpackages.
|
||||
* @return
|
||||
*/
|
||||
public List<AS3Package> getSubPackages() {
|
||||
if (sortedPackages == null) {
|
||||
List<AS3Package> list = new ArrayList<>();
|
||||
@@ -121,6 +209,10 @@ public class AS3Package extends AS3ClassTreeItem {
|
||||
return sortedPackages;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets ScriptPacks in this package.
|
||||
* @return
|
||||
*/
|
||||
public List<ScriptPack> getScriptPacks() {
|
||||
if (sortedScripts == null) {
|
||||
List<ScriptPack> list = new ArrayList<>();
|
||||
@@ -134,21 +226,38 @@ public class AS3Package extends AS3ClassTreeItem {
|
||||
return sortedScripts;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds ScriptPack to the package.
|
||||
* @param script
|
||||
*/
|
||||
public void addScriptPack(ScriptPack script) {
|
||||
ClassPath cp = script.getClassPath();
|
||||
scripts.put(cp.className + cp.namespaceSuffix, script);
|
||||
sortedScripts = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds subpackage.
|
||||
* @param subPackage
|
||||
*/
|
||||
public void addSubPackage(AS3Package subPackage) {
|
||||
subPackages.put(subPackage.getNameWithNamespaceSuffix(), subPackage);
|
||||
sortedPackages = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets subpackage by name.
|
||||
* @param packageName
|
||||
* @return
|
||||
*/
|
||||
public AS3Package getSubPackage(String packageName) {
|
||||
return subPackages.get(packageName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all subpackages and scripts in this package.
|
||||
* @return
|
||||
*/
|
||||
public List<AS3ClassTreeItem> getAllChildren() {
|
||||
List<AS3ClassTreeItem> result = new ArrayList<>(getChildCount());
|
||||
result.addAll(subPackages.values());
|
||||
@@ -156,6 +265,11 @@ public class AS3Package extends AS3ClassTreeItem {
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets child at index.
|
||||
* @param index
|
||||
* @return
|
||||
*/
|
||||
public AS3ClassTreeItem getChild(int index) {
|
||||
if (index < subPackages.size()) {
|
||||
return getSubPackages().get(index);
|
||||
@@ -168,10 +282,19 @@ public class AS3Package extends AS3ClassTreeItem {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets child count.
|
||||
* @return
|
||||
*/
|
||||
public int getChildCount() {
|
||||
return subPackages.size() + getScriptPacks().size();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets index of child.
|
||||
* @param child
|
||||
* @return
|
||||
*/
|
||||
public int getIndexOfChild(AS3ClassTreeItem child) {
|
||||
int res = 0;
|
||||
if (child instanceof AS3Package) {
|
||||
@@ -195,6 +318,9 @@ public class AS3Package extends AS3ClassTreeItem {
|
||||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clears subpackages and scripts in this package.
|
||||
*/
|
||||
public void clear() {
|
||||
subPackages.clear();
|
||||
scripts.clear();
|
||||
@@ -202,6 +328,10 @@ public class AS3Package extends AS3ClassTreeItem {
|
||||
sortedScripts = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* ToString
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
if (flat) {
|
||||
@@ -210,6 +340,10 @@ public class AS3Package extends AS3ClassTreeItem {
|
||||
return IdentifiersDeobfuscation.printIdentifier(true, packageName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets modified flag.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean isModified() {
|
||||
List<ScriptPack> sps = getScriptPacks();
|
||||
|
||||
@@ -19,13 +19,19 @@ package com.jpexs.decompiler.flash.timeline;
|
||||
import java.awt.Shape;
|
||||
|
||||
/**
|
||||
*
|
||||
* Clipping region.
|
||||
* @author JPEXS
|
||||
*/
|
||||
public class Clip {
|
||||
|
||||
/**
|
||||
* Shape.
|
||||
*/
|
||||
public Shape shape;
|
||||
|
||||
/**
|
||||
* Clipping depth.
|
||||
*/
|
||||
public int depth;
|
||||
|
||||
public Clip(Shape shape, int depth) {
|
||||
|
||||
@@ -37,67 +37,155 @@ import java.util.Objects;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
/**
|
||||
*
|
||||
* State at specific depth on a frame.
|
||||
* @author JPEXS
|
||||
*/
|
||||
public class DepthState {
|
||||
|
||||
/**
|
||||
* Depth.
|
||||
*/
|
||||
public int depth = -1;
|
||||
|
||||
/**
|
||||
* CharacterId.
|
||||
*/
|
||||
public int characterId = -1;
|
||||
|
||||
/**
|
||||
* Matrix.
|
||||
*/
|
||||
public MATRIX matrix;
|
||||
|
||||
/**
|
||||
* Instance name.
|
||||
*/
|
||||
public String instanceName;
|
||||
|
||||
/**
|
||||
* Class name.
|
||||
*/
|
||||
public String className;
|
||||
|
||||
/**
|
||||
* Color transform.
|
||||
*/
|
||||
public ColorTransform colorTransForm;
|
||||
|
||||
/**
|
||||
* Whether to cache as bitmap.
|
||||
*/
|
||||
public boolean cacheAsBitmap = false;
|
||||
|
||||
/**
|
||||
* Blend mode.
|
||||
*/
|
||||
public int blendMode = 0;
|
||||
|
||||
/**
|
||||
* Filters.
|
||||
*/
|
||||
public List<FILTER> filters = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* Whether is visible.
|
||||
*/
|
||||
public boolean isVisible = true;
|
||||
|
||||
/**
|
||||
* Background color.
|
||||
*/
|
||||
public RGBA backGroundColor;
|
||||
|
||||
/**
|
||||
* Clip actions.
|
||||
*/
|
||||
public CLIPACTIONS clipActions;
|
||||
|
||||
/**
|
||||
* AMF data.
|
||||
*/
|
||||
public byte[] amfData;
|
||||
|
||||
/**
|
||||
* Ratio.
|
||||
*/
|
||||
public int ratio = -1;
|
||||
|
||||
/**
|
||||
* Whether this is a keyframe.
|
||||
*/
|
||||
public boolean key = false;
|
||||
|
||||
/**
|
||||
* Clip depth.
|
||||
*/
|
||||
public int clipDepth = -1;
|
||||
|
||||
/**
|
||||
* How many frames this depthstate is the same.
|
||||
*/
|
||||
public int time = 0;
|
||||
|
||||
/**
|
||||
* SWF file.
|
||||
*/
|
||||
private final SWF swf;
|
||||
|
||||
/**
|
||||
* Frame.
|
||||
*/
|
||||
public Frame frame;
|
||||
|
||||
/**
|
||||
* Frame of placeobject.
|
||||
*/
|
||||
public Frame placeFrame;
|
||||
|
||||
/**
|
||||
* Last placeObject.
|
||||
*/
|
||||
public PlaceObjectTypeTag placeObjectTag;
|
||||
|
||||
/**
|
||||
* Minimum required PlaceObject version.
|
||||
*/
|
||||
public int minPlaceObjectNum;
|
||||
|
||||
/**
|
||||
* Instance identifier.
|
||||
*/
|
||||
public long instanceId;
|
||||
|
||||
/**
|
||||
* Whether this is a motion tween.
|
||||
*/
|
||||
public boolean motionTween = false;
|
||||
|
||||
/**
|
||||
* Whether this state has an image placed.
|
||||
*/
|
||||
public boolean hasImage = false;
|
||||
|
||||
/**
|
||||
* Instance ids counter.
|
||||
*/
|
||||
private static AtomicLong lastInstanceId = new AtomicLong(0);
|
||||
|
||||
/**
|
||||
* Gets new instance id.
|
||||
* @return
|
||||
*/
|
||||
public static long getNewInstanceId() {
|
||||
return lastInstanceId.addAndGet(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs DepthState.
|
||||
* @param swf SWF
|
||||
* @param frame Frame
|
||||
* @param placeFrame Frame of placeObject
|
||||
*/
|
||||
public DepthState(SWF swf, Frame frame, Frame placeFrame) {
|
||||
this.swf = swf;
|
||||
this.frame = frame;
|
||||
@@ -105,6 +193,13 @@ public class DepthState {
|
||||
this.instanceId = getNewInstanceId();
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs DepthState.
|
||||
* @param obj Last DepthState
|
||||
* @param frame Frame
|
||||
* @param placeFrame Frame of placeObject
|
||||
* @param sameInstance Whether it is same instance
|
||||
*/
|
||||
public DepthState(DepthState obj, Frame frame, Frame placeFrame, boolean sameInstance) {
|
||||
this.frame = frame;
|
||||
this.placeFrame = placeFrame;
|
||||
@@ -134,16 +229,29 @@ public class DepthState {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets matrix.
|
||||
* @param matrix
|
||||
*/
|
||||
public void setMATRIX(MATRIX matrix) {
|
||||
this.matrix = matrix;
|
||||
this.placeObjectTag.setMatrix(matrix);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether cache as bitmap is on.
|
||||
* @return
|
||||
*/
|
||||
public boolean cacheAsBitmap() {
|
||||
return (placeObjectTag != null && placeObjectTag.cacheAsBitmap())
|
||||
|| (filters != null && filters.size() > 0);
|
||||
|| (filters != null && !filters.isEmpty());
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts DepthState to PlaceObject tag of required version.
|
||||
* @param depth Depth
|
||||
* @return
|
||||
*/
|
||||
public PlaceObjectTypeTag toPlaceObjectTag(int depth) {
|
||||
if (minPlaceObjectNum <= 1) {
|
||||
CXFORM cxForm0 = colorTransForm == null ? null : new CXFORM(colorTransForm);
|
||||
@@ -160,6 +268,10 @@ public class DepthState {
|
||||
return new PlaceObject4Tag(swf, false, depth, className, characterId, matrix, cxForm, ratio, instanceName, clipDepth, filters, blendMode, cacheAsBitmap ? 1 : 0, isVisible ? 1 : 0, backGroundColor, clipActions, null, hasImage);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets character tag.
|
||||
* @return
|
||||
*/
|
||||
public CharacterTag getCharacter() {
|
||||
if (characterId == -1) {
|
||||
|
||||
@@ -173,6 +285,10 @@ public class DepthState {
|
||||
return swf.getCharacter(characterId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Hashcode.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int hash = 7;
|
||||
@@ -196,6 +312,11 @@ public class DepthState {
|
||||
return hash;
|
||||
}
|
||||
|
||||
/**
|
||||
* Equals.
|
||||
* @param obj
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj) {
|
||||
|
||||
@@ -36,49 +36,103 @@ import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
|
||||
/**
|
||||
*
|
||||
* Single frame of a timeline.
|
||||
* @author JPEXS
|
||||
*/
|
||||
public class Frame implements TreeItem, Exportable {
|
||||
|
||||
/**
|
||||
* Zero based frame index
|
||||
* Zero based frame index.
|
||||
*/
|
||||
public final int frame;
|
||||
|
||||
/**
|
||||
* Map of depth to DepthState.
|
||||
*/
|
||||
public TreeMap<Integer, DepthState> layers = new TreeMap<>();
|
||||
|
||||
/**
|
||||
* Background color.
|
||||
*/
|
||||
public RGB backgroundColor = new RGBA(0, 0, 0, 0);
|
||||
|
||||
/**
|
||||
* Timeline.
|
||||
*/
|
||||
public final Timeline timeline;
|
||||
|
||||
/**
|
||||
* List of soundIds.
|
||||
*/
|
||||
public List<Integer> sounds = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* List of sound classes.
|
||||
*/
|
||||
public List<String> soundClasses = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* List of sound infos.
|
||||
*/
|
||||
public List<SOUNDINFO> soundInfos = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* List of DoAction tags.
|
||||
*/
|
||||
public List<DoActionTag> actions = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* List of ASMSource containers.
|
||||
*/
|
||||
public List<ASMSourceContainer> actionContainers = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* Inner nested tags in this frame.
|
||||
* @see ShowFrameTag.isNestedTagType
|
||||
*/
|
||||
public List<Tag> innerTags = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* All inner tags in this frame.
|
||||
*/
|
||||
public List<Tag> allInnerTags = new ArrayList<>();
|
||||
|
||||
public ShowFrameTag showFrameTag = null; // can be null for the last frame
|
||||
/**
|
||||
* ShowFrame tag for this frame.
|
||||
* Can be null for the last frame.
|
||||
*/
|
||||
public ShowFrameTag showFrameTag = null;
|
||||
|
||||
/**
|
||||
* Whether layers changed.
|
||||
*/
|
||||
public boolean layersChanged;
|
||||
|
||||
/**
|
||||
* List of frame labels.
|
||||
*/
|
||||
public List<String> labels = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* List of name anchors.
|
||||
*/
|
||||
public List<Boolean> namedAnchors = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* Constructs Frame.
|
||||
* @param timeline Timeline
|
||||
* @param frame Zero-based frame index
|
||||
*/
|
||||
public Frame(Timeline timeline, int frame) {
|
||||
this.timeline = timeline;
|
||||
this.frame = frame;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs Frame.
|
||||
* @param obj Source frame
|
||||
* @param frame New zero-based frame index
|
||||
*/
|
||||
public Frame(Frame obj, int frame) {
|
||||
this.frame = frame;
|
||||
layers = new TreeMap<>();
|
||||
@@ -90,11 +144,19 @@ public class Frame implements TreeItem, Exportable {
|
||||
//Do not copy sounds
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets openable.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public Openable getOpenable() {
|
||||
return timeline.swf;
|
||||
}
|
||||
|
||||
/**
|
||||
* ToString
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
String name = "frame " + (frame + 1);
|
||||
@@ -110,11 +172,20 @@ public class Frame implements TreeItem, Exportable {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets export file name.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String getExportFileName() {
|
||||
return "frame_" + (frame + 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Equals.
|
||||
* @param obj
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (obj instanceof Frame) {
|
||||
@@ -125,11 +196,19 @@ public class Frame implements TreeItem, Exportable {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* HashCode.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return timeline.hashCode() ^ Integer.hashCode(frame);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether some of "all inner frames" are moified.
|
||||
* @return
|
||||
*/
|
||||
public boolean isAllInnerTagsModified() {
|
||||
for (Tag t : allInnerTags) {
|
||||
if (t.isModified() && !t.isReadOnly()) {
|
||||
@@ -139,6 +218,10 @@ public class Frame implements TreeItem, Exportable {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets modified flag.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean isModified() {
|
||||
for (Tag t : innerTags) {
|
||||
@@ -162,6 +245,10 @@ public class Frame implements TreeItem, Exportable {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get needed characters for this frame.
|
||||
* @param needed Result
|
||||
*/
|
||||
public void getNeededCharacters(Set<Integer> needed) {
|
||||
for (Tag t : innerTags) {
|
||||
if (t instanceof PlaceObjectTypeTag) {
|
||||
@@ -174,6 +261,10 @@ public class Frame implements TreeItem, Exportable {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get needed characters for this frame to deepest level.
|
||||
* @param needed Result
|
||||
*/
|
||||
public void getNeededCharactersDeep(Set<Integer> needed) {
|
||||
for (Tag t : innerTags) {
|
||||
if (t instanceof PlaceObjectTypeTag) {
|
||||
|
||||
@@ -22,39 +22,70 @@ import com.jpexs.decompiler.flash.treeitems.Openable;
|
||||
import com.jpexs.decompiler.flash.treeitems.TreeItem;
|
||||
|
||||
/**
|
||||
*
|
||||
* A frame that contains script
|
||||
* @author JPEXS
|
||||
*/
|
||||
public class FrameScript implements TreeItem, Exportable {
|
||||
|
||||
/**
|
||||
* SWF.
|
||||
*/
|
||||
private final SWF swf;
|
||||
|
||||
/**
|
||||
* Frame.
|
||||
*/
|
||||
private final Frame frame;
|
||||
|
||||
/**
|
||||
* Constructs FrameScript.
|
||||
* @param swf SWF
|
||||
* @param frame Frame
|
||||
*/
|
||||
public FrameScript(SWF swf, Frame frame) {
|
||||
this.swf = swf;
|
||||
this.frame = frame;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets Frame.
|
||||
* @return
|
||||
*/
|
||||
public Frame getFrame() {
|
||||
return frame;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets openable.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public Openable getOpenable() {
|
||||
return swf;
|
||||
}
|
||||
|
||||
/**
|
||||
* ToString.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return frame.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets export filename.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String getExportFileName() {
|
||||
return frame.getExportFileName();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets modified flag.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean isModified() {
|
||||
return frame.isModified();
|
||||
|
||||
@@ -22,16 +22,38 @@ import com.jpexs.decompiler.flash.treeitems.TreeItem;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
*
|
||||
* Scene object.
|
||||
* @author JPEXS
|
||||
*/
|
||||
public class Scene implements TreeItem {
|
||||
|
||||
/**
|
||||
* SWF.
|
||||
*/
|
||||
private SWF swf;
|
||||
|
||||
/**
|
||||
* Start frame (zero-ased).
|
||||
*/
|
||||
public int startFrame;
|
||||
|
||||
/**
|
||||
* End frame (zero-based).
|
||||
*/
|
||||
public int endFrame;
|
||||
|
||||
/**
|
||||
* Name.
|
||||
*/
|
||||
public String name;
|
||||
|
||||
/**
|
||||
* Constructs Scene.
|
||||
* @param swf SWF
|
||||
* @param startFrame Start frame (zero-based)
|
||||
* @param endFrame End frame (zero-based)
|
||||
* @param name Name
|
||||
*/
|
||||
public Scene(SWF swf, int startFrame, int endFrame, String name) {
|
||||
this.swf = swf;
|
||||
this.startFrame = startFrame;
|
||||
@@ -39,10 +61,19 @@ public class Scene implements TreeItem {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets number of frames in this scene.
|
||||
* @return
|
||||
*/
|
||||
public int getSceneFrameCount() {
|
||||
return endFrame - startFrame + 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets SceneFrame at index
|
||||
* @param sceneFrameIndex Index at range 0 to sceneFrameCount - 1
|
||||
* @return
|
||||
*/
|
||||
public SceneFrame getSceneFrame(int sceneFrameIndex) {
|
||||
if (sceneFrameIndex >= getSceneFrameCount()) {
|
||||
throw new IndexOutOfBoundsException("Invalid sceneframe index");
|
||||
@@ -50,16 +81,28 @@ public class Scene implements TreeItem {
|
||||
return new SceneFrame(swf, this, startFrame + sceneFrameIndex);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets openable.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public Openable getOpenable() {
|
||||
return swf;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets modified flag.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean isModified() {
|
||||
return false; //??
|
||||
}
|
||||
|
||||
/**
|
||||
* HashCode.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int hash = 7;
|
||||
@@ -68,6 +111,11 @@ public class Scene implements TreeItem {
|
||||
return hash;
|
||||
}
|
||||
|
||||
/**
|
||||
* Equals.
|
||||
* @param obj
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj) {
|
||||
@@ -86,6 +134,10 @@ public class Scene implements TreeItem {
|
||||
return Objects.equals(this.swf, other.swf);
|
||||
}
|
||||
|
||||
/**
|
||||
* ToString.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return name;
|
||||
|
||||
@@ -22,44 +22,85 @@ import com.jpexs.decompiler.flash.treeitems.TreeItem;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
*
|
||||
* A frame in a Scene object.
|
||||
* @author JPEXS
|
||||
*/
|
||||
public class SceneFrame implements TreeItem {
|
||||
|
||||
/**
|
||||
* SWF.
|
||||
*/
|
||||
private final SWF swf;
|
||||
|
||||
/**
|
||||
* Scene.
|
||||
*/
|
||||
private final Scene scene;
|
||||
|
||||
/**
|
||||
* Real frame index - from main SWF time line.
|
||||
*/
|
||||
private final int realFrameIndex;
|
||||
|
||||
/**
|
||||
* Constructs SceneFrame.
|
||||
* @param swf SWF
|
||||
* @param scene Scene
|
||||
* @param realFrameIndex Real frame index - from main SWF time line
|
||||
*/
|
||||
public SceneFrame(SWF swf, Scene scene, int realFrameIndex) {
|
||||
this.swf = swf;
|
||||
this.scene = scene;
|
||||
this.realFrameIndex = realFrameIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets scene frame index.
|
||||
* @return
|
||||
*/
|
||||
public int getSceneFrameIndex() {
|
||||
return realFrameIndex - scene.startFrame;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets frame.
|
||||
* @return
|
||||
*/
|
||||
public Frame getFrame() {
|
||||
return swf.getTimeline().getFrame(realFrameIndex);
|
||||
}
|
||||
|
||||
/**
|
||||
* ToString.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return "scene frame " + (getSceneFrameIndex() + 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets openable.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public Openable getOpenable() {
|
||||
return swf;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets modified flag.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean isModified() {
|
||||
return getFrame().isModified();
|
||||
}
|
||||
|
||||
/**
|
||||
* HashCode.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int hash = 5;
|
||||
@@ -68,6 +109,11 @@ public class SceneFrame implements TreeItem {
|
||||
return hash;
|
||||
}
|
||||
|
||||
/**
|
||||
* Equals.
|
||||
* @param obj
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj) {
|
||||
|
||||
@@ -28,51 +28,98 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
*
|
||||
* SoundStream blocks across frame range.
|
||||
* @author JPEXS
|
||||
*/
|
||||
public class SoundStreamFrameRange implements TreeItem, SoundTag {
|
||||
|
||||
/**
|
||||
* Start frame (zero-based).
|
||||
*/
|
||||
public int startFrame;
|
||||
|
||||
/**
|
||||
* End frame (zero-based).
|
||||
*/
|
||||
public int endFrame;
|
||||
|
||||
/**
|
||||
* Sound blocks.
|
||||
*/
|
||||
public List<SoundStreamBlockTag> blocks = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* Sound stream head.
|
||||
*/
|
||||
private final SoundStreamHeadTypeTag head;
|
||||
|
||||
/**
|
||||
* Constructs SoundStreamFrameRange
|
||||
* @param head Sound stream head
|
||||
*/
|
||||
public SoundStreamFrameRange(SoundStreamHeadTypeTag head) {
|
||||
this.head = head;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets openable.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public Openable getOpenable() {
|
||||
return head.getOpenable();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets modified flag
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean isModified() {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets sound export format.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public SoundExportFormat getExportFormat() {
|
||||
return head.getExportFormat();
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether import is supported.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean importSupported() {
|
||||
return false; //??
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets sound rate.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public int getSoundRate() {
|
||||
return head.getSoundRate();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets sound type.
|
||||
* True = stereo, false = mono.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean getSoundType() {
|
||||
return head.getSoundType();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets raw sound data.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public List<ByteArrayRange> getRawSoundData() {
|
||||
List<ByteArrayRange> ret = new ArrayList<>();
|
||||
@@ -87,85 +134,156 @@ public class SoundStreamFrameRange implements TreeItem, SoundTag {
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets sound format id.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public int getSoundFormatId() {
|
||||
return head.getSoundFormatId();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets total sound sample count.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public long getTotalSoundSampleCount() {
|
||||
return blocks.size() * head.getSoundSampleCount();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets sound size.
|
||||
* True = 16 bit, false = 8 bit.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean getSoundSize() {
|
||||
return head.getSoundSize();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets character export filename.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String getCharacterExportFileName() {
|
||||
return head.getCharacterExportFileName() + "_" + (startFrame + 1) + "-" + (endFrame + 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets name.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String getName() {
|
||||
return "SoundStreamBlocks";
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets sound format.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public SoundFormat getSoundFormat() {
|
||||
return head.getSoundFormat();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets sound size.
|
||||
* True = 16 bit, false = 8 bit
|
||||
* @param soundSize
|
||||
*/
|
||||
@Override
|
||||
public void setSoundSize(boolean soundSize) {
|
||||
//?
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets sound type.
|
||||
* True = stereo, false = mono
|
||||
* @param soundType
|
||||
*/
|
||||
@Override
|
||||
public void setSoundType(boolean soundType) {
|
||||
//?
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets sound sample count.
|
||||
* @param soundSampleCount
|
||||
*/
|
||||
@Override
|
||||
public void setSoundSampleCount(long soundSampleCount) {
|
||||
//?
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets sound compression.
|
||||
* @param soundCompression
|
||||
*/
|
||||
@Override
|
||||
public void setSoundCompression(int soundCompression) {
|
||||
//?
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets sound rate.
|
||||
* @param soundRate
|
||||
*/
|
||||
@Override
|
||||
public void setSoundRate(int soundRate) {
|
||||
//?
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets character id.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public int getCharacterId() {
|
||||
return head.getCharacterId();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets sound stream head.
|
||||
* @return
|
||||
*/
|
||||
public SoundStreamHeadTypeTag getHead() {
|
||||
return head;
|
||||
}
|
||||
|
||||
/**
|
||||
* ToString.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return "SoundStreamBlocks (frame " + (startFrame + 1) + " - " + (endFrame + 1) + ")";
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the sound is readonly.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean isReadOnly() {
|
||||
return head.isReadOnly();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets FLA export name.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String getFlaExportName() {
|
||||
return head.getFlaExportName() + "_" + (startFrame + 1) + "-" + (endFrame + 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets initial latency.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public int getInitialLatency() {
|
||||
return 0;
|
||||
|
||||
@@ -17,15 +17,26 @@
|
||||
package com.jpexs.decompiler.flash.timeline;
|
||||
|
||||
/**
|
||||
*
|
||||
* SVG clipping region
|
||||
* @author JPEXS
|
||||
*/
|
||||
public class SvgClip {
|
||||
|
||||
/**
|
||||
* Shape.
|
||||
*/
|
||||
public String shape;
|
||||
|
||||
/**
|
||||
* Depth.
|
||||
*/
|
||||
public int depth;
|
||||
|
||||
/**
|
||||
* Constructs SvgClip.
|
||||
* @param shape Shape
|
||||
* @param depth Depth
|
||||
*/
|
||||
public SvgClip(String shape, int depth) {
|
||||
this.shape = shape;
|
||||
this.depth = depth;
|
||||
|
||||
@@ -25,46 +25,86 @@ import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
*
|
||||
* A tag containing script.
|
||||
* @author JPEXS
|
||||
*/
|
||||
public class TagScript implements TreeItem, Exportable {
|
||||
|
||||
/**
|
||||
* SWF.
|
||||
*/
|
||||
private final SWF swf;
|
||||
|
||||
/**
|
||||
* Tag.
|
||||
*/
|
||||
private final Tag tag;
|
||||
|
||||
/**
|
||||
* Frames
|
||||
*/
|
||||
private final List<TreeItem> frames;
|
||||
|
||||
/**
|
||||
* Constructs TagScript.
|
||||
* @param swf SWF
|
||||
* @param tag Tag
|
||||
* @param frames Frames
|
||||
*/
|
||||
public TagScript(SWF swf, Tag tag, List<TreeItem> frames) {
|
||||
this.swf = swf;
|
||||
this.tag = tag;
|
||||
this.frames = frames;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets tag.
|
||||
* @return
|
||||
*/
|
||||
public Tag getTag() {
|
||||
return tag;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets frames.
|
||||
* @return
|
||||
*/
|
||||
public List<TreeItem> getFrames() {
|
||||
return frames;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets openable.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public Openable getOpenable() {
|
||||
return swf;
|
||||
}
|
||||
|
||||
/**
|
||||
* ToString.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return tag.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets export filename.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String getExportFileName() {
|
||||
return tag.getExportFileName();
|
||||
}
|
||||
|
||||
/**
|
||||
* Equals.
|
||||
* @param obj
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (obj instanceof TagScript) {
|
||||
@@ -74,11 +114,19 @@ public class TagScript implements TreeItem, Exportable {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* HashCode.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return tag.hashCode();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets modified flag.
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public boolean isModified() {
|
||||
for (TreeItem f : frames) {
|
||||
|
||||
@@ -21,8 +21,8 @@ import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
*
|
||||
* NOT WORKING STUB!!! FIXME
|
||||
* An attemp to detect tweens.
|
||||
* FIXME!! NOT WORKING STUB!!!
|
||||
*
|
||||
* @author JPEXS
|
||||
*/
|
||||
|
||||
@@ -17,13 +17,19 @@
|
||||
package com.jpexs.decompiler.flash.timeline;
|
||||
|
||||
/**
|
||||
*
|
||||
* Range of tween.
|
||||
* @author JPEXS
|
||||
*/
|
||||
public class TweenRange {
|
||||
|
||||
/**
|
||||
* Start frame (zero-based).
|
||||
*/
|
||||
public int startPosition;
|
||||
|
||||
/**
|
||||
* End frame (zero-based).
|
||||
*/
|
||||
public int endPosition;
|
||||
|
||||
public TweenRange(int startPosition, int endPosition) {
|
||||
|
||||
Reference in New Issue
Block a user