blob: 0257889a226c5b02c30e0f6785745377b5ec88aa [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.flex.swf;
import java.util.Arrays;
import org.apache.flex.swf.types.Rect;
/**
* Represents the header of a SWF file.
*/
public class Header
{
public static final char[] SIGNATURE_COMPRESSED_ZLIB = new char[] {'C', 'W', 'S'};
public static final char[] SIGNATURE_COMPRESSED_LZMA = new char[] {'Z', 'W', 'S'};
public static final char[] SIGNATURE_UNCOMPRESSED = new char[] {'F', 'W', 'S'};
/**
* Constructor.
*/
public Header()
{
}
private char[] signature;
private int version;
private long length;
private long compressedLength;
private Rect frameSize = new Rect(0, 0, 0, 0); // so that buildEmptySWF() doesn't NPE
private float frameRate;
private int frameCount;
public enum Compression
{
NONE, ZLIB, LZMA
}
/**
* SWF signature:
* <ul>
* <li>CWS - compressed</li>
* <li>FWS - uncompressed</li>
* </ul>
*
* @return signature string
*/
public char[] getSignature()
{
return signature;
}
/**
* Determine if the signature is valid.
*
* @param signature The signature to be checked.
* @return true if the signature is valid, false otherwise.
*/
public boolean isSignatureValid(char[] signature)
{
return (Arrays.equals(signature, SIGNATURE_COMPRESSED_ZLIB) ||
Arrays.equals(signature, SIGNATURE_COMPRESSED_LZMA) ||
Arrays.equals(signature, SIGNATURE_UNCOMPRESSED));
}
public void setSignature(char[] signature)
{
if (isSignatureValid(signature))
this.signature = signature;
else
throw new IllegalArgumentException("Invalid SWF signature: " + new String(signature));
}
/**
* SWF file version.
*
* @return version
*/
public int getVersion()
{
return version;
}
public void setVersion(int version)
{
this.version = version;
}
/**
* Length of entire file in bytes. If the SWF file is compressed, the length
* is the size after decompression.
*
* @return file length
*/
public long getLength()
{
return length;
}
/**
* Length is the LZMA "compressedLength" from the header
*/
public long getCompressedLength()
{
assert this.getCompression() == Compression.LZMA; // this field only valid for LZMA
return this.compressedLength;
}
public void setLength(long length)
{
this.length = length;
}
public void setCompressedLength(long length)
{
this.compressedLength = length;
}
/**
* Frame size in twips.
*
* @return frame size
*/
public Rect getFrameSize()
{
return frameSize;
}
public void setFrameSize(Rect frameSize)
{
this.frameSize = frameSize;
}
/**
* Get frame rate.
*
* @return frame rate
*/
public float getFrameRate()
{
return frameRate;
}
public void setFrameRate(float frameRate)
{
this.frameRate = frameRate;
}
/**
* Get frame count.
*
* @return frame count
*/
public int getFrameCount()
{
return frameCount;
}
public void setFrameCount(int frameCount)
{
this.frameCount = frameCount;
}
/**
* Check if the SWF file uses compression.
*
* @return true if compressed
*/
public Compression getCompression()
{
if (Arrays.equals(signature, SIGNATURE_COMPRESSED_LZMA))
{
return Compression.LZMA;
}
else if (Arrays.equals(signature, SIGNATURE_COMPRESSED_ZLIB))
{
return Compression.ZLIB;
}
else
{
assert Arrays.equals(signature, SIGNATURE_UNCOMPRESSED);
return Compression.NONE;
}
}
/**
* Based on desire for compression, debug, and swf version, pick the
* appropriate compression type
*/
public static Compression decideCompression(boolean compressed, int swfVersion, boolean debug)
{
Compression ret = Compression.NONE;
if (compressed)
{
if (debug)
{
// Use zlib for debug, as it is much, much faster
ret = Compression.ZLIB;
}
else
{
// LZMA is best - use it if the SWF version supports it.
// Otherwise fall back to ZLIB
ret = (swfVersion >= 13) ? Compression.LZMA : Compression.ZLIB;
}
}
return ret;
}
@Override
public String toString()
{
return String.format(
"[SWF HEADER]\n" +
" Signature: %s\n" +
" Version: %d\n" +
" Length: %d\n" +
" Frame size: %s\n" +
" Frame rate: %.2f\n" +
" Frame count: %d\n",
new String(signature), version, length, frameSize, frameRate, frameCount);
}
}