Doug Zongker | be6d4d1 | 2011-03-02 10:38:02 -0800 | [diff] [blame] | 1 | # Copyright (C) 2011 The Android Open Source Project |
| 2 | # |
| 3 | # Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 | # you may not use this file except in compliance with the License. |
| 5 | # You may obtain a copy of the License at |
| 6 | # |
| 7 | # http://www.apache.org/licenses/LICENSE-2.0 |
| 8 | # |
| 9 | # Unless required by applicable law or agreed to in writing, software |
| 10 | # distributed under the License is distributed on an "AS IS" BASIS, |
| 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 | # See the License for the specific language governing permissions and |
| 13 | # limitations under the License. |
| 14 | |
| 15 | """Script to take a set of frames (PNG files) for a recovery |
| 16 | "installing" icon animation and turn it into a base image plus a set |
| 17 | of overlays, as needed by the recovery UI code. Run with the names of |
| 18 | all the input frames on the command line, in order.""" |
| 19 | |
| 20 | import sys |
| 21 | try: |
| 22 | import Image |
| 23 | except ImportError: |
| 24 | print "This script requires the Python Imaging Library to be installed." |
| 25 | sys.exit(1) |
| 26 | |
| 27 | # Find the smallest box that contains all the pixels which change |
| 28 | # between images. |
| 29 | |
| 30 | print "reading", sys.argv[1] |
| 31 | base = Image.open(sys.argv[1]) |
| 32 | |
| 33 | minmini = base.size[0]-1 |
| 34 | maxmaxi = 0 |
| 35 | minminj = base.size[1]-1 |
| 36 | maxmaxj = 0 |
| 37 | |
| 38 | for top_name in sys.argv[2:]: |
| 39 | print "reading", top_name |
| 40 | top = Image.open(top_name) |
| 41 | |
| 42 | assert base.size == top.size |
| 43 | |
| 44 | mini = base.size[0]-1 |
| 45 | maxi = 0 |
| 46 | minj = base.size[1]-1 |
| 47 | maxj = 0 |
| 48 | |
| 49 | h, w = base.size |
| 50 | for j in range(w): |
| 51 | for i in range(h): |
| 52 | b = base.getpixel((i,j)) |
| 53 | t = top.getpixel((i,j)) |
| 54 | if b != t: |
| 55 | if i < mini: mini = i |
| 56 | if i > maxi: maxi = i |
| 57 | if j < minj: minj = j |
| 58 | if j > maxj: maxj = j |
| 59 | |
| 60 | minmini = min(minmini, mini) |
| 61 | maxmaxi = max(maxmaxi, maxi) |
| 62 | minminj = min(minminj, minj) |
| 63 | maxmaxj = max(maxmaxj, maxj) |
| 64 | |
| 65 | w = maxmaxi - minmini + 1 |
| 66 | h = maxmaxj - minminj + 1 |
| 67 | |
| 68 | # Now write out an image containing just that box, for each frame. |
| 69 | |
| 70 | for num, top_name in enumerate(sys.argv[1:]): |
| 71 | top = Image.open(top_name) |
| 72 | |
| 73 | out = Image.new("RGB", (w, h)) |
| 74 | for i in range(w): |
| 75 | for j in range(h): |
| 76 | t = top.getpixel((i+minmini, j+minminj)) |
| 77 | out.putpixel((i, j), t) |
| 78 | |
| 79 | fn = "icon_installing_overlay%02d.png" % (num+1,) |
| 80 | out.save(fn) |
| 81 | print "saved", fn |
| 82 | |
| 83 | # Write out the base icon, which is the first frame with that box |
| 84 | # blacked out (just to make the file smaller, since it's always |
| 85 | # displayed with one of the overlays on top of it). |
| 86 | |
| 87 | for i in range(w): |
| 88 | for j in range(h): |
| 89 | base.putpixel((i+minmini, j+minminj), (0, 0, 0)) |
| 90 | fn = "icon_installing.png" |
| 91 | base.save(fn) |
| 92 | print "saved", fn |
| 93 | |
| 94 | # The device_ui_init() function needs to tell the recovery UI the |
| 95 | # position of the overlay box. |
| 96 | |
| 97 | print |
| 98 | print "add this to your device_ui_init() function:" |
| 99 | print "-" * 40 |
| 100 | print " ui_parameters->install_overlay_offset_x = %d;" % (minmini,) |
| 101 | print " ui_parameters->install_overlay_offset_y = %d;" % (minminj,) |
| 102 | print "-" * 40 |