# Copyright (C) 2011 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Script to take a set of frames (PNG files) for a recovery "installing" icon animation and turn it into a base image plus a set of overlays, as needed by the recovery UI code. Run with the names of all the input frames on the command line, in order.""" import sys try: import Image except ImportError: print "This script requires the Python Imaging Library to be installed." sys.exit(1) # Find the smallest box that contains all the pixels which change # between images. print "reading", sys.argv[1] base = Image.open(sys.argv[1]) minmini = base.size[0]-1 maxmaxi = 0 minminj = base.size[1]-1 maxmaxj = 0 for top_name in sys.argv[2:]: print "reading", top_name top = Image.open(top_name) assert base.size == top.size mini = base.size[0]-1 maxi = 0 minj = base.size[1]-1 maxj = 0 h, w = base.size for j in range(w): for i in range(h): b = base.getpixel((i,j)) t = top.getpixel((i,j)) if b != t: if i < mini: mini = i if i > maxi: maxi = i if j < minj: minj = j if j > maxj: maxj = j minmini = min(minmini, mini) maxmaxi = max(maxmaxi, maxi) minminj = min(minminj, minj) maxmaxj = max(maxmaxj, maxj) w = maxmaxi - minmini + 1 h = maxmaxj - minminj + 1 # Now write out an image containing just that box, for each frame. for num, top_name in enumerate(sys.argv[1:]): top = Image.open(top_name) out = Image.new("RGB", (w, h)) for i in range(w): for j in range(h): t = top.getpixel((i+minmini, j+minminj)) out.putpixel((i, j), t) fn = "icon_installing_overlay%02d.png" % (num+1,) out.save(fn) print "saved", fn # Write out the base icon, which is the first frame with that box # blacked out (just to make the file smaller, since it's always # displayed with one of the overlays on top of it). for i in range(w): for j in range(h): base.putpixel((i+minmini, j+minminj), (0, 0, 0)) fn = "icon_installing.png" base.save(fn) print "saved", fn # The device_ui_init() function needs to tell the recovery UI the # position of the overlay box. print print "add this to your device_ui_init() function:" print "-" * 40 print " ui_parameters->install_overlay_offset_x = %d;" % (minmini,) print " ui_parameters->install_overlay_offset_y = %d;" % (minminj,) print "-" * 40