| Index: utility/bmpblk_utility.cc
|
| diff --git a/utility/bmpblk_utility.cc b/utility/bmpblk_utility.cc
|
| index 66b60d9deb2fa33b545198bc7150abdddfb366f5..9f912d0b0a0b6ae1af239a0e6438013551ddbf77 100644
|
| --- a/utility/bmpblk_utility.cc
|
| +++ b/utility/bmpblk_utility.cc
|
| @@ -16,6 +16,11 @@
|
| #include <string.h>
|
| #include <yaml.h>
|
|
|
| +extern "C" {
|
| +#include "eficompress.h"
|
| +}
|
| +
|
| +
|
| /* BMP header, used to validate image requirements
|
| * See http://en.wikipedia.org/wiki/BMP_file_format
|
| */
|
| @@ -67,6 +72,13 @@ void BmpBlockUtil::initialize() {
|
| 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::load_from_config(const char *filename) {
|
| @@ -292,10 +304,31 @@ void BmpBlockUtil::load_all_image_files() {
|
| const string &content = read_image_file(it->second.filename.c_str());
|
| it->second.raw_content = content;
|
| it->second.data.original_size = content.size();
|
| - /* Use no compression as default */
|
| - it->second.data.compression = COMPRESS_NONE;
|
| - it->second.compressed_content = content;
|
| - it->second.data.compressed_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:
|
| + {
|
| + // The content will always compress smaller (so sez the docs).
|
| + uint32_t tmpsize = content.size();
|
| + uint8_t *tmpbuf = (uint8_t *)malloc(tmpsize);
|
| + // The size of the compressed content is also returned.
|
| + if (EFI_SUCCESS != EfiCompress((uint8_t *)content.c_str(), tmpsize,
|
| + tmpbuf, &tmpsize)) {
|
| + error("Unable to compress!\n");
|
| + }
|
| + it->second.data.compression = compression_;
|
| + it->second.compressed_content.assign((const char *)tmpbuf, tmpsize);
|
| + it->second.data.compressed_size = tmpsize;
|
| + free(tmpbuf);
|
| + }
|
| + break;
|
| + default:
|
| + error("Unsupported compression method attempted.\n");
|
| + }
|
| }
|
| }
|
|
|
| @@ -409,7 +442,7 @@ void BmpBlockUtil::pack_bmpblock() {
|
|
|
| /* Compute the ImageInfo offsets from start of BMPBLOCK. */
|
| uint32_t current_offset = sizeof(BmpBlockHeader) +
|
| - sizeof(ScreenLayout) * config_.images_map.size();
|
| + sizeof(ScreenLayout) * config_.screens_map.size();
|
| for (StrImageConfigMap::iterator it = config_.images_map.begin();
|
| it != config_.images_map.end();
|
| ++it) {
|
| @@ -507,7 +540,9 @@ static void usagehelp_exit(const char *prog_name) {
|
| printf(
|
| "To display the contents of a BMPBLOCK:\n"
|
| "\n"
|
| - " %s BMPBLOCK\n"
|
| + " %s [-y] BMPBLOCK\n"
|
| + "\n"
|
| + " -y = display as yaml\n"
|
| "\n", prog_name);
|
| printf(
|
| "To unpack a BMPBLOCK file:\n"
|
| @@ -531,15 +566,17 @@ int main(int argc, char *argv[]) {
|
| else
|
| prog_name = argv[0];
|
|
|
| - int force = 0, extract_mode = 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:")) != -1) {
|
| + while ((opt = getopt(argc, argv, ":c:xz:fd:y")) != -1) {
|
| switch (opt) {
|
| case 'c':
|
| config_fn = optarg;
|
| @@ -547,6 +584,9 @@ int main(int argc, char *argv[]) {
|
| 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)) {
|
| @@ -556,12 +596,13 @@ int main(int argc, char *argv[]) {
|
| }
|
| if (compression >= MAX_COMPRESS) {
|
| fprintf(stderr, "%s: compression type must be less than %d\n",
|
| - prog_name, compression);
|
| + prog_name, MAX_COMPRESS);
|
| errorcnt++;
|
| }
|
| + set_compression = 1;
|
| break;
|
| case 'f':
|
| - force = 1;
|
| + overwrite = 1;
|
| break;
|
| case 'd':
|
| extract_dir= optarg;
|
| @@ -594,27 +635,17 @@ int main(int argc, char *argv[]) {
|
| BmpBlockUtil util;
|
|
|
| if (config_fn) {
|
| - printf("compression is %d\n", compression);
|
| + if (set_compression)
|
| + util.force_compression(compression);
|
| util.load_from_config(config_fn);
|
| util.pack_bmpblock();
|
| util.write_to_bmpblock(bmpblock_fn);
|
| - printf("The BMPBLOCK is sucessfully created in: %s.\n",
|
| - bmpblock_fn);
|
| }
|
|
|
| else if (extract_mode) {
|
| - return extract_bmpblock(bmpblock_fn, extract_dir, force);
|
| - printf("extract parts from %s into %s %s overwriting\n",
|
| - bmpblock_fn, extract_dir, force ? "with" : "without");
|
| - /* TODO(waihong): Implement the list mode. */
|
| - error("Extract mode hasn't been implemented yet.\n");
|
| - }
|
| -
|
| - else {
|
| - return display_bmpblock(bmpblock_fn);
|
| - printf("display content of %s\n", bmpblock_fn);
|
| - /* TODO(waihong): Implement the list mode. */
|
| - error("List mode hasn't been implemented yet.\n");
|
| + return dump_bmpblock(bmpblock_fn, 1, extract_dir, overwrite);
|
| + } else {
|
| + return dump_bmpblock(bmpblock_fn, show_as_yaml, 0, 0);
|
| }
|
|
|
| return 0;
|
|
|