#------------------------------------------------------------------------
#
# Copyright (c) 1997-1998 by Cornell University.
#
# See the file "license.txt" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
#------------------------------------------------------------------------
# ppmstoanimgifs.vm
# Convert a list of PPMs to an animated GIF
package require DvmBasic
package require DvmPnm
package require DvmGif
package require DvmImap
package require DvmColor
source ../lib/pnmlib.tcl
if {$argc < 3} {
puts "Enter input PPMs prefix :"
set infile [gets stdin]
puts "Enter input GIF name :"
set outfile [gets stdin]
puts "Enter number of images :"
set numimages [gets stdin]
} else {
set infile [lindex $argv 0]
set outfile [lindex $argv 1]
set numimages [lindex $argv 2]
}
set maxcolors 256
set bp [bitparser_new]
set bs [bitstream_new 1265535]
set file [open $outfile w]
fconfigure $file -translation binary -buffersize 65535
bitparser_wrap $bp $bs
set bytes [read_ppm ${infile}000.ppm]
set red [lindex $bytes 1]
set green [lindex $bytes 2]
set blue [lindex $bytes 3]
set rmap [imagemap_new]
set gmap [imagemap_new]
set bmap [imagemap_new]
set qr [byte_new [byte_get_width $red] [byte_get_height $red]]
set qg [byte_new [byte_get_width $red] [byte_get_height $red]]
set qb [byte_new [byte_get_width $red] [byte_get_height $red]]
set inds [byte_new [byte_get_width $red] [byte_get_height $red]]
set cht [color_hash_table_new 15]
color_hash_table_clear $cht
rgb_to_256 $red $green $blue $cht $rmap $gmap $bmap
color_hash_table_free $cht
set cht [color_hash_table_new 16]
color_hash_table_clear $cht
# Uncomment the following line to quantize using hash table only.
# rgb_quant_with_hash_table $red $green $blue $cht $rmap $gmap $bmap $inds
set tree [vp_tree_new]
vp_tree_init $rmap $gmap $bmap $tree
rgb_quant_with_vp_tree $red $green $blue $tree $cht $rmap $gmap $bmap $inds
# Initialize the sequence header
set hdr [gif_seq_hdr_new]
gif_seq_hdr_set_width $hdr [byte_get_width $red]
gif_seq_hdr_set_height $hdr [byte_get_height $red]
gif_seq_hdr_set_ct_flag $hdr 1
gif_seq_hdr_set_version $hdr 87a
gif_seq_hdr_set_ct_size $hdr 256
gif_seq_hdr_set_ct_sorted $hdr 0
gif_seq_hdr_set_aspect_ratio $hdr 0
gif_seq_hdr_set_background_color $hdr 0
gif_seq_hdr_set_resolution $hdr 3
# Encode the sequence header, global color table, and the application extension
# indicating to loop the sequence
gif_seq_hdr_encode $hdr $bp
gif_ct_encode 256 $rmap $gmap $bmap $bp
gif_seq_loop_encode $bp
# Initialize the image header
set img [gif_img_hdr_new]
gif_img_hdr_set_width $img [gif_seq_hdr_get_width $hdr]
gif_img_hdr_set_height $img [gif_seq_hdr_get_height $hdr]
gif_img_hdr_set_graphic_control_flag $img 1
gif_img_hdr_set_ct_flag $img 0
gif_img_hdr_set_left_position $img 0
gif_img_hdr_set_top_position $img 0
gif_img_hdr_set_ct_flag $img 0
gif_img_hdr_set_interlaced $img 0
gif_img_hdr_set_graphic_control_flag $img 0
gif_img_hdr_set_disposal_method $img 0
gif_img_hdr_set_user_input_flag $img 0
gif_img_hdr_set_transparent_color_flag $img 0
gif_img_hdr_set_delay_time $img 1
gif_img_hdr_encode $img $bp
gif_img_encode $hdr $img $inds $bp
for {set i 1} {$i < $numimages} {incr i} {
set bytes [read_ppm [format "%s%03d.ppm" $infile $i]]
set red [lindex $bytes 1]
set green [lindex $bytes 2]
set blue [lindex $bytes 3]
rgb_quant_with_vp_tree $red $green $blue $tree $cht $rmap $gmap $bmap $inds
# Encode the image header and image, we use the same color table for
# all image
gif_img_hdr_encode $img $bp
gif_img_encode $hdr $img $inds $bp
byte_free $red
byte_free $green
byte_free $blue
}
#Encode the sequence trailer
gif_seq_trailer_encode $bp
bitstream_channel_write $bs $file 0
close $file