summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBill Richardson <wfrichar@chromium.org>2011-05-05 15:12:10 -0700
committerBill Richardson <wfrichar@chromium.org>2011-05-05 15:31:31 -0700
commit54e95825b30d4f730cbd70c109fb6622dda6fbb8 (patch)
tree30f12b2296bf16299ceef047cf9cde6332c2bba1
parentc3574086a82d04b3584712f7e15a8eb4ea6d40a0 (diff)
downloadvboot-54e95825b30d4f730cbd70c109fb6622dda6fbb8.tar.gz
Change GBB bmpblock to version 1.1, supporting direct HWID rendering.
With version 1.0, the BIOS displays its screens using composited images, but we still have to create a new bmp image for every HWID. Version 1.1 lets us render the ASCII HWID string directly, so the BIOS screens don't need modification just because the HWID changes. In the yaml file, we just replace the hwid image with a magic string, like so: bmpblock: 1.1 [...] screens: en_remove: - [ 0, 0, remove_bg] - [256, 534, en_model_text] - [314, 534, $HWID] - [192, 479, url] - [195, 453, en_remove_text] This change modifies the bmpblk_utility to accept and generate both 1.0 and 1.1 versions. It also updates the supporting scripts (most of which aren't needed anymore) and adds a new DEFAULT.yaml file which can be used as the basis for all locales. BUG=chrome-os-partner:3264 TEST=none (manual) Change-Id: I012349393848393928282 Reviewed-on: http://gerrit.chromium.org/gerrit/378 Tested-by: Bill Richardson <wfrichar@chromium.org> Reviewed-by: Bill Richardson <wfrichar@chromium.org>
-rw-r--r--firmware/include/bmpblk_header.h10
-rw-r--r--scripts/newbitmaps/README33
-rwxr-xr-xscripts/newbitmaps/bitmap_viewer5
-rw-r--r--scripts/newbitmaps/images/1280x800/DEFAULT.yaml (renamed from scripts/newbitmaps/images/1366x768/hwid_unknown.yaml)263
-rw-r--r--scripts/newbitmaps/images/1366x768/DEFAULT.yaml1398
-rw-r--r--scripts/newbitmaps/images/1366x768/hwid_unknown.bmpbin5530 -> 0 bytes
-rwxr-xr-xscripts/newbitmaps/images/make_yaml_from_hwids9
-rwxr-xr-xscripts/newbitmaps/lib/bmpblock.py11
-rw-r--r--scripts/newbitmaps/lib/current_hwid.bmpbin0 -> 5110 bytes
-rwxr-xr-xscripts/newbitmaps/make_bmp_from_components.py11
-rw-r--r--utility/bmpblk_util.c143
-rw-r--r--utility/bmpblk_utility.cc936
-rw-r--r--utility/include/bmpblk_utility.h22
13 files changed, 2183 insertions, 658 deletions
diff --git a/firmware/include/bmpblk_header.h b/firmware/include/bmpblk_header.h
index 3edd6739..09474d76 100644
--- a/firmware/include/bmpblk_header.h
+++ b/firmware/include/bmpblk_header.h
@@ -52,7 +52,7 @@ __pragma(pack(push, 1)) /* Support packing for MSVC. */
#define BMPBLOCK_SIGNATURE_SIZE (4)
#define BMPBLOCK_MAJOR_VERSION (0x0001)
-#define BMPBLOCK_MINOR_VERSION (0x0000)
+#define BMPBLOCK_MINOR_VERSION (0x0001)
#define MAX_IMAGE_IN_LAYOUT (8)
@@ -106,6 +106,7 @@ typedef struct ImageInfo {
typedef enum ImageTag {
TAG_NONE = 0,
TAG_HWID,
+ TAG_HWID_RTOL, /* "right-to-left", ie, right-justified HWID */
} ImageTag;
/* Constants for ImageInfo.format */
@@ -122,6 +123,13 @@ typedef enum Compression {
MAX_COMPRESS,
} Compression;
+/* These magic image names can be used in the .yaml file to indicate that
+ the ASCII HWID should be displayed. For RENDER_HWID, the image coordinates
+ specify upper-left corner of the HWID string. For RENDER_HWID_RTOL, they
+ indicate the upper-right corner (handy for right-to-left languages). */
+#define RENDER_HWID "$HWID"
+#define RENDER_HWID_RTOL "$HWID.rtol"
+
__pragma(pack(pop)) /* Support packing for MSVC. */
#endif /* VBOOT_REFERENCE_BMPBLK_HEADER_H_ */
diff --git a/scripts/newbitmaps/README b/scripts/newbitmaps/README
index bc8cb8f9..c71a0598 100644
--- a/scripts/newbitmaps/README
+++ b/scripts/newbitmaps/README
@@ -2,7 +2,13 @@ This directory contains examples of the new-style BIOS bitmaps, and a simple
(and ugly) tool to view the configuration file that describes how each
screen is displayed.
-Old-style bitmaps:
+Note:
+
+Because the bitmap images and display code is part of the Read-Only BIOS,
+back-porting any new bitmaps to older devices is not possible.
+
+
+Old-style, unversioned bitmaps (used in Cr-48):
In the Cr-48 BIOS there are four BIOS screens that may be presented to the
user. Each contains a graphic, a URL, and some informative text. The screens
@@ -14,21 +20,26 @@ BIOS is compiled. The result is an opaque blob that cannot be viewed or
edited with linux-based tools.
-New-style bitmaps (version 1.0):
+Version 1.0, new-style bitmaps (used in Alex):
-Future BIOSes will continue to display the same basic screens, but using a
+The BIOSes will continue to display the same basic screens, but it uses a
different format. Each screen has separate bitmaps for the basic graphic,
-the URL, and the informative text, and will be displayed by rendering each
-component in order. This will allow us to modify and replace any bitmap
-(most frequently the HWID), using standard command-line tools such as
-imagemagick. Compositing each screen in this way also means that we can
-easily provide localized BIOS screens or custom messages.
+the URL, and the informative text, and is displayed by rendering each
+component in order. This allows us to modify and replace any bitmap (most
+frequently the HWID), using standard command-line tools such as imagemagick.
+Compositing each screen in this way also means that we can easily provide
+localized BIOS screens or custom messages.
-Note:
+Version 1.1 (used in ZGB):
+
+This is essentially the same as version 1.0, except that the ASCII HWID
+string can be rendered directly. In the screen description, the magic image
+name "$HWID" (or "$HWID.rtol") indicates that the ASCII HWID value should be
+displayed instead of an actual image. This means that we only need to
+generate one bmpblock for all locales, since the HWID string can be changed
+at the factory using "gbb_utility".
-Because the bitmap images and display code is part of the Read-Only BIOS,
-back-porting the new-style bitmaps to older devices is not possible.
Manual instructions:
diff --git a/scripts/newbitmaps/bitmap_viewer b/scripts/newbitmaps/bitmap_viewer
index 795ff77e..85473eec 100755
--- a/scripts/newbitmaps/bitmap_viewer
+++ b/scripts/newbitmaps/bitmap_viewer
@@ -12,11 +12,14 @@ from lib import bmpblock
from lib import pixcontrol
from lib import pixdisplay
+
class MyApp(wx.App):
def OnInit(self):
- self._bmpblock = bmpblock.BmpBlock(sys.argv[1])
progname = os.path.basename(sys.argv[0])
+ progdir = os.path.abspath(os.path.dirname(sys.argv[0]))
+ self._bmpblock = bmpblock.BmpBlock(os.path.join(progdir, 'lib'),
+ sys.argv[1])
self._mainframe = pixcontrol.Frame(self._bmpblock, progname)
self._mainframe.Show()
self.SetTopWindow(self._mainframe)
diff --git a/scripts/newbitmaps/images/1366x768/hwid_unknown.yaml b/scripts/newbitmaps/images/1280x800/DEFAULT.yaml
index d4d7aa68..3dd3c676 100644
--- a/scripts/newbitmaps/images/1366x768/hwid_unknown.yaml
+++ b/scripts/newbitmaps/images/1280x800/DEFAULT.yaml
@@ -1,12 +1,9 @@
-bmpblock: 1.0
+bmpblock: 1.1
compression: 1
images:
- # The HWID must change for every BOM
- hwid: hwid_unknown.bmp
-
# This URL never changes
url: URL.bmp
@@ -283,21 +280,21 @@ screens:
en_remove:
- [ 0, 0, remove_bg]
- [263, 534, en_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [195, 453, en_remove_text]
en_yuck:
- [ 0, 0, yuck_bg]
- [263, 534, en_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [160, 453, en_yuck_text]
en_insert:
- [ 0, 0, insert_bg]
- [263, 534, en_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [273, 435, en_insert_text]
@@ -308,21 +305,21 @@ screens:
es_419_remove:
- [ 0, 0, remove_bg]
- [258, 534, es_419_model_text]
- - [325, 534, hwid]
+ - [325, 534, $HWID]
- [192, 479, url]
- [161, 453, es_419_remove_text]
es_419_yuck:
- [ 0, 0, yuck_bg]
- [258, 534, es_419_model_text]
- - [325, 534, hwid]
+ - [325, 534, $HWID]
- [192, 479, url]
- [115, 453, es_419_yuck_text]
es_419_insert:
- [ 0, 0, insert_bg]
- [258, 534, es_419_model_text]
- - [325, 534, hwid]
+ - [325, 534, $HWID]
- [192, 479, url]
- [256, 435, es_419_insert_text]
@@ -333,21 +330,21 @@ screens:
pt_BR_remove:
- [ 0, 0, remove_bg]
- [258, 534, pt_BR_model_text]
- - [325, 534, hwid]
+ - [325, 534, $HWID]
- [192, 479, url]
- [161, 453, pt_BR_remove_text]
pt_BR_yuck:
- [ 0, 0, yuck_bg]
- [258, 534, pt_BR_model_text]
- - [325, 534, hwid]
+ - [325, 534, $HWID]
- [192, 479, url]
- [154, 453, pt_BR_yuck_text]
pt_BR_insert:
- [ 0, 0, insert_bg]
- [258, 534, pt_BR_model_text]
- - [325, 534, hwid]
+ - [325, 534, $HWID]
- [192, 479, url]
- [249, 435, pt_BR_insert_text]
@@ -358,21 +355,21 @@ screens:
en_GB_remove:
- [ 0, 0, remove_bg]
- [263, 534, en_GB_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [195, 453, en_GB_remove_text]
en_GB_yuck:
- [ 0, 0, yuck_bg]
- [263, 534, en_GB_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [135, 453, en_GB_yuck_text]
en_GB_insert:
- [ 0, 0, insert_bg]
- [263, 534, en_GB_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [273, 435, en_GB_insert_text]
@@ -383,21 +380,21 @@ screens:
fr_remove:
- [ 0, 0, remove_bg]
- [256, 534, fr_model_text]
- - [328, 534, hwid]
+ - [328, 534, $HWID]
- [192, 479, url]
- [68, 453, fr_remove_text]
fr_yuck:
- [ 0, 0, yuck_bg]
- [256, 534, fr_model_text]
- - [328, 534, hwid]
+ - [328, 534, $HWID]
- [192, 479, url]
- [66, 453, fr_yuck_text]
fr_insert:
- [ 0, 0, insert_bg]
- [256, 534, fr_model_text]
- - [328, 534, hwid]
+ - [328, 534, $HWID]
- [192, 479, url]
- [215, 435, fr_insert_text]
@@ -408,21 +405,21 @@ screens:
es_remove:
- [ 0, 0, remove_bg]
- [258, 534, es_model_text]
- - [325, 534, hwid]
+ - [325, 534, $HWID]
- [192, 479, url]
- [166, 453, es_remove_text]
es_yuck:
- [ 0, 0, yuck_bg]
- [258, 534, es_model_text]
- - [325, 534, hwid]
+ - [325, 534, $HWID]
- [192, 479, url]
- [147, 453, es_yuck_text]
es_insert:
- [ 0, 0, insert_bg]
- [258, 534, es_model_text]
- - [325, 534, hwid]
+ - [325, 534, $HWID]
- [192, 479, url]
- [239, 435, es_insert_text]
@@ -433,21 +430,21 @@ screens:
pt_PT_remove:
- [ 0, 0, remove_bg]
- [258, 534, pt_PT_model_text]
- - [325, 534, hwid]
+ - [325, 534, $HWID]
- [192, 479, url]
- [161, 453, pt_PT_remove_text]
pt_PT_yuck:
- [ 0, 0, yuck_bg]
- [258, 534, pt_PT_model_text]
- - [325, 534, hwid]
+ - [325, 534, $HWID]
- [192, 479, url]
- [167, 453, pt_PT_yuck_text]
pt_PT_insert:
- [ 0, 0, insert_bg]
- [258, 534, pt_PT_model_text]
- - [325, 534, hwid]
+ - [325, 534, $HWID]
- [192, 479, url]
- [239, 435, pt_PT_insert_text]
@@ -458,21 +455,21 @@ screens:
ca_remove:
- [ 0, 0, remove_bg]
- [263, 534, ca_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [180, 453, ca_remove_text]
ca_yuck:
- [ 0, 0, yuck_bg]
- [263, 534, ca_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [97, 453, ca_yuck_text]
ca_insert:
- [ 0, 0, insert_bg]
- [263, 534, ca_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [240, 435, ca_insert_text]
@@ -483,21 +480,21 @@ screens:
it_remove:
- [ 0, 0, remove_bg]
- [257, 534, it_model_text]
- - [327, 534, hwid]
+ - [327, 534, $HWID]
- [192, 479, url]
- [200, 453, it_remove_text]
it_yuck:
- [ 0, 0, yuck_bg]
- [257, 534, it_model_text]
- - [327, 534, hwid]
+ - [327, 534, $HWID]
- [192, 479, url]
- [168, 453, it_yuck_text]
it_insert:
- [ 0, 0, insert_bg]
- [257, 534, it_model_text]
- - [327, 534, hwid]
+ - [327, 534, $HWID]
- [192, 479, url]
- [241, 435, it_insert_text]
@@ -508,21 +505,21 @@ screens:
de_remove:
- [ 0, 0, remove_bg]
- [261, 534, de_model_text]
- - [322, 534, hwid]
+ - [322, 534, $HWID]
- [192, 479, url]
- [140, 453, de_remove_text]
de_yuck:
- [ 0, 0, yuck_bg]
- [261, 534, de_model_text]
- - [322, 534, hwid]
+ - [322, 534, $HWID]
- [192, 479, url]
- [134, 453, de_yuck_text]
de_insert:
- [ 0, 0, insert_bg]
- [261, 534, de_model_text]
- - [322, 534, hwid]
+ - [322, 534, $HWID]
- [192, 479, url]
- [212, 435, de_insert_text]
@@ -533,21 +530,21 @@ screens:
el_remove:
- [ 0, 0, remove_bg]
- [236, 540, el_model_text]
- - [348, 540, hwid]
+ - [348, 540, $HWID]
- [192, 485, url]
- [91, 437, el_remove_text]
el_yuck:
- [ 0, 0, yuck_bg]
- [236, 540, el_model_text]
- - [348, 540, hwid]
+ - [348, 540, $HWID]
- [192, 485, url]
- [80, 437, el_yuck_text]
el_insert:
- [ 0, 0, insert_bg]
- [236, 540, el_model_text]
- - [348, 540, hwid]
+ - [348, 540, $HWID]
- [192, 485, url]
- [145, 437, el_insert_text]
@@ -558,21 +555,21 @@ screens:
nl_remove:
- [ 0, 0, remove_bg]
- [263, 534, nl_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [170, 453, nl_remove_text]
nl_yuck:
- [ 0, 0, yuck_bg]
- [263, 534, nl_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [58, 453, nl_yuck_text]
nl_insert:
- [ 0, 0, insert_bg]
- [263, 534, nl_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [259, 435, nl_insert_text]
@@ -583,21 +580,21 @@ screens:
da_remove:
- [ 0, 0, remove_bg]
- [263, 534, da_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [193, 453, da_remove_text]
da_yuck:
- [ 0, 0, yuck_bg]
- [263, 534, da_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [144, 453, da_yuck_text]
da_insert:
- [ 0, 0, insert_bg]
- [263, 534, da_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [257, 435, da_insert_text]
@@ -608,21 +605,21 @@ screens:
no_remove:
- [ 0, 0, remove_bg]
- [261, 534, no_model_text]
- - [322, 534, hwid]
+ - [322, 534, $HWID]
- [192, 479, url]
- [198, 453, no_remove_text]
no_yuck:
- [ 0, 0, yuck_bg]
- [261, 534, no_model_text]
- - [322, 534, hwid]
+ - [322, 534, $HWID]
- [192, 479, url]
- [89, 453, no_yuck_text]
no_insert:
- [ 0, 0, insert_bg]
- [261, 534, no_model_text]
- - [322, 534, hwid]
+ - [322, 534, $HWID]
- [192, 479, url]
- [244, 435, no_insert_text]
@@ -633,21 +630,21 @@ screens:
sv_remove:
- [ 0, 0, remove_bg]
- [261, 534, sv_model_text]
- - [322, 534, hwid]
+ - [322, 534, $HWID]
- [192, 479, url]
- [166, 453, sv_remove_text]
sv_yuck:
- [ 0, 0, yuck_bg]
- [261, 534, sv_model_text]
- - [322, 534, hwid]
+ - [322, 534, $HWID]
- [192, 479, url]
- [153, 453, sv_yuck_text]
sv_insert:
- [ 0, 0, insert_bg]
- [261, 534, sv_model_text]
- - [322, 534, hwid]
+ - [322, 534, $HWID]
- [192, 479, url]
- [275, 435, sv_insert_text]
@@ -658,21 +655,21 @@ screens:
fi_remove:
- [ 0, 0, remove_bg]
- [269, 534, fi_model_text]
- - [315, 534, hwid]
+ - [315, 534, $HWID]
- [192, 479, url]
- [215, 453, fi_remove_text]
fi_yuck:
- [ 0, 0, yuck_bg]
- [269, 534, fi_model_text]
- - [315, 534, hwid]
+ - [315, 534, $HWID]
- [192, 479, url]
- [117, 453, fi_yuck_text]
fi_insert:
- [ 0, 0, insert_bg]
- [269, 534, fi_model_text]
- - [315, 534, hwid]
+ - [315, 534, $HWID]
- [192, 479, url]
- [205, 435, fi_insert_text]
@@ -683,21 +680,21 @@ screens:
et_remove:
- [ 0, 0, remove_bg]
- [263, 534, et_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [172, 453, et_remove_text]
et_yuck:
- [ 0, 0, yuck_bg]
- [263, 534, et_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [163, 453, et_yuck_text]
et_insert:
- [ 0, 0, insert_bg]
- [263, 534, et_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [269, 435, et_insert_text]
@@ -708,21 +705,21 @@ screens:
lv_remove:
- [ 0, 0, remove_bg]
- [257, 534, lv_model_text]
- - [326, 534, hwid]
+ - [326, 534, $HWID]
- [192, 479, url]
- [209, 453, lv_remove_text]
lv_yuck:
- [ 0, 0, yuck_bg]
- [257, 534, lv_model_text]
- - [326, 534, hwid]
+ - [326, 534, $HWID]
- [192, 479, url]
- [211, 453, lv_yuck_text]
lv_insert:
- [ 0, 0, insert_bg]
- [257, 534, lv_model_text]
- - [326, 534, hwid]
+ - [326, 534, $HWID]
- [192, 479, url]
- [280, 435, lv_insert_text]
@@ -733,21 +730,21 @@ screens:
lt_remove:
- [ 0, 0, remove_bg]
- [257, 534, lt_model_text]
- - [326, 534, hwid]
+ - [326, 534, $HWID]
- [192, 479, url]
- [172, 453, lt_remove_text]
lt_yuck:
- [ 0, 0, yuck_bg]
- [257, 534, lt_model_text]
- - [326, 534, hwid]
+ - [326, 534, $HWID]
- [192, 479, url]
- [209, 453, lt_yuck_text]
lt_insert:
- [ 0, 0, insert_bg]
- [257, 534, lt_model_text]
- - [326, 534, hwid]
+ - [326, 534, $HWID]
- [192, 479, url]
- [265, 435, lt_insert_text]
@@ -758,21 +755,21 @@ screens:
ru_remove:
- [ 0, 0, remove_bg]
- [255, 534, ru_model_text]
- - [328, 534, hwid]
+ - [328, 534, $HWID]
- [192, 479, url]
- [158, 453, ru_remove_text]
ru_yuck:
- [ 0, 0, yuck_bg]
- [255, 534, ru_model_text]
- - [328, 534, hwid]
+ - [328, 534, $HWID]
- [192, 479, url]
- [117, 453, ru_yuck_text]
ru_insert:
- [ 0, 0, insert_bg]
- [255, 534, ru_model_text]
- - [328, 534, hwid]
+ - [328, 534, $HWID]
- [192, 479, url]
- [230, 435, ru_insert_text]
@@ -783,21 +780,21 @@ screens:
pl_remove:
- [ 0, 0, remove_bg]
- [263, 534, pl_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [109, 453, pl_remove_text]
pl_yuck:
- [ 0, 0, yuck_bg]
- [263, 534, pl_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [133, 453, pl_yuck_text]
pl_insert:
- [ 0, 0, insert_bg]
- [263, 534, pl_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [222, 435, pl_insert_text]
@@ -808,21 +805,21 @@ screens:
cs_remove:
- [ 0, 0, remove_bg]
- [263, 534, cs_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [136, 453, cs_remove_text]
cs_yuck:
- [ 0, 0, yuck_bg]
- [263, 534, cs_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [119, 453, cs_yuck_text]
cs_insert:
- [ 0, 0, insert_bg]
- [263, 534, cs_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [202, 435, cs_insert_text]
@@ -833,21 +830,21 @@ screens:
sk_remove:
- [ 0, 0, remove_bg]
- [263, 534, sk_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [159, 453, sk_remove_text]
sk_yuck:
- [ 0, 0, yuck_bg]
- [263, 534, sk_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [138, 453, sk_yuck_text]
sk_insert:
- [ 0, 0, insert_bg]
- [263, 534, sk_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [196, 435, sk_insert_text]
@@ -858,21 +855,21 @@ screens:
hu_remove:
- [ 0, 0, remove_bg]
- [261, 534, hu_model_text]
- - [322, 534, hwid]
+ - [322, 534, $HWID]
- [192, 479, url]
- [111, 453, hu_remove_text]
hu_yuck:
- [ 0, 0, yuck_bg]
- [261, 534, hu_model_text]
- - [322, 534, hwid]
+ - [322, 534, $HWID]
- [192, 479, url]
- [108, 453, hu_yuck_text]
hu_insert:
- [ 0, 0, insert_bg]
- [261, 534, hu_model_text]
- - [322, 534, hwid]
+ - [322, 534, $HWID]
- [192, 479, url]
- [223, 435, hu_insert_text]
@@ -883,21 +880,21 @@ screens:
sl_remove:
- [ 0, 0, remove_bg]
- [263, 534, sl_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [203, 453, sl_remove_text]
sl_yuck:
- [ 0, 0, yuck_bg]
- [263, 534, sl_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [121, 453, sl_yuck_text]
sl_insert:
- [ 0, 0, insert_bg]
- [263, 534, sl_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [263, 435, sl_insert_text]
@@ -908,21 +905,21 @@ screens:
sr_remove:
- [ 0, 0, remove_bg]
- [268, 534, sr_model_text]
- - [315, 534, hwid]
+ - [315, 534, $HWID]
- [192, 479, url]
- [172, 453, sr_remove_text]
sr_yuck:
- [ 0, 0, yuck_bg]
- [268, 534, sr_model_text]
- - [315, 534, hwid]
+ - [315, 534, $HWID]
- [192, 479, url]
- [85, 453, sr_yuck_text]
sr_insert:
- [ 0, 0, insert_bg]
- [268, 534, sr_model_text]
- - [315, 534, hwid]
+ - [315, 534, $HWID]
- [192, 479, url]
- [259, 435, sr_insert_text]
@@ -933,21 +930,21 @@ screens:
hr_remove:
- [ 0, 0, remove_bg]
- [263, 534, hr_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [189, 453, hr_remove_text]
hr_yuck:
- [ 0, 0, yuck_bg]
- [263, 534, hr_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [199, 453, hr_yuck_text]
hr_insert:
- [ 0, 0, insert_bg]
- [263, 534, hr_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [279, 435, hr_insert_text]
@@ -958,21 +955,21 @@ screens:
bg_remove:
- [ 0, 0, remove_bg]
- [259, 534, bg_model_text]
- - [324, 534, hwid]
+ - [324, 534, $HWID]
- [192, 479, url]
- [106, 453, bg_remove_text]
bg_yuck:
- [ 0, 0, yuck_bg]
- [259, 534, bg_model_text]
- - [324, 534, hwid]
+ - [324, 534, $HWID]
- [192, 479, url]
- [103, 453, bg_yuck_text]
bg_insert:
- [ 0, 0, insert_bg]
- [259, 534, bg_model_text]
- - [324, 534, hwid]
+ - [324, 534, $HWID]
- [192, 479, url]
- [221, 435, bg_insert_text]
@@ -983,21 +980,21 @@ screens:
ro_remove:
- [ 0, 0, remove_bg]
- [263, 534, ro_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [131, 453, ro_remove_text]
ro_yuck:
- [ 0, 0, yuck_bg]
- [263, 534, ro_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [191, 453, ro_yuck_text]
ro_insert:
- [ 0, 0, insert_bg]
- [263, 534, ro_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [251, 435, ro_insert_text]
@@ -1008,21 +1005,21 @@ screens:
uk_remove:
- [ 0, 0, remove_bg]
- [255, 534, uk_model_text]
- - [328, 534, hwid]
+ - [328, 534, $HWID]
- [192, 479, url]
- [171, 453, uk_remove_text]
uk_yuck:
- [ 0, 0, yuck_bg]
- [255, 534, uk_model_text]
- - [328, 534, hwid]
+ - [328, 534, $HWID]
- [192, 479, url]
- [163, 453, uk_yuck_text]
uk_insert:
- [ 0, 0, insert_bg]
- [255, 534, uk_model_text]
- - [328, 534, hwid]
+ - [328, 534, $HWID]
- [192, 479, url]
- [255, 435, uk_insert_text]
@@ -1033,21 +1030,21 @@ screens:
tr_remove:
- [ 0, 0, remove_bg]
- [263, 534, tr_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [133, 453, tr_remove_text]
tr_yuck:
- [ 0, 0, yuck_bg]
- [263, 534, tr_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [121, 453, tr_yuck_text]
tr_insert:
- [ 0, 0, insert_bg]
- [263, 534, tr_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [266, 435, tr_insert_text]
@@ -1058,21 +1055,21 @@ screens:
iw_remove:
- [ 0, 0, remove_bg]
- [256, 539, iw_model_text]
- - [327, 539, hwid]
+ - [327, 539, $HWID]
- [192, 484, url]
- [100, 459, iw_remove_text]
iw_yuck:
- [ 0, 0, yuck_bg]
- [256, 539, iw_model_text]
- - [327, 539, hwid]
+ - [327, 539, $HWID]
- [192, 484, url]
- [92, 435, iw_yuck_text]
iw_insert:
- [ 0, 0, insert_bg]
- [256, 539, iw_model_text]
- - [327, 539, hwid]
+ - [327, 539, $HWID]
- [192, 484, url]
- [256, 436, iw_insert_text]
@@ -1083,21 +1080,21 @@ screens:
ar_remove:
- [ 0, 0, remove_bg]
- [243, 537, ar_model_text]
- - [341, 537, hwid]
+ - [341, 537, $HWID]
- [192, 482, url]
- [121, 453, ar_remove_text]
ar_yuck:
- [ 0, 0, yuck_bg]
- [243, 537, ar_model_text]
- - [341, 537, hwid]
+ - [341, 537, $HWID]
- [192, 482, url]
- [80, 429, ar_yuck_text]
ar_insert:
- [ 0, 0, insert_bg]
- [243, 537, ar_model_text]
- - [341, 537, hwid]
+ - [341, 537, $HWID]
- [192, 482, url]
- [178, 430, ar_insert_text]
@@ -1108,21 +1105,21 @@ screens:
fa_remove:
- [ 0, 0, remove_bg]
- [263, 539, fa_model_text]
- - [320, 539, hwid]
+ - [320, 539, $HWID]
- [192, 484, url]
- [79, 432, fa_remove_text]
fa_yuck:
- [ 0, 0, yuck_bg]
- [263, 539, fa_model_text]
- - [320, 539, hwid]
+ - [320, 539, $HWID]
- [192, 484, url]
- [88, 434, fa_yuck_text]
fa_insert:
- [ 0, 0, insert_bg]
- [263, 539, fa_model_text]
- - [320, 539, hwid]
+ - [320, 539, $HWID]
- [192, 484, url]
- [119, 434, fa_insert_text]
@@ -1133,21 +1130,21 @@ screens:
hi_remove:
- [ 0, 0, remove_bg]
- [258, 535, hi_model_text]
- - [325, 535, hwid]
+ - [325, 535, $HWID]
- [192, 480, url]
- [75, 448, hi_remove_text]
hi_yuck:
- [ 0, 0, yuck_bg]
- [258, 535, hi_model_text]
- - [325, 535, hwid]
+ - [325, 535, $HWID]
- [192, 480, url]
- [83, 448, hi_yuck_text]
hi_insert:
- [ 0, 0, insert_bg]
- [258, 535, hi_model_text]
- - [325, 535, hwid]
+ - [325, 535, $HWID]
- [192, 480, url]
- [205, 424, hi_insert_text]
@@ -1158,21 +1155,21 @@ screens:
th_remove:
- [ 0, 0, remove_bg]
- [267, 528, th_model_text]
- - [316, 528, hwid]
+ - [316, 528, $HWID]
- [192, 473, url]
- [92, 435, th_remove_text]
th_yuck:
- [ 0, 0, yuck_bg]
- [267, 528, th_model_text]
- - [316, 528, hwid]
+ - [316, 528, $HWID]
- [192, 473, url]
- [100, 435, th_yuck_text]
th_insert:
- [ 0, 0, insert_bg]
- [267, 528, th_model_text]
- - [316, 528, hwid]
+ - [316, 528, $HWID]
- [192, 473, url]
- [239, 416, th_insert_text]
@@ -1183,21 +1180,21 @@ screens:
vi_remove:
- [ 0, 0, remove_bg]
- [249, 541, vi_model_text]
- - [335, 541, hwid]
+ - [335, 541, $HWID]
- [192, 486, url]
- [71, 434, vi_remove_text]
vi_yuck:
- [ 0, 0, yuck_bg]
- [249, 541, vi_model_text]
- - [335, 541, hwid]
+ - [335, 541, $HWID]
- [192, 486, url]
- [111, 434, vi_yuck_text]
vi_insert:
- [ 0, 0, insert_bg]
- [249, 541, vi_model_text]
- - [335, 541, hwid]
+ - [335, 541, $HWID]
- [192, 486, url]
- [125, 434, vi_insert_text]
@@ -1208,21 +1205,21 @@ screens:
id_remove:
- [ 0, 0, remove_bg]
- [263, 534, id_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [148, 453, id_remove_text]
id_yuck:
- [ 0, 0, yuck_bg]
- [263, 534, id_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [139, 453, id_yuck_text]
id_insert:
- [ 0, 0, insert_bg]
- [263, 534, id_model_text]
- - [321, 534, hwid]
+ - [321, 534, $HWID]
- [192, 479, url]
- [271, 435, id_insert_text]
@@ -1233,21 +1230,21 @@ screens:
fil_remove:
- [ 0, 0, remove_bg]
- [258, 534, fil_model_text]
- - [325, 534, hwid]
+ - [325, 534, $HWID]
- [192, 479, url]
- [138, 453, fil_remove_text]
fil_yuck:
- [ 0, 0, yuck_bg]
- [258, 534, fil_model_text]
- - [325, 534, hwid]
+ - [325, 534, $HWID]
- [192, 479, url]
- [122, 453, fil_yuck_text]
fil_insert:
- [ 0, 0, insert_bg]
- [258, 534, fil_model_text]
- - [325, 534, hwid]
+ - [325, 534, $HWID]
- [192, 479, url]
- [229, 435, fil_insert_text]
@@ -1258,21 +1255,21 @@ screens:
zh_CN_remove:
- [ 0, 0, remove_bg]
- [261, 534, zh_CN_model_text]
- - [322, 534, hwid]
+ - [322, 534, $HWID]
- [192, 479, url]
- [144, 451, zh_CN_remove_text]
zh_CN_yuck:
- [ 0, 0, yuck_bg]
- [261, 534, zh_CN_model_text]
- - [322, 534, hwid]
+ - [322, 534, $HWID]
- [192, 479, url]
- [97, 451, zh_CN_yuck_text]
zh_CN_insert:
- [ 0, 0, insert_bg]
- [261, 534, zh_CN_model_text]
- - [322, 534, hwid]
+ - [322, 534, $HWID]
- [192, 479, url]
- [223, 427, zh_CN_insert_text]
@@ -1283,21 +1280,21 @@ screens:
zh_TW_remove:
- [ 0, 0, remove_bg]
- [261, 533, zh_TW_model_text]
- - [322, 533, hwid]
+ - [322, 533, $HWID]
- [192, 478, url]
- [159, 450, zh_TW_remove_text]
zh_TW_yuck:
- [ 0, 0, yuck_bg]
- [261, 533, zh_TW_model_text]
- - [322, 533, hwid]
+ - [322, 533, $HWID]
- [192, 478, url]
- [103, 450, zh_TW_yuck_text]
zh_TW_insert:
- [ 0, 0, insert_bg]
- [261, 533, zh_TW_model_text]
- - [322, 533, hwid]
+ - [322, 533, $HWID]
- [192, 478, url]
- [216, 426, zh_TW_insert_text]
@@ -1308,21 +1305,21 @@ screens:
ko_remove:
- [ 0, 0, remove_bg]
- [260, 535, ko_model_text]
- - [323, 535, hwid]
+ - [323, 535, $HWID]
- [192, 480, url]
- [106, 454, ko_remove_text]
ko_yuck:
- [ 0, 0, yuck_bg]
- [260, 535, ko_model_text]
- - [323, 535, hwid]
+ - [323, 535, $HWID]
- [192, 480, url]
- [75, 430, ko_yuck_text]
ko_insert:
- [ 0, 0, insert_bg]
- [260, 535, ko_model_text]
- - [323, 535, hwid]
+ - [323, 535, $HWID]
- [192, 480, url]
- [217, 430, ko_insert_text]
@@ -1333,21 +1330,21 @@ screens:
ja_remove:
- [ 0, 0, remove_bg]
- [250, 536, ja_model_text]
- - [334, 536, hwid]
+ - [334, 536, $HWID]
- [192, 481, url]
- [75, 429, ja_remove_text]
ja_yuck:
- [ 0, 0, yuck_bg]
- [250, 536, ja_model_text]
- - [334, 536, hwid]
+ - [334, 536, $HWID]
- [192, 481, url]
- [73, 429, ja_yuck_text]
ja_insert:
- [ 0, 0, insert_bg]
- [250, 536, ja_model_text]
- - [334, 536, hwid]
+ - [334, 536, $HWID]
- [192, 481, url]
- [170, 430, ja_insert_text]
diff --git a/scripts/newbitmaps/images/1366x768/DEFAULT.yaml b/scripts/newbitmaps/images/1366x768/DEFAULT.yaml
new file mode 100644
index 00000000..ce19e745
--- /dev/null
+++ b/scripts/newbitmaps/images/1366x768/DEFAULT.yaml
@@ -0,0 +1,1398 @@
+bmpblock: 1.1
+
+compression: 1
+
+images:
+
+ # This URL never changes
+ url: URL.bmp
+
+ # The background images are from the UI people
+ devmode_bg: Devmode.bmp
+ remove_bg: Remove.bmp
+ yuck_bg: Yuck.bmp
+ insert_bg: Insert.bmp
+
+ # The following strings must be approved by the localization people
+ en_model_text: ./localized_bitmaps/en/model.bmp
+ en_devmode_text: ./localized_bitmaps/en/devmode.bmp
+ en_remove_text: ./localized_bitmaps/en/remove.bmp
+ en_yuck_text: ./localized_bitmaps/en/yuck.bmp
+ en_insert_text: ./localized_bitmaps/en/insert.bmp
+
+ es_419_model_text: ./localized_bitmaps/es_419/model.bmp
+ es_419_devmode_text: ./localized_bitmaps/es_419/devmode.bmp
+ es_419_remove_text: ./localized_bitmaps/es_419/remove.bmp
+ es_419_yuck_text: ./localized_bitmaps/es_419/yuck.bmp
+ es_419_insert_text: ./localized_bitmaps/es_419/insert.bmp
+
+ pt_BR_model_text: ./localized_bitmaps/pt_BR/model.bmp
+ pt_BR_devmode_text: ./localized_bitmaps/pt_BR/devmode.bmp
+ pt_BR_remove_text: ./localized_bitmaps/pt_BR/remove.bmp
+ pt_BR_yuck_text: ./localized_bitmaps/pt_BR/yuck.bmp
+ pt_BR_insert_text: ./localized_bitmaps/pt_BR/insert.bmp
+
+ en_GB_model_text: ./localized_bitmaps/en_GB/model.bmp
+ en_GB_devmode_text: ./localized_bitmaps/en_GB/devmode.bmp
+ en_GB_remove_text: ./localized_bitmaps/en_GB/remove.bmp
+ en_GB_yuck_text: ./localized_bitmaps/en_GB/yuck.bmp
+ en_GB_insert_text: ./localized_bitmaps/en_GB/insert.bmp
+
+ fr_model_text: ./localized_bitmaps/fr/model.bmp
+ fr_devmode_text: ./localized_bitmaps/fr/devmode.bmp
+ fr_remove_text: ./localized_bitmaps/fr/remove.bmp
+ fr_yuck_text: ./localized_bitmaps/fr/yuck.bmp
+ fr_insert_text: ./localized_bitmaps/fr/insert.bmp
+
+ es_model_text: ./localized_bitmaps/es/model.bmp
+ es_devmode_text: ./localized_bitmaps/es/devmode.bmp
+ es_remove_text: ./localized_bitmaps/es/remove.bmp
+ es_yuck_text: ./localized_bitmaps/es/yuck.bmp
+ es_insert_text: ./localized_bitmaps/es/insert.bmp
+
+ pt_PT_model_text: ./localized_bitmaps/pt_PT/model.bmp
+ pt_PT_devmode_text: ./localized_bitmaps/pt_PT/devmode.bmp
+ pt_PT_remove_text: ./localized_bitmaps/pt_PT/remove.bmp
+ pt_PT_yuck_text: ./localized_bitmaps/pt_PT/yuck.bmp
+ pt_PT_insert_text: ./localized_bitmaps/pt_PT/insert.bmp
+
+ ca_model_text: ./localized_bitmaps/ca/model.bmp
+ ca_devmode_text: ./localized_bitmaps/ca/devmode.bmp
+ ca_remove_text: ./localized_bitmaps/ca/remove.bmp
+ ca_yuck_text: ./localized_bitmaps/ca/yuck.bmp
+ ca_insert_text: ./localized_bitmaps/ca/insert.bmp
+
+ it_model_text: ./localized_bitmaps/it/model.bmp
+ it_devmode_text: ./localized_bitmaps/it/devmode.bmp
+ it_remove_text: ./localized_bitmaps/it/remove.bmp
+ it_yuck_text: ./localized_bitmaps/it/yuck.bmp
+ it_insert_text: ./localized_bitmaps/it/insert.bmp
+
+ de_model_text: ./localized_bitmaps/de/model.bmp
+ de_devmode_text: ./localized_bitmaps/de/devmode.bmp
+ de_remove_text: ./localized_bitmaps/de/remove.bmp
+ de_yuck_text: ./localized_bitmaps/de/yuck.bmp
+ de_insert_text: ./localized_bitmaps/de/insert.bmp
+
+ el_model_text: ./localized_bitmaps/el/model.bmp
+ el_devmode_text: ./localized_bitmaps/el/devmode.bmp
+ el_remove_text: ./localized_bitmaps/el/remove.bmp
+ el_yuck_text: ./localized_bitmaps/el/yuck.bmp
+ el_insert_text: ./localized_bitmaps/el/insert.bmp
+
+ nl_model_text: ./localized_bitmaps/nl/model.bmp
+ nl_devmode_text: ./localized_bitmaps/nl/devmode.bmp
+ nl_remove_text: ./localized_bitmaps/nl/remove.bmp
+ nl_yuck_text: ./localized_bitmaps/nl/yuck.bmp
+ nl_insert_text: ./localized_bitmaps/nl/insert.bmp
+
+ da_model_text: ./localized_bitmaps/da/model.bmp
+ da_devmode_text: ./localized_bitmaps/da/devmode.bmp
+ da_remove_text: ./localized_bitmaps/da/remove.bmp
+ da_yuck_text: ./localized_bitmaps/da/yuck.bmp
+ da_insert_text: ./localized_bitmaps/da/insert.bmp
+
+ no_model_text: ./localized_bitmaps/no/model.bmp
+ no_devmode_text: ./localized_bitmaps/no/devmode.bmp
+ no_remove_text: ./localized_bitmaps/no/remove.bmp
+ no_yuck_text: ./localized_bitmaps/no/yuck.bmp
+ no_insert_text: ./localized_bitmaps/no/insert.bmp
+
+ sv_model_text: ./localized_bitmaps/sv/model.bmp
+ sv_devmode_text: ./localized_bitmaps/sv/devmode.bmp
+ sv_remove_text: ./localized_bitmaps/sv/remove.bmp
+ sv_yuck_text: ./localized_bitmaps/sv/yuck.bmp
+ sv_insert_text: ./localized_bitmaps/sv/insert.bmp
+
+ fi_model_text: ./localized_bitmaps/fi/model.bmp
+ fi_devmode_text: ./localized_bitmaps/fi/devmode.bmp
+ fi_remove_text: ./localized_bitmaps/fi/remove.bmp
+ fi_yuck_text: ./localized_bitmaps/fi/yuck.bmp
+ fi_insert_text: ./localized_bitmaps/fi/insert.bmp
+
+ et_model_text: ./localized_bitmaps/et/model.bmp
+ et_devmode_text: ./localized_bitmaps/et/devmode.bmp
+ et_remove_text: ./localized_bitmaps/et/remove.bmp
+ et_yuck_text: ./localized_bitmaps/et/yuck.bmp
+ et_insert_text: ./localized_bitmaps/et/insert.bmp
+
+ lv_model_text: ./localized_bitmaps/lv/model.bmp
+ lv_devmode_text: ./localized_bitmaps/lv/devmode.bmp
+ lv_remove_text: ./localized_bitmaps/lv/remove.bmp
+ lv_yuck_text: ./localized_bitmaps/lv/yuck.bmp
+ lv_insert_text: ./localized_bitmaps/lv/insert.bmp
+
+ lt_model_text: ./localized_bitmaps/lt/model.bmp
+ lt_devmode_text: ./localized_bitmaps/lt/devmode.bmp
+ lt_remove_text: ./localized_bitmaps/lt/remove.bmp
+ lt_yuck_text: ./localized_bitmaps/lt/yuck.bmp
+ lt_insert_text: ./localized_bitmaps/lt/insert.bmp
+
+ ru_model_text: ./localized_bitmaps/ru/model.bmp
+ ru_devmode_text: ./localized_bitmaps/ru/devmode.bmp
+ ru_remove_text: ./localized_bitmaps/ru/remove.bmp
+ ru_yuck_text: ./localized_bitmaps/ru/yuck.bmp
+ ru_insert_text: ./localized_bitmaps/ru/insert.bmp
+
+ pl_model_text: ./localized_bitmaps/pl/model.bmp
+ pl_devmode_text: ./localized_bitmaps/pl/devmode.bmp
+ pl_remove_text: ./localized_bitmaps/pl/remove.bmp
+ pl_yuck_text: ./localized_bitmaps/pl/yuck.bmp
+ pl_insert_text: ./localized_bitmaps/pl/insert.bmp
+
+ cs_model_text: ./localized_bitmaps/cs/model.bmp
+ cs_devmode_text: ./localized_bitmaps/cs/devmode.bmp
+ cs_remove_text: ./localized_bitmaps/cs/remove.bmp
+ cs_yuck_text: ./localized_bitmaps/cs/yuck.bmp
+ cs_insert_text: ./localized_bitmaps/cs/insert.bmp
+
+ sk_model_text: ./localized_bitmaps/sk/model.bmp
+ sk_devmode_text: ./localized_bitmaps/sk/devmode.bmp
+ sk_remove_text: ./localized_bitmaps/sk/remove.bmp
+ sk_yuck_text: ./localized_bitmaps/sk/yuck.bmp
+ sk_insert_text: ./localized_bitmaps/sk/insert.bmp
+
+ hu_model_text: ./localized_bitmaps/hu/model.bmp
+ hu_devmode_text: ./localized_bitmaps/hu/devmode.bmp
+ hu_remove_text: ./localized_bitmaps/hu/remove.bmp
+ hu_yuck_text: ./localized_bitmaps/hu/yuck.bmp
+ hu_insert_text: ./localized_bitmaps/hu/insert.bmp
+
+ sl_model_text: ./localized_bitmaps/sl/model.bmp
+ sl_devmode_text: ./localized_bitmaps/sl/devmode.bmp
+ sl_remove_text: ./localized_bitmaps/sl/remove.bmp
+ sl_yuck_text: ./localized_bitmaps/sl/yuck.bmp
+ sl_insert_text: ./localized_bitmaps/sl/insert.bmp
+
+ sr_model_text: ./localized_bitmaps/sr/model.bmp
+ sr_devmode_text: ./localized_bitmaps/sr/devmode.bmp
+ sr_remove_text: ./localized_bitmaps/sr/remove.bmp
+ sr_yuck_text: ./localized_bitmaps/sr/yuck.bmp
+ sr_insert_text: ./localized_bitmaps/sr/insert.bmp
+
+ hr_model_text: ./localized_bitmaps/hr/model.bmp
+ hr_devmode_text: ./localized_bitmaps/hr/devmode.bmp
+ hr_remove_text: ./localized_bitmaps/hr/remove.bmp
+ hr_yuck_text: ./localized_bitmaps/hr/yuck.bmp
+ hr_insert_text: ./localized_bitmaps/hr/insert.bmp
+
+ bg_model_text: ./localized_bitmaps/bg/model.bmp
+ bg_devmode_text: ./localized_bitmaps/bg/devmode.bmp
+ bg_remove_text: ./localized_bitmaps/bg/remove.bmp
+ bg_yuck_text: ./localized_bitmaps/bg/yuck.bmp
+ bg_insert_text: ./localized_bitmaps/bg/insert.bmp
+
+ ro_model_text: ./localized_bitmaps/ro/model.bmp
+ ro_devmode_text: ./localized_bitmaps/ro/devmode.bmp
+ ro_remove_text: ./localized_bitmaps/ro/remove.bmp
+ ro_yuck_text: ./localized_bitmaps/ro/yuck.bmp
+ ro_insert_text: ./localized_bitmaps/ro/insert.bmp
+
+ uk_model_text: ./localized_bitmaps/uk/model.bmp
+ uk_devmode_text: ./localized_bitmaps/uk/devmode.bmp
+ uk_remove_text: ./localized_bitmaps/uk/remove.bmp
+ uk_yuck_text: ./localized_bitmaps/uk/yuck.bmp
+ uk_insert_text: ./localized_bitmaps/uk/insert.bmp
+
+ tr_model_text: ./localized_bitmaps/tr/model.bmp
+ tr_devmode_text: ./localized_bitmaps/tr/devmode.bmp
+ tr_remove_text: ./localized_bitmaps/tr/remove.bmp
+ tr_yuck_text: ./localized_bitmaps/tr/yuck.bmp
+ tr_insert_text: ./localized_bitmaps/tr/insert.bmp
+
+ iw_model_text: ./localized_bitmaps/iw/model.bmp
+ iw_devmode_text: ./localized_bitmaps/iw/devmode.bmp
+ iw_remove_text: ./localized_bitmaps/iw/remove.bmp
+ iw_yuck_text: ./localized_bitmaps/iw/yuck.bmp
+ iw_insert_text: ./localized_bitmaps/iw/insert.bmp
+
+ ar_model_text: ./localized_bitmaps/ar/model.bmp
+ ar_devmode_text: ./localized_bitmaps/ar/devmode.bmp
+ ar_remove_text: ./localized_bitmaps/ar/remove.bmp
+ ar_yuck_text: ./localized_bitmaps/ar/yuck.bmp
+ ar_insert_text: ./localized_bitmaps/ar/insert.bmp
+
+ fa_model_text: ./localized_bitmaps/fa/model.bmp
+ fa_devmode_text: ./localized_bitmaps/fa/devmode.bmp
+ fa_remove_text: ./localized_bitmaps/fa/remove.bmp
+ fa_yuck_text: ./localized_bitmaps/fa/yuck.bmp
+ fa_insert_text: ./localized_bitmaps/fa/insert.bmp
+
+ hi_model_text: ./localized_bitmaps/hi/model.bmp
+ hi_devmode_text: ./localized_bitmaps/hi/devmode.bmp
+ hi_remove_text: ./localized_bitmaps/hi/remove.bmp
+ hi_yuck_text: ./localized_bitmaps/hi/yuck.bmp
+ hi_insert_text: ./localized_bitmaps/hi/insert.bmp
+
+ th_model_text: ./localized_bitmaps/th/model.bmp
+ th_devmode_text: ./localized_bitmaps/th/devmode.bmp
+ th_remove_text: ./localized_bitmaps/th/remove.bmp
+ th_yuck_text: ./localized_bitmaps/th/yuck.bmp
+ th_insert_text: ./localized_bitmaps/th/insert.bmp
+
+ vi_model_text: ./localized_bitmaps/vi/model.bmp
+ vi_devmode_text: ./localized_bitmaps/vi/devmode.bmp
+ vi_remove_text: ./localized_bitmaps/vi/remove.bmp
+ vi_yuck_text: ./localized_bitmaps/vi/yuck.bmp
+ vi_insert_text: ./localized_bitmaps/vi/insert.bmp
+
+ id_model_text: ./localized_bitmaps/id/model.bmp
+ id_devmode_text: ./localized_bitmaps/id/devmode.bmp
+ id_remove_text: ./localized_bitmaps/id/remove.bmp
+ id_yuck_text: ./localized_bitmaps/id/yuck.bmp
+ id_insert_text: ./localized_bitmaps/id/insert.bmp
+
+ fil_model_text: ./localized_bitmaps/fil/model.bmp
+ fil_devmode_text: ./localized_bitmaps/fil/devmode.bmp
+ fil_remove_text: ./localized_bitmaps/fil/remove.bmp
+ fil_yuck_text: ./localized_bitmaps/fil/yuck.bmp
+ fil_insert_text: ./localized_bitmaps/fil/insert.bmp
+
+ zh_CN_model_text: ./localized_bitmaps/zh_CN/model.bmp
+ zh_CN_devmode_text: ./localized_bitmaps/zh_CN/devmode.bmp
+ zh_CN_remove_text: ./localized_bitmaps/zh_CN/remove.bmp
+ zh_CN_yuck_text: ./localized_bitmaps/zh_CN/yuck.bmp
+ zh_CN_insert_text: ./localized_bitmaps/zh_CN/insert.bmp
+
+ zh_TW_model_text: ./localized_bitmaps/zh_TW/model.bmp
+ zh_TW_devmode_text: ./localized_bitmaps/zh_TW/devmode.bmp
+ zh_TW_remove_text: ./localized_bitmaps/zh_TW/remove.bmp
+ zh_TW_yuck_text: ./localized_bitmaps/zh_TW/yuck.bmp
+ zh_TW_insert_text: ./localized_bitmaps/zh_TW/insert.bmp
+
+ ko_model_text: ./localized_bitmaps/ko/model.bmp
+ ko_devmode_text: ./localized_bitmaps/ko/devmode.bmp
+ ko_remove_text: ./localized_bitmaps/ko/remove.bmp
+ ko_yuck_text: ./localized_bitmaps/ko/yuck.bmp
+ ko_insert_text: ./localized_bitmaps/ko/insert.bmp
+
+ ja_model_text: ./localized_bitmaps/ja/model.bmp
+ ja_devmode_text: ./localized_bitmaps/ja/devmode.bmp
+ ja_remove_text: ./localized_bitmaps/ja/remove.bmp
+ ja_yuck_text: ./localized_bitmaps/ja/yuck.bmp
+ ja_insert_text: ./localized_bitmaps/ja/insert.bmp
+
+screens:
+ en_devel:
+ - [ 0, 0, devmode_bg]
+ - [272, 516, en_devmode_text]
+
+ en_remove:
+ - [ 0, 0, remove_bg]
+ - [256, 534, en_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [195, 453, en_remove_text]
+
+ en_yuck:
+ - [ 0, 0, yuck_bg]
+ - [256, 534, en_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [160, 453, en_yuck_text]
+
+ en_insert:
+ - [ 0, 0, insert_bg]
+ - [256, 534, en_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [273, 435, en_insert_text]
+
+ es_419_devel:
+ - [ 0, 0, devmode_bg]
+ - [229, 516, es_419_devmode_text]
+
+ es_419_remove:
+ - [ 0, 0, remove_bg]
+ - [252, 534, es_419_model_text]
+ - [319, 534, $HWID]
+ - [192, 479, url]
+ - [161, 453, es_419_remove_text]
+
+ es_419_yuck:
+ - [ 0, 0, yuck_bg]
+ - [252, 534, es_419_model_text]
+ - [319, 534, $HWID]
+ - [192, 479, url]
+ - [115, 453, es_419_yuck_text]
+
+ es_419_insert:
+ - [ 0, 0, insert_bg]
+ - [252, 534, es_419_model_text]
+ - [319, 534, $HWID]
+ - [192, 479, url]
+ - [256, 435, es_419_insert_text]
+
+ pt_BR_devel:
+ - [ 0, 0, devmode_bg]
+ - [202, 516, pt_BR_devmode_text]
+
+ pt_BR_remove:
+ - [ 0, 0, remove_bg]
+ - [252, 534, pt_BR_model_text]
+ - [319, 534, $HWID]
+ - [192, 479, url]
+ - [161, 453, pt_BR_remove_text]
+
+ pt_BR_yuck:
+ - [ 0, 0, yuck_bg]
+ - [252, 534, pt_BR_model_text]
+ - [319, 534, $HWID]
+ - [192, 479, url]
+ - [154, 453, pt_BR_yuck_text]
+
+ pt_BR_insert:
+ - [ 0, 0, insert_bg]
+ - [252, 534, pt_BR_model_text]
+ - [319, 534, $HWID]
+ - [192, 479, url]
+ - [249, 435, pt_BR_insert_text]
+
+ en_GB_devel:
+ - [ 0, 0, devmode_bg]
+ - [272, 516, en_GB_devmode_text]
+
+ en_GB_remove:
+ - [ 0, 0, remove_bg]
+ - [256, 534, en_GB_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [195, 453, en_GB_remove_text]
+
+ en_GB_yuck:
+ - [ 0, 0, yuck_bg]
+ - [256, 534, en_GB_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [135, 453, en_GB_yuck_text]
+
+ en_GB_insert:
+ - [ 0, 0, insert_bg]
+ - [256, 534, en_GB_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [273, 435, en_GB_insert_text]
+
+ fr_devel:
+ - [ 0, 0, devmode_bg]
+ - [141, 516, fr_devmode_text]
+
+ fr_remove:
+ - [ 0, 0, remove_bg]
+ - [249, 534, fr_model_text]
+ - [321, 534, $HWID]
+ - [192, 479, url]
+ - [68, 453, fr_remove_text]
+
+ fr_yuck:
+ - [ 0, 0, yuck_bg]
+ - [249, 534, fr_model_text]
+ - [321, 534, $HWID]
+ - [192, 479, url]
+ - [66, 453, fr_yuck_text]
+
+ fr_insert:
+ - [ 0, 0, insert_bg]
+ - [249, 534, fr_model_text]
+ - [321, 534, $HWID]
+ - [192, 479, url]
+ - [215, 435, fr_insert_text]
+
+ es_devel:
+ - [ 0, 0, devmode_bg]
+ - [212, 516, es_devmode_text]
+
+ es_remove:
+ - [ 0, 0, remove_bg]
+ - [252, 534, es_model_text]
+ - [319, 534, $HWID]
+ - [192, 479, url]
+ - [166, 453, es_remove_text]
+
+ es_yuck:
+ - [ 0, 0, yuck_bg]
+ - [252, 534, es_model_text]
+ - [319, 534, $HWID]
+ - [192, 479, url]
+ - [147, 453, es_yuck_text]
+
+ es_insert:
+ - [ 0, 0, insert_bg]
+ - [252, 534, es_model_text]
+ - [319, 534, $HWID]
+ - [192, 479, url]
+ - [239, 435, es_insert_text]
+
+ pt_PT_devel:
+ - [ 0, 0, devmode_bg]
+ - [211, 516, pt_PT_devmode_text]
+
+ pt_PT_remove:
+ - [ 0, 0, remove_bg]
+ - [252, 534, pt_PT_model_text]
+ - [319, 534, $HWID]
+ - [192, 479, url]
+ - [161, 453, pt_PT_remove_text]
+
+ pt_PT_yuck:
+ - [ 0, 0, yuck_bg]
+ - [252, 534, pt_PT_model_text]
+ - [319, 534, $HWID]
+ - [192, 479, url]
+ - [167, 453, pt_PT_yuck_text]
+
+ pt_PT_insert:
+ - [ 0, 0, insert_bg]
+ - [252, 534, pt_PT_model_text]
+ - [319, 534, $HWID]
+ - [192, 479, url]
+ - [239, 435, pt_PT_insert_text]
+
+ ca_devel:
+ - [ 0, 0, devmode_bg]
+ - [221, 516, ca_devmode_text]
+
+ ca_remove:
+ - [ 0, 0, remove_bg]
+ - [256, 534, ca_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [180, 453, ca_remove_text]
+
+ ca_yuck:
+ - [ 0, 0, yuck_bg]
+ - [256, 534, ca_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [97, 453, ca_yuck_text]
+
+ ca_insert:
+ - [ 0, 0, insert_bg]
+ - [256, 534, ca_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [240, 435, ca_insert_text]
+
+ it_devel:
+ - [ 0, 0, devmode_bg]
+ - [229, 516, it_devmode_text]
+
+ it_remove:
+ - [ 0, 0, remove_bg]
+ - [250, 534, it_model_text]
+ - [320, 534, $HWID]
+ - [192, 479, url]
+ - [200, 453, it_remove_text]
+
+ it_yuck:
+ - [ 0, 0, yuck_bg]
+ - [250, 534, it_model_text]
+ - [320, 534, $HWID]
+ - [192, 479, url]
+ - [168, 453, it_yuck_text]
+
+ it_insert:
+ - [ 0, 0, insert_bg]
+ - [250, 534, it_model_text]
+ - [320, 534, $HWID]
+ - [192, 479, url]
+ - [241, 435, it_insert_text]
+
+ de_devel:
+ - [ 0, 0, devmode_bg]
+ - [181, 516, de_devmode_text]
+
+ de_remove:
+ - [ 0, 0, remove_bg]
+ - [255, 534, de_model_text]
+ - [316, 534, $HWID]
+ - [192, 479, url]
+ - [140, 453, de_remove_text]
+
+ de_yuck:
+ - [ 0, 0, yuck_bg]
+ - [255, 534, de_model_text]
+ - [316, 534, $HWID]
+ - [192, 479, url]
+ - [134, 453, de_yuck_text]
+
+ de_insert:
+ - [ 0, 0, insert_bg]
+ - [255, 534, de_model_text]
+ - [316, 534, $HWID]
+ - [192, 479, url]
+ - [212, 435, de_insert_text]
+
+ el_devel:
+ - [ 0, 0, devmode_bg]
+ - [92, 488, el_devmode_text]
+
+ el_remove:
+ - [ 0, 0, remove_bg]
+ - [229, 540, el_model_text]
+ - [341, 540, $HWID]
+ - [192, 485, url]
+ - [91, 437, el_remove_text]
+
+ el_yuck:
+ - [ 0, 0, yuck_bg]
+ - [229, 540, el_model_text]
+ - [341, 540, $HWID]
+ - [192, 485, url]
+ - [80, 437, el_yuck_text]
+
+ el_insert:
+ - [ 0, 0, insert_bg]
+ - [229, 540, el_model_text]
+ - [341, 540, $HWID]
+ - [192, 485, url]
+ - [145, 437, el_insert_text]
+
+ nl_devel:
+ - [ 0, 0, devmode_bg]
+ - [222, 516, nl_devmode_text]
+
+ nl_remove:
+ - [ 0, 0, remove_bg]
+ - [256, 534, nl_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [170, 453, nl_remove_text]
+
+ nl_yuck:
+ - [ 0, 0, yuck_bg]
+ - [256, 534, nl_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [58, 453, nl_yuck_text]
+
+ nl_insert:
+ - [ 0, 0, insert_bg]
+ - [256, 534, nl_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [259, 435, nl_insert_text]
+
+ da_devel:
+ - [ 0, 0, devmode_bg]
+ - [208, 516, da_devmode_text]
+
+ da_remove:
+ - [ 0, 0, remove_bg]
+ - [256, 534, da_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [193, 453, da_remove_text]
+
+ da_yuck:
+ - [ 0, 0, yuck_bg]
+ - [256, 534, da_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [144, 453, da_yuck_text]
+
+ da_insert:
+ - [ 0, 0, insert_bg]
+ - [256, 534, da_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [257, 435, da_insert_text]
+
+ no_devel:
+ - [ 0, 0, devmode_bg]
+ - [207, 516, no_devmode_text]
+
+ no_remove:
+ - [ 0, 0, remove_bg]
+ - [255, 534, no_model_text]
+ - [316, 534, $HWID]
+ - [192, 479, url]
+ - [198, 453, no_remove_text]
+
+ no_yuck:
+ - [ 0, 0, yuck_bg]
+ - [255, 534, no_model_text]
+ - [316, 534, $HWID]
+ - [192, 479, url]
+ - [89, 453, no_yuck_text]
+
+ no_insert:
+ - [ 0, 0, insert_bg]
+ - [255, 534, no_model_text]
+ - [316, 534, $HWID]
+ - [192, 479, url]
+ - [244, 435, no_insert_text]
+
+ sv_devel:
+ - [ 0, 0, devmode_bg]
+ - [229, 516, sv_devmode_text]
+
+ sv_remove:
+ - [ 0, 0, remove_bg]
+ - [255, 534, sv_model_text]
+ - [316, 534, $HWID]
+ - [192, 479, url]
+ - [166, 453, sv_remove_text]
+
+ sv_yuck:
+ - [ 0, 0, yuck_bg]
+ - [255, 534, sv_model_text]
+ - [316, 534, $HWID]
+ - [192, 479, url]
+ - [153, 453, sv_yuck_text]
+
+ sv_insert:
+ - [ 0, 0, insert_bg]
+ - [255, 534, sv_model_text]
+ - [316, 534, $HWID]
+ - [192, 479, url]
+ - [275, 435, sv_insert_text]
+
+ fi_devel:
+ - [ 0, 0, devmode_bg]
+ - [192, 516, fi_devmode_text]
+
+ fi_remove:
+ - [ 0, 0, remove_bg]
+ - [262, 534, fi_model_text]
+ - [308, 534, $HWID]
+ - [192, 479, url]
+ - [215, 453, fi_remove_text]
+
+ fi_yuck:
+ - [ 0, 0, yuck_bg]
+ - [262, 534, fi_model_text]
+ - [308, 534, $HWID]
+ - [192, 479, url]
+ - [117, 453, fi_yuck_text]
+
+ fi_insert:
+ - [ 0, 0, insert_bg]
+ - [262, 534, fi_model_text]
+ - [308, 534, $HWID]
+ - [192, 479, url]
+ - [205, 435, fi_insert_text]
+
+ et_devel:
+ - [ 0, 0, devmode_bg]
+ - [231, 516, et_devmode_text]
+
+ et_remove:
+ - [ 0, 0, remove_bg]
+ - [256, 534, et_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [172, 453, et_remove_text]
+
+ et_yuck:
+ - [ 0, 0, yuck_bg]
+ - [256, 534, et_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [163, 453, et_yuck_text]
+
+ et_insert:
+ - [ 0, 0, insert_bg]
+ - [256, 534, et_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [269, 435, et_insert_text]
+
+ lv_devel:
+ - [ 0, 0, devmode_bg]
+ - [220, 516, lv_devmode_text]
+
+ lv_remove:
+ - [ 0, 0, remove_bg]
+ - [251, 534, lv_model_text]
+ - [320, 534, $HWID]
+ - [192, 479, url]
+ - [209, 453, lv_remove_text]
+
+ lv_yuck:
+ - [ 0, 0, yuck_bg]
+ - [251, 534, lv_model_text]
+ - [320, 534, $HWID]
+ - [192, 479, url]
+ - [211, 453, lv_yuck_text]
+
+ lv_insert:
+ - [ 0, 0, insert_bg]
+ - [251, 534, lv_model_text]
+ - [320, 534, $HWID]
+ - [192, 479, url]
+ - [280, 435, lv_insert_text]
+
+ lt_devel:
+ - [ 0, 0, devmode_bg]
+ - [212, 516, lt_devmode_text]
+
+ lt_remove:
+ - [ 0, 0, remove_bg]
+ - [251, 534, lt_model_text]
+ - [320, 534, $HWID]
+ - [192, 479, url]
+ - [172, 453, lt_remove_text]
+
+ lt_yuck:
+ - [ 0, 0, yuck_bg]
+ - [251, 534, lt_model_text]
+ - [320, 534, $HWID]
+ - [192, 479, url]
+ - [209, 453, lt_yuck_text]
+
+ lt_insert:
+ - [ 0, 0, insert_bg]
+ - [251, 534, lt_model_text]
+ - [320, 534, $HWID]
+ - [192, 479, url]
+ - [265, 435, lt_insert_text]
+
+ ru_devel:
+ - [ 0, 0, devmode_bg]
+ - [220, 516, ru_devmode_text]
+
+ ru_remove:
+ - [ 0, 0, remove_bg]
+ - [249, 534, ru_model_text]
+ - [322, 534, $HWID]
+ - [192, 479, url]
+ - [158, 453, ru_remove_text]
+
+ ru_yuck:
+ - [ 0, 0, yuck_bg]
+ - [249, 534, ru_model_text]
+ - [322, 534, $HWID]
+ - [192, 479, url]
+ - [117, 453, ru_yuck_text]
+
+ ru_insert:
+ - [ 0, 0, insert_bg]
+ - [249, 534, ru_model_text]
+ - [322, 534, $HWID]
+ - [192, 479, url]
+ - [230, 435, ru_insert_text]
+
+ pl_devel:
+ - [ 0, 0, devmode_bg]
+ - [207, 516, pl_devmode_text]
+
+ pl_remove:
+ - [ 0, 0, remove_bg]
+ - [256, 534, pl_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [109, 453, pl_remove_text]
+
+ pl_yuck:
+ - [ 0, 0, yuck_bg]
+ - [256, 534, pl_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [133, 453, pl_yuck_text]
+
+ pl_insert:
+ - [ 0, 0, insert_bg]
+ - [256, 534, pl_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [222, 435, pl_insert_text]
+
+ cs_devel:
+ - [ 0, 0, devmode_bg]
+ - [212, 516, cs_devmode_text]
+
+ cs_remove:
+ - [ 0, 0, remove_bg]
+ - [256, 534, cs_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [136, 453, cs_remove_text]
+
+ cs_yuck:
+ - [ 0, 0, yuck_bg]
+ - [256, 534, cs_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [119, 453, cs_yuck_text]
+
+ cs_insert:
+ - [ 0, 0, insert_bg]
+ - [256, 534, cs_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [202, 435, cs_insert_text]
+
+ sk_devel:
+ - [ 0, 0, devmode_bg]
+ - [202, 516, sk_devmode_text]
+
+ sk_remove:
+ - [ 0, 0, remove_bg]
+ - [256, 534, sk_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [159, 453, sk_remove_text]
+
+ sk_yuck:
+ - [ 0, 0, yuck_bg]
+ - [256, 534, sk_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [138, 453, sk_yuck_text]
+
+ sk_insert:
+ - [ 0, 0, insert_bg]
+ - [256, 534, sk_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [196, 435, sk_insert_text]
+
+ hu_devel:
+ - [ 0, 0, devmode_bg]
+ - [174, 516, hu_devmode_text]
+
+ hu_remove:
+ - [ 0, 0, remove_bg]
+ - [255, 534, hu_model_text]
+ - [316, 534, $HWID]
+ - [192, 479, url]
+ - [111, 453, hu_remove_text]
+
+ hu_yuck:
+ - [ 0, 0, yuck_bg]
+ - [255, 534, hu_model_text]
+ - [316, 534, $HWID]
+ - [192, 479, url]
+ - [108, 453, hu_yuck_text]
+
+ hu_insert:
+ - [ 0, 0, insert_bg]
+ - [255, 534, hu_model_text]
+ - [316, 534, $HWID]
+ - [192, 479, url]
+ - [223, 435, hu_insert_text]
+
+ sl_devel:
+ - [ 0, 0, devmode_bg]
+ - [251, 516, sl_devmode_text]
+
+ sl_remove:
+ - [ 0, 0, remove_bg]
+ - [256, 534, sl_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [203, 453, sl_remove_text]
+
+ sl_yuck:
+ - [ 0, 0, yuck_bg]
+ - [256, 534, sl_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [121, 453, sl_yuck_text]
+
+ sl_insert:
+ - [ 0, 0, insert_bg]
+ - [256, 534, sl_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [263, 435, sl_insert_text]
+
+ sr_devel:
+ - [ 0, 0, devmode_bg]
+ - [180, 516, sr_devmode_text]
+
+ sr_remove:
+ - [ 0, 0, remove_bg]
+ - [262, 534, sr_model_text]
+ - [309, 534, $HWID]
+ - [192, 479, url]
+ - [172, 453, sr_remove_text]
+
+ sr_yuck:
+ - [ 0, 0, yuck_bg]
+ - [262, 534, sr_model_text]
+ - [309, 534, $HWID]
+ - [192, 479, url]
+ - [85, 453, sr_yuck_text]
+
+ sr_insert:
+ - [ 0, 0, insert_bg]
+ - [262, 534, sr_model_text]
+ - [309, 534, $HWID]
+ - [192, 479, url]
+ - [259, 435, sr_insert_text]
+
+ hr_devel:
+ - [ 0, 0, devmode_bg]
+ - [224, 516, hr_devmode_text]
+
+ hr_remove:
+ - [ 0, 0, remove_bg]
+ - [256, 534, hr_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [189, 453, hr_remove_text]
+
+ hr_yuck:
+ - [ 0, 0, yuck_bg]
+ - [256, 534, hr_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [199, 453, hr_yuck_text]
+
+ hr_insert:
+ - [ 0, 0, insert_bg]
+ - [256, 534, hr_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [279, 435, hr_insert_text]
+
+ bg_devel:
+ - [ 0, 0, devmode_bg]
+ - [152, 516, bg_devmode_text]
+
+ bg_remove:
+ - [ 0, 0, remove_bg]
+ - [253, 534, bg_model_text]
+ - [318, 534, $HWID]
+ - [192, 479, url]
+ - [106, 453, bg_remove_text]
+
+ bg_yuck:
+ - [ 0, 0, yuck_bg]
+ - [253, 534, bg_model_text]
+ - [318, 534, $HWID]
+ - [192, 479, url]
+ - [103, 453, bg_yuck_text]
+
+ bg_insert:
+ - [ 0, 0, insert_bg]
+ - [253, 534, bg_model_text]
+ - [318, 534, $HWID]
+ - [192, 479, url]
+ - [221, 435, bg_insert_text]
+
+ ro_devel:
+ - [ 0, 0, devmode_bg]
+ - [182, 516, ro_devmode_text]
+
+ ro_remove:
+ - [ 0, 0, remove_bg]
+ - [256, 534, ro_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [131, 453, ro_remove_text]
+
+ ro_yuck:
+ - [ 0, 0, yuck_bg]
+ - [256, 534, ro_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [191, 453, ro_yuck_text]
+
+ ro_insert:
+ - [ 0, 0, insert_bg]
+ - [256, 534, ro_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [251, 435, ro_insert_text]
+
+ uk_devel:
+ - [ 0, 0, devmode_bg]
+ - [229, 516, uk_devmode_text]
+
+ uk_remove:
+ - [ 0, 0, remove_bg]
+ - [249, 534, uk_model_text]
+ - [322, 534, $HWID]
+ - [192, 479, url]
+ - [171, 453, uk_remove_text]
+
+ uk_yuck:
+ - [ 0, 0, yuck_bg]
+ - [249, 534, uk_model_text]
+ - [322, 534, $HWID]
+ - [192, 479, url]
+ - [163, 453, uk_yuck_text]
+
+ uk_insert:
+ - [ 0, 0, insert_bg]
+ - [249, 534, uk_model_text]
+ - [322, 534, $HWID]
+ - [192, 479, url]
+ - [255, 435, uk_insert_text]
+
+ tr_devel:
+ - [ 0, 0, devmode_bg]
+ - [211, 516, tr_devmode_text]
+
+ tr_remove:
+ - [ 0, 0, remove_bg]
+ - [256, 534, tr_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [133, 453, tr_remove_text]
+
+ tr_yuck:
+ - [ 0, 0, yuck_bg]
+ - [256, 534, tr_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [121, 453, tr_yuck_text]
+
+ tr_insert:
+ - [ 0, 0, insert_bg]
+ - [256, 534, tr_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [266, 435, tr_insert_text]
+
+ iw_devel:
+ - [ 0, 0, devmode_bg]
+ - [178, 512, iw_devmode_text]
+
+ iw_remove:
+ - [ 0, 0, remove_bg]
+ - [250, 539, iw_model_text]
+ - [321, 539, $HWID]
+ - [192, 484, url]
+ - [100, 459, iw_remove_text]
+
+ iw_yuck:
+ - [ 0, 0, yuck_bg]
+ - [250, 539, iw_model_text]
+ - [321, 539, $HWID]
+ - [192, 484, url]
+ - [92, 435, iw_yuck_text]
+
+ iw_insert:
+ - [ 0, 0, insert_bg]
+ - [250, 539, iw_model_text]
+ - [321, 539, $HWID]
+ - [192, 484, url]
+ - [256, 436, iw_insert_text]
+
+ ar_devel:
+ - [ 0, 0, devmode_bg]
+ - [171, 510, ar_devmode_text]
+
+ ar_remove:
+ - [ 0, 0, remove_bg]
+ - [236, 537, ar_model_text]
+ - [334, 537, $HWID]
+ - [192, 482, url]
+ - [121, 453, ar_remove_text]
+
+ ar_yuck:
+ - [ 0, 0, yuck_bg]
+ - [236, 537, ar_model_text]
+ - [334, 537, $HWID]
+ - [192, 482, url]
+ - [80, 429, ar_yuck_text]
+
+ ar_insert:
+ - [ 0, 0, insert_bg]
+ - [236, 537, ar_model_text]
+ - [334, 537, $HWID]
+ - [192, 482, url]
+ - [178, 430, ar_insert_text]
+
+ fa_devel:
+ - [ 0, 0, devmode_bg]
+ - [120, 506, fa_devmode_text]
+
+ fa_remove:
+ - [ 0, 0, remove_bg]
+ - [257, 539, fa_model_text]
+ - [314, 539, $HWID]
+ - [192, 484, url]
+ - [79, 432, fa_remove_text]
+
+ fa_yuck:
+ - [ 0, 0, yuck_bg]
+ - [257, 539, fa_model_text]
+ - [314, 539, $HWID]
+ - [192, 484, url]
+ - [88, 434, fa_yuck_text]
+
+ fa_insert:
+ - [ 0, 0, insert_bg]
+ - [257, 539, fa_model_text]
+ - [314, 539, $HWID]
+ - [192, 484, url]
+ - [119, 434, fa_insert_text]
+
+ hi_devel:
+ - [ 0, 0, devmode_bg]
+ - [213, 504, hi_devmode_text]
+
+ hi_remove:
+ - [ 0, 0, remove_bg]
+ - [252, 535, hi_model_text]
+ - [319, 535, $HWID]
+ - [192, 480, url]
+ - [75, 448, hi_remove_text]
+
+ hi_yuck:
+ - [ 0, 0, yuck_bg]
+ - [252, 535, hi_model_text]
+ - [319, 535, $HWID]
+ - [192, 480, url]
+ - [83, 448, hi_yuck_text]
+
+ hi_insert:
+ - [ 0, 0, insert_bg]
+ - [252, 535, hi_model_text]
+ - [319, 535, $HWID]
+ - [192, 480, url]
+ - [205, 424, hi_insert_text]
+
+ th_devel:
+ - [ 0, 0, devmode_bg]
+ - [240, 504, th_devmode_text]
+
+ th_remove:
+ - [ 0, 0, remove_bg]
+ - [261, 528, th_model_text]
+ - [310, 528, $HWID]
+ - [192, 473, url]
+ - [92, 435, th_remove_text]
+
+ th_yuck:
+ - [ 0, 0, yuck_bg]
+ - [261, 528, th_model_text]
+ - [310, 528, $HWID]
+ - [192, 473, url]
+ - [100, 435, th_yuck_text]
+
+ th_insert:
+ - [ 0, 0, insert_bg]
+ - [261, 528, th_model_text]
+ - [310, 528, $HWID]
+ - [192, 473, url]
+ - [239, 416, th_insert_text]
+
+ vi_devel:
+ - [ 0, 0, devmode_bg]
+ - [164, 508, vi_devmode_text]
+
+ vi_remove:
+ - [ 0, 0, remove_bg]
+ - [242, 541, vi_model_text]
+ - [328, 541, $HWID]
+ - [192, 486, url]
+ - [71, 434, vi_remove_text]
+
+ vi_yuck:
+ - [ 0, 0, yuck_bg]
+ - [242, 541, vi_model_text]
+ - [328, 541, $HWID]
+ - [192, 486, url]
+ - [111, 434, vi_yuck_text]
+
+ vi_insert:
+ - [ 0, 0, insert_bg]
+ - [242, 541, vi_model_text]
+ - [328, 541, $HWID]
+ - [192, 486, url]
+ - [125, 434, vi_insert_text]
+
+ id_devel:
+ - [ 0, 0, devmode_bg]
+ - [241, 516, id_devmode_text]
+
+ id_remove:
+ - [ 0, 0, remove_bg]
+ - [256, 534, id_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [148, 453, id_remove_text]
+
+ id_yuck:
+ - [ 0, 0, yuck_bg]
+ - [256, 534, id_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [139, 453, id_yuck_text]
+
+ id_insert:
+ - [ 0, 0, insert_bg]
+ - [256, 534, id_model_text]
+ - [314, 534, $HWID]
+ - [192, 479, url]
+ - [271, 435, id_insert_text]
+
+ fil_devel:
+ - [ 0, 0, devmode_bg]
+ - [227, 516, fil_devmode_text]
+
+ fil_remove:
+ - [ 0, 0, remove_bg]
+ - [252, 534, fil_model_text]
+ - [319, 534, $HWID]
+ - [192, 479, url]
+ - [138, 453, fil_remove_text]
+
+ fil_yuck:
+ - [ 0, 0, yuck_bg]
+ - [252, 534, fil_model_text]
+ - [319, 534, $HWID]
+ - [192, 479, url]
+ - [122, 453, fil_yuck_text]
+
+ fil_insert:
+ - [ 0, 0, insert_bg]
+ - [252, 534, fil_model_text]
+ - [319, 534, $HWID]
+ - [192, 479, url]
+ - [229, 435, fil_insert_text]
+
+ zh_CN_devel:
+ - [ 0, 0, devmode_bg]
+ - [245, 508, zh_CN_devmode_text]
+
+ zh_CN_remove:
+ - [ 0, 0, remove_bg]
+ - [255, 534, zh_CN_model_text]
+ - [316, 534, $HWID]
+ - [192, 479, url]
+ - [144, 451, zh_CN_remove_text]
+
+ zh_CN_yuck:
+ - [ 0, 0, yuck_bg]
+ - [255, 534, zh_CN_model_text]
+ - [316, 534, $HWID]
+ - [192, 479, url]
+ - [97, 451, zh_CN_yuck_text]
+
+ zh_CN_insert:
+ - [ 0, 0, insert_bg]
+ - [255, 534, zh_CN_model_text]
+ - [316, 534, $HWID]
+ - [192, 479, url]
+ - [223, 427, zh_CN_insert_text]
+
+ zh_TW_devel:
+ - [ 0, 0, devmode_bg]
+ - [205, 508, zh_TW_devmode_text]
+
+ zh_TW_remove:
+ - [ 0, 0, remove_bg]
+ - [255, 533, zh_TW_model_text]
+ - [316, 533, $HWID]
+ - [192, 478, url]
+ - [159, 450, zh_TW_remove_text]
+
+ zh_TW_yuck:
+ - [ 0, 0, yuck_bg]
+ - [255, 533, zh_TW_model_text]
+ - [316, 533, $HWID]
+ - [192, 478, url]
+ - [103, 450, zh_TW_yuck_text]
+
+ zh_TW_insert:
+ - [ 0, 0, insert_bg]
+ - [255, 533, zh_TW_model_text]
+ - [316, 533, $HWID]
+ - [192, 478, url]
+ - [216, 426, zh_TW_insert_text]
+
+ ko_devel:
+ - [ 0, 0, devmode_bg]
+ - [182, 510, ko_devmode_text]
+
+ ko_remove:
+ - [ 0, 0, remove_bg]
+ - [254, 535, ko_model_text]
+ - [317, 535, $HWID]
+ - [192, 480, url]
+ - [106, 454, ko_remove_text]
+
+ ko_yuck:
+ - [ 0, 0, yuck_bg]
+ - [254, 535, ko_model_text]
+ - [317, 535, $HWID]
+ - [192, 480, url]
+ - [75, 430, ko_yuck_text]
+
+ ko_insert:
+ - [ 0, 0, insert_bg]
+ - [254, 535, ko_model_text]
+ - [317, 535, $HWID]
+ - [192, 480, url]
+ - [217, 430, ko_insert_text]
+
+ ja_devel:
+ - [ 0, 0, devmode_bg]
+ - [113, 507, ja_devmode_text]
+
+ ja_remove:
+ - [ 0, 0, remove_bg]
+ - [243, 536, ja_model_text]
+ - [327, 536, $HWID]
+ - [192, 481, url]
+ - [75, 429, ja_remove_text]
+
+ ja_yuck:
+ - [ 0, 0, yuck_bg]
+ - [243, 536, ja_model_text]
+ - [327, 536, $HWID]
+ - [192, 481, url]
+ - [73, 429, ja_yuck_text]
+
+ ja_insert:
+ - [ 0, 0, insert_bg]
+ - [243, 536, ja_model_text]
+ - [327, 536, $HWID]
+ - [192, 481, url]
+ - [170, 430, ja_insert_text]
+
+localizations:
+
+ # This determines the order in which the localizations appear. The first
+ # one is the default.
+
+ - [ en_devel, en_remove, en_yuck, en_insert ]
+ - [ es_419_devel, es_419_remove, es_419_yuck, es_419_insert ]
+ - [ pt_BR_devel, pt_BR_remove, pt_BR_yuck, pt_BR_insert ]
+ - [ en_GB_devel, en_GB_remove, en_GB_yuck, en_GB_insert ]
+ - [ fr_devel, fr_remove, fr_yuck, fr_insert ]
+ - [ es_devel, es_remove, es_yuck, es_insert ]
+ - [ pt_PT_devel, pt_PT_remove, pt_PT_yuck, pt_PT_insert ]
+ - [ ca_devel, ca_remove, ca_yuck, ca_insert ]
+ - [ it_devel, it_remove, it_yuck, it_insert ]
+ - [ de_devel, de_remove, de_yuck, de_insert ]
+ - [ el_devel, el_remove, el_yuck, el_insert ]
+ - [ nl_devel, nl_remove, nl_yuck, nl_insert ]
+ - [ da_devel, da_remove, da_yuck, da_insert ]
+ - [ no_devel, no_remove, no_yuck, no_insert ]
+ - [ sv_devel, sv_remove, sv_yuck, sv_insert ]
+ - [ fi_devel, fi_remove, fi_yuck, fi_insert ]
+ - [ et_devel, et_remove, et_yuck, et_insert ]
+ - [ lv_devel, lv_remove, lv_yuck, lv_insert ]
+ - [ lt_devel, lt_remove, lt_yuck, lt_insert ]
+ - [ ru_devel, ru_remove, ru_yuck, ru_insert ]
+ - [ pl_devel, pl_remove, pl_yuck, pl_insert ]
+ - [ cs_devel, cs_remove, cs_yuck, cs_insert ]
+ - [ sk_devel, sk_remove, sk_yuck, sk_insert ]
+ - [ hu_devel, hu_remove, hu_yuck, hu_insert ]
+ - [ sl_devel, sl_remove, sl_yuck, sl_insert ]
+ - [ sr_devel, sr_remove, sr_yuck, sr_insert ]
+ - [ hr_devel, hr_remove, hr_yuck, hr_insert ]
+ - [ bg_devel, bg_remove, bg_yuck, bg_insert ]
+ - [ ro_devel, ro_remove, ro_yuck, ro_insert ]
+ - [ uk_devel, uk_remove, uk_yuck, uk_insert ]
+ - [ tr_devel, tr_remove, tr_yuck, tr_insert ]
+ - [ iw_devel, iw_remove, iw_yuck, iw_insert ]
+ - [ ar_devel, ar_remove, ar_yuck, ar_insert ]
+ - [ fa_devel, fa_remove, fa_yuck, fa_insert ]
+ - [ hi_devel, hi_remove, hi_yuck, hi_insert ]
+ - [ th_devel, th_remove, th_yuck, th_insert ]
+ - [ vi_devel, vi_remove, vi_yuck, vi_insert ]
+ - [ id_devel, id_remove, id_yuck, id_insert ]
+ - [ fil_devel, fil_remove, fil_yuck, fil_insert ]
+ - [ zh_CN_devel, zh_CN_remove, zh_CN_yuck, zh_CN_insert ]
+ - [ zh_TW_devel, zh_TW_remove, zh_TW_yuck, zh_TW_insert ]
+ - [ ko_devel, ko_remove, ko_yuck, ko_insert ]
+ - [ ja_devel, ja_remove, ja_yuck, ja_insert ]
diff --git a/scripts/newbitmaps/images/1366x768/hwid_unknown.bmp b/scripts/newbitmaps/images/1366x768/hwid_unknown.bmp
deleted file mode 100644
index af0d19d5..00000000
--- a/scripts/newbitmaps/images/1366x768/hwid_unknown.bmp
+++ /dev/null
Binary files differ
diff --git a/scripts/newbitmaps/images/make_yaml_from_hwids b/scripts/newbitmaps/images/make_yaml_from_hwids
index 66577d4c..96a83049 100755
--- a/scripts/newbitmaps/images/make_yaml_from_hwids
+++ b/scripts/newbitmaps/images/make_yaml_from_hwids
@@ -6,6 +6,15 @@
# Generate a new yaml file for each specified hwid_*.bmp file.
#
+if [ "${1:-}" = "--force" ]; then
+ shift;
+else
+ echo "This script is deprecated."
+ echo "The latest BIOSes can render HWIDs directly from ASCII."
+ echo "Use --force to proceed anyway."
+ exit 1
+fi
+
# I'm sorting the locales in more-or-less geographical order. Right should move
# east, left should move west. Of course we'll start in the US. :-)
locales="en es_419 pt_BR en_GB fr es pt_PT ca it de el nl da no sv fi et lv lt ru pl cs sk hu sl sr hr bg ro uk tr iw ar fa hi th vi id fil zh_CN zh_TW ko ja"
diff --git a/scripts/newbitmaps/lib/bmpblock.py b/scripts/newbitmaps/lib/bmpblock.py
index c25f93e9..4d588d76 100755
--- a/scripts/newbitmaps/lib/bmpblock.py
+++ b/scripts/newbitmaps/lib/bmpblock.py
@@ -14,10 +14,11 @@ class BmpBlock(object):
It has a few special attributes to specify which part we're focusing on.
"""
- def __init__(self, filename=None):
+ 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)
@@ -45,9 +46,9 @@ class BmpBlock(object):
"""Raise an error if the specified dict is not a valid BmpBlock structure"""
assert isinstance(thing, dict)
- assert thing["bmpblock"] == 1.0
+ assert thing["bmpblock"] == 1.0 or thing["bmpblock"] == 1.1
- seen_images = {}
+ seen_images = {"$HWID":1, "$HWID.rtol":2}
seen_screens = {}
images = thing["images"]
@@ -56,6 +57,10 @@ class BmpBlock(object):
# 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)
diff --git a/scripts/newbitmaps/lib/current_hwid.bmp b/scripts/newbitmaps/lib/current_hwid.bmp
new file mode 100644
index 00000000..411242d8
--- /dev/null
+++ b/scripts/newbitmaps/lib/current_hwid.bmp
Binary files differ
diff --git a/scripts/newbitmaps/make_bmp_from_components.py b/scripts/newbitmaps/make_bmp_from_components.py
index dffe1eda..15b818e9 100755
--- a/scripts/newbitmaps/make_bmp_from_components.py
+++ b/scripts/newbitmaps/make_bmp_from_components.py
@@ -13,10 +13,17 @@ import re
import tempfile
-if len(sys.argv) < 2:
- print "usage: %s autotest/../hardware_Components/" % sys.argv[0]
+if '--force' in sys.argv:
+ sys.argv.remove('--force')
+else:
+ print "This script is deprecated."
+ print "The latest BIOSes can render HWIDs directly from ASCII."
+ print "Use --force to proceed anyway."
sys.exit(1)
+if len(sys.argv) < 2:
+ print "usage: %s --force autotest/../hardware_Components/" % sys.argv[0]
+ sys.exit(1)
def MakeBmp(hwid, geom, bmp, directory):
""" Create the bitmap for this file. """
diff --git a/utility/bmpblk_util.c b/utility/bmpblk_util.c
index 5c94d8e9..2dd63e8c 100644
--- a/utility/bmpblk_util.c
+++ b/utility/bmpblk_util.c
@@ -282,74 +282,89 @@ int dump_bmpblock(const char *infile, int show_as_yaml,
fprintf(yfp, "images:\n");
for(i=0; i<hdr->number_of_imageinfos; i++) {
img = (ImageInfo *)(ptr + offset);
- sprintf(image_name, "img_%08x.bmp", offset);
- fprintf(yfp, " img_%08x: %s # %dx%d %d/%d\n", offset, image_name,
- img->width, img->height,
- img->compressed_size, img->original_size);
- if (todir) {
- sprintf(full_path_name, "%s/%s", todir, image_name);
- bfd = open(full_path_name,
- O_WRONLY | O_CREAT | O_TRUNC | (overwrite ? 0 : O_EXCL),
- 0666);
- if (bfd < 0) {
- fprintf(stderr, "Unable to open %s: %s\n", full_path_name,
- strerror(errno));
- fclose(yfp);
- discard_file(ptr, length);
- return 1;
+ if (img->compressed_size) {
+ sprintf(image_name, "img_%08x.bmp", offset);
+ if (img->tag == TAG_HWID) {
+ fprintf(yfp, " %s: %s # %dx%d %d/%d tag=%d\n",
+ RENDER_HWID, image_name,
+ img->width, img->height,
+ img->compressed_size, img->original_size, img->tag);
+ } else if (img->tag == TAG_HWID_RTOL) {
+ fprintf(yfp, " %s: %s # %dx%d %d/%d tag=%d\n",
+ RENDER_HWID_RTOL, image_name,
+ img->width, img->height,
+ img->compressed_size, img->original_size, img->tag);
+ } else {
+ fprintf(yfp, " img_%08x: %s # %dx%d %d/%d tag=%d\n",
+ offset, image_name,
+ img->width, img->height,
+ img->compressed_size, img->original_size, img->tag);
}
- bfp = fdopen(bfd, "wb");
- if (!bfp) {
- fprintf(stderr, "Unable to fdopen %s: %s\n", full_path_name,
- strerror(errno));
- close(bfd);
- fclose(yfp);
- discard_file(ptr, length);
- return 1;
- }
- switch(img->compression) {
- case COMPRESS_NONE:
- data_ptr = ptr + offset + sizeof(ImageInfo);
- free_data = 0;
- break;
- case COMPRESS_EFIv1:
- data_ptr = do_efi_decompress(img);
- if (!data_ptr) {
+ if (todir) {
+ sprintf(full_path_name, "%s/%s", todir, image_name);
+ bfd = open(full_path_name,
+ O_WRONLY | O_CREAT | O_TRUNC | (overwrite ? 0 : O_EXCL),
+ 0666);
+ if (bfd < 0) {
+ fprintf(stderr, "Unable to open %s: %s\n", full_path_name,
+ strerror(errno));
+ fclose(yfp);
+ discard_file(ptr, length);
+ return 1;
+ }
+ bfp = fdopen(bfd, "wb");
+ if (!bfp) {
+ fprintf(stderr, "Unable to fdopen %s: %s\n", full_path_name,
+ strerror(errno));
+ close(bfd);
+ fclose(yfp);
+ discard_file(ptr, length);
+ return 1;
+ }
+ switch(img->compression) {
+ case COMPRESS_NONE:
+ data_ptr = ptr + offset + sizeof(ImageInfo);
+ free_data = 0;
+ break;
+ case COMPRESS_EFIv1:
+ data_ptr = do_efi_decompress(img);
+ if (!data_ptr) {
+ fclose(bfp);
+ fclose(yfp);
+ discard_file(ptr, length);
+ return 1;
+ }
+ free_data = 1;
+ break;
+ case COMPRESS_LZMA1:
+ data_ptr = do_lzma_decompress(img);
+ if (!data_ptr) {
+ fclose(bfp);
+ fclose(yfp);
+ discard_file(ptr, length);
+ return 1;
+ }
+ free_data = 1;
+ break;
+ default:
+ fprintf(stderr, "Unsupported compression method encountered.\n");
fclose(bfp);
fclose(yfp);
discard_file(ptr, length);
return 1;
}
- free_data = 1;
- break;
- case COMPRESS_LZMA1:
- data_ptr = do_lzma_decompress(img);
- if (!data_ptr) {
+ if (1 != fwrite(data_ptr, img->original_size, 1, bfp)) {
+ fprintf(stderr, "Unable to write %s: %s\n", full_path_name,
+ strerror(errno));
fclose(bfp);
fclose(yfp);
discard_file(ptr, length);
return 1;
}
- free_data = 1;
- break;
- default:
- fprintf(stderr, "Unsupported compression method encountered.\n");
- fclose(bfp);
- fclose(yfp);
- discard_file(ptr, length);
- return 1;
- }
- if (1 != fwrite(data_ptr, img->original_size, 1, bfp)) {
- fprintf(stderr, "Unable to write %s: %s\n", full_path_name,
- strerror(errno));
fclose(bfp);
- fclose(yfp);
- discard_file(ptr, length);
- return 1;
+ if (free_data)
+ free(data_ptr);
}
- fclose(bfp);
- if (free_data)
- free(data_ptr);
}
offset += sizeof(ImageInfo);
offset += img->compressed_size;
@@ -370,9 +385,21 @@ int dump_bmpblock(const char *infile, int show_as_yaml,
scr = (ScreenLayout *)(ptr + offset);
for(i=0; i<MAX_IMAGE_IN_LAYOUT; i++) {
if (scr->images[i].image_info_offset) {
- fprintf(yfp, " - [%d, %d, img_%08x]\n",
- scr->images[i].x, scr->images[i].y,
- scr->images[i].image_info_offset);
+ ImageInfo *iptr =
+ (ImageInfo *)(ptr + scr->images[i].image_info_offset);
+ if (iptr->tag == TAG_HWID) {
+ fprintf(yfp, " - [%d, %d, %s]\n",
+ scr->images[i].x, scr->images[i].y,
+ RENDER_HWID);
+ } else if (iptr->tag == TAG_HWID_RTOL) {
+ fprintf(yfp, " - [%d, %d, %s]\n",
+ scr->images[i].x, scr->images[i].y,
+ RENDER_HWID_RTOL);
+ } else {
+ fprintf(yfp, " - [%d, %d, img_%08x]\n",
+ scr->images[i].x, scr->images[i].y,
+ scr->images[i].image_info_offset);
+ }
}
}
}
diff --git a/utility/bmpblk_utility.cc b/utility/bmpblk_utility.cc
index 078a5ceb..3cc31ad2 100644
--- a/utility/bmpblk_utility.cc
+++ b/utility/bmpblk_utility.cc
@@ -59,82 +59,118 @@ static void error(const char *format, ...) {
namespace vboot_reference {
-BmpBlockUtil::BmpBlockUtil() {
- initialize();
-}
+ BmpBlockUtil::BmpBlockUtil(bool debug) {
+ major_version_ = BMPBLOCK_MAJOR_VERSION;
+ minor_version_ = BMPBLOCK_MINOR_VERSION;
+ config_.config_filename.clear();
+ memset(&config_.header, '\0', BMPBLOCK_SIGNATURE_SIZE);
+ config_.images_map.clear();
+ config_.screens_map.clear();
+ config_.localizations.clear();
+ bmpblock_.clear();
+ set_compression_ = false;
+ compression_ = COMPRESS_NONE;
+ debug_ = debug;
+ }
-BmpBlockUtil::~BmpBlockUtil() {
-}
+ BmpBlockUtil::~BmpBlockUtil() {
+ }
-void BmpBlockUtil::initialize() {
- config_.config_filename.clear();
- memset(&config_.header, '\0', BMPBLOCK_SIGNATURE_SIZE);
- config_.images_map.clear();
- config_.screens_map.clear();
- config_.localizations.clear();
- bmpblock_.clear();
- set_compression_ = false;
- compression_ = COMPRESS_NONE;
-}
+ void BmpBlockUtil::force_compression(uint32_t compression) {
+ compression_ = compression;
+ set_compression_ = true;
+ }
-void BmpBlockUtil::force_compression(uint32_t compression) {
- compression_ = compression;
- set_compression_ = true;
-}
+ void BmpBlockUtil::load_from_config(const char *filename) {
+ load_yaml_config(filename);
+ fill_bmpblock_header();
+ load_all_image_files();
+ }
-void BmpBlockUtil::load_from_config(const char *filename) {
- load_yaml_config(filename);
- fill_bmpblock_header();
- load_all_image_files();
- fill_all_image_infos();
-}
+ void BmpBlockUtil::load_yaml_config(const char *filename) {
+ yaml_parser_t parser;
-void BmpBlockUtil::load_yaml_config(const char *filename) {
- yaml_parser_t parser;
+ config_.config_filename = filename;
+ config_.images_map.clear();
+ config_.screens_map.clear();
+ config_.localizations.clear();
- config_.config_filename = filename;
- config_.images_map.clear();
- config_.screens_map.clear();
- config_.localizations.clear();
+ FILE *fp = fopen(filename, "rb");
+ if (!fp) {
+ perror(filename);
+ exit(errno);
+ }
- FILE *fp = fopen(filename, "rb");
- if (!fp) {
- perror(filename);
- exit(errno);
- }
+ yaml_parser_initialize(&parser);
+ yaml_parser_set_input_file(&parser, fp);
+ parse_config(&parser);
+ yaml_parser_delete(&parser);
+ fclose(fp);
- yaml_parser_initialize(&parser);
- yaml_parser_set_input_file(&parser, fp);
- parse_config(&parser);
- yaml_parser_delete(&parser);
- fclose(fp);
-}
-void BmpBlockUtil::expect_event(yaml_parser_t *parser,
- const yaml_event_type_e type) {
- yaml_event_t event;
- yaml_parser_parse(parser, &event);
- if (event.type != type) {
- error("Syntax error.\n");
- }
- yaml_event_delete(&event);
-}
+ // HEY: Check the yaml file for self-consistency now. Warn on any problems.
+ // All images should be used somewhere in the screens.
+ // All images referenced in the screens should be defined.
+ // All screens should be used somewhere in the localizations.
+ // All screens referenced in the localizations should be defined.
-void BmpBlockUtil::parse_config(yaml_parser_t *parser) {
- expect_event(parser, YAML_STREAM_START_EVENT);
- expect_event(parser, YAML_DOCUMENT_START_EVENT);
- parse_first_layer(parser);
- expect_event(parser, YAML_DOCUMENT_END_EVENT);
- expect_event(parser, YAML_STREAM_END_EVENT);
-}
+ if (debug_) {
+ printf("%ld image_names\n", config_.image_names.size());
+ for (unsigned int i = 0; i < config_.image_names.size(); ++i) {
+ printf(" %d: \"%s\"\n", i, config_.image_names[i].c_str());
+ }
+ printf("%ld images_map\n", config_.images_map.size());
+ for (StrImageConfigMap::iterator it = config_.images_map.begin();
+ it != config_.images_map.end();
+ ++it) {
+ printf(" \"%s\": filename=\"%s\" offset=0x%x tag=%d\n",
+ it->first.c_str(),
+ it->second.filename.c_str(),
+ it->second.offset,
+ it->second.data.tag);
+ }
+ printf("%ld screens_map\n", config_.screens_map.size());
+ for (StrScreenConfigMap::iterator it = config_.screens_map.begin();
+ it != config_.screens_map.end();
+ ++it) {
+ printf(" \"%s\":\n", it->first.c_str());
+ for (int k=0; k<MAX_IMAGE_IN_LAYOUT; k++) {
+ printf(" %d: \"%s\" (%d,%d) ofs=0x%x\n",
+ k,
+ it->second.image_names[k].c_str(),
+ it->second.data.images[k].x,
+ it->second.data.images[k].y,
+ it->second.data.images[k].image_info_offset);
+ }
+ }
+ }
+ }
-void BmpBlockUtil::parse_first_layer(yaml_parser_t *parser) {
- yaml_event_t event;
- string keyword;
- expect_event(parser, YAML_MAPPING_START_EVENT);
- for (;;) {
+ void BmpBlockUtil::expect_event(yaml_parser_t *parser,
+ const yaml_event_type_e type) {
+ yaml_event_t event;
yaml_parser_parse(parser, &event);
- switch (event.type) {
+ if (event.type != type) {
+ error("Syntax error.\n");
+ }
+ yaml_event_delete(&event);
+ }
+
+ void BmpBlockUtil::parse_config(yaml_parser_t *parser) {
+ expect_event(parser, YAML_STREAM_START_EVENT);
+ expect_event(parser, YAML_DOCUMENT_START_EVENT);
+ parse_first_layer(parser);
+ expect_event(parser, YAML_DOCUMENT_END_EVENT);
+ expect_event(parser, YAML_STREAM_END_EVENT);
+ }
+
+ void BmpBlockUtil::parse_first_layer(yaml_parser_t *parser) {
+ yaml_event_t event;
+ string keyword;
+ expect_event(parser, YAML_MAPPING_START_EVENT);
+ for (;;) {
+ yaml_parser_parse(parser, &event);
+ switch (event.type) {
case YAML_SCALAR_EVENT:
keyword = (char*)event.data.scalar.value;
if (keyword == "bmpblock") {
@@ -154,53 +190,55 @@ void BmpBlockUtil::parse_first_layer(yaml_parser_t *parser) {
return;
default:
error("Syntax error in parsing config file.\n");
+ }
+ yaml_event_delete(&event);
}
- yaml_event_delete(&event);
}
-}
-void BmpBlockUtil::parse_bmpblock(yaml_parser_t *parser) {
- yaml_event_t event;
- yaml_parser_parse(parser, &event);
- if (event.type != YAML_SCALAR_EVENT) {
- error("Syntax error in parsing bmpblock.\n");
- }
- char wantversion[20];
- sprintf(wantversion, "%d.%d",
- BMPBLOCK_MAJOR_VERSION,
- BMPBLOCK_MINOR_VERSION);
- string gotversion = (char*)event.data.scalar.value;
- if (gotversion != wantversion) {
- error("Invalid version specified in config file\n");
+ void BmpBlockUtil::parse_bmpblock(yaml_parser_t *parser) {
+ yaml_event_t event;
+ yaml_parser_parse(parser, &event);
+ if (event.type != YAML_SCALAR_EVENT) {
+ error("Syntax error in parsing bmpblock.\n");
+ }
+ string gotversion = (char*)event.data.scalar.value;
+ if (gotversion == "1.1") {
+ render_hwid_ = true;
+ } else if (gotversion == "1.0") {
+ minor_version_ = 0;
+ render_hwid_ = false;
+ } else {
+ error("Unsupported version specified in config file (%s)\n",
+ gotversion.c_str());
+ }
+ yaml_event_delete(&event);
}
- yaml_event_delete(&event);
-}
-void BmpBlockUtil::parse_compression(yaml_parser_t *parser) {
- yaml_event_t event;
- yaml_parser_parse(parser, &event);
- if (event.type != YAML_SCALAR_EVENT) {
- error("Syntax error in parsing bmpblock.\n");
- }
- char *comp_str = (char *)event.data.scalar.value;
- char *e = 0;
- uint32_t comp = (uint32_t)strtoul(comp_str, &e, 0);
- if (!*comp_str || (e && *e) || comp >= MAX_COMPRESS) {
- error("Invalid compression specified in config file\n");
- }
- if (!set_compression_) {
- compression_ = comp;
+ void BmpBlockUtil::parse_compression(yaml_parser_t *parser) {
+ yaml_event_t event;
+ yaml_parser_parse(parser, &event);
+ if (event.type != YAML_SCALAR_EVENT) {
+ error("Syntax error in parsing bmpblock.\n");
+ }
+ char *comp_str = (char *)event.data.scalar.value;
+ char *e = 0;
+ uint32_t comp = (uint32_t)strtoul(comp_str, &e, 0);
+ if (!*comp_str || (e && *e) || comp >= MAX_COMPRESS) {
+ error("Invalid compression specified in config file (%d)\n", comp);
+ }
+ if (!set_compression_) {
+ compression_ = comp;
+ }
+ yaml_event_delete(&event);
}
- yaml_event_delete(&event);
-}
-void BmpBlockUtil::parse_images(yaml_parser_t *parser) {
- yaml_event_t event;
- string image_name, image_filename;
- expect_event(parser, YAML_MAPPING_START_EVENT);
- for (;;) {
- yaml_parser_parse(parser, &event);
- switch (event.type) {
+ void BmpBlockUtil::parse_images(yaml_parser_t *parser) {
+ yaml_event_t event;
+ string image_name, image_filename;
+ expect_event(parser, YAML_MAPPING_START_EVENT);
+ for (;;) {
+ yaml_parser_parse(parser, &event);
+ switch (event.type) {
case YAML_SCALAR_EVENT:
image_name = (char*)event.data.scalar.value;
yaml_event_delete(&event);
@@ -218,35 +256,48 @@ void BmpBlockUtil::parse_images(yaml_parser_t *parser) {
return;
default:
error("Syntax error in parsing images.\n");
+ }
+ yaml_event_delete(&event);
}
- yaml_event_delete(&event);
}
-}
-void BmpBlockUtil::parse_layout(yaml_parser_t *parser, ScreenConfig &screen) {
- yaml_event_t event;
- string screen_name;
- int depth = 0, index1 = 0, index2 = 0;
- expect_event(parser, YAML_SEQUENCE_START_EVENT);
- for (;;) {
- yaml_parser_parse(parser, &event);
- switch (event.type) {
+ void BmpBlockUtil::parse_layout(yaml_parser_t *parser, ScreenConfig &screen) {
+ yaml_event_t event;
+ int depth = 0, index1 = 0, index2 = 0;
+ expect_event(parser, YAML_SEQUENCE_START_EVENT);
+ for (;;) {
+ yaml_parser_parse(parser, &event);
+ switch (event.type) {
case YAML_SEQUENCE_START_EVENT:
depth++;
break;
case YAML_SCALAR_EVENT:
switch (index2) {
- case 0:
- screen.data.images[index1].x = atoi((char*)event.data.scalar.value);
- break;
- case 1:
- screen.data.images[index1].y = atoi((char*)event.data.scalar.value);
- break;
- case 2:
- screen.image_names[index1] = (char*)event.data.scalar.value;
- break;
- default:
- error("Syntax error in parsing layout.\n");
+ case 0:
+ screen.data.images[index1].x = atoi((char*)event.data.scalar.value);
+ break;
+ case 1:
+ screen.data.images[index1].y = atoi((char*)event.data.scalar.value);
+ break;
+ case 2:
+ screen.image_names[index1] = (char*)event.data.scalar.value;
+ // Detect the special case where we're rendering the HWID string
+ // instead of displaying a bitmap. The image name shouldn't
+ // exist in the list of images, but we will still need an
+ // ImageInfo struct to remember where to draw the text.
+ // Note that if the image name DOES exist, we still will won't
+ // display it (yet). Future versions may use that image to hold the
+ // font glpyhs, which is why we pass it around now.
+ if (render_hwid_) {
+ if (screen.image_names[index1] == RENDER_HWID) {
+ config_.images_map[RENDER_HWID].data.tag = TAG_HWID;
+ } else if (screen.image_names[index1] == RENDER_HWID_RTOL) {
+ config_.images_map[RENDER_HWID_RTOL].data.tag = TAG_HWID_RTOL;
+ }
+ }
+ break;
+ default:
+ error("Syntax error in parsing layout\n");
}
index2++;
break;
@@ -262,18 +313,18 @@ void BmpBlockUtil::parse_layout(yaml_parser_t *parser, ScreenConfig &screen) {
break;
default:
error("Syntax error in paring layout.\n");
+ }
+ yaml_event_delete(&event);
}
- yaml_event_delete(&event);
}
-}
-void BmpBlockUtil::parse_screens(yaml_parser_t *parser) {
- yaml_event_t event;
- string screen_name;
- expect_event(parser, YAML_MAPPING_START_EVENT);
- for (;;) {
- yaml_parser_parse(parser, &event);
- switch (event.type) {
+ void BmpBlockUtil::parse_screens(yaml_parser_t *parser) {
+ yaml_event_t event;
+ string screen_name;
+ expect_event(parser, YAML_MAPPING_START_EVENT);
+ for (;;) {
+ yaml_parser_parse(parser, &event);
+ switch (event.type) {
case YAML_SCALAR_EVENT:
screen_name = (char*)event.data.scalar.value;
config_.screens_map[screen_name] = ScreenConfig();
@@ -284,18 +335,18 @@ void BmpBlockUtil::parse_screens(yaml_parser_t *parser) {
return;
default:
error("Syntax error in parsing screens.\n");
+ }
+ yaml_event_delete(&event);
}
- yaml_event_delete(&event);
}
-}
-void BmpBlockUtil::parse_localizations(yaml_parser_t *parser) {
- yaml_event_t event;
- int depth = 0, index = 0;
- expect_event(parser, YAML_SEQUENCE_START_EVENT);
- for (;;) {
- yaml_parser_parse(parser, &event);
- switch (event.type) {
+ void BmpBlockUtil::parse_localizations(yaml_parser_t *parser) {
+ yaml_event_t event;
+ int depth = 0, index = 0;
+ expect_event(parser, YAML_SEQUENCE_START_EVENT);
+ for (;;) {
+ yaml_parser_parse(parser, &event);
+ switch (event.type) {
case YAML_SEQUENCE_START_EVENT:
config_.localizations.push_back(vector<string>());
depth++;
@@ -314,25 +365,39 @@ void BmpBlockUtil::parse_localizations(yaml_parser_t *parser) {
break;
default:
error("Syntax error in parsing localizations.\n");
+ }
+ yaml_event_delete(&event);
}
- yaml_event_delete(&event);
}
-}
-void BmpBlockUtil::load_all_image_files() {
- for (StrImageConfigMap::iterator it = config_.images_map.begin();
- it != config_.images_map.end();
- ++it) {
- const string &content = read_image_file(it->second.filename.c_str());
- it->second.raw_content = content;
- it->second.data.original_size = content.size();
- switch(compression_) {
- case COMPRESS_NONE:
- it->second.data.compression = compression_;
- it->second.compressed_content = content;
- it->second.data.compressed_size = content.size();
- break;
- case COMPRESS_EFIv1:
+ void BmpBlockUtil::load_all_image_files() {
+ for (unsigned int i = 0; i < config_.image_names.size(); i++) {
+ StrImageConfigMap::iterator it =
+ config_.images_map.find(config_.image_names[i]);
+ if (debug_) {
+ printf("loading image \"%s\" from \"%s\"\n",
+ config_.image_names[i].c_str(),
+ it->second.filename.c_str());
+ }
+ const string &content = read_image_file(it->second.filename.c_str());
+ it->second.raw_content = content;
+ it->second.data.original_size = content.size();
+ it->second.data.format = get_image_format(content);
+ switch (it->second.data.format) {
+ case FORMAT_BMP:
+ it->second.data.width = get_bmp_image_width(it->second.raw_content);
+ it->second.data.height = get_bmp_image_height(it->second.raw_content);
+ break;
+ default:
+ error("Unsupported image format in %s\n", it->second.filename.c_str());
+ }
+ switch(compression_) {
+ case COMPRESS_NONE:
+ it->second.data.compression = compression_;
+ it->second.compressed_content = content;
+ it->second.data.compressed_size = content.size();
+ break;
+ case COMPRESS_EFIv1:
{
// The content will always compress smaller (so sez the docs).
uint32_t tmpsize = content.size();
@@ -348,7 +413,7 @@ void BmpBlockUtil::load_all_image_files() {
free(tmpbuf);
}
break;
- case COMPRESS_LZMA1:
+ case COMPRESS_LZMA1:
{
// Calculate the worst case of buffer size.
uint32_t tmpsize = lzma_stream_buffer_bound(content.size());
@@ -380,331 +445,326 @@ void BmpBlockUtil::load_all_image_files() {
free(tmpbuf);
}
break;
- default:
- error("Unsupported compression method attempted.\n");
+ default:
+ error("Unsupported compression method attempted.\n");
+ }
}
}
-}
-
-const string BmpBlockUtil::read_image_file(const char *filename) {
- string content;
- vector<char> buffer;
-
- FILE *fp = fopen(filename, "rb");
- if (!fp) {
- perror(filename);
- exit(errno);
- }
- if (fseek(fp, 0, SEEK_END) == 0) {
- buffer.resize(ftell(fp));
- rewind(fp);
- }
+ const string BmpBlockUtil::read_image_file(const char *filename) {
+ string content;
+ vector<char> buffer;
- if (!buffer.empty()) {
- if(fread(&buffer[0], buffer.size(), 1, fp) != 1) {
+ FILE *fp = fopen(filename, "rb");
+ if (!fp) {
perror(filename);
- buffer.clear();
- } else {
- content.assign(buffer.begin(), buffer.end());
+ exit(errno);
}
- }
- fclose(fp);
- return content;
-}
-
-ImageFormat BmpBlockUtil::get_image_format(const string content) {
- if (content.size() < sizeof(BMP_IMAGE_HEADER))
- return FORMAT_INVALID;
- const BMP_IMAGE_HEADER *hdr = (const BMP_IMAGE_HEADER *)content.c_str();
+ if (fseek(fp, 0, SEEK_END) == 0) {
+ buffer.resize(ftell(fp));
+ rewind(fp);
+ }
- if (hdr->CharB != 'B' || hdr->CharM != 'M' ||
- hdr->Planes != 1 ||
- (hdr->CompressionType != 0 && hdr->CompressionType != 1) ||
- (hdr->BitPerPixel != 1 && hdr->BitPerPixel != 4 &&
- hdr->BitPerPixel != 8 && hdr->BitPerPixel != 24))
- return FORMAT_INVALID;
+ if (!buffer.empty()) {
+ if(fread(&buffer[0], buffer.size(), 1, fp) != 1) {
+ perror(filename);
+ buffer.clear();
+ } else {
+ content.assign(buffer.begin(), buffer.end());
+ }
+ }
- return FORMAT_BMP;
-}
+ fclose(fp);
+ return content;
+ }
-uint32_t BmpBlockUtil::get_bmp_image_width(const string content) {
- const BMP_IMAGE_HEADER *hdr = (const BMP_IMAGE_HEADER *)content.c_str();
- return hdr->PixelWidth;
-}
+ ImageFormat BmpBlockUtil::get_image_format(const string content) {
+ if (content.size() < sizeof(BMP_IMAGE_HEADER))
+ return FORMAT_INVALID;
+ const BMP_IMAGE_HEADER *hdr = (const BMP_IMAGE_HEADER *)content.c_str();
-uint32_t BmpBlockUtil::get_bmp_image_height(const string content) {
- const BMP_IMAGE_HEADER *hdr = (const BMP_IMAGE_HEADER *)content.c_str();
- return hdr->PixelHeight;
-}
+ if (hdr->CharB != 'B' || hdr->CharM != 'M' ||
+ hdr->Planes != 1 ||
+ (hdr->CompressionType != 0 && hdr->CompressionType != 1) ||
+ (hdr->BitPerPixel != 1 && hdr->BitPerPixel != 4 &&
+ hdr->BitPerPixel != 8 && hdr->BitPerPixel != 24))
+ return FORMAT_INVALID;
-void BmpBlockUtil::fill_all_image_infos() {
- int errcnt = 0;
- for (StrImageConfigMap::iterator it = config_.images_map.begin();
- it != config_.images_map.end();
- ++it) {
- it->second.data.format = (uint32_t)get_image_format(it->second.raw_content);
- switch (it->second.data.format) {
- case FORMAT_BMP:
- it->second.data.width = get_bmp_image_width(it->second.raw_content);
- it->second.data.height = get_bmp_image_height(it->second.raw_content);
- break;
- default:
- fprintf(stderr, "Unsupported image format in %s\n",
- it->second.filename.c_str());
- errcnt++;
- }
+ return FORMAT_BMP;
}
- if (errcnt)
- error("Unable to continue due to errors.\n");
-}
-void BmpBlockUtil::compress_all_images(const Compression compress) {
- switch (compress) {
- case COMPRESS_NONE:
- for (StrImageConfigMap::iterator it = config_.images_map.begin();
- it != config_.images_map.end();
- ++it) {
- it->second.data.compression = compress;
- it->second.compressed_content = it->second.raw_content;
- it->second.data.compressed_size = it->second.compressed_content.size();
- }
- break;
- default:
- error("Unsupported data compression.\n");
+ uint32_t BmpBlockUtil::get_bmp_image_width(const string content) {
+ const BMP_IMAGE_HEADER *hdr = (const BMP_IMAGE_HEADER *)content.c_str();
+ return hdr->PixelWidth;
}
-}
-void BmpBlockUtil::fill_bmpblock_header() {
- memset(&config_.header, '\0', sizeof(config_.header));
- memcpy(&config_.header.signature, BMPBLOCK_SIGNATURE,
- BMPBLOCK_SIGNATURE_SIZE);
- config_.header.major_version = BMPBLOCK_MAJOR_VERSION;
- config_.header.minor_version = BMPBLOCK_MINOR_VERSION;
- config_.header.number_of_localizations = config_.localizations.size();
- config_.header.number_of_screenlayouts = config_.localizations[0].size();
- for (unsigned int i = 1; i < config_.localizations.size(); ++i) {
- assert(config_.header.number_of_screenlayouts ==
- config_.localizations[i].size());
+ uint32_t BmpBlockUtil::get_bmp_image_height(const string content) {
+ const BMP_IMAGE_HEADER *hdr = (const BMP_IMAGE_HEADER *)content.c_str();
+ return hdr->PixelHeight;
}
- config_.header.number_of_imageinfos = config_.images_map.size();
-}
-void BmpBlockUtil::pack_bmpblock() {
- bmpblock_.clear();
-
- /* Compute the ImageInfo offsets from start of BMPBLOCK. */
- uint32_t current_offset = sizeof(BmpBlockHeader) +
- sizeof(ScreenLayout) * (config_.header.number_of_localizations *
- config_.header.number_of_screenlayouts);
- for (unsigned int i = 0; i < config_.image_names.size(); ++i) {
- string image_name = config_.image_names[i];
- ImageConfig &img = config_.images_map[image_name];
- img.offset = current_offset;
- current_offset += sizeof(ImageInfo) +
- config_.images_map[image_name].data.compressed_size;
- /* Make it 4-byte aligned. */
- if ((current_offset & 3) > 0) {
- current_offset = (current_offset & ~3) + 4;
+ void BmpBlockUtil::fill_bmpblock_header() {
+ memset(&config_.header, '\0', sizeof(config_.header));
+ memcpy(&config_.header.signature, BMPBLOCK_SIGNATURE,
+ BMPBLOCK_SIGNATURE_SIZE);
+ config_.header.major_version = major_version_;
+ config_.header.minor_version = minor_version_;
+ config_.header.number_of_localizations = config_.localizations.size();
+ config_.header.number_of_screenlayouts = config_.localizations[0].size();
+ // HEY: this is part of the yaml consistency check
+ for (unsigned int i = 1; i < config_.localizations.size(); ++i) {
+ assert(config_.header.number_of_screenlayouts ==
+ config_.localizations[i].size());
}
+ config_.header.number_of_imageinfos = config_.images_map.size();
}
- bmpblock_.resize(current_offset);
-
- /* Fill BmpBlockHeader struct. */
- string::iterator current_filled = bmpblock_.begin();
- std::copy(reinterpret_cast<char*>(&config_.header),
- reinterpret_cast<char*>(&config_.header + 1),
- current_filled);
- current_filled += sizeof(config_.header);
-
- /* Fill all ScreenLayout structs. */
- for (unsigned int i = 0; i < config_.localizations.size(); ++i) {
- for (unsigned int j = 0; j < config_.localizations[i].size(); ++j) {
- ScreenConfig &screen = config_.screens_map[config_.localizations[i][j]];
- for (unsigned int k = 0;
- k < MAX_IMAGE_IN_LAYOUT && !screen.image_names[k].empty();
- ++k) {
- screen.data.images[k].image_info_offset =
- config_.images_map[screen.image_names[k]].offset;
+
+ void BmpBlockUtil::pack_bmpblock() {
+ bmpblock_.clear();
+
+ /* Compute the ImageInfo offsets from start of BMPBLOCK. */
+ uint32_t current_offset = sizeof(BmpBlockHeader) +
+ sizeof(ScreenLayout) * (config_.header.number_of_localizations *
+ config_.header.number_of_screenlayouts);
+ for (StrImageConfigMap::iterator it = config_.images_map.begin();
+ it != config_.images_map.end();
+ ++it) {
+ it->second.offset = current_offset;
+ if (debug_)
+ printf(" \"%s\": filename=\"%s\" offset=0x%x tag=%d\n",
+ it->first.c_str(),
+ it->second.filename.c_str(),
+ it->second.offset,
+ it->second.data.tag);
+ current_offset += sizeof(ImageInfo) +
+ it->second.data.compressed_size;
+ /* Make it 4-byte aligned. */
+ if ((current_offset & 3) > 0) {
+ current_offset = (current_offset & ~3) + 4;
}
- std::copy(reinterpret_cast<char*>(&screen.data),
- reinterpret_cast<char*>(&screen.data + 1),
- current_filled);
- current_filled += sizeof(screen.data);
}
- }
+ bmpblock_.resize(current_offset);
- /* Fill all ImageInfo structs and image contents. */
- for (StrImageConfigMap::iterator it = config_.images_map.begin();
- it != config_.images_map.end();
- ++it) {
- current_filled = bmpblock_.begin() + it->second.offset;
- std::copy(reinterpret_cast<char*>(&it->second.data),
- reinterpret_cast<char*>(&it->second.data + 1),
- current_filled);
- current_filled += sizeof(it->second.data);
- std::copy(it->second.compressed_content.begin(),
- it->second.compressed_content.end(),
+ /* Fill BmpBlockHeader struct. */
+ string::iterator current_filled = bmpblock_.begin();
+ std::copy(reinterpret_cast<char*>(&config_.header),
+ reinterpret_cast<char*>(&config_.header + 1),
current_filled);
+ current_filled += sizeof(config_.header);
+ current_offset = sizeof(config_.header);
+
+ /* Fill all ScreenLayout structs. */
+ for (unsigned int i = 0; i < config_.localizations.size(); ++i) {
+ for (unsigned int j = 0; j < config_.localizations[i].size(); ++j) {
+ ScreenConfig &screen = config_.screens_map[config_.localizations[i][j]];
+ for (unsigned int k = 0;
+ k < MAX_IMAGE_IN_LAYOUT && !screen.image_names[k].empty();
+ ++k) {
+ if (config_.images_map.find(screen.image_names[k]) ==
+ config_.images_map.end()) {
+ error("Invalid image name \"%s\"\n", screen.image_names[k].c_str());
+ }
+ if (debug_)
+ printf("i=%d j=%d k=%d=\"%s\" (%d,%d) ofs=%x\n", i,j,k,
+ screen.image_names[k].c_str(),
+ screen.data.images[k].x, screen.data.images[k].y,
+ config_.images_map[screen.image_names[k]].offset
+ );
+ screen.data.images[k].image_info_offset =
+ config_.images_map[screen.image_names[k]].offset;
+ }
+ std::copy(reinterpret_cast<char*>(&screen.data),
+ reinterpret_cast<char*>(&screen.data + 1),
+ current_filled);
+ current_filled += sizeof(screen.data);
+ if (debug_)
+ printf("S: current offset is 0x%08x\n", current_offset);
+ current_offset += sizeof(screen.data);
+ }
+ }
+
+ /* Fill all ImageInfo structs and image contents. */
+ for (StrImageConfigMap::iterator it = config_.images_map.begin();
+ it != config_.images_map.end();
+ ++it) {
+ current_filled = bmpblock_.begin() + it->second.offset;
+ current_offset = it->second.offset;
+ if (debug_)
+ printf("I0: current offset is 0x%08x\n", current_offset);
+ std::copy(reinterpret_cast<char*>(&it->second.data),
+ reinterpret_cast<char*>(&it->second.data + 1),
+ current_filled);
+ current_filled += sizeof(it->second.data);
+ current_offset += sizeof(it->second.data);
+ if (debug_)
+ printf("I1: current offset is 0x%08x (len %ld)\n",
+ current_offset, it->second.compressed_content.length());
+ std::copy(it->second.compressed_content.begin(),
+ it->second.compressed_content.end(),
+ current_filled);
+ }
}
-}
-void BmpBlockUtil::write_to_bmpblock(const char *filename) {
- assert(!bmpblock_.empty());
+ void BmpBlockUtil::write_to_bmpblock(const char *filename) {
+ assert(!bmpblock_.empty());
- FILE *fp = fopen(filename, "wb");
- if (!fp) {
- perror(filename);
- exit(errno);
- }
+ FILE *fp = fopen(filename, "wb");
+ if (!fp) {
+ perror(filename);
+ exit(errno);
+ }
- int r = fwrite(bmpblock_.c_str(), bmpblock_.size(), 1, fp);
- fclose(fp);
- if (r != 1) {
- perror(filename);
- exit(errno);
+ int r = fwrite(bmpblock_.c_str(), bmpblock_.size(), 1, fp);
+ fclose(fp);
+ if (r != 1) {
+ perror(filename);
+ exit(errno);
+ }
}
-}
} // namespace vboot_reference
#ifdef WITH_UTIL_MAIN
-//////////////////////////////////////////////////////////////////////////////
-// Command line utilities.
+ //////////////////////////////////////////////////////////////////////////////
+ // Command line utilities.
-extern "C" {
+ extern "C" {
#include "bmpblk_util.h"
-}
+ }
-using vboot_reference::BmpBlockUtil;
-
-// utility function: provide usage of this utility and exit.
-static void usagehelp_exit(const char *prog_name) {
- printf(
- "\n"
- "To create a new BMPBLOCK file using config from YAML file:\n"
- "\n"
- " %s [-z NUM] -c YAML BMPBLOCK\n"
- "\n"
- " -z NUM = compression algorithm to use\n"
- " 0 = none\n"
- " 1 = EFIv1\n"
- " 2 = LZMA1\n"
- "\n", prog_name);
- printf(
- "To display the contents of a BMPBLOCK:\n"
- "\n"
- " %s [-y] BMPBLOCK\n"
- "\n"
- " -y = display as yaml\n"
- "\n", prog_name);
- printf(
- "To unpack a BMPBLOCK file:\n"
- "\n"
- " %s -x [-d DIR] [-f] BMPBLOCK\n"
- "\n"
- " -d DIR = directory to use (default '.')\n"
- " -f = force overwriting existing files\n"
- "\n", prog_name);
- exit(1);
-}
+ using vboot_reference::BmpBlockUtil;
+
+ // utility function: provide usage of this utility and exit.
+ static void usagehelp_exit(const char *prog_name) {
+ printf(
+ "\n"
+ "To create a new BMPBLOCK file using config from YAML file:\n"
+ "\n"
+ " %s [-z NUM] -c YAML BMPBLOCK\n"
+ "\n"
+ " -z NUM = compression algorithm to use\n"
+ " 0 = none\n"
+ " 1 = EFIv1\n"
+ " 2 = LZMA1\n"
+ "\n", prog_name);
+ printf(
+ "To display the contents of a BMPBLOCK:\n"
+ "\n"
+ " %s [-y] BMPBLOCK\n"
+ "\n"
+ " -y = display as yaml\n"
+ "\n", prog_name);
+ printf(
+ "To unpack a BMPBLOCK file:\n"
+ "\n"
+ " %s -x [-d DIR] [-f] BMPBLOCK\n"
+ "\n"
+ " -d DIR = directory to use (default '.')\n"
+ " -f = force overwriting existing files\n"
+ "\n", prog_name);
+ exit(1);
+ }
-///////////////////////////////////////////////////////////////////////
-// main
-
-int main(int argc, char *argv[]) {
-
- const char *prog_name = strrchr(argv[0], '/');
- if (prog_name)
- prog_name++;
- else
- prog_name = argv[0];
-
- int overwrite = 0, extract_mode = 0;
- int compression = 0;
- int set_compression = 0;
- const char *config_fn = 0, *bmpblock_fn = 0, *extract_dir = ".";
- int show_as_yaml = 0;
-
- int opt;
- opterr = 0; // quiet
- int errorcnt = 0;
- char *e = 0;
- while ((opt = getopt(argc, argv, ":c:xz:fd:y")) != -1) {
- switch (opt) {
- case 'c':
- config_fn = optarg;
- break;
- case 'x':
- extract_mode = 1;
- break;
- case 'y':
- show_as_yaml = 1;
- break;
- case 'z':
- compression = (int)strtoul(optarg, &e, 0);
- if (!*optarg || (e && *e)) {
- fprintf(stderr, "%s: invalid argument to -%c: \"%s\"\n",
- prog_name, opt, optarg);
+ ///////////////////////////////////////////////////////////////////////
+ // main
+
+ int main(int argc, char *argv[]) {
+
+ const char *prog_name = strrchr(argv[0], '/');
+ if (prog_name)
+ prog_name++;
+ else
+ prog_name = argv[0];
+
+ int overwrite = 0, extract_mode = 0;
+ int compression = 0;
+ int set_compression = 0;
+ const char *config_fn = 0, *bmpblock_fn = 0, *extract_dir = ".";
+ int show_as_yaml = 0;
+ bool debug = false;
+
+ int opt;
+ opterr = 0; // quiet
+ int errorcnt = 0;
+ char *e = 0;
+ while ((opt = getopt(argc, argv, ":c:xz:fd:yD")) != -1) {
+ switch (opt) {
+ case 'c':
+ config_fn = optarg;
+ break;
+ case 'x':
+ extract_mode = 1;
+ break;
+ case 'y':
+ show_as_yaml = 1;
+ break;
+ case 'z':
+ compression = (int)strtoul(optarg, &e, 0);
+ if (!*optarg || (e && *e)) {
+ fprintf(stderr, "%s: invalid argument to -%c: \"%s\"\n",
+ prog_name, opt, optarg);
+ errorcnt++;
+ }
+ if (compression >= MAX_COMPRESS) {
+ fprintf(stderr, "%s: compression type must be less than %d\n",
+ prog_name, MAX_COMPRESS);
+ errorcnt++;
+ }
+ set_compression = 1;
+ break;
+ case 'f':
+ overwrite = 1;
+ break;
+ case 'd':
+ extract_dir= optarg;
+ break;
+ case 'D':
+ debug = true;
+ break;
+ case ':':
+ fprintf(stderr, "%s: missing argument to -%c\n",
+ prog_name, optopt);
errorcnt++;
- }
- if (compression >= MAX_COMPRESS) {
- fprintf(stderr, "%s: compression type must be less than %d\n",
- prog_name, MAX_COMPRESS);
+ break;
+ default:
+ fprintf(stderr, "%s: unrecognized switch: -%c\n",
+ prog_name, optopt);
errorcnt++;
+ break;
}
- set_compression = 1;
- break;
- case 'f':
- overwrite = 1;
- break;
- case 'd':
- extract_dir= optarg;
- break;
- case ':':
- fprintf(stderr, "%s: missing argument to -%c\n",
- prog_name, optopt);
- errorcnt++;
- break;
- default:
- fprintf(stderr, "%s: unrecognized switch: -%c\n",
- prog_name, optopt);
+ }
+ argc -= optind;
+ argv += optind;
+
+ if (argc >= 1) {
+ bmpblock_fn = argv[0];
+ } else {
+ fprintf(stderr, "%s: missing BMPBLOCK name\n", prog_name);
errorcnt++;
- break;
}
- }
- argc -= optind;
- argv += optind;
-
- if (argc >= 1) {
- bmpblock_fn = argv[0];
- } else {
- fprintf(stderr, "%s: missing BMPBLOCK name\n", prog_name);
- errorcnt++;
- }
- if (errorcnt)
- usagehelp_exit(prog_name);
+ if (errorcnt)
+ usagehelp_exit(prog_name);
- BmpBlockUtil util;
+ BmpBlockUtil util(debug);
- if (config_fn) {
- if (set_compression)
- util.force_compression(compression);
- util.load_from_config(config_fn);
- util.pack_bmpblock();
- util.write_to_bmpblock(bmpblock_fn);
- }
+ if (config_fn) {
+ if (set_compression)
+ util.force_compression(compression);
+ util.load_from_config(config_fn);
+ util.pack_bmpblock();
+ util.write_to_bmpblock(bmpblock_fn);
+ }
- else if (extract_mode) {
- return dump_bmpblock(bmpblock_fn, 1, extract_dir, overwrite);
- } else {
- return dump_bmpblock(bmpblock_fn, show_as_yaml, 0, 0);
- }
+ else if (extract_mode) {
+ return dump_bmpblock(bmpblock_fn, 1, extract_dir, overwrite);
+ } else {
+ return dump_bmpblock(bmpblock_fn, show_as_yaml, 0, 0);
+ }
- return 0;
-}
+ return 0;
+ }
#endif // WITH_UTIL_MAIN
diff --git a/utility/include/bmpblk_utility.h b/utility/include/bmpblk_utility.h
index 9c708ba3..95e8ce35 100644
--- a/utility/include/bmpblk_utility.h
+++ b/utility/include/bmpblk_utility.h
@@ -50,15 +50,12 @@ typedef struct BmpBlockConfig {
class BmpBlockUtil {
public:
- BmpBlockUtil();
+ BmpBlockUtil(bool debug);
~BmpBlockUtil();
/* Load all the images and related infomations according to a config file. */
void load_from_config(const char *filename);
- /* Compress all the images using a given comression method. */
- void compress_all_images(const Compression compress);
-
/* Contruct the bmpblock. */
void pack_bmpblock();
@@ -69,9 +66,6 @@ class BmpBlockUtil {
void force_compression(uint32_t compression);
private:
- /* Clear all internal data. */
- void initialize();
-
/* Elemental function called from load_from_config.
* Load the config file (yaml format) and parse it. */
void load_yaml_config(const char *filename);
@@ -81,10 +75,6 @@ class BmpBlockUtil {
void load_all_image_files();
/* Elemental function called from load_from_config.
- * Contruct all ImageInfo structs. */
- void fill_all_image_infos();
-
- /* Elemental function called from load_from_config.
* Contruct the BmpBlockHeader struct. */
void fill_bmpblock_header();
@@ -105,6 +95,16 @@ class BmpBlockUtil {
uint32_t get_bmp_image_width(const string content);
uint32_t get_bmp_image_height(const string content);
+ /* Verbosity flags */
+ bool debug_;
+
+ /* Internal variable for string the BmpBlock version. */
+ uint16_t major_version_;
+ uint16_t minor_version_;
+
+ /* Flags for version-specific features */
+ bool render_hwid_;
+
/* Internal variable for storing the config of BmpBlock. */
BmpBlockConfig config_;