/* * Copyright (C) 2010-2016 JPEXS, All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. */ package com.jpexs.decompiler.flash.timeline; import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.tags.DoActionTag; import com.jpexs.decompiler.flash.tags.ShowFrameTag; import com.jpexs.decompiler.flash.tags.Tag; import com.jpexs.decompiler.flash.tags.base.ASMSourceContainer; import com.jpexs.decompiler.flash.tags.base.Exportable; import com.jpexs.decompiler.flash.treeitems.TreeItem; import com.jpexs.decompiler.flash.types.RGB; import com.jpexs.decompiler.flash.types.RGBA; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.TreeMap; /** * * @author JPEXS */ public class Frame implements TreeItem, Exportable { public final int frame; public TreeMap<Integer, DepthState> layers = new TreeMap<>(); public RGB backgroundColor = new RGBA(0, 0, 0, 0); public final Timeline timeline; public List<Integer> sounds = new ArrayList<>(); public List<String> soundClasses = new ArrayList<>(); public List<DoActionTag> actions = new ArrayList<>(); public List<ASMSourceContainer> actionContainers = new ArrayList<>(); public List<Tag> innerTags = new ArrayList<>(); public ShowFrameTag showFrameTag = null; // can be null for the last frame public boolean layersChanged; public String label = null; public boolean namedAnchor = false; public Frame(Timeline timeline, int frame) { this.timeline = timeline; this.frame = frame; } public Frame(Frame obj, int frame) { this.frame = frame; layers = new TreeMap<>(); backgroundColor = obj.backgroundColor; timeline = obj.timeline; for (int depth : obj.layers.keySet()) { layers.put(depth, new DepthState(obj.layers.get(depth), this, true)); } //Do not copy sounds } @Override public SWF getSwf() { return timeline.swf; } @Override public String toString() { return "frame " + (frame + 1); } @Override public String getExportFileName() { return "frame_" + (frame + 1); } @Override public boolean equals(Object obj) { if (obj instanceof Frame) { Frame frameObj = (Frame) obj; return Objects.equals(timeline, frameObj.timeline) && frame == frameObj.frame; } return false; } @Override public int hashCode() { return timeline.hashCode() ^ Integer.hashCode(frame); } @Override public boolean isModified() { for (Tag t : innerTags) { if (t.isModified()) { return true; } } for (Tag t : actions) { if (t.isModified()) { return true; } } for (ASMSourceContainer t : actionContainers) { if (t.isModified()) { return true; } } if (showFrameTag != null && showFrameTag.isModified()) { return true; } return false; } }