Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/bin/bash | 1 #!/bin/bash -i |
| 2 # Copyright 2013 The Chromium Authors. All rights reserved. | 2 # Copyright 2013 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 # The optimization code is based on pngslim (http://goo.gl/a0XHg) | 6 # The optimization code is based on pngslim (http://goo.gl/a0XHg) |
| 7 # and executes a similar pipleline to optimize the png file size. | 7 # and executes a similar pipleline to optimize the png file size. |
| 8 # The steps that require pngoptimizercl/pngrewrite/deflopt are omitted, | 8 # The steps that require pngoptimizercl/pngrewrite/deflopt are omitted, |
| 9 # but this runs all other processes, including: | 9 # but this runs all other processes, including: |
| 10 # 1) various color-dependent optimizations using optipng. | 10 # 1) various color-dependent optimizations using optipng. |
| 11 # 2) optimize the number of huffman blocks. | 11 # 2) optimize the number of huffman blocks. |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 47 # Global variables for stats | 47 # Global variables for stats |
| 48 TOTAL_OLD_BYTES=0 | 48 TOTAL_OLD_BYTES=0 |
| 49 TOTAL_NEW_BYTES=0 | 49 TOTAL_NEW_BYTES=0 |
| 50 TOTAL_FILE=0 | 50 TOTAL_FILE=0 |
| 51 CORRUPTED_FILE=0 | 51 CORRUPTED_FILE=0 |
| 52 PROCESSED_FILE=0 | 52 PROCESSED_FILE=0 |
| 53 | 53 |
| 54 declare -a THROBBER_STR=('-' '\\' '|' '/') | 54 declare -a THROBBER_STR=('-' '\\' '|' '/') |
| 55 THROBBER_COUNT=0 | 55 THROBBER_COUNT=0 |
| 56 | 56 |
| 57 VERBOSE=0 | 57 VERBOSE=false |
| 58 | 58 |
| 59 # Echo only if verbose option is set. | 59 # Echo only if verbose option is set. |
| 60 function info { | 60 function info { |
| 61 if [ $VERBOSE -eq 1 ]; then | 61 if $VERBOSE ; then |
| 62 echo $@ | 62 echo $@ |
| 63 fi | 63 fi |
| 64 } | 64 } |
| 65 | 65 |
| 66 # Show throbber character at current cursor position. | 66 # Show throbber character at current cursor position. |
| 67 function throbber { | 67 function throbber { |
| 68 info -ne "${THROBBER_STR[$THROBBER_COUNT]}\b" | 68 info -ne "${THROBBER_STR[$THROBBER_COUNT]}\b" |
| 69 let THROBBER_COUNT=($THROBBER_COUNT+1)%4 | 69 let THROBBER_COUNT=$THROBBER_COUNT+1 |
| 70 let THROBBER_COUNT=$THROBBER_COUNT%4 | |
| 70 } | 71 } |
| 71 | 72 |
| 72 # Usage: pngout_loop <file> <png_out_options> ... | 73 # Usage: pngout_loop <file> <png_out_options> ... |
| 73 # Optimize the png file using pngout with the given options | 74 # Optimize the png file using pngout with the given options |
| 74 # using various block split thresholds and filter types. | 75 # using various block split thresholds and filter types. |
| 75 function pngout_loop { | 76 function pngout_loop { |
| 76 local file=$1 | 77 local file=$1 |
| 77 shift | 78 shift |
| 78 local opts=$* | 79 local opts=$* |
| 79 if [ $OPTIMIZE_LEVEL == 1 ]; then | 80 if [ $OPTIMIZE_LEVEL == 1 ]; then |
| 80 for j in $(seq 0 5); do | 81 for j in $(eval echo {0..5}); do |
| 81 throbber | 82 throbber |
| 82 pngout -q -k1 -s1 -f$j $opts $file | 83 pngout -q -k1 -s1 -f$j $opts $file |
| 83 done | 84 done |
| 84 else | 85 else |
| 85 for i in 0 128 256 512; do | 86 for i in 0 128 256 512; do |
| 86 for j in $(seq 0 5); do | 87 for j in $(eval echo {0..5}); do |
| 87 throbber | 88 throbber |
| 88 pngout -q -k1 -s1 -b$i -f$j $opts $file | 89 pngout -q -k1 -s1 -b$i -f$j $opts $file |
| 89 done | 90 done |
| 90 done | 91 done |
| 91 fi | 92 fi |
| 92 } | 93 } |
| 93 | 94 |
| 94 # Usage: get_color_depth_list | 95 # Usage: get_color_depth_list |
| 95 # Returns the list of color depth options for current optimization level. | 96 # Returns the list of color depth options for current optimization level. |
| 96 function get_color_depth_list { | 97 function get_color_depth_list { |
| 97 if [ $OPTIMIZE_LEVEL == 1 ]; then | 98 if [ $OPTIMIZE_LEVEL == 1 ]; then |
| 98 echo "-d0" | 99 echo "-d0" |
| 99 else | 100 else |
| 100 echo "-d1 -d2 -d4 -d8" | 101 echo "-d1 -d2 -d4 -d8" |
| 101 fi | 102 fi |
| 102 } | 103 } |
| 103 | 104 |
| 104 # Usage: process_grayscale <file> | 105 # Usage: process_grayscale <file> |
| 105 # Optimize grayscale images for all color bit depths. | 106 # Optimize grayscale images for all color bit depths. |
| 106 # | 107 # |
| 107 # TODO(oshima): Experiment with -d0 w/o -c0. | 108 # TODO(oshima): Experiment with -d0 w/o -c0. |
| 108 function process_grayscale { | 109 function process_grayscale { |
| 109 info -n "|gray" | |
| 110 for opt in $(get_color_depth_list); do | 110 for opt in $(get_color_depth_list); do |
| 111 pngout_loop $file -c0 $opt | 111 pngout_loop $file -c0 $opt |
| 112 done | 112 done |
| 113 } | 113 } |
| 114 | 114 |
| 115 # Usage: process_grayscale_alpha <file> | 115 # Usage: process_grayscale_alpha <file> |
| 116 # Optimize grayscale images with alpha for all color bit depths. | 116 # Optimize grayscale images with alpha for all color bit depths. |
| 117 function process_grayscale_alpha { | 117 function process_grayscale_alpha { |
| 118 info -n "|gray-a" | |
| 119 pngout_loop $file -c4 | 118 pngout_loop $file -c4 |
| 120 for opt in $(get_color_depth_list); do | 119 for opt in $(get_color_depth_list); do |
| 121 pngout_loop $file -c3 $opt | 120 pngout_loop $file -c3 $opt |
| 122 done | 121 done |
| 123 } | 122 } |
| 124 | 123 |
| 125 # Usage: process_rgb <file> | 124 # Usage: process_rgb <file> |
| 126 # Optimize rgb images with or without alpha for all color bit depths. | 125 # Optimize rgb images with or without alpha for all color bit depths. |
| 127 function process_rgb { | 126 function process_rgb { |
| 128 info -n "|rgb" | |
| 129 for opt in $(get_color_depth_list); do | 127 for opt in $(get_color_depth_list); do |
| 130 pngout_loop $file -c3 $opt | 128 pngout_loop $file -c3 $opt |
| 131 done | 129 done |
| 132 pngout_loop $file -c2 | 130 pngout_loop $file -c2 |
| 133 pngout_loop $file -c6 | 131 pngout_loop $file -c6 |
| 134 } | 132 } |
| 135 | 133 |
| 136 # Usage: huffman_blocks <file> | 134 # Usage: huffman_blocks <file> |
| 137 # Optimize the huffman blocks. | 135 # Optimize the huffman blocks. |
| 138 function huffman_blocks { | 136 function huffman_blocks { |
| 139 local file=$1 | 137 local file=$1 |
| 140 info -n "|huffman" | |
| 141 local size=$(stat -c%s $file) | 138 local size=$(stat -c%s $file) |
| 142 local min_block_size=$DEFAULT_MIN_BLOCK_SIZE | 139 local min_block_size=$DEFAULT_MIN_BLOCK_SIZE |
| 143 local limit_blocks=$DEFAULT_LIMIT_BLOCKS | 140 local limit_blocks=$DEFAULT_LIMIT_BLOCKS |
| 144 | 141 |
| 145 if [ $size -gt $LARGE_FILE_THRESHOLD ]; then | 142 if [ $size -gt $LARGE_FILE_THRESHOLD ]; then |
| 146 min_block_size=$LARGE_MIN_BLOCK_SIZE | 143 min_block_size=$LARGE_MIN_BLOCK_SIZE |
| 147 limit_blocks=$LARGE_LIMIT_BLOCKS | 144 limit_blocks=$LARGE_LIMIT_BLOCKS |
| 148 fi | 145 fi |
| 149 let max_blocks=$size/$min_block_size | 146 let max_blocks=$size/$min_block_size |
| 150 if [ $max_blocks -gt $limit_blocks ]; then | 147 if [ $max_blocks -gt $limit_blocks ]; then |
| 151 max_blocks=$limit_blocks | 148 max_blocks=$limit_blocks |
| 152 fi | 149 fi |
| 153 | 150 |
| 154 for i in $(seq 2 $max_blocks); do | 151 for i in $(eval echo {2..$max_blocks}); do |
| 155 throbber | 152 throbber |
| 156 pngout -q -k1 -ks -s1 -n$i $file | 153 pngout -q -k1 -ks -s1 -n$i $file |
| 157 done | 154 done |
| 158 } | 155 } |
| 159 | 156 |
| 160 # Usage: random_huffman_table_trial <file> | 157 # Usage: random_huffman_table_trial <file> |
| 161 # Try compressing by randomizing the initial huffman table. | 158 # Try compressing by randomizing the initial huffman table. |
| 162 # | 159 # |
| 163 # TODO(oshima): Try adjusting different parameters for large files to | 160 # TODO(oshima): Try adjusting different parameters for large files to |
| 164 # reduce runtime. | 161 # reduce runtime. |
| 165 function random_huffman_table_trial { | 162 function random_huffman_table_trial { |
| 166 info -n "|random" | |
|
oshima
2014/05/22 18:51:43
why removing them?
Peter Kasting
2014/05/22 18:57:31
They usually extend the printed text for each file
oshima
2014/05/22 20:38:05
I added -v for development purpose to see each ste
| |
| 167 local file=$1 | 163 local file=$1 |
| 168 local old_size=$(stat -c%s $file) | 164 local old_size=$(stat -c%s $file) |
| 169 local trials_count=$DEFAULT_RANDOM_TRIALS | 165 local trials_count=$DEFAULT_RANDOM_TRIALS |
| 170 | 166 |
| 171 if [ $old_size -gt $LARGE_FILE_THRESHOLD ]; then | 167 if [ $old_size -gt $LARGE_FILE_THRESHOLD ]; then |
| 172 trials_count=$LARGE_RANDOM_TRIALS | 168 trials_count=$LARGE_RANDOM_TRIALS |
| 173 fi | 169 fi |
| 174 for i in $(seq 1 $trials_count); do | 170 for i in $(eval echo {1..$trials_count}); do |
| 175 throbber | 171 throbber |
| 176 pngout -q -k1 -ks -s0 -r $file | 172 pngout -q -k1 -ks -s0 -r $file |
| 177 done | 173 done |
| 178 local new_size=$(stat -c%s $file) | 174 local new_size=$(stat -c%s $file) |
| 179 if [ $new_size -lt $old_size ]; then | 175 if [ $new_size -lt $old_size ]; then |
| 180 random_huffman_table_trial $file | 176 random_huffman_table_trial $file |
| 181 fi | 177 fi |
| 182 } | 178 } |
| 183 | 179 |
| 184 # Usage: final_comprssion <file> | 180 # Usage: final_comprssion <file> |
| 185 # Further compress using optipng and advdef. | 181 # Further compress using optipng and advdef. |
| 186 # TODO(oshima): Experiment with 256. | 182 # TODO(oshima): Experiment with 256. |
| 187 function final_compression { | 183 function final_compression { |
| 188 info -n "|final" | |
| 189 local file=$1 | 184 local file=$1 |
| 190 if [ $OPTIMIZE_LEVEL == 2 ]; then | 185 if [ $OPTIMIZE_LEVEL == 2 ]; then |
| 191 for i in 32k 16k 8k 4k 2k 1k 512; do | 186 for i in 32k 16k 8k 4k 2k 1k 512; do |
| 192 throbber | 187 throbber |
| 193 optipng -q -nb -nc -zw$i -zc1-9 -zm1-9 -zs0-3 -f0-5 $file | 188 optipng -q -nb -nc -zw$i -zc1-9 -zm1-9 -zs0-3 -f0-5 $file |
| 194 done | 189 done |
| 195 fi | 190 fi |
| 196 for i in $(seq 1 4); do | 191 for i in $(eval echo {1..4}); do |
| 197 throbber | 192 throbber |
| 198 advdef -q -z -$i $file | 193 advdef -q -z -$i $file |
| 199 done | 194 done |
| 200 info -ne "\r" | 195 |
| 196 # Clear the current line. | |
| 197 if $VERBOSE ; then | |
| 198 printf "\033[0G\033[K" | |
| 199 fi | |
| 201 } | 200 } |
| 202 | 201 |
| 203 # Usage: get_color_type <file> | 202 # Usage: get_color_type <file> |
| 204 # Returns the color type name of the png file. Here is the list of names | 203 # Returns the color type name of the png file. Here is the list of names |
| 205 # for each color type codes. | 204 # for each color type codes. |
| 206 # 0 : grayscale | 205 # 0: grayscale |
| 207 # 2 : RGB | 206 # 2: RGB |
| 208 # 3 : colormap | 207 # 3: colormap |
| 209 # 4 : gray+alpha | 208 # 4: gray+alpha |
| 210 # 6 : RGBA | 209 # 6: RGBA |
| 211 # See http://en.wikipedia.org/wiki/Portable_Network_Graphics#Color_depth | 210 # See http://en.wikipedia.org/wiki/Portable_Network_Graphics#Color_depth |
| 212 # for details about the color type code. | 211 # for details about the color type code. |
| 213 function get_color_type { | 212 function get_color_type { |
| 214 local file=$1 | 213 local file=$1 |
| 215 echo $(file $file | awk -F, '{print $3}' | awk '{print $2}') | 214 echo $(file $file | awk -F, '{print $3}' | awk '{print $2}') |
| 216 } | 215 } |
| 217 | 216 |
| 218 # Usage: optimize_size <file> | 217 # Usage: optimize_size <file> |
| 219 # Performs png file optimization. | 218 # Performs png file optimization. |
| 220 function optimize_size { | 219 function optimize_size { |
| 221 tput el | 220 # Print filename, trimmed to ensure it + throbber don't take more than 1 line |
| 221 local filename_length=${#file} | |
| 222 local -i allowed_length=$COLUMNS-1 | |
| 223 local -i trimmed_length=$filename_length-$COLUMNS-4 | |
| 224 if [ "$filename_length" -lt "$allowed_length" ]; then | |
| 225 info -n "$file" | |
| 226 else | |
| 227 info -n "...${file:$trimmed_length}" | |
| 228 fi | |
| 229 | |
| 222 local file=$1 | 230 local file=$1 |
| 223 info -n "$file " | |
| 224 | 231 |
| 225 advdef -q -z -4 $file | 232 advdef -q -z -4 $file |
| 226 | 233 |
| 227 pngout -q -s4 -c0 -force $file $file.tmp.png | 234 pngout -q -s4 -c0 -force $file $file.tmp.png |
| 228 if [ -f $file.tmp.png ]; then | 235 if [ -f $file.tmp.png ]; then |
| 229 rm $file.tmp.png | 236 rm $file.tmp.png |
| 230 process_grayscale $file | 237 process_grayscale $file |
| 231 process_grayscale_alpha $file | 238 process_grayscale_alpha $file |
| 232 else | 239 else |
| 233 pngout -q -s4 -c4 -force $file $file.tmp.png | 240 pngout -q -s4 -c4 -force $file $file.tmp.png |
| 234 if [ -f $file.tmp.png ]; then | 241 if [ -f $file.tmp.png ]; then |
| 235 rm $file.tmp.png | 242 rm $file.tmp.png |
| 236 process_grayscale_alpha $file | 243 process_grayscale_alpha $file |
| 237 else | 244 else |
| 238 process_rgb $file | 245 process_rgb $file |
| 239 fi | 246 fi |
| 240 fi | 247 fi |
| 241 | 248 |
| 242 info -n "|filter" | |
| 243 local old_color_type=$(get_color_type $file) | 249 local old_color_type=$(get_color_type $file) |
| 244 optipng -q -zc9 -zm8 -zs0-3 -f0-5 $file -out $file.tmp.png | 250 optipng -q -zc9 -zm8 -zs0-3 -f0-5 $file -out $file.tmp.png |
| 245 local new_color_type=$(get_color_type $file.tmp.png) | 251 local new_color_type=$(get_color_type $file.tmp.png) |
| 246 # optipng may corrupt a png file when reducing the color type | 252 # optipng may corrupt a png file when reducing the color type |
| 247 # to grayscale/grayscale+alpha. Just skip such cases until | 253 # to grayscale/grayscale+alpha. Just skip such cases until |
| 248 # the bug is fixed. See crbug.com/174505, crbug.com/174084. | 254 # the bug is fixed. See crbug.com/174505, crbug.com/174084. |
| 249 # The issue is reported in | 255 # The issue is reported in |
| 250 # https://sourceforge.net/tracker/?func=detail&aid=3603630&group_id=151404&ati d=780913 | 256 # https://sourceforge.net/tracker/?func=detail&aid=3603630&group_id=151404&ati d=780913 |
| 251 if [[ $old_color_type == "RGBA" && $new_color_type =~ gray.* ]] ; then | 257 if [[ $old_color_type == "RGBA" && $new_color_type == gray* ]] ; then |
| 252 rm $file.tmp.png | 258 rm $file.tmp.png |
| 253 info -n "[skip opting]" | 259 info -n "[skip opting]" |
| 254 else | 260 else |
| 255 mv $file.tmp.png $file | 261 mv $file.tmp.png $file |
| 256 fi | 262 fi |
| 257 pngout -q -k1 -s1 $file | 263 pngout -q -k1 -s1 $file |
| 258 | 264 |
| 259 huffman_blocks $file | 265 huffman_blocks $file |
| 260 | 266 |
| 261 # TODO(oshima): Experiment with strategy 1. | 267 # TODO(oshima): Experiment with strategy 1. |
| 262 info -n "|strategy" | |
| 263 if [ $OPTIMIZE_LEVEL == 2 ]; then | 268 if [ $OPTIMIZE_LEVEL == 2 ]; then |
| 264 for i in 3 2 0; do | 269 for i in 3 2 0; do |
| 265 pngout -q -k1 -ks -s$i $file | 270 pngout -q -k1 -ks -s$i $file |
| 266 done | 271 done |
| 267 else | 272 else |
| 268 pngout -q -k1 -ks -s1 $file | 273 pngout -q -k1 -ks -s1 $file |
| 269 fi | 274 fi |
| 270 | 275 |
| 271 if [ $OPTIMIZE_LEVEL == 2 ]; then | 276 if [ $OPTIMIZE_LEVEL == 2 ]; then |
| 272 random_huffman_table_trial $file | 277 random_huffman_table_trial $file |
| 273 fi | 278 fi |
| 274 | 279 |
| 275 final_compression $file | 280 final_compression $file |
| 276 } | 281 } |
| 277 | 282 |
| 278 # Usage: process_file <file> | 283 # Usage: process_file <file> |
| 279 function process_file { | 284 function process_file { |
| 280 local file=$1 | 285 local file=$1 |
| 281 local name=$(basename $file) | 286 local name=$(basename $file) |
| 282 # -rem alla removes all ancillary chunks except for tRNS | 287 # -rem alla removes all ancillary chunks except for tRNS |
| 283 pngcrush -d $TMP_DIR -brute -reduce -rem alla $file > /dev/null | 288 pngcrush -d $TMP_DIR -brute -reduce -rem alla $file > /dev/null 2>&1 |
| 284 | 289 |
| 285 if [ -f $TMP_DIR/$name -a $OPTIMIZE_LEVEL != 0 ]; then | 290 if [ -f $TMP_DIR/$name -a $OPTIMIZE_LEVEL != 0 ]; then |
| 286 optimize_size $TMP_DIR/$name | 291 optimize_size $TMP_DIR/$name |
| 287 fi | 292 fi |
| 288 } | 293 } |
| 289 | 294 |
| 290 # Usage: optimize_file <file> | 295 # Usage: optimize_file <file> |
| 291 function optimize_file { | 296 function optimize_file { |
| 292 local file=$1 | 297 local file=$1 |
| 293 if $using_cygwin ; then | 298 if $using_cygwin ; then |
| 294 file=$(cygpath -w $file) | 299 file=$(cygpath -w $file) |
| 295 fi | 300 fi |
| 296 | 301 |
| 297 local name=$(basename $file) | 302 local name=$(basename $file) |
| 298 local old=$(stat -c%s $file) | 303 local old=$(stat -c%s $file) |
| 299 local tmp_file=$TMP_DIR/$name | 304 local tmp_file=$TMP_DIR/$name |
| 300 let TOTAL_FILE+=1 | 305 let TOTAL_FILE+=1 |
| 301 | 306 |
| 302 process_file $file | 307 process_file $file |
| 303 | 308 |
| 304 if [ ! -e $tmp_file ] ; then | 309 if [ ! -e $tmp_file ] ; then |
| 305 let CORRUPTED_FILE+=1 | 310 let CORRUPTED_FILE+=1 |
| 306 echo "The png file ($file) may be corrupted. skipping" | 311 echo "$file may be corrupted; skipping\n" |
| 307 return | 312 return |
| 308 fi | 313 fi |
| 309 | 314 |
| 310 local new=$(stat -c%s $tmp_file) | 315 local new=$(stat -c%s $tmp_file) |
| 311 let diff=$old-$new | 316 let diff=$old-$new |
| 312 let percent=($diff*100)/$old | 317 let percent=$diff*100 |
| 318 let percent=$percent/$old | |
| 313 | 319 |
| 314 tput el | |
| 315 if [ $new -lt $old ]; then | 320 if [ $new -lt $old ]; then |
| 316 echo -ne "$file : $old => $new ($diff bytes : $percent %)\n" | 321 echo -ne "$file: $old => $new ($diff bytes: $percent%)\n" |
| 317 mv "$tmp_file" "$file" | 322 cp "$tmp_file" "$file" |
| 318 let TOTAL_OLD_BYTES+=$old | 323 let TOTAL_OLD_BYTES+=$old |
| 319 let TOTAL_NEW_BYTES+=$new | 324 let TOTAL_NEW_BYTES+=$new |
| 320 let PROCESSED_FILE+=1 | 325 let PROCESSED_FILE+=1 |
| 321 else | 326 else |
| 322 if [ $OPTIMIZE_LEVEL == 0 ]; then | 327 if [ $OPTIMIZE_LEVEL == 0 ]; then |
| 323 info -ne "$file : skipped\r" | 328 info -ne "$file: Skipped\n" |
| 329 else | |
| 330 echo -ne "$file: Unable to reduce size\n" | |
|
oshima
2014/05/22 18:51:43
info
Peter Kasting
2014/05/22 18:57:31
I used echo on purpose, to match the use of echo i
| |
| 324 fi | 331 fi |
| 325 rm $tmp_file | 332 rm $tmp_file |
| 326 fi | 333 fi |
| 327 } | 334 } |
| 328 | 335 |
| 329 function optimize_dir { | 336 function optimize_dir { |
| 330 local dir=$1 | 337 local dir=$1 |
| 331 if $using_cygwin ; then | 338 if $using_cygwin ; then |
| 332 dir=$(cygpath -w $dir) | 339 dir=$(cygpath -w $dir) |
| 333 fi | 340 fi |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 393 echo "$0 must be run in src directory" | 400 echo "$0 must be run in src directory" |
| 394 exit 1 | 401 exit 1 |
| 395 fi | 402 fi |
| 396 | 403 |
| 397 if [ "$(expr substr $(uname -s) 1 6)" == "CYGWIN" ]; then | 404 if [ "$(expr substr $(uname -s) 1 6)" == "CYGWIN" ]; then |
| 398 using_cygwin=true | 405 using_cygwin=true |
| 399 else | 406 else |
| 400 using_cygwin=false | 407 using_cygwin=false |
| 401 fi | 408 fi |
| 402 | 409 |
| 410 # The -i in the shebang line should result in $COLUMNS being set on newer | |
| 411 # versions of bash. If it's not set yet, attempt to set it. | |
| 412 if [ -z $COLUMNS ]; then | |
| 413 which tput > /dev/null 2>&1 | |
| 414 if [ "$?" == "0" ]; then | |
| 415 COLUMNS=$(tput cols) | |
| 416 else | |
| 417 # No tput either... give up and just guess 80 columns. | |
| 418 COLUMNS=80 | |
| 419 fi | |
| 420 export COLUMNS | |
| 421 fi | |
| 422 | |
| 403 OPTIMIZE_LEVEL=1 | 423 OPTIMIZE_LEVEL=1 |
| 404 # Parse options | 424 # Parse options |
| 405 while getopts o:r:h:v opts | 425 while getopts o:r:h:v opts |
| 406 do | 426 do |
| 407 case $opts in | 427 case $opts in |
| 408 r) | 428 r) |
| 409 COMMIT=$(git svn find-rev r$OPTARG | tail -1) || exit | 429 COMMIT=$(git svn find-rev r$OPTARG | tail -1) || exit |
| 410 if [ -z "$COMMIT" ] ; then | 430 if [ -z "$COMMIT" ] ; then |
| 411 echo "Revision $OPTARG not found" | 431 echo "Revision $OPTARG not found" |
| 412 show_help | 432 show_help |
| 413 fi | 433 fi |
| 414 ;; | 434 ;; |
| 415 o) | 435 o) |
| 416 if [[ ! "$OPTARG" =~ [012] ]] ; then | 436 if [[ "$OPTARG" != 0 && "$OPTARG" != 1 && "$OPTARG" != 2 ]] ; then |
| 417 show_help | 437 show_help |
| 418 fi | 438 fi |
| 419 OPTIMIZE_LEVEL=$OPTARG | 439 OPTIMIZE_LEVEL=$OPTARG |
| 420 ;; | 440 ;; |
| 421 v) | 441 v) |
| 422 let VERBOSE=1 | 442 VERBOSE=true |
| 423 ;; | 443 ;; |
| 424 [h?]) | 444 [h?]) |
| 425 show_help;; | 445 show_help;; |
| 426 esac | 446 esac |
| 427 done | 447 done |
| 428 | 448 |
| 429 # Remove options from argument list. | 449 # Remove options from argument list. |
| 430 shift $(($OPTIND -1)) | 450 shift $(($OPTIND -1)) |
| 431 | 451 |
| 432 # Make sure we have all necessary commands installed. | 452 # Make sure we have all necessary commands installed. |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 448 fail_if_not_installed pngout $pngout_url | 468 fail_if_not_installed pngout $pngout_url |
| 449 fi | 469 fi |
| 450 | 470 |
| 451 # Create tmp directory for crushed png file. | 471 # Create tmp directory for crushed png file. |
| 452 TMP_DIR=$(mktemp -d) | 472 TMP_DIR=$(mktemp -d) |
| 453 if $using_cygwin ; then | 473 if $using_cygwin ; then |
| 454 TMP_DIR=$(cygpath -w $TMP_DIR) | 474 TMP_DIR=$(cygpath -w $TMP_DIR) |
| 455 fi | 475 fi |
| 456 | 476 |
| 457 # Make sure we cleanup temp dir | 477 # Make sure we cleanup temp dir |
| 458 trap "rm -rf $TMP_DIR" EXIT | 478 #trap "rm -rf $TMP_DIR" EXIT |
| 459 | 479 |
| 460 # If no directories are specified, optimize all directories. | 480 # If no directories are specified, optimize all directories. |
| 461 DIRS=$@ | 481 DIRS=$@ |
| 462 set ${DIRS:=$ALL_DIRS} | 482 set ${DIRS:=$ALL_DIRS} |
| 463 | 483 |
| 464 info "Optimize level=$OPTIMIZE_LEVEL" | 484 info "Optimize level=$OPTIMIZE_LEVEL" |
| 465 | 485 |
| 466 if [ -n "$COMMIT" ] ; then | 486 if [ -n "$COMMIT" ] ; then |
| 467 ALL_FILES=$(git diff --name-only $COMMIT HEAD $DIRS | grep "png$") | 487 ALL_FILES=$(git diff --name-only $COMMIT HEAD $DIRS | grep "png$") |
| 468 ALL_FILES_LIST=( $ALL_FILES ) | 488 ALL_FILES_LIST=( $ALL_FILES ) |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 482 info "" | 502 info "" |
| 483 elif [ -f $d ] ; then | 503 elif [ -f $d ] ; then |
| 484 optimize_file $d | 504 optimize_file $d |
| 485 else | 505 else |
| 486 echo "Not a file or directory: $d"; | 506 echo "Not a file or directory: $d"; |
| 487 fi | 507 fi |
| 488 done | 508 done |
| 489 fi | 509 fi |
| 490 | 510 |
| 491 # Print the results. | 511 # Print the results. |
| 492 if [ $PROCESSED_FILE == 0 ]; then | 512 echo "Optimized $PROCESSED_FILE/$TOTAL_FILE files in" \ |
| 493 echo "Did not find any files (out of $TOTAL_FILE files)" \ | 513 "$(date -d "0 + $SECONDS sec" +%Ts)" |
| 494 "that could be optimized" \ | 514 if [ $PROCESSED_FILE != 0 ]; then |
| 495 "in $(date -u -d @$SECONDS +%T)s" | |
| 496 else | |
| 497 let diff=$TOTAL_OLD_BYTES-$TOTAL_NEW_BYTES | 515 let diff=$TOTAL_OLD_BYTES-$TOTAL_NEW_BYTES |
| 498 let percent=$diff*100/$TOTAL_OLD_BYTES | 516 let percent=$diff*100/$TOTAL_OLD_BYTES |
| 499 echo "Processed $PROCESSED_FILE files (out of $TOTAL_FILE files)" \ | 517 echo "Result: $TOTAL_OLD_BYTES => $TOTAL_NEW_BYTES bytes" \ |
| 500 "in $(date -u -d @$SECONDS +%T)s" | 518 "($diff bytes: $percent%)" |
| 501 echo "Result : $TOTAL_OLD_BYTES => $TOTAL_NEW_BYTES bytes" \ | |
| 502 "($diff bytes : $percent %)" | |
| 503 fi | 519 fi |
| 504 if [ $CORRUPTED_FILE != 0 ]; then | 520 if [ $CORRUPTED_FILE != 0 ]; then |
| 505 echo "Warning: corrupted files found: $CORRUPTED_FILE" | 521 echo "Warning: corrupted files found: $CORRUPTED_FILE" |
| 506 echo "Please contact the author of the CL that landed corrupted png files" | 522 echo "Please contact the author of the CL that landed corrupted png files" |
| 507 fi | 523 fi |
| OLD | NEW |