From 1922bf05254b464725c456740a8ddca2edd687ab Mon Sep 17 00:00:00 2001 From: Christer Jensen Date: Wed, 30 Aug 2017 19:46:22 +0200 Subject: [PATCH] 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. --- .gitignore | 1 + src/render_icons.sh | 98 +++++++++++++++++++++++++-------------------- 2 files changed, 55 insertions(+), 44 deletions(-) mode change 100644 => 100755 src/render_icons.sh diff --git a/.gitignore b/.gitignore index 05b994c..f256c54 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ configure install-sh missing *.tmp +*_timestamp diff --git a/src/render_icons.sh b/src/render_icons.sh old mode 100644 new mode 100755 index 9152e8d..3864c08 --- a/src/render_icons.sh +++ b/src/render_icons.sh @@ -1,7 +1,6 @@ #!/bin/bash INKSCAPE="/usr/bin/inkscape" -OPTIPNG="/usr/bin/optipng" pushd `dirname $0` > /dev/null DIR="$( cd "$(dirname "$0")" ; pwd -P )" @@ -9,62 +8,73 @@ popd > /dev/null cd ${DIR} +TYPES=(actions apps categories devices emblems mimetypes places status) +SIZES=(16 22 24 32 48 64 96 128) + 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 + 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 - mkdir -p $THEMEDIR/$CONTEXT +rm -rf $THEMEDIR/actions/{32,32@2x,48,48@2x,64,64@2x,96,96@2x,128,128@2x} # derp - 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 - mkdir -p $THEMEDIR/$CONTEXT/$SIZE@2x +# Generates inkscape export commands for the given +# svg-file that can be piped to inkscape. +genInkscapeCmds() { - cp -r $CONTEXT/symlinks/* $THEMEDIR/$CONTEXT/$SIZE - cp -r $CONTEXT/symlinks/* $THEMEDIR/$CONTEXT/$SIZE@2x + local CONTEXT=$1 - 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 - - ICON_NAME=$(sed "s/\_$SIZE.*$//" <<< $OBJECT_ID) - - if [ -f $THEMEDIR/$CONTEXT/$SIZE/$ICON_NAME.png ]; then - echo $THEMEDIR/$CONTEXT/$SIZE/$ICON_NAME.png exists. - else - echo - echo Rendering $THEMEDIR/$CONTEXT/$SIZE/$ICON_NAME.png - $INKSCAPE --export-id=$OBJECT_ID \ - --export-id-only \ - --export-png=$THEMEDIR/$CONTEXT/$SIZE/$ICON_NAME.png $CONTEXT.svg >/dev/null \ - && $OPTIPNG -o7 --quiet $ASSETS_DIR/$i.png - 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 + local ICON_NAME=$(sed "s/\_$SIZE.*$//" <<< $OBJECT_ID) + + echo \ + "--export-id=$OBJECT_ID" \ + "--export-id-only" \ + "--export-png=$THEMEDIR/$CONTEXT/$SIZE/$ICON_NAME.png $CONTEXT.svg" + + echo \ + "--export-id=$OBJECT_ID" \ + "--export-dpi=180" \ + "--export-id-only" \ + "--export-png=$THEMEDIR/$CONTEXT/$SIZE@2x/$ICON_NAME.png $CONTEXT.svg" 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 -rm index.tmp -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 +wait -# TODO -cp -r animations $THEMEDIR/. -cp -r panel $THEMEDIR/. +# Remove all empty directories from the theme folder. +find $THEMEDIR -type d -empty -delete