#! /bin/bash
# This script tests: giftopnm pamtogif ppmtogif
# Also requires: pamarith pamcomp pamdepth pamenlarge pamstack pbmmake
# Also requires: pnminvert ppmchange ppmpat ppmtopgm ppmtoppm 

tmpdir=${tmpdir:-/tmp}

madras_ppm=${tmpdir}/madras.ppm
gingham_ppm=${tmpdir}/gingham.ppm
argyle_ppm=${tmpdir}/argyle.ppm

alpha0_pbm=${tmpdir}/alpha0.pbm
alpha1_pbm=${tmpdir}/alpha1.pbm
clear_pbm=${tmpdir}/clear.pbm
opaque_pbm=${tmpdir}/opaque.pbm
alpha0_pam=${tmpdir}/alpha0.pam
alpha1_pam=${tmpdir}/alpha1.pam
clear_pam=${tmpdir}/clear.pam
opaque_pam=${tmpdir}/opaque.pam

image0_alpha_pam=${tmpdir}/image0.alpha.pam
image1_alpha_pam=${tmpdir}/image1.alpha.pam

out_pnm=${tmpdir}/out.pnm
out0_ppm=${tmpdir}/out0.ppm
out1_ppm=${tmpdir}/out1.ppm
out2_ppm=${tmpdir}/out2.ppm
a0_out_pbm=${tmpdir}/a0.out.pbm
a1_out_pbm=${tmpdir}/a1.out.pbm

# Make test images & alpha masks

ppmpat -argyle2 \
  -color=rgb:00/00/00,rgb:ff/ff/ff,rgb:ff/ff/ff 40 24 > ${argyle_ppm}
ppmpat -gingham3 \
  -color=rgb:3f/3f/3f,rgb:7f/7f/7f,rgb:ef/ef/ef 40 24 > ${gingham_ppm}
ppmpat -madras \
       -color=rgb:0f/0f/0f,rgb:ff/00/00,rgb:00/ff/00 40 24 > ${madras_ppm}

pbmmake -g 5 3 | pamenlarge 8 | tee ${alpha0_pbm} | \
  pamdepth 255 > ${alpha0_pam}
pnminvert ${alpha0_pbm} | tee ${alpha1_pbm} | \
  pamdepth 255 > ${alpha1_pam}

pbmmake -w 40 24 | tee ${clear_pbm} | pamdepth 255 > ${clear_pam}
pbmmake -b 40 24 | tee ${opaque_pbm} | pamdepth 255 > ${opaque_pam}


echo "Test 0."
echo "Should print 0 or 1 0."
i=1
for test_pnm in ${argyle_ppm} ${gingham_ppm} ${madras_ppm} \
			      ${alpha0_pbm} ${alpha1_pbm}
  do
  echo -n "Image $i: "; i=$((i+1));
  pamtogif ${test_pnm} | giftopnm | tee ${out_pnm} | \
    cmp -s - ${test_pnm}; result=$?

  if [ $result -eq 0 ];
    then echo $?;
  else
    ppmtoppm < ${out_pnm} | cmp -s - ${test_pnm}; echo $result $?
  fi
  # madras, alpha, alpha1 : should match
  # argyle: giftopnm produces PBM, gingham: giftopnm produces PGM
  rm ${out_pnm}
  done


echo "Test 1."  # Color + alpha channel
echo "Should print 0 unless otherwise stated."

i=1
for test_pnm in  ${argyle_ppm} ${gingham_ppm} ${madras_ppm}
  do
  echo "Image $i"; i=$((i+1));

  pamstack -tupletype="RGB_ALPHA" ${test_pnm} ${alpha0_pam} > \
    ${image0_alpha_pam}
  pamstack -tupletype="RGB_ALPHA" ${test_pnm} ${alpha1_pam} > \
    ${image1_alpha_pam}

  pamtogif ${image0_alpha_pam} | giftopnm -alphaout=${a0_out_pbm} | \
    ppmtoppm | tee ${out0_ppm} | \
    cmp -s - ${test_pnm}; echo "a1:" $? "(should print 1)"
  cmp -s ${alpha0_pbm} ${a0_out_pbm}; echo "a2:" $?  # Should match

  pamarith -multiply ${test_pnm} ${alpha0_pbm} | \
    cmp -s - ${out0_ppm}; echo "a3:" $? # Should match

  pamtogif ${image1_alpha_pam} | giftopnm -alphaout=${a1_out_pbm} | \
    ppmtoppm | tee ${out1_ppm} | \
    cmp -s - ${test_pnm}; echo "b1:" $? "(should print 1)"

  cmp -s ${alpha1_pbm} ${a1_out_pbm}; echo "b2:" $?  # Should match

  pamarith -multiply ${test_pnm} ${alpha1_pam} | \
    cmp -s - ${out1_ppm}; echo "b3:" $?    # Should match

  pamarith -multiply ${test_pnm} ${alpha0_pbm} | \
    cmp -s - ${out0_ppm}; echo "c1:" $?    # Should match

  pamarith -multiply ${test_pnm} ${alpha1_pbm} | \
    cmp -s - ${out1_ppm}; echo "c2:" $?    # Should match

  pamcomp -alpha=${alpha0_pbm} ${out0_ppm} ${out1_ppm} | \
    cmp -s - ${test_pnm}; echo "c3:" $?    # Should match

  pamcomp -alpha=${alpha1_pbm} ${out1_ppm} ${out0_ppm} | \
    cmp -s - ${test_pnm}; echo "c4:" $?    # Should match

  pamtogif ${image0_alpha_pam} -alphacolor=rgb:00/00/80 | \
    giftopnm  -alphaout=${a0_out_pbm} > /dev/null
    cmp -s ${a0_out_pbm} ${alpha0_pbm}; echo "d1:" $?    # Should match

  pamtogif ${image0_alpha_pam} -alphacolor=rgb:00/00/80 | \
    giftopnm | ppmtoppm | \
    ppmchange rgb:00/00/80 rgb:00/00/00 -remainder=rgb:ff/ff/ff | \
    ppmtopgm | \
    cmp -s - ${alpha0_pam}; echo "d2:" $?    # Should match

  rm ${image0_alpha_pam} ${image1_alpha_pam}
  rm ${out0_ppm} ${out1_ppm} # ${out0_pnm} ${out1_pnm}
  rm ${a0_out_pbm} ${a1_out_pbm}

  done

echo "Test 2."  # clear/opaque alpha channel
echo "Should print 0 unless otherwise stated."

i=1
for test_pnm in  ${argyle_ppm} ${gingham_ppm} ${madras_ppm}
  do
  echo "Image $i"; i=$((i+1));

  pamstack -tupletype="RGB_ALPHA" ${test_pnm} ${clear_pam} > \
    ${image0_alpha_pam}
  pamstack -tupletype="RGB_ALPHA" ${test_pnm} ${opaque_pam} > \
    ${image1_alpha_pam}

  # clear
  pamtogif ${image0_alpha_pam} | giftopnm -alphaout=${a0_out_pbm} | \
    ppmtoppm | tee ${out0_ppm} | \
    cmp -s - ${test_pnm}; echo "cl1:" $? # Should match
  cmp -s ${clear_pbm} ${a0_out_pbm}; echo "cl2:" $?  # Should match

  # opaque
  pamtogif ${image1_alpha_pam} | giftopnm -alphaout=${a1_out_pbm} | \
    tee ${out1_ppm} | \
    cmp -s - ${test_pnm}; echo "op1:" $? "(should print 1)"

  cmp -s ${opaque_pbm} ${a1_out_pbm}; echo "op2:" $?  # Should match

  rm ${image0_alpha_pam} ${image1_alpha_pam}
  rm ${out0_ppm} ${out1_ppm}
  rm ${a0_out_pbm} ${a1_out_pbm}

  done

rm ${clear_pbm} ${clear_pam} ${opaque_pbm} ${opaque_pam}


echo "Test 3."  # ppmtogif
echo "Should print 0 in all cases."

i=1
for test_pnm in  ${argyle_ppm} ${gingham_ppm} ${madras_ppm}
  do
  echo "Image $i"; i=$((i+1));

  ppmtogif -alpha=${alpha0_pbm} ${test_pnm} | \
    giftopnm -alphaout=${a0_out_pbm} | \
    ppmtoppm > ${out0_ppm}
    cmp -s ${alpha0_pbm} ${a0_out_pbm}; echo "a2:" $?  # Should match
  pamarith -multiply ${test_pnm} ${alpha0_pbm} | \
    cmp -s - ${out0_ppm}; echo "a3:" $? # Should match

  ppmtogif -alpha=${alpha1_pbm} ${test_pnm} | \
    giftopnm -alphaout=${a1_out_pbm} | \
    ppmtoppm > ${out1_ppm}
    cmp -s ${alpha1_pbm} ${a1_out_pbm}; echo "b2:" $?  # Should match
  pamarith -multiply ${test_pnm} ${alpha1_pam} | \
    cmp -s - ${out1_ppm}; echo "b3:" $?    # Should match

  pamcomp -alpha=${alpha1_pbm} ${out1_ppm} ${out0_ppm} | \
    cmp -s - ${test_pnm}; echo "c4:" $?    # Should match

  rm ${out0_ppm} ${out1_ppm}
  rm ${a0_out_pbm} ${a1_out_pbm}

  done

rm ${alpha0_pbm} ${alpha1_pbm}
rm ${alpha0_pam} ${alpha1_pam}
rm ${argyle_ppm} ${gingham_ppm}


echo "Test 4."
echo "Should print 0 in all cases."
# no separate alpha channel
# designate colors which appear in madras as transparent 

for color in "0f/0f/0f" "ff/00/00" "00/ff/00"
  do
  echo "color=rgb:"${color}
  pamtogif -transparent=rgb:${color} ${madras_ppm} | \
    giftopnm -alphaout=${a0_out_pbm} > ${out0_ppm}
    cmp -s ${madras_ppm} ${out0_ppm}; echo $?   # Should match 

  pbmmake -g 40 24 | pamdepth 255 | pamstack ${madras_ppm} - | 
  pamtogif -transparent=rgb:${color} - | \
    giftopnm -alphaout=${a1_out_pbm} > ${out1_ppm}
    cmp -s ${madras_ppm} ${out1_ppm}; echo $?   # Should match 

  ppmchange rgb:${color} rgb:00/00/00 \
    -remainder=rgb:ff/ff/ff ${madras_ppm} > ${out2_ppm}

  ppmtoppm < ${a0_out_pbm} | \
    cmp -s ${out2_ppm} -; echo $?   # Should match 

  rm ${out0_ppm} ${out1_ppm} ${out2_ppm} ${a0_out_pbm} ${a1_out_pbm}
  done

rm ${madras_ppm} 
