Index: build/sanitize-png-files.sh |
diff --git a/build/sanitize-png-files.sh b/build/sanitize-png-files.sh |
index 88c704d2e854af8418d37f903e5f64ae90f44a73..92ddeb898209f81fa06fbf0212b75e99a325e561 100755 |
--- a/build/sanitize-png-files.sh |
+++ b/build/sanitize-png-files.sh |
@@ -27,10 +27,18 @@ remoting/resources |
remoting/webapp |
" |
+# Files larger than this file size (in bytes) will |
+# use the optimization parameters tailored for large files. |
+LARGE_FILE_THRESHOLD=3000 |
+ |
# Constants used for optimization |
-readonly MIN_BLOCK_SIZE=128 |
-readonly LIMIT_BLOCKS=256 |
-readonly RANDOM_TRIALS=100 |
+readonly DEFAULT_MIN_BLOCK_SIZE=128 |
+readonly DEFAULT_LIMIT_BLOCKS=256 |
+readonly DEFAULT_RANDOM_TRIALS=100 |
+# Taken from the recommendation in the pngslim's readme.txt. |
+readonly LARGE_MIN_BLOCK_SIZE=1 |
+readonly LARGE_LIMIT_BLOCKS=2 |
+readonly LARGE_RANDOM_TRIALS=1 |
# Global variables for stats |
TOTAL_OLD_BYTES=0 |
@@ -54,12 +62,29 @@ function pngout_loop { |
local file=$1 |
shift |
local opts=$* |
- for i in 0 128 256 512; do |
+ if [ $OPTIMIZE_LEVEL == 1 ]; then |
for j in $(seq 0 5); do |
throbber |
- pngout -q -k1 -s1 -b$i -f$j $opts $file |
+ pngout -q -k1 -s1 -f$j $opts $file |
done |
- done |
+ else |
+ for i in 0 128 256 512; do |
+ for j in $(seq 0 5); do |
+ throbber |
+ pngout -q -k1 -s1 -b$i -f$j $opts $file |
+ done |
+ done |
+ fi |
+} |
+ |
+# Usage: get_color_depth_list |
+# Returns the list of color depth options for current optimization level. |
+function get_color_depth_list { |
+ if [ $OPTIMIZE_LEVEL == 1 ]; then |
+ echo "-d0" |
+ else |
+ echo "-d1 -d2 -d4 -d8" |
+ fi |
} |
# Usage: process_grayscale <file> |
@@ -68,7 +93,7 @@ function pngout_loop { |
# TODO(oshima): Experiment with -d0 w/o -c0. |
function process_grayscale { |
echo -n "|gray" |
- for opt in -d1 -d2 -d4 -d8; do |
+ for opt in $(get_color_depth_list); do |
pngout_loop $file -c0 $opt |
done |
} |
@@ -78,7 +103,7 @@ function process_grayscale { |
function process_grayscale_alpha { |
echo -n "|gray-a" |
pngout_loop $file -c4 |
- for opt in -d1 -d2 -d4 -d8; do |
+ for opt in $(get_color_depth_list); do |
pngout_loop $file -c3 $opt |
done |
} |
@@ -87,7 +112,7 @@ function process_grayscale_alpha { |
# Optimize rgb images with or without alpha for all color bit depths. |
function process_rgb { |
echo -n "|rgb" |
- for opt in -d1 -d2 -d4 -d8; do |
+ for opt in $(get_color_depth_list); do |
pngout_loop $file -c3 $opt |
done |
pngout_loop $file -c2 |
@@ -100,11 +125,19 @@ function huffman_blocks { |
local file=$1 |
echo -n "|huffman" |
local size=$(stat -c%s $file) |
- let MAX_BLOCKS=$size/$MIN_BLOCK_SIZE |
- if [ $MAX_BLOCKS -gt $LIMIT_BLOCKS ]; then |
- MAX_BLOCKS=$LIMIT_BLOCKS |
+ local min_block_size=$DEFAULT_MIN_BLOCK_SIZE |
+ local limit_blocks=$DEFAULT_LIMIT_BLOCKS |
+ |
+ if [ $size -gt $LARGE_FILE_THRESHOLD ]; then |
+ min_block_size=$LARGE_MIN_BLOCK_SIZE |
+ limit_blocks=$LARGE_LIMIT_BLOCKS |
fi |
- for i in $(seq 2 $MAX_BLOCKS); do |
+ let max_blocks=$size/$min_block_size |
+ if [ $max_blocks -gt $limit_blocks ]; then |
+ max_blocks=$limit_blocks |
+ fi |
+ |
+ for i in $(seq 2 $max_blocks); do |
throbber |
pngout -q -k1 -ks -s1 -n$i $file |
done |
@@ -119,7 +152,12 @@ function random_huffman_table_trial { |
echo -n "|random" |
local file=$1 |
local old_size=$(stat -c%s $file) |
- for i in $(seq 1 $RANDOM_TRIALS); do |
+ local trials_count=$DEFAULT_RANDOM_TRIALS |
+ |
+ if [ $old_size -gt $LARGE_FILE_THRESHOLD ]; then |
+ trials_count=$LARGE_RANDOM_TRIALS |
+ fi |
+ for i in $(seq 1 $trials_count); do |
throbber |
pngout -q -k1 -ks -s0 -r $file |
done |
@@ -135,10 +173,12 @@ function random_huffman_table_trial { |
function final_compression { |
echo -n "|final" |
local file=$1 |
- for i in 32k 16k 8k 4k 2k 1k 512; do |
- throbber |
- optipng -q -nb -nc -zw$i -zc1-9 -zm1-9 -zs0-3 -f0-5 $file |
- done |
+ if [ $OPTIMIZE_LEVEL == 2 ]; then |
+ for i in 32k 16k 8k 4k 2k 1k 512; do |
+ throbber |
+ optipng -q -nb -nc -zw$i -zc1-9 -zm1-9 -zs0-3 -f0-5 $file |
+ done |
+ fi |
for i in $(seq 1 4); do |
throbber |
advdef -q -z -$i $file |
@@ -178,11 +218,17 @@ function optimize_size { |
# TODO(oshima): Experiment with strategy 1. |
echo -n "|strategy" |
- for i in 3 2 0; do |
- pngout -q -k1 -ks -s$i $file |
- done |
+ if [ $OPTIMIZE_LEVEL == 2 ]; then |
+ for i in 3 2 0; do |
+ pngout -q -k1 -ks -s$i $file |
+ done |
+ else |
+ pngout -q -k1 -ks -s1 $file |
+ fi |
- random_huffman_table_trial $file |
+ if [ $OPTIMIZE_LEVEL == 2 ]; then |
+ random_huffman_table_trial $file |
+ fi |
final_compression $file |
} |
@@ -194,7 +240,7 @@ function process_file { |
# -rem alla removes all ancillary chunks except for tRNS |
pngcrush -d $TMP_DIR -brute -reduce -rem alla $file > /dev/null |
- if [ ! -z "$OPTIMIZE" ]; then |
+ if [ $OPTIMIZE_LEVEL != 0 ]; then |
optimize_size $TMP_DIR/$name |
fi |
} |
@@ -210,8 +256,6 @@ function sanitize_file { |
local new=$(stat -c%s $tmp_file) |
let diff=$old-$new |
- let TOTAL_OLD_BYTES+=$old |
- let TOTAL_NEW_BYTES+=$new |
let percent=($diff*100)/$old |
let TOTAL_FILE+=1 |
@@ -219,9 +263,11 @@ function sanitize_file { |
if [ $new -lt $old ]; then |
echo -ne "$file : $old => $new ($diff bytes : $percent %)\n" |
mv "$tmp_file" "$file" |
+ let TOTAL_OLD_BYTES+=$old |
+ let TOTAL_NEW_BYTES+=$new |
let PROCESSED_FILE+=1 |
else |
- if [ -z "$OPTIMIZE" ]; then |
+ if [ $OPTIMIZE_LEVEL == 0 ]; then |
echo -ne "$file : skipped\r" |
fi |
rm $tmp_file |
@@ -264,8 +310,14 @@ $program is a utility to reduce the size of png files by removing |
unnecessary chunks and compressing the image. |
Options: |
- -o Aggressively optimize file size. Warning: this is *VERY* slow and |
- can take hours to process all files. |
+ -o<optimize_level> Specify optimization level: (default is 1) |
+ 0 Just run pngcrush. It removes unnecessary chunks and perform basic |
+ optimization on the encoded data. |
+ 1 Optimize png files using pngout/optipng and advdef. This can further |
+ reduce addtional 5~30%. This is the default level. |
+ 2 Aggressively optimize the size of png files. This may produce |
+ addtional 1%~5% reduction. Warning: this is *VERY* |
+ slow and can take hours to process all files. |
-h Print this help text." |
exit 1 |
} |
@@ -275,12 +327,17 @@ if [ ! -e ../.gclient ]; then |
exit 1 |
fi |
+OPTIMIZE_LEVEL=1 |
# Parse options |
-while getopts oh opts |
+while getopts o:h opts |
do |
case $opts in |
o) |
- OPTIMIZE=true; |
+ if [[ ! "$OPTARG" =~ [012] ]]; then |
+ show_help |
+ fi |
+ OPTIMIZE_LEVEL=$OPTARG |
+ [ "$1" == "-o" ] && shift |
shift;; |
[h?]) |
show_help;; |
@@ -289,7 +346,7 @@ done |
# Make sure we have all necessary commands installed. |
install_if_not_installed pngcrush |
-if [ ! -z "$OPTIMIZE" ]; then |
+if [ $OPTIMIZE_LEVEL != 2 ]; then |
install_if_not_installed optipng |
fail_if_not_installed advdef "http://advancemame.sourceforge.net/comp-download.html" |
fail_if_not_installed pngout "http://www.jonof.id.au/kenutils" |
@@ -305,6 +362,7 @@ trap "rm -rf $TMP_DIR" EXIT |
DIRS=$@ |
set ${DIRS:=$ALL_DIRS} |
+echo "Optimize level=$OPTIMIZE_LEVEL" |
for d in $DIRS; do |
echo "Sanitizing png files in $d" |
sanitize_dir $d |