aboutsummaryrefslogtreecommitdiffstats
path: root/make-overlay.py
blob: 7f931b373352794b32862d8ad553608b3d23b45d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# 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