/* * JSwiff is an open source Java API for Macromedia Flash file generation * and manipulation * * Copyright (C) 2004-2006 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; import com.jswiff.swfrecords.RGB; import com.jswiff.swfrecords.Rect; import com.jswiff.swfrecords.SWFHeader; import com.jswiff.swfrecords.tags.Tag; import org.apache.log4j.Logger; import java.io.Serializable; import java.util.ArrayList; import java.util.List; /** * This class represents a Macromedia Flash (SWF) document. Contains an SWF * header and a list of tags. Use a <code>SWFReader</code> to parse a file to * an <code>SWFDocument</code> instance. Write SWF files using * <code>SWFWriter</code>. */ public class SWFDocument implements Serializable { private static Logger logger = Logger.getLogger(SWFDocument.class); /** The version of the JSwiff library */ public static final String JSWIFF_VERSION = "8.0-beta-2"; /** * The default value for the compression flag. By default, compression is on */ public static final boolean DEFAULT_COMPRESSION = true; /** The default SWF version (8) */ public static final short DEFAULT_SWF_VERSION = 8; /** * The default frame size (based on the authoring tool from Macromedia: * 11000 x 8000 twips) */ public static final Rect DEFAULT_FRAME_SIZE = new Rect(0, 11000, 0, 8000); /** * The default frame rate of a (newly created) SWF movie (based on the * authoring tool from Macromedia: 12 fps) */ public static final short DEFAULT_FRAME_RATE = 12; /** The latest supported SWF version (8) */ public static final short MAX_SWF_VERSION = 9; /** Grants the SWF local file access */ public static final byte ACCESS_MODE_LOCAL = 0; /** Grants the SWF network access (local access is denied) */ public static final byte ACCESS_MODE_NETWORK = 1; private SWFHeader header = new SWFHeader(); private int currentCharId; private List tags = new ArrayList(); private RGB backgroundColor = new RGB((short) 255, (short) 255, (short) 255); private byte accessMode = ACCESS_MODE_LOCAL; private String metadata; /** * Creates a new SWFDocument instance. */ public SWFDocument() { header.setCompressed(DEFAULT_COMPRESSION); header.setVersion(DEFAULT_SWF_VERSION); header.setFrameSize(DEFAULT_FRAME_SIZE); header.setFrameRate(DEFAULT_FRAME_RATE); } /** * Sets the access mode for the SWF (local or network). * * @param accessMode * either ACCESS_MODE_LOCAL or ACCESS_MODE_NETWORK */ public void setAccessMode(byte accessMode) { this.accessMode = accessMode; } /** * Returns the access mode of the SWF (local or network). * * @return either ACCESS_MODE_LOCAL or ACCESS_MODE_NETWORK */ public byte getAccessMode() { return accessMode; } /** * Sets the background color of the document. * * @param backgroundColor * background color (as <code>RGB</code> instance) */ public void setBackgroundColor(RGB backgroundColor) { this.backgroundColor = backgroundColor; } /** * Returns the background color of the document. * * @return background color (as <code>RGB</code> instance) */ public RGB getBackgroundColor() { return backgroundColor; } /** * Sets the compression flag of the SWF * * @param compressed * <code>true</code> activates the compression */ public void setCompressed(boolean compressed) { header.setCompressed(compressed); } /** * Checks if the SWF file is compressed. * * @return <code>true</code> if compression is on, otherwise * <code>false</code> */ public boolean isCompressed() { return header.isCompressed(); } /** * Sets the file length. This value is computed and set when writing the SWF * with <code>SWFWriter</code>. * * @param fileLength * file length in bytes */ public void setFileLength(long fileLength) { header.setFileLength(fileLength); } /** * Returns the length of the SWF file. This value is computed and set when * writing the SWF with <code>SWFWriter</code>. * * @return SWF file length */ public long getFileLength() { return header.getFileLength(); } /** * Sets the number of frames in the SWF movie. This value is computed and * set when the document is written with <code>SWFWriter</code>. * * @param frameCount * frame count */ public void setFrameCount(int frameCount) { header.setFrameCount(frameCount); } /** * Returns the number of frames in the SWF movie. This value is computed and * set when the document is written with <code>SWFWriter</code>. * * @return frame count */ public int getFrameCount() { return header.getFrameCount(); } /** * Sets the frame rate of the SWF. The default is 12. * * @param frameRate * the frame rate (in fps) */ public void setFrameRate(short frameRate) { header.setFrameRate(frameRate); } /** * Returns the frame rate of the SWF movie. * * @return the frame rate in fps */ public short getFrameRate() { return header.getFrameRate(); } /** * Sets the frame size of the SWF. The default is Rect(0, 11000, 0, 8000), * i.e. width = 550 px and height = 400 px. * * @param frameSize * the size of the SWF frames. */ public void setFrameSize(Rect frameSize) { header.setFrameSize(frameSize); } /** * Returns the frame size of the SWF movie. * * @return the frame size (as <code>Rect</code> instance) */ public Rect getFrameSize() { return header.getFrameSize(); } /** * Sets the metadata of the document. Dublin Core RDF is used here. * * @param metadata * document metadata as Dublin Core RDF */ public void setMetadata(String metadata) { this.metadata = metadata; } /** * Returns the metadata of the document (if set). Dublin Core RDF is used * here. * * @return document metadata as Dublin Core RDF */ public String getMetadata() { return metadata; } /** * Returns a new character ID. Character IDs start at 1 and are consecutive. * * @return new character ID */ public int getNewCharacterId() { return ++currentCharId; } /** * Returns a list containing this SWF document's tags. * * @return the tag list */ public List getTags() { return tags; } /** * Sets the Flash version of the file, must be between 1 and * <code>MAX_SWF_VERSION</code>. The default value is * <code>DEFAULT_SWF_VERSION</code>. * * @param version * value for the Flash version * * @throws IllegalArgumentException * if version not in specified interval */ public void setVersion(short version) { if (version < 1) { throw new IllegalArgumentException("Flash version must be at least 1!"); } else if (version > MAX_SWF_VERSION) { logger.warn("Flash version > " + MAX_SWF_VERSION + " not fully supported. You could get unexpected errors during the conversion process!!!"); } header.setVersion(version); } /** * Returns the SWF version of the file. * * @return SWF version */ public short getVersion() { return header.getVersion(); } /** * Adds a tag to the SWF document to be written. Warning: no checking of * compliance with particular SWF versions! * * @param tag * the SWF tag to be added */ public void addTag(Tag tag) { tags.add(tag); } /** * Adds a list of tags to the SWF document to be written. Warning: no * checking of compliance with particular SWF versions! * * @param tagList * a list of tags */ public void addTags(List tagList) { tags.addAll(tagList); } /** * Removes the specified tag from the document. * * @param tag * tag to be removed * * @return <code>true</code> if document contained the specified tag */ public boolean removeTag(Tag tag) { return tags.remove(tag); } /** * Removes the tag at the specified position within the document. * * @param index * index of the tag to be removed * * @return the tag previously contained at specified position */ public Tag removeTag(int index) { return (Tag) tags.remove(index); } public void setTag(int index,Tag tag) { tags.set(index, tag); } }