1#!/usr/bin/env python 2# Copyright (c) 2014 Google Inc. All rights reserved. 3# 4# Redistribution and use in source and binary forms, with or without 5# modification, are permitted provided that the following conditions are 6# met: 7# 8# * Redistributions of source code must retain the above copyright 9# notice, this list of conditions and the following disclaimer. 10# * Redistributions in binary form must reproduce the above 11# copyright notice, this list of conditions and the following disclaimer 12# in the documentation and/or other materials provided with the 13# distribution. 14# * Neither the name of Google Inc. nor the names of its 15# contributors may be used to endorse or promote products derived from 16# this software without specific prior written permission. 17# 18# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 30import devtools_file_hashes 31import glob 32import hashlib 33import os 34import os.path 35import re 36import subprocess 37import sys 38 39try: 40 import json 41except ImportError: 42 import simplejson as json 43 44scripts_path = os.path.dirname(os.path.abspath(__file__)) 45devtools_path = os.path.dirname(scripts_path) 46blink_source_path = os.path.dirname(devtools_path) 47blink_path = os.path.dirname(blink_source_path) 48chromium_src_path = os.path.dirname(os.path.dirname(blink_path)) 49devtools_frontend_path = devtools_path + "/front_end" 50images_path = devtools_frontend_path + "/Images" 51image_sources_path = images_path + "/src" 52hashes_file_name = "optimize_png.hashes" 53hashes_file_path = image_sources_path + "/" + hashes_file_name 54 55file_names = os.listdir(image_sources_path) 56svg_file_paths = [image_sources_path + "/" + file_name for file_name in file_names if file_name.endswith(".svg")] 57svg_file_paths_to_optimize = devtools_file_hashes.files_with_invalid_hashes(hashes_file_path, svg_file_paths) 58svg_file_names = [re.sub(".svg$", "", re.sub(".*/", "", file_path)) for file_path in svg_file_paths_to_optimize] 59 60optimize_script_path = "tools/resources/optimize-png-files.sh" 61 62 63def check_installed(app_name, package, how_to): 64 proc = subprocess.Popen("which %s" % app_name, stdout=subprocess.PIPE, shell=True) 65 proc.communicate() 66 if proc.returncode != 0: 67 print "This script needs \"%s\" to be installed." % app_name 68 if how_to: 69 print how_to 70 else: 71 print "To install execute the following command: sudo apt-get install %s" % package 72 sys.exit(1) 73 74check_installed("pngcrush", "pngcrush", None) 75check_installed("optipng", "optipng", None) 76check_installed("advdef", "advancecomp", None) 77check_installed("pngout", None, "Utility can be downloaded here: http://www.jonof.id.au/kenutils") 78 79 80def optimize_png(file_name): 81 png_full_path = images_path + "/" + file_name + ".png" 82 optimize_command = "bash %s -o2 %s" % (optimize_script_path, png_full_path) 83 proc = subprocess.Popen(optimize_command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True, cwd=chromium_src_path) 84 return proc 85 86if len(svg_file_names): 87 print "%d unoptimized png files found." % len(svg_file_names) 88else: 89 print "All png files are already optimized." 90 sys.exit() 91 92processes = {} 93for file_name in svg_file_names: 94 name = re.sub(".svg$", "", file_name) 95 name2x = name + "_2x" 96 processes[name] = optimize_png(name) 97 processes[name2x] = optimize_png(name2x) 98 99for file_name, proc in processes.items(): 100 (optimize_out, _) = proc.communicate() 101 print("Optimization of %s finished: %s" % (file_name, optimize_out)) 102 103devtools_file_hashes.update_file_hashes(hashes_file_path, svg_file_paths) 104