You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdesdk/scripts/png2mng.pl

194 lines
4.3 KiB

#! /usr/bin/perl
## This script is based on cyclo.cgi, see http://homepage2.nifty.com/sophia0/
## cyclo.cgi v0.3c (CYCLIC IMAGE) 2001.04.15 by techan
# usage: png2mng <basename> <width> <height>
$basename = $ARGV[0];
# Image Width Height
@w_h = ($ARGV[1], $ARGV[2]);
# The number of repeats for base (integer > 1)
$b_repeat = 1;
# Ticks per second
$tps = 20;
## Main
&InitCrcTable;
$r = "NG\r\n\x1a\n";
$sig_p = "\x89P".$r;
$sig_m = "\x8aM".$r;
# Check File
@png = ();
$size = 1;
for ($i=0;$size > 0;) {
$file = $basename.sprintf('%04d.png', $i+1);
$size = -s $file;
if ($size > 0)
{
open(IN, "< $file") || &Error(1);
binmode(IN);
read(IN, $sig, 8);
if ($sig ne $sig_p) { close(IN); &Error(2); }
read(IN, $png[$i], $size-8);
close(IN);
$i++;
}
}
$number = $i;
$it = $number * $b_repeat;
$ti = $it;
$|=1;
binmode(STDOUT);
# Signature
print $sig_m;
# MHDR
$data = 'MHDR'.pack("N7",
$w_h[0], # Width
$w_h[1], # Height
$tps, # Ticks per second
$number, # Layers
$ti, # Frames
$ti, # Time
583); # Simplicity
&OutputData;
# DEFI define objects of the number specified by $number
for ($i=0;$i<$number;$i++) {
$data = 'DEFI'.pack("n",
$i+1); # Object_id
# Do_not_show: 1 byte (unsigned integer)
# Concrete_flag: 1 byte (unsigned integer)
# X_location: 4 bytes (signed integer)
# Y_location: 4 bytes (signed integer)
# Left_cb: 4 bytes (signed integer)
# Right_cb: 4 bytes (signed integer)
# Top_cb: 4 bytes (signed integer)
# Bottom_cb: 4 bytes (signed integer)
&OutputData;
print $png[$i];
}
undef(@png);
# LOOP
$data = 'LOOP'.pack("CNC",
0, # Nest_level
$it, # Iteration_count
6); # Termination_condition:
# 1: Decoder discretion, not cacheable.
# 2: User discretion, not cacheable.
# *3: External signal, not cacheable.
# 4: Deterministic, cacheable.
# 5: Decoder discretion, cacheable.
# 6: User discretion, cacheable.
# *7: External signal, cacheable.
# Iteration_min: 4 bytes(unsigned integer)
# Iteration_max: 4 bytes (unsigned integer)
# Signal_number: 4 bytes (unsigned integer)
# Additional signal_number: 4 bytes (unsigned integer)
&OutputData;
# SHOW
$data = 'SHOW'.pack("nnC",
1, # First_image
$number, # Last_image
6); # Show_mode:
# 0: Make the images potentially visible and display them.
# 1: Make the images invisible.
# 2: Display those that are potentially visible.
# 3: Mark images "potentially visible" but do not display
# them.
# 4: Display any that are potentially visible after toggling.
# 5: Do not display even if potentially visible after toggling.
# 6: Step through the images in the given range, making the
# next image potentially visible and display it. Jump to
# the beginning of the range when reaching the end of the
# range. Perform one step for each SHOW chunk (in reverse
# order if last_image < first_image).
# 7: Make the next image in the range (cycle) potentially
# visible but do not display it.
&OutputData;
# ENDL
$data = "ENDL\0"; # Nest_level: 1 byte
&OutputData;
# MEND
print "\0\0\0\0MEND! \xf7\xd5";
exit(0);
sub Error
{
my $e = $_[0];
$black = "\0\0\0";
$red = "\xff\0\0";
$white = "\xff\xff\xff";
if ($e == 1) { $plte = $white.$black; }
elsif ($e == 2) { $plte = $white.$red; }
else { $plte = $red.$white; }
$plte = "PLTE".$plte;
$p = $sig_p;
$p.="\0\0\0\rIHDR";
$p.="\0\0\0\x1e\0\0\0\x0c\x01\x03\0\0\0";
$p.="\x4f\xe0\x9f\x71";
$p.="\0\0\0\x06".$plte.&CalcCrc($plte);
$p.="\0\0\0\x2eIDAT";
$p.="\x78\x9c\x63\x60\x40\x05\xbf\xcf\xcb\x7c\x60\x68\xd2\x58\xd4\x01";
$p.="\x21\x3e\x81\x88\xe6\xf3\x4a\x40\xb1\x2e\xa5\x05\x0c\x4d\x9e\x4a";
$p.="\x13\x18\x7e\x69\xcc\xe9\0\xab\x05\0\xb0\x88\x10\xb8";
$p.="\x57\x3a\0\xa1";
$p.="\0\0\0\0IEND\xaeB`\x82";
$|=1;
# print "Content-type: $mime\n";
# print "Content-length: 121\n\n";
binmode(STDOUT);
print $p;
exit(1);
}
sub InitCrcTable
{
my $d;
@crc_table = ();
for (0 .. 255) {
$d = $_;
for (0 .. 7) {
if ($d & 1) { $d = 0xedb88320 ^ (($d >> 1) & 0x7fffffff); }
else { $d = ($d >> 1) & 0x7fffffff; }
}
$crc_table[$_] = $d;
}
}
sub CalcCrc
{
my $data = $_[0];
my $c = 0xffffffff;
foreach (unpack("C*", $data)) {
$c = $crc_table[($c ^ $_) & 0xff] ^ (($c >> 8) & 0xffffff);
}
return(pack("N", ~$c));
}
sub OutputData
{
print pack("N", length($data)-4).$data.&CalcCrc($data);
undef($data);
}
__END__