forked from ioccc-src/winner
-
Notifications
You must be signed in to change notification settings - Fork 6
/
makegif.sh
executable file
·66 lines (62 loc) · 2.19 KB
/
makegif.sh
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
#!/bin/bash
image=${1:-"input.jpg"}
output=${2:-"output.gif"}
prog=${3:-"./prog"}
ext="${image##*.}"
dir="gif"
[[ $# -lt 3 ]] && [[ "$ext" = "png" || "$ext" = "ppm" ]] && prog="./prog_$ext"
[[ -f "$image" ]] || {
echo "Usage: $0 image.jpg output.gif ./prog"
echo "Dependencies: ImageMagick, bc (basic calculator)"
echo "Note: don't use large images (dimensions above 1000), ImageMagick may fail."
echo "Uses \"gif\" directory for temporary files."
exit 1
}
# make sure CC is set so that when we do make CC="$CC" it isn't empty. Doing it
# this way allows us to have the user specify a different compiler in an easy
# way.
[[ -z "$CC" || ! -f "$CC" || ! -x "$CC" ]] && CC="cc"
make CC="$CC" all >/dev/null || exit 1
mkdir -p "$dir"
i=8 ; x=$i ; j=0
while [[ $x -le 16000 ]]; do
x="$(echo "a=$i*e(l(2)/4*$j)+0.5;scale=0;a/1" | bc -l)"
echo "### $j : $x"
list[j]="$dir/out$j.$ext"
"$prog" "$x" "$image" "$dir/out$j.$ext" ; j=$((j+1))
done
i=$j ; j=$((j-2))
while [[ $j -ge 1 ]]; do
### Uncomment the following line if you want to make a GIF in an image editor such as GIMP
# cp "$dir/out$j.$ext" "$dir/out$i.$ext"
list[i]="$dir/out$j.$ext"
i=$((i+1)) ; j=$((j-1))
done
# try finding convert(1) from ImageMagick if CONVERT not passed to script or is
# not an executable file
convert_error()
{
echo 1>&2
echo "Warning: $CONVERT failed to generate out.gif. Is $CONVERT convert(1) from ImageMagick?" 1>&2
echo "Tip: visit: https://www.ioccc.org/faq.html#imagemagick" 1>&2
echo 1>&2
echo "Tip: if you have it in a different path, try: CONVERT=path ./try.sh" 1>&2
echo 1>&2
}
[[ -z "$CONVERT" || ! -f "$CONVERT" || ! -x "$CONVERT" ]] && CONVERT="$(type -P convert)"
if [[ -z "$CONVERT" || ! -f "$CONVERT" || ! -x "$CONVERT" ]]; then
echo 1>&2
echo "Could not fine convert(1) from ImageMagick." 1>&2
echo "Tip: visit: https://www.ioccc.org/faq.html#imagemagick" 1>&2
echo 1>&2
else
"$CONVERT" -delay 10 -dither none -loop 0 "${list[@]}" +map "$output"
if [[ ! -f "$output" ]]; then
convert_error
else
echo 1>&2
echo "Now look at $output with a graphics viewer that can show animated GIFs." 1>&2
echo "Warning: includes flashing colours." 1>&2
echo 1>&2
fi
fi