| /* |
| * |
| * 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); |
| } |
| } |