summaryrefslogtreecommitdiff
path: root/scripts/newbitmaps/lib/bmpblock.py
blob: 4d588d769c72eff2e9a821f515bacc022c0cecab (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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#!/usr/bin/python -tt
# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""A BmpBlock class"""

import os
import types
import yaml

class BmpBlock(object):
  """A wrapper for the config.yaml file.
  It has a few special attributes to specify which part we're focusing on.
  """

  def __init__(self, libdir, filename=None):
    self.yaml = None
    self.filename = None
    self.current_screen = None
    self.libdir = libdir
    self.filename = filename                    # always set, so we can reload
    if filename:
      self.LoadFile(filename)

  def LoadFile(self, filename):
    """Load the specified yaml file and verify that it's a valid BmpBlock"""
    print "Loading", filename
    with open(filename, 'rb') as f:
      stuff = yaml.safe_load(f)
    # FIXME: This is pretty lame. We should be able to find images using a
    # default directory path instead of using chdir.
    if os.path.dirname(filename):
      os.chdir(os.path.dirname(filename))
    if self.IsValidSyntax(stuff):
      self.yaml = stuff
      self.current_screen = sorted(self.yaml["screens"].keys())[0]

  def Reload(self):
    tmp = self.current_screen
    self.LoadFile(self.filename)
    if tmp in self.yaml["screens"]:
      self.current_screen = tmp

  def IsValidSyntax(self, thing):
    """Raise an error if the specified dict is not a valid BmpBlock structure"""

    assert isinstance(thing, dict)
    assert thing["bmpblock"] == 1.0 or thing["bmpblock"] == 1.1

    seen_images = {"$HWID":1, "$HWID.rtol":2}
    seen_screens = {}

    images = thing["images"]
    assert isinstance(images, dict)
    assert len(images) > 0
    # image values should all be filenames (ie, strings)
    for val in images.values():
      assert val and isinstance(val, types.StringTypes)
    if not "$HWID" in images:
      images["$HWID"] = os.path.join(self.libdir,'current_hwid.bmp')
    if not "$HWID.rtol" in images:
      images["$HWID.rtol"] = os.path.join(self.libdir, 'current_hwid.bmp')

    screens = thing["screens"]
    assert isinstance(screens, dict)
    assert screens
    # screen values should all be lists of 3-tuples
    for scrname, imglist in screens.items():
      assert len(imglist) <= 8
      for img in imglist:
        assert 3 == len(img)
        # must have defined all referenced bitmaps
        x,y,i = img
        assert i in images
        seen_images[i] = True

    localizations = thing["localizations"]
    assert hasattr(localizations, '__iter__')
    assert localizations
    # localizations should all be lists with the same number of screens
    len0 = len(localizations[0])
    assert len0
    for elt in localizations:
      assert len0 == len(elt)
      # we must have defined all referenced screens
      for scr in elt:
        assert scr in screens
        seen_screens[scr] = True

    for unused_img in [x for x in images if x not in seen_images]:
      print "  Unused image:", unused_img
    for unused_scr in [x for x in screens if x not in seen_screens]:
      print "  Unused screen:", unused_scr

    return True

  def RegisterScreenDisplayObject(self, displayer):
    """Register an object with a .Redisplay() function to display updates."""
    self.displayer = displayer


  def Redisplay(self):
    """Redisplay contents."""
    if self.displayer:
      if self.current_screen:
        sc = self.yaml['screens'][self.current_screen]
        slist = [(x,y,self.yaml['images'][z]) for x,y,z in sc]
        self.displayer.DisplayScreen(self.current_screen, slist)

  def Saveit(self):
    """Save current screen to file."""
    if self.displayer:
      if self.current_screen:
        sc = self.yaml['screens'][self.current_screen]
        slist = [(x,y,self.yaml['images'][z]) for x,y,z in sc]
        self.displayer.SaveScreen(self.current_screen, slist)