blob: 71ca86818540d786a6d3f037de70b598989fdb12 [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.ArrayList;
import java.util.List;
import org.apache.flex.swf.io.SWFWriter;
import org.apache.flex.swf.tags.*;
import org.apache.flex.swf.types.RGB;
import org.apache.flex.swf.types.Rect;
/**
* The implementation of a {@code ISWF} object. Most of the ISWF properties are
* encapsulated in the a {@link Header} member, but we don't expose the
* {@code Header} at the interface level.
*/
public class SWF implements ISWF
{
/**
* Get a {@code FileAttributes} tag from an {@code ISWF} object.
*
* @param swf {@code ISWF} object
* @return {@code FileAttributesTag}
*/
public static FileAttributesTag getFileAttributes(ISWF swf)
{
if (swf instanceof SWF)
{
final SWF swfObject = (SWF)swf;
return swfObject.fileAttributes;
}
else
{
final FileAttributesTag tag = new FileAttributesTag();
tag.setAS3(swf.getUseAS3());
tag.setHasMetadata(swf.hasMetadata());
tag.setUseDirectBlit(swf.getUseDirectBlit());
tag.setUseGPU(swf.getUseGPU());
tag.setUseNetwork(swf.getUseNetwork());
return tag;
}
}
/**
* Constructor.
*/
public SWF()
{
frames = new ArrayList<SWFFrame>();
header = new Header();
fileAttributes = new FileAttributesTag();
}
private final List<SWFFrame> frames;
private String topLevelClass;
private FileAttributesTag fileAttributes;
private MetadataTag metadata;
private RGB backgroundColor;
private Header header;
private EnableDebugger2Tag enableDebugger2;
private ScriptLimitsTag scriptLimits;
private ProductInfoTag productInfoTag;
private EnableTelemetryTag enableTelemetry;
@Override
public void addFrame(SWFFrame frame)
{
if (frame == null)
throw new NullPointerException();
frames.add(frame);
// Keep frame count in header sync'ed.
header.setFrameCount(frames.size());
}
// The following are ISWF implementation methods.
@Override
public RGB getBackgroundColor()
{
return backgroundColor;
}
/**
* Expose the FileAttributes tag for {@link SWFWriter}.
*
* @return FileAttributes tag
*/
public FileAttributesTag getFileAttributes()
{
return fileAttributes;
}
@Override
public SWFFrame getFrameAt(int index)
{
// If the frameCount is greater than the number of frames
// then assume the header was set correctly but the frames
// in the SWF were not found. Correct the model at this point
// by creating the correct number of frames.
for (int i = frames.size(); i <= index; i++)
addFrame(new SWFFrame());
return frames.get(index);
}
@Override
public int getFrameCount()
{
// disable for now, as frames.size is zero if SWFReader.buildFramesFromTags()
// hasn't been called
// assert header.getFrameCount() == frames.size();
return header.getFrameCount();
}
@Override
public float getFrameRate()
{
return header.getFrameRate();
}
/**
* Return all the frames in the SWF.
*
* @return frames
*/
public List<SWFFrame> getFrames()
{
return frames;
}
@Override
public Rect getFrameSize()
{
return header.getFrameSize();
}
public Header getHeader()
{
return header;
}
@Override
public String getMetadata()
{
return metadata == null ? null : metadata.getMetadata();
}
@Override
public String getTopLevelClass()
{
return topLevelClass;
}
@Override
public int getVersion()
{
return header.getVersion();
}
@Override
public boolean hasMetadata()
{
assert fileAttributes.isHasMetadata() == (metadata != null);
return fileAttributes.isHasMetadata();
}
@Override
public boolean getUseAS3()
{
return fileAttributes.isAS3();
}
@Override
public void setUseAS3(boolean value)
{
fileAttributes.setAS3(value);
}
@Override
public void setBackgroundColor(RGB color)
{
assert color != null;
backgroundColor = color;
}
@Override
public void setFrameRate(float frameRate)
{
header.setFrameRate(frameRate);
}
@Override
public void setFrameSize(Rect rect)
{
header.setFrameSize(rect);
}
@Override
public void setMetadata(String value)
{
if (value == null)
{
metadata = null;
fileAttributes.setHasMetadata(false);
}
else
{
metadata = new MetadataTag(value);
fileAttributes.setHasMetadata(true);
}
}
@Override
public void setTopLevelClass(String value)
{
topLevelClass = value;
}
@Override
public void setUseDirectBlit(boolean value)
{
fileAttributes.setUseDirectBlit(value);
}
@Override
public void setUseGPU(boolean value)
{
fileAttributes.setUseGPU(value);
}
@Override
public void setUseNetwork(boolean value)
{
fileAttributes.setUseNetwork(value);
}
@Override
public void setVersion(int version)
{
header.setVersion(version);
}
@Override
public boolean getUseDirectBlit()
{
return fileAttributes.isUseDirectBlit();
}
@Override
public boolean getUseGPU()
{
return fileAttributes.isUseGPU();
}
@Override
public boolean getUseNetwork()
{
return fileAttributes.isUseNetwork();
}
@Override
public void deleteFrame(int index)
{
frames.remove(index);
}
public void setEnableDebugger2(EnableDebugger2Tag tag)
{
this.enableDebugger2 = tag;
}
@Override
public EnableDebugger2Tag getEnableDebugger2()
{
return enableDebugger2;
}
@Override
public void setScriptLimits(int maxRecursionDepth, int scriptTimeoutSeconds)
{
// TODO: check for value range and report problem or clamp value
// They should both be UI16.
scriptLimits = new ScriptLimitsTag(maxRecursionDepth, scriptTimeoutSeconds);
}
@Override
public ScriptLimitsTag getScriptLimits()
{
return scriptLimits;
}
@Override
public ProductInfoTag getProductInfo()
{
return productInfoTag;
}
@Override
public void setProductInfo(ProductInfoTag tag)
{
this.productInfoTag = tag;
}
@Override
public EnableTelemetryTag getEnableTelemetry() {
return enableTelemetry;
}
@Override
public void setEnableTelemetry(EnableTelemetryTag tag) {
this.enableTelemetry = tag;
}
}