#!/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> ..."
    exit 1
}

ext=

while :; do

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

    *)  
        break
    ;;

    esac
done

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

newcolors=$1
shift
nfiles=$#
files=($@)

# Extract the width and height of each of the images.
# Here, we make the assumption that the width and height are on the
# second line, even though the PPM format doesn't require that.
# To be robust, we need to use Pnmfile to get that information, or 
# Put this program in C and use ppm_readppminit().

set widths=()
set heights=()

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

tempdir="${TMPDIR-/tmp}/ppmquantall.$$"
mkdir $tempdir || { echo "Could not create temporary file. Exiting."; exit 1;}
chmod 700 $tempdir

trap 'rm -rf $tempdir' 0 1 3 15

all=$tempdir/pqa.all.$$

pnmcat -topbottom -jleft -white ${files[@]} | ppmquant $newcolors > $all
if [ $? != 0 ]; then
    exit $?
fi

y=0
i=0

while [ $i -lt $nfiles ]; do
    pnmcut -left 0 -top $y -width ${widths[$i]} -height ${heights[$i]} $all \
        > ${files[$i]}$ext
    if [ $? != 0 ]; then
        exit $?
    fi
    y=$(($y + ${heights[$i]}))
    i=$(($i + 1))
done
