#!/bin/sh
#
# ppmquantall - run ppmquant on a bunch of files all at once, so they share
#               a common colormap
#
# WARNING: overwrites the source files with the results!!!
#
# Verbose explanation: Let's say you've got a dozen pixmaps that you want
# to display on the screen all at the same time.  Your screen can only
# display 256 different colors, but the pixmaps have a total of a thousand
# or so different colors.  For a single pixmap you solve this problem with
# ppmquant; this script solves it for multiple pixmaps.  All it does is
# concatenate them together into one big pixmap, run ppmquant on that, and
# then split it up into little pixmaps again.

usage()
{
  echo "usage: $0 [-ext extension] <newcolours> <ppmfile> <ppmfile> ..."
  exit 1
}

if [ $# -lt 3 ]; then
    usage
fi

while :; do
  case "$1" in
    -ext*)
	if [ $# -lt 2 ]; then
          usage
        fi
	ext="$2"
	shift
	shift
        ;;

    *)  break;;
  esac
done


newcolors=$1
shift
files=($@)

set heights=()

for i in ${files[@]}; do
    heights=(${heights[*]} `egrep -v '^#' $i | head -2 | tail -1 | sed 's/.* //'` )
done

all=`tempfile -p pqa.all -m 600`
pnmcat -tb -white ${files[@]} | ppmquant $newcolors > $all
if [ $? != 0 ]; then
  exit $?
fi

width=`egrep -v '^#' $all | head -2 | tail -1 | sed 's/ .*//'`

y=0
i=1
while [ $i -le $# ]; do
    pnmcut 0 $y $width ${heights[$i]} $all | pnmcrop -quiet -white > ${files[$i]}.ext
    if [ $? != 0 ]; then
      exit $?
    fi
    y=$(($y + ${heights[$i]}))
    i=$(($i + 1))
done

rm -f $all
