/usr/local/CPAN/FigAnim/ConvertSMIL.pm


package ConvertSMIL;

# SMIL tags generator

use strict;
use warnings;


sub smil {
    if ($_[0][0] == 1) {
	return changeThickness($_[0][1], # from
			       $_[0][2], # to
			       $_[0][3], # begin
			       $_[0][4]); # dur

    } elsif (($_[0][0] >= 11) && ($_[0][0] <= 16)) {
	return translate($_[0][1], $_[0][2], # begin, dur
			 $_[0][3], $_[0][4], # x, y
			 $_[0][5]); # unit

    } elsif (($_[0][0] >= 21) && ($_[0][0] <= 26)) {
	return rotate($_[0][1], $_[0][2], # begin, dur
		      $_[0][3], # angle
		      $_[0][4], $_[0][5], # x, y
		      $_[0][6]); # unit

    } elsif (($_[0][0] >= 31) && ($_[0][0] <= 36)) {
	return scale($_[0][1], $_[0][2], # begin, dur
		     $_[0][3], # factor
		     $_[0][4], $_[0][5]); # x, y

    } elsif ($_[0][0] == 2) {
	return changeFillIntensity($_[0][1], $_[0][2], # begin, dur
				   $_[0][3], $_[0][4], # from, to
				   $_[0][5], $_[0][6]); # color, colors

    } elsif ($_[0][0] == 0) {
	return setAttributeValue($_[0][1], $_[0][2], # begin, dur
				 $_[0][3], $_[0][4]); # attribute, value

    } else {
	return "";
    }
}


sub setAttributeValue {
    my ($begin, $dur, $attribute, $value, $colors) = @_;

    my $attributeType;
    my $attributeName;
    my $to;

    if ($attribute eq "visibility") {
	$attributeType = "CSS";
	$attributeName = "visibility";
	if ($value == 0) { $to = "hidden"; }
	else { $to = "visible"; }

    } elsif ($attribute eq "pen_color")  {
	$attributeType = "CSS";
	$attributeName = "stroke";
	$to = ConvertSVG::pen_fill_colors_to_rgb($value, $colors);

    } elsif ($attribute eq "fill_color")  {
	$attributeType = "CSS";
	$attributeName = "fill";
	$to = ConvertSVG::pen_fill_colors_to_rgb($value, $colors);

    } else {
	# error
    }

    if ($attributeName) {
	return
	    "<set attributeName=\"" . $attributeName . "\" " .
	    "attributeType=\"" . $attributeType . "\" " .
	    "to=\"" . $to . "\" " .
	    "begin=\"" . $begin . "s\" " .
	    "dur=\"0s\" " .
	    "fill=\"freeze\" " .
	    "/>";
    } else {
	# error
	return "";
    }
}

sub changeThickness {
    my ($from, $to, $begin, $dur) = @_;
    return
	"<animate attributeName=\"stroke-width\" attributeType=\"CSS\" " .
	"from=\"" . ConvertSVG::thickness_to_value($from) . "\" " . 
	"to=\"" . ConvertSVG::thickness_to_value($to) . "\" " .
	"begin=\"" . $begin . "s\" " .
	"dur=\"" . $dur . "s\" " .
	"fill=\"freeze\" " .
	"/>";
}

sub changeFillIntensity {
    my ($begin, $dur, $from, $to, $color, $colors) = @_;

    $from = ConvertSVG::area_fill_to_fill($from, $color, $colors);
    $to = ConvertSVG::area_fill_to_fill($to, $color, $colors);

    $from =~ s/fill: //;
    $to =~ s/fill: //;

    return
	"<animateColor attributeName=\"fill\" attributeType=\"CSS\" " .
	"begin=\"" . $begin . "s\" " .
	"dur=\"" . $dur . "s\" " .
	"from=\"" . $from . "\" " .
	"to=\"" . $to . "\" " .
	"fill=\"freeze\" " .
	"/>";
}

sub translate {
    my ($begin, $dur, $x, $y, $unit) = @_;

    if ($unit eq 'in') {
	$x = 1200 * $x;
	$y = 1200 * $y;
    } elsif ($unit eq 'cm') {
	$x = 450 * $x;
	$y = 450 * $y;
    } elsif ($unit eq 'px') {
	$x = 15 * $x;
	$y = 15 * $y;
    }

    return
	"<animateTransform attributeType=\"XML\" " .
	"attributeName=\"transform\" type=\"translate\" " .
	"from=\"0 0\" " .
	"to=\"" . $x . " " . $y . "\" " .
	"begin=\"" . $begin . "s\" " .
	"dur=\"" . $dur . "s\" " .
	"fill=\"freeze\" " .
	"additive=\"sum\" " .
	"/>";
}

sub rotate {
    my ($begin, $dur, $angle, $x, $y, $unit) = @_;

    if ($unit eq 'in') {
	$x = 1200 * $x;
	$y = 1200 * $y;
    } elsif ($unit eq 'cm') {
	$x = 450 * $x;
	$y = 450 * $y;
    } elsif ($unit eq 'px') {
	$x = 15 * $x;
	$y = 15 * $y;
    }

    return
	"<animateTransform attributeType=\"XML\" " .
	"attributeName=\"transform\" type=\"rotate\" " .
	"from=\"0 " . $x . " " . $y . "\" " .
	"to=\"" . $angle . " " .$x . " " . $y . "\" " .
	"begin=\"" . $begin . "s\" " .
	"dur=\"" . $dur . "s\" " .
	"fill=\"freeze\" " .
	"additive=\"sum\" " .
	"/>";
}

sub scale {
    my ($begin, $dur, $factor, $x, $y) = @_;

    return
	translate($begin, $dur, -$x*($factor-1), -$y*($factor-1), '') .
	"<animateTransform attributeType=\"XML\" " .
	"attributeName=\"transform\" type=\"scale\" " .
	"from=\"1 1\" " .
	"to=\"" . $factor . " " . $factor . "\" " .
	"begin=\"" . $begin . "s\" " .
	"dur=\"" . $dur . "s\" " .
	"fill=\"freeze\" " .
	"additive=\"sum\" " .
	"/>";
}


1;