Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3ceeb580 authored by Doug Zongker's avatar Doug Zongker Committed by Doug Zongker
Browse files

update tools for making recovery images

We no longer render animations as a base image with a
possibly-partially-transparent overlay drawn over it, so delete the
make-overlay.py tool.  Now we represent them as series of images that
are interlaced by row (with a special text chunk in the PNG file
specifying the number of frames) so add the interlace-frames.py tool
to make those.

Change-Id: I866db269107a21351c3df3b4683f233f72234334
parent 59508993
Loading
Loading
Loading
Loading

interlace-frames.py

0 → 100644
+53 −0
Original line number Diff line number Diff line
# Copyright (C) 2014 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 animation
and turn it into a single output image which contains the input frames
interlaced by row.  Run with the names of all the input frames on the
command line, in order, followed by the name of the output file."""

import sys
try:
  import Image
  import PngImagePlugin
except ImportError:
  print "This script requires the Python Imaging Library to be installed."
  sys.exit(1)

frames = [Image.open(fn).convert("RGB") for fn in sys.argv[1:-1]]
assert len(frames) > 0, "Must have at least one input frame."
sizes = set()
for fr in frames:
  sizes.add(fr.size)

assert len(sizes) == 1, "All input images must have the same size."
w, h = sizes.pop()
N = len(frames)

out = Image.new("RGB", (w, h*N))
for j in range(h):
  for i in range(w):
    for fn, f in enumerate(frames):
      out.putpixel((i, j*N+fn), f.getpixel((i, j)))

# When loading this image, the graphics library expects to find a text
# chunk that specifies how many frames this animation represents.  If
# you post-process the output of this script with some kind of
# optimizer tool (eg pngcrush or zopflipng) make sure that your
# optimizer preserves this text chunk.

meta = PngImagePlugin.PngInfo()
meta.add_text("Frames", str(N))

out.save(sys.argv[-1], pnginfo=meta)

make-overlay.py

deleted100644 → 0
+0 −102
Original line number Diff line number Diff line
# 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