Improve render script performance

The script no longer creates a new inkscape process for every
png export. Instead a single inkscape process is created for each
svg-file and export commands are simply fed to it. This allows for
using multiple CPU-cores and avoids the cost of constantly starting
up inkscape.

The script no longer renders out the entire icon set each time it's
run, instead it updates only icons which have been changed since
the last time the script finished running. This also means if the
script is interrupted while rendering, any svg-files what was
finished will not render out again saving time.
pull/48/head
Christer Jensen 7 years ago
parent 55a575386a
commit 1922bf0525

1
.gitignore vendored

@ -9,3 +9,4 @@ configure
install-sh install-sh
missing missing
*.tmp *.tmp
*_timestamp

@ -1,7 +1,6 @@
#!/bin/bash #!/bin/bash
INKSCAPE="/usr/bin/inkscape" INKSCAPE="/usr/bin/inkscape"
OPTIPNG="/usr/bin/optipng"
pushd `dirname $0` > /dev/null pushd `dirname $0` > /dev/null
DIR="$( cd "$(dirname "$0")" ; pwd -P )" DIR="$( cd "$(dirname "$0")" ; pwd -P )"
@ -9,62 +8,73 @@ popd > /dev/null
cd ${DIR} cd ${DIR}
TYPES=(actions apps categories devices emblems mimetypes places status)
SIZES=(16 22 24 32 48 64 96 128)
THEMEDIR=../Arc THEMEDIR=../Arc
mkdir -p $THEMEDIR # Set up all the folders in the theme directory.
mkdir -p $THEMEDIR/{actions,apps,categories,devices,emblems,mimetypes,places,status}/{16,22,24,32,48,64,96,128}{,@2x}
cp -u index.theme $THEMEDIR/index.theme
for CONTEXT in actions apps categories devices emblems mimetypes places status for CONTEXT in ${TYPES[@]}
do do
for SIZE in ${SIZES[@]}
do
cp -ru $CONTEXT/symlinks/* $THEMEDIR/$CONTEXT/$SIZE
cp -ru $CONTEXT/symlinks/* $THEMEDIR/$CONTEXT/$SIZE@2x
cp -ru $CONTEXT/symbolic $THEMEDIR/$CONTEXT
done
done
mkdir -p $THEMEDIR/$CONTEXT rm -rf $THEMEDIR/actions/{32,32@2x,48,48@2x,64,64@2x,96,96@2x,128,128@2x} # derp
mkdir -p $THEMEDIR/$CONTEXT
cp -r $CONTEXT/symbolic $THEMEDIR/$CONTEXT # TODO
cp -ru animations $THEMEDIR/.
cp -ru panel $THEMEDIR/.
for SIZE in 16 22 24 32 48 64 96 128
do
$INKSCAPE -S $CONTEXT.svg | grep -E "_$SIZE" | sed 's/\,.*$//' > index.tmp
mkdir -p $THEMEDIR/$CONTEXT/$SIZE # Generates inkscape export commands for the given
mkdir -p $THEMEDIR/$CONTEXT/$SIZE@2x # svg-file that can be piped to inkscape.
genInkscapeCmds() {
cp -r $CONTEXT/symlinks/* $THEMEDIR/$CONTEXT/$SIZE local CONTEXT=$1
cp -r $CONTEXT/symlinks/* $THEMEDIR/$CONTEXT/$SIZE@2x
for OBJECT_ID in `cat index.tmp` for SIZE in ${SIZES[@]}
do
echo "Rendering icons $CONTEXT.svg @$SIZE" >&2
for OBJECT_ID in `cat <($INKSCAPE -S $CONTEXT.svg | grep -E "_$SIZE" | sed 's/\,.*$//')`
do do
local ICON_NAME=$(sed "s/\_$SIZE.*$//" <<< $OBJECT_ID)
ICON_NAME=$(sed "s/\_$SIZE.*$//" <<< $OBJECT_ID)
echo \
if [ -f $THEMEDIR/$CONTEXT/$SIZE/$ICON_NAME.png ]; then "--export-id=$OBJECT_ID" \
echo $THEMEDIR/$CONTEXT/$SIZE/$ICON_NAME.png exists. "--export-id-only" \
else "--export-png=$THEMEDIR/$CONTEXT/$SIZE/$ICON_NAME.png $CONTEXT.svg"
echo
echo Rendering $THEMEDIR/$CONTEXT/$SIZE/$ICON_NAME.png echo \
$INKSCAPE --export-id=$OBJECT_ID \ "--export-id=$OBJECT_ID" \
--export-id-only \ "--export-dpi=180" \
--export-png=$THEMEDIR/$CONTEXT/$SIZE/$ICON_NAME.png $CONTEXT.svg >/dev/null \ "--export-id-only" \
&& $OPTIPNG -o7 --quiet $ASSETS_DIR/$i.png "--export-png=$THEMEDIR/$CONTEXT/$SIZE@2x/$ICON_NAME.png $CONTEXT.svg"
fi
if [ -f $THEMEDIR/$CONTEXT/$SIZE@2x/$ICON_NAME.png ]; then
echo $THEMEDIR/$CONTEXT/$SIZE@2x/$ICON_NAME.png exists.
else
echo
echo Rendering $THEMEDIR/$CONTEXT/$SIZE@2x/$ICON_NAME.png
$INKSCAPE --export-id=$OBJECT_ID \
--export-dpi=180 \
--export-id-only \
--export-png=$THEMEDIR/$CONTEXT/$SIZE@2x/$ICON_NAME.png $CONTEXT.svg >/dev/null \
&& $OPTIPNG -o7 --quiet $ASSETS_DIR/$i@2.png
fi
done done
done done
}
for CONTEXT in ${TYPES[@]}
do
# Only render out the icons if the svg-file has been modified
# since we finished rendering it out last.
if [[ $CONTEXT.svg -nt .${CONTEXT}_timestamp ]]
then
genInkscapeCmds $CONTEXT | $INKSCAPE --shell > /dev/null && touch .${CONTEXT}_timestamp &
else
echo "No changes to $CONTEXT.svg, skipping..."
fi
done done
rm index.tmp wait
cp index.theme $THEMEDIR/index.theme
rm -rf $THEMEDIR/actions/{32,32@2x,48,48@2x,64,64@2x,96,96@2x,128,128@2x} # derp
# TODO # Remove all empty directories from the theme folder.
cp -r animations $THEMEDIR/. find $THEMEDIR -type d -empty -delete
cp -r panel $THEMEDIR/.

Loading…
Cancel
Save