/*
* JAME 6.2.1
* http://jame.sourceforge.net
*
* Copyright 2001, 2016 Andrea Medeghini
*
* This file is part of JAME.
*
* JAME is an application for creating fractals and other graphics artifacts.
*
* JAME 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 3 of the License, or
* (at your option) any later version.
*
* JAME 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 JAME. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.sf.jame.core.media;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import java.util.LinkedList;
import java.util.List;
public class Movie extends AbstractGraphics implements Animate {
private Controller controller;
private Sequence sequence;
private Movie parent;
private Layer layer;
private int rate = 24;
private Dimension size;
private Point2D center;
private final String name;
private final Timeline timeline;
private AffineTransform transform;
private List<AnimationListener> listeners = new LinkedList<AnimationListener>();
public Movie(final String name, final Timeline timeline, final Dimension size) {
this.name = name;
this.size = size;
this.timeline = timeline;
center = new Point2D.Float(0, 0);
transform = new AffineTransform();
}
@Override
public final Object clone() throws CloneNotSupportedException {
return new Movie(name + "_copy", (Timeline) timeline.clone(), size);
}
@Override
public final AffineTransform getTransform() {
return transform;
}
@Override
public Point2D getCenter() {
return center;
}
public Dimension getSize() {
return size;
}
@Override
public void setCenter(Point2D center) {
this.center = center;
}
public void setSize(Dimension size) {
this.size = size;
}
public final Timeline getTimeline() {
return timeline;
}
protected Layer getLayer() {
return layer;
}
protected Sequence getSequence() {
return sequence;
}
@Override
public String getName() {
return name;
}
@Override
public Movie getParent() {
return parent;
}
public final Controller getEngine() {
return controller;
}
@Override
public final void build(final Controller controller, final Movie parent, final Layer layer, final Sequence sequence) {
this.controller = controller;
this.parent = parent;
this.layer = layer;
this.sequence = sequence;
timeline.build(controller, this);
}
@Override
public final void init() {
timeline.init();
}
@Override
public final void kill() {
timeline.kill();
}
@Override
public final void reset() {
timeline.reset();
}
public int getFrames() {
return timeline.getFrames();
}
public int getFrame() {
return timeline.getFrame();
}
public final void setFrame(final int frame) {
timeline.setFrame(frame);
fireFrameChanged(frame);
}
public final void nextFrame() {
timeline.nextFrame();
fireFrameChanged(getFrame());
}
public final void prevFrame() {
timeline.prevFrame();
fireFrameChanged(getFrame());
}
public final int getFrameRate() {
if (parent != null) {
return parent.getFrameRate();
}
else {
return rate;
}
}
protected final void setFrameRate(final int rate) {
this.rate = rate;
}
public void load() {
}
public void flush() {
}
public void addAnimationListener(AnimationListener listener) {
listeners.add(listener);
}
public void removeAnimationListener(AnimationListener listener) {
listeners.remove(listener);
}
protected final void fireFrameChanged(int frame) {
for (AnimationListener listener : listeners) {
listener.frameChanged(frame);
}
}
public int getWidth() {
return (int) size.getWidth();
}
public int getHeight() {
return (int) size.getHeight();
}
public final void resize(int width, int height) {
getTransform().setToScale(width / (float) getSize().width, height / (float) getSize().height);
translate((float) -getCenter().getX(), (float) -getCenter().getY());
}
}