blobcats/generate_raster_images.zsh

74 lines
2.3 KiB
Bash
Executable File

#!/usr/bin/env zsh
# Generates trimmed raster images from SVGs in svg/.
# Argument 1 is the file extension, default is webp.
# Argument 2 is the size, default is to use the SVG size.
setopt LOCAL_OPTIONS ERR_RETURN NO_UNSET PIPE_FAIL
if ! type magick &> /dev/null; then
print -Pu2 "%F{1}'magick' from imagemagick not found%f"
return 1
fi
local ext=webp
[[ ${ARGC} > 0 ]] && ext=${1}
local size=-1
[[ ${ARGC} > 1 ]] && size=${2}
function gri_convert() {
local svg=${1}
local target=${svg##*/}
target=${ext}/${target%.*}.${ext}
magick -verbose -background none -quality 100 \
${svg} -trim -resize ${size} ${target}
if [[ ${ext} == "png" ]] && type pngcrush &> /dev/null; then
pngcrush -ow ${target}
fi
}
print -P "%F{12}generating ${ext} images in ${PWD}/${ext} …%f"
mkdir -p ${ext}
for svg in svg/*.svg; do
gri_convert ${svg}
done
if ([[ ${ext} == "webp" ]] && type webpmux &> /dev/null) \
|| ([[ ${ext} == "png" ]] && type apngasm &> /dev/null); then
print -P "%F{12}generating animated emoji …%f"
for cfg in svg/animated/*cfg; do
local emojiname=${cfg##*/}
emojiname=${emojiname%.*}
local -a webpmux_args=()
local -a apngasm_args=()
while read line; do
local -a framecfg=(${(@s: :)line})
[[ ${framecfg[1][1]} == "#" ]] && continue
if [[ ${framecfg[1]} == "loop" ]]; then
webpmux_args+=(-loop ${framecfg[2]})
apngasm_args+=(--loops ${framecfg[2]})
break
fi
webpmux_args+=(-frame ${ext}/${framecfg[1]}.${ext}
+${framecfg[2]}+0+0+0-b)
apngasm_args+=(${ext}/${framecfg[1]}.${ext} ${framecfg[2]})
gri_convert svg/animated/${framecfg[1]}.svg
done < ${cfg}
if [[ ${ext} == "webp" ]]; then
webpmux -o ${ext}/a${emojiname}.${ext} ${webpmux_args}
elif [[ ${ext} == "png" ]]; then
apngasm --force --output ${ext}/a${emojiname}.${ext} ${apngasm_args}
fi
rm -v ${ext}/${emojiname}_*.${ext}
done
else
print -P "%F{1}Not generating animated emoji." \
"Animated emojis are only generated for webp (with webpmux)" \
"and png (with apngasm)%f"
fi