Index: tools/resources/optimize-png-files.sh |
diff --git a/tools/resources/optimize-png-files.sh b/tools/resources/optimize-png-files.sh |
index e5e404324be9185364d5555c5e73484d211e2915..c40e78d4cd8d415bb54e66f9191c7ceb182afd02 100755 |
--- a/tools/resources/optimize-png-files.sh |
+++ b/tools/resources/optimize-png-files.sh |
@@ -1,4 +1,4 @@ |
-#!/bin/bash |
+#!/bin/bash -i |
# Copyright 2013 The Chromium Authors. All rights reserved. |
# Use of this source code is governed by a BSD-style license that can be |
# found in the LICENSE file. |
@@ -54,11 +54,11 @@ PROCESSED_FILE=0 |
declare -a THROBBER_STR=('-' '\\' '|' '/') |
THROBBER_COUNT=0 |
-VERBOSE=0 |
+VERBOSE=false |
# Echo only if verbose option is set. |
function info { |
- if [ $VERBOSE -eq 1 ]; then |
+ if $VERBOSE ; then |
echo $@ |
fi |
} |
@@ -66,7 +66,8 @@ function info { |
# Show throbber character at current cursor position. |
function throbber { |
info -ne "${THROBBER_STR[$THROBBER_COUNT]}\b" |
- let THROBBER_COUNT=($THROBBER_COUNT+1)%4 |
+ let THROBBER_COUNT=$THROBBER_COUNT+1 |
+ let THROBBER_COUNT=$THROBBER_COUNT%4 |
} |
# Usage: pngout_loop <file> <png_out_options> ... |
@@ -77,13 +78,13 @@ function pngout_loop { |
shift |
local opts=$* |
if [ $OPTIMIZE_LEVEL == 1 ]; then |
- for j in $(seq 0 5); do |
+ for j in $(eval echo {0..5}); do |
throbber |
pngout -q -k1 -s1 -f$j $opts $file |
done |
else |
for i in 0 128 256 512; do |
- for j in $(seq 0 5); do |
+ for j in $(eval echo {0..5}); do |
throbber |
pngout -q -k1 -s1 -b$i -f$j $opts $file |
done |
@@ -106,7 +107,7 @@ function get_color_depth_list { |
# |
# TODO(oshima): Experiment with -d0 w/o -c0. |
function process_grayscale { |
- info -n "|gray" |
+ info -ne "\b\b\b\b\b\b\b\bgray...." |
for opt in $(get_color_depth_list); do |
pngout_loop $file -c0 $opt |
done |
@@ -115,7 +116,7 @@ function process_grayscale { |
# Usage: process_grayscale_alpha <file> |
# Optimize grayscale images with alpha for all color bit depths. |
function process_grayscale_alpha { |
- info -n "|gray-a" |
+ info -ne "\b\b\b\b\b\b\b\bgray-a.." |
pngout_loop $file -c4 |
for opt in $(get_color_depth_list); do |
pngout_loop $file -c3 $opt |
@@ -125,7 +126,7 @@ function process_grayscale_alpha { |
# Usage: process_rgb <file> |
# Optimize rgb images with or without alpha for all color bit depths. |
function process_rgb { |
- info -n "|rgb" |
+ info -ne "\b\b\b\b\b\b\b\brgb....." |
for opt in $(get_color_depth_list); do |
pngout_loop $file -c3 $opt |
done |
@@ -136,8 +137,8 @@ function process_rgb { |
# Usage: huffman_blocks <file> |
# Optimize the huffman blocks. |
function huffman_blocks { |
+ info -ne "\b\b\b\b\b\b\b\bhuffman." |
local file=$1 |
- info -n "|huffman" |
local size=$(stat -c%s $file) |
local min_block_size=$DEFAULT_MIN_BLOCK_SIZE |
local limit_blocks=$DEFAULT_LIMIT_BLOCKS |
@@ -151,7 +152,7 @@ function huffman_blocks { |
max_blocks=$limit_blocks |
fi |
- for i in $(seq 2 $max_blocks); do |
+ for i in $(eval echo {2..$max_blocks}); do |
throbber |
pngout -q -k1 -ks -s1 -n$i $file |
done |
@@ -163,7 +164,7 @@ function huffman_blocks { |
# TODO(oshima): Try adjusting different parameters for large files to |
# reduce runtime. |
function random_huffman_table_trial { |
- info -n "|random" |
+ info -ne "\b\b\b\b\b\b\b\brandom.." |
local file=$1 |
local old_size=$(stat -c%s $file) |
local trials_count=$DEFAULT_RANDOM_TRIALS |
@@ -171,7 +172,7 @@ function random_huffman_table_trial { |
if [ $old_size -gt $LARGE_FILE_THRESHOLD ]; then |
trials_count=$LARGE_RANDOM_TRIALS |
fi |
- for i in $(seq 1 $trials_count); do |
+ for i in $(eval echo {1..$trials_count}); do |
throbber |
pngout -q -k1 -ks -s0 -r $file |
done |
@@ -185,7 +186,7 @@ function random_huffman_table_trial { |
# Further compress using optipng and advdef. |
# TODO(oshima): Experiment with 256. |
function final_compression { |
- info -n "|final" |
+ info -ne "\b\b\b\b\b\b\b\bfinal..." |
local file=$1 |
if [ $OPTIMIZE_LEVEL == 2 ]; then |
for i in 32k 16k 8k 4k 2k 1k 512; do |
@@ -193,21 +194,25 @@ function final_compression { |
optipng -q -nb -nc -zw$i -zc1-9 -zm1-9 -zs0-3 -f0-5 $file |
done |
fi |
- for i in $(seq 1 4); do |
+ for i in $(eval echo {1..4}); do |
throbber |
advdef -q -z -$i $file |
done |
- info -ne "\r" |
+ |
+ # Clear the current line. |
+ if $VERBOSE ; then |
+ printf "\033[0G\033[K" |
+ fi |
} |
# Usage: get_color_type <file> |
# Returns the color type name of the png file. Here is the list of names |
# for each color type codes. |
-# 0 : grayscale |
-# 2 : RGB |
-# 3 : colormap |
-# 4 : gray+alpha |
-# 6 : RGBA |
+# 0: grayscale |
+# 2: RGB |
+# 3: colormap |
+# 4: gray+alpha |
+# 6: RGBA |
# See http://en.wikipedia.org/wiki/Portable_Network_Graphics#Color_depth |
# for details about the color type code. |
function get_color_type { |
@@ -218,9 +223,17 @@ function get_color_type { |
# Usage: optimize_size <file> |
# Performs png file optimization. |
function optimize_size { |
- tput el |
+ # Print filename, trimmed to ensure it + status don't take more than 1 line |
+ local filename_length=${#file} |
+ local -i allowed_length=$COLUMNS-11 |
+ local -i trimmed_length=$filename_length-$COLUMNS+14 |
+ if [ "$filename_length" -lt "$allowed_length" ]; then |
+ info -n "$file|........" |
+ else |
+ info -n "...${file:$trimmed_length}|........" |
+ fi |
+ |
local file=$1 |
- info -n "$file " |
advdef -q -z -4 $file |
@@ -239,7 +252,7 @@ function optimize_size { |
fi |
fi |
- info -n "|filter" |
+ info -ne "\b\b\b\b\b\b\b\bfilter.." |
local old_color_type=$(get_color_type $file) |
optipng -q -zc9 -zm8 -zs0-3 -f0-5 $file -out $file.tmp.png |
local new_color_type=$(get_color_type $file.tmp.png) |
@@ -248,9 +261,8 @@ function optimize_size { |
# the bug is fixed. See crbug.com/174505, crbug.com/174084. |
# The issue is reported in |
# https://sourceforge.net/tracker/?func=detail&aid=3603630&group_id=151404&atid=780913 |
- if [[ $old_color_type == "RGBA" && $new_color_type =~ gray.* ]] ; then |
+ if [[ $old_color_type == "RGBA" && $new_color_type == gray* ]] ; then |
rm $file.tmp.png |
- info -n "[skip opting]" |
else |
mv $file.tmp.png $file |
fi |
@@ -259,7 +271,7 @@ function optimize_size { |
huffman_blocks $file |
# TODO(oshima): Experiment with strategy 1. |
- info -n "|strategy" |
+ info -ne "\b\b\b\b\b\b\b\bstrategy" |
if [ $OPTIMIZE_LEVEL == 2 ]; then |
for i in 3 2 0; do |
pngout -q -k1 -ks -s$i $file |
@@ -280,7 +292,7 @@ function process_file { |
local file=$1 |
local name=$(basename $file) |
# -rem alla removes all ancillary chunks except for tRNS |
- pngcrush -d $TMP_DIR -brute -reduce -rem alla $file > /dev/null |
+ pngcrush -d $TMP_DIR -brute -reduce -rem alla $file > /dev/null 2>&1 |
if [ -f $TMP_DIR/$name -a $OPTIMIZE_LEVEL != 0 ]; then |
optimize_size $TMP_DIR/$name |
@@ -301,26 +313,28 @@ function optimize_file { |
process_file $file |
- if [ ! -e $tmp_file ] ; then |
+ if [ ! -e $tmp_file ] ; then |
let CORRUPTED_FILE+=1 |
- echo "The png file ($file) may be corrupted. skipping" |
+ echo "$file may be corrupted; skipping\n" |
return |
fi |
local new=$(stat -c%s $tmp_file) |
let diff=$old-$new |
- let percent=($diff*100)/$old |
+ let percent=$diff*100 |
+ let percent=$percent/$old |
- tput el |
if [ $new -lt $old ]; then |
- echo -ne "$file : $old => $new ($diff bytes : $percent %)\n" |
- mv "$tmp_file" "$file" |
+ info "$file: $old => $new ($diff bytes: $percent%)" |
+ cp "$tmp_file" "$file" |
let TOTAL_OLD_BYTES+=$old |
let TOTAL_NEW_BYTES+=$new |
let PROCESSED_FILE+=1 |
else |
if [ $OPTIMIZE_LEVEL == 0 ]; then |
- info -ne "$file : skipped\r" |
+ info "$file: Skipped" |
+ else |
+ info "$file: Unable to reduce size" |
fi |
rm $tmp_file |
fi |
@@ -400,6 +414,19 @@ else |
using_cygwin=false |
fi |
+# The -i in the shebang line should result in $COLUMNS being set on newer |
+# versions of bash. If it's not set yet, attempt to set it. |
+if [ -z $COLUMNS ]; then |
+ which tput > /dev/null 2>&1 |
+ if [ "$?" == "0" ]; then |
+ COLUMNS=$(tput cols) |
+ else |
+ # No tput either... give up and just guess 80 columns. |
+ COLUMNS=80 |
+ fi |
+ export COLUMNS |
+fi |
+ |
OPTIMIZE_LEVEL=1 |
# Parse options |
while getopts o:r:h:v opts |
@@ -413,13 +440,13 @@ do |
fi |
;; |
o) |
- if [[ ! "$OPTARG" =~ [012] ]] ; then |
+ if [[ "$OPTARG" != 0 && "$OPTARG" != 1 && "$OPTARG" != 2 ]] ; then |
show_help |
fi |
OPTIMIZE_LEVEL=$OPTARG |
;; |
v) |
- let VERBOSE=1 |
+ VERBOSE=true |
;; |
[h?]) |
show_help;; |
@@ -455,7 +482,7 @@ if $using_cygwin ; then |
fi |
# Make sure we cleanup temp dir |
-trap "rm -rf $TMP_DIR" EXIT |
+#trap "rm -rf $TMP_DIR" EXIT |
# If no directories are specified, optimize all directories. |
DIRS=$@ |
@@ -489,17 +516,13 @@ else |
fi |
# Print the results. |
-if [ $PROCESSED_FILE == 0 ]; then |
- echo "Did not find any files (out of $TOTAL_FILE files)" \ |
- "that could be optimized" \ |
- "in $(date -u -d @$SECONDS +%T)s" |
-else |
+echo "Optimized $PROCESSED_FILE/$TOTAL_FILE files in" \ |
+ "$(date -d "0 + $SECONDS sec" +%Ts)" |
+if [ $PROCESSED_FILE != 0 ]; then |
let diff=$TOTAL_OLD_BYTES-$TOTAL_NEW_BYTES |
let percent=$diff*100/$TOTAL_OLD_BYTES |
- echo "Processed $PROCESSED_FILE files (out of $TOTAL_FILE files)" \ |
- "in $(date -u -d @$SECONDS +%T)s" |
- echo "Result : $TOTAL_OLD_BYTES => $TOTAL_NEW_BYTES bytes" \ |
- "($diff bytes : $percent %)" |
+ echo "Result: $TOTAL_OLD_BYTES => $TOTAL_NEW_BYTES bytes" \ |
+ "($diff bytes: $percent%)" |
fi |
if [ $CORRUPTED_FILE != 0 ]; then |
echo "Warning: corrupted files found: $CORRUPTED_FILE" |