about summary refs log tree commit diff
path: root/editor/ppmquantall
diff options
context:
space:
mode:
Diffstat (limited to 'editor/ppmquantall')
-rwxr-xr-xeditor/ppmquantall97
1 files changed, 97 insertions, 0 deletions
diff --git a/editor/ppmquantall b/editor/ppmquantall
new file mode 100755
index 00000000..af1ce22c
--- /dev/null
+++ b/editor/ppmquantall
@@ -0,0 +1,97 @@
+#!/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
+# pnmquant; this script solves it for multiple pixmaps.  All it does is
+# concatenate them together into one big pixmap, run pnmquant on that, and
+# then split it up into little pixmaps again.
+#
+# IMPLEMENTATION NOTE:  Now that Pnmcolormap can compute a single colormap
+# for a whole stream of images, this program could be implemented more
+# simply.  Today, it concatenates a bunch of images into one image, uses
+# Pnmquant to quantize that, then splits the result back into multiple
+# images.  It could instead just run Pnmcolormap over all the images,
+# then run Pnmremap on each input image using the one colormap for all.
+
+usage()
+{
+    echo "usage: $0 [-ext extension] <newcolors> <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[@]} | pnmquant $newcolors > $all
+if [ $? != 0 ]; then
+    exit $?
+fi
+
+y=0
+i=0
+
+while [ $i -lt $nfiles ]; do
+    pamcut -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