1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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
|