summaryrefslogtreecommitdiffstats
path: root/scripts/png2mng.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/png2mng.pl')
-rw-r--r--scripts/png2mng.pl193
1 files changed, 193 insertions, 0 deletions
diff --git a/scripts/png2mng.pl b/scripts/png2mng.pl
new file mode 100644
index 00000000..14ef58ae
--- /dev/null
+++ b/scripts/png2mng.pl
@@ -0,0 +1,193 @@
+#! /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__