/* * JSwiff is an open source Java API for Macromedia Flash file generation * and manipulation * * Copyright (C) 2004-2005 Ralf Terdic (contact@jswiff.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package com.jswiff.swfrecords.tags; import com.jswiff.io.InputBitStream; import com.jswiff.io.OutputBitStream; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * <p> * This tag defines a sprite character (i.e. a movie inside the main SWF * movie). It consists of a character ID, a frame count and several control * tags. Character instances referred to by these control tags in the sprite * must have been previously defined. * </p> * * <p> * Once defined, the sprite can be displayed using the * <code>PlaceObject2</code> tag. * </p> * * @see PlaceObject2 * @since SWF 3 */ public final class DefineSprite extends DefinitionTag { private List controlTags = new ArrayList(); /** * Creates a new DefineSprite tag. Supply the character ID of the sprite. * After tag creation, use <code>addControlTag()</code> to add tags to the * sprite's tag list. * * @param characterId sprite's character ID */ public DefineSprite(int characterId) { code = TagConstants.DEFINE_SPRITE; this.characterId = characterId; } DefineSprite() { // empty } /** * Returns the list of control tags contained in the sprite. * * @return the sprite's control tags */ public List getControlTags() { return controlTags; } /** * Returns the number of frames contained in the sprite. * * @return Returns the frameCount. */ public int getFrameCount() { int count = 0; for (Iterator i = controlTags.iterator(); i.hasNext();) { if (((Tag) i.next()).getCode() == TagConstants.SHOW_FRAME) { count++; } } return count; } /** * Adds a control tag to the sprite. Do not use definition tags * (<code>Define...</code>) here! * * @param controlTag a control tag */ public void addControlTag(Tag controlTag) { controlTags.add(controlTag); } public void setControlTag(int index, Tag controlTag) { controlTags.set(index, controlTag); } protected void writeData(OutputBitStream outStream) throws IOException { forceLongHeader = true; outStream.writeUI16(characterId); outStream.writeUI16(getFrameCount()); TagWriter.writeTags(outStream, controlTags, getSWFVersion()); } void setData(byte[] data) throws IOException { InputBitStream inStream = new InputBitStream(data); characterId = inStream.readUI16(); inStream.readUI16(); // frameCount do { Tag tag = TagReaderImpl.getInstance().readTag(inStream, getSWFVersion(), isJapanese()); if (tag.getCode() != TagConstants.END) { controlTags.add(tag); } else { break; } } while (true); } }