diff options
author | Bill Richardson <wfrichar@chromium.org> | 2011-08-16 14:52:56 -0700 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2011-08-29 10:59:33 -0700 |
commit | 3e79883063d890a85da157c508afd3012735b8e0 (patch) | |
tree | 5cc55ac62d018ef8aeb02576c1aea5087abde7b1 | |
parent | 2d0cce869275f5fd0de39ad2c1fca1c1d0779c59 (diff) |
New function VbExDecompress(), changed VbExDisplayImage().
The vboot_api.h interface has changed, so we need to adapt. VbExDecompress()
now allows the vboot library access to native decompression routines. The
signature of VbExDisplayImage() has changed, so we now only need to support
uncompressed native-format bitmaps.
BUG=chromium-os:19134
TEST=manual
I tested by modifying the U-Boot build so I could get into the U-Boot prompt
and run "vbexport_test display". The GBB screens rendered correctly.
Change-Id: Iec605dee0af46e7d9eecc89b826e260f8a5930a4
Reviewed-on: http://gerrit.chromium.org/gerrit/6131
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Reviewed-by: Bill Richardson <wfrichar@chromium.org>
Tested-by: Bill Richardson <wfrichar@chromium.org>
-rw-r--r-- | common/cmd_vbexport_test.c | 31 | ||||
-rw-r--r-- | lib/vbexport/display.c | 61 |
2 files changed, 50 insertions, 42 deletions
diff --git a/common/cmd_vbexport_test.c b/common/cmd_vbexport_test.c index 3813ce18109..fe4a3434c7c 100644 --- a/common/cmd_vbexport_test.c +++ b/common/cmd_vbexport_test.c @@ -436,6 +436,8 @@ static int show_images_and_delay(BmpBlockHeader *bmph, int index) int i; ScreenLayout *screen; ImageInfo *info; + void *rawimg; + uint32_t inoutsize; screen = (ScreenLayout *)(bmph + 1); screen += index; @@ -445,18 +447,37 @@ static int show_images_and_delay(BmpBlockHeader *bmph, int index) i++) { info = (ImageInfo *)((uint8_t *)bmph + screen->images[i].image_info_offset); + inoutsize = info->original_size; + + if (COMPRESS_NONE == info->compression) { + rawimg = NULL; + } else { + rawimg = VbExMalloc(inoutsize); + if (VbExDecompress(info + 1, info->compressed_size, + info->compression, + rawimg, &inoutsize)) { + goto bad; + } + } + if (VbExDisplayImage(screen->images[i].x, screen->images[i].y, - info, - info + 1)) { - VbExDebug("Failed to display image, screen=%lu, " - "image=%d!\n", index, i); - return 1; + rawimg ? rawimg : info + 1, + inoutsize)) { + goto bad; } + if (rawimg) + VbExFree(rawimg); } VbExSleepMs(1000); return 0; + +bad: + if (rawimg) + VbExFree(rawimg); + VbExDebug("Failed to display image, screen=%lu, image=%d!\n", index, i); + return 1; } static int do_vbexport_test_display( diff --git a/lib/vbexport/display.c b/lib/vbexport/display.c index 80f45128d99..c177f3bacfe 100644 --- a/lib/vbexport/display.c +++ b/lib/vbexport/display.c @@ -127,56 +127,43 @@ VbError_t VbExDisplayScreen(uint32_t screen_type) return VBERROR_SUCCESS; } -static uint8_t *uncompress_lzma(uint8_t *in_addr, SizeT in_size, - SizeT out_size) +VbError_t VbExDecompress(void *inbuf, uint32_t in_size, + uint32_t compression_type, + void *outbuf, uint32_t *out_size) { - uint8_t *out_addr = VbExMalloc(out_size); - SizeT lzma_len = out_size; + SizeT input_size = in_size; + SizeT output_size = *out_size; int ret; - ret = lzmaBuffToBuffDecompress(out_addr, &lzma_len, in_addr, in_size); - if (ret != SZ_OK) { - VbExFree(out_addr); - out_addr = NULL; - } - return out_addr; -} - -VbError_t VbExDisplayImage(uint32_t x, uint32_t y, const ImageInfo *info, - const void *buffer) -{ - int ret; - uint8_t *raw_data; - - switch (info->compression) { + switch (compression_type) { case COMPRESS_NONE: - raw_data = (uint8_t *)buffer; - break; + memcpy(outbuf, inbuf, in_size); + *out_size = in_size; + return VBERROR_SUCCESS; case COMPRESS_LZMA1: - raw_data = uncompress_lzma((uint8_t *)buffer, - (SizeT)info->compressed_size, - (SizeT)info->original_size); - if (!raw_data) { - VBDEBUG("LZMA decompress failed.\n"); - return 1; + ret = lzmaBuffToBuffDecompress(outbuf, &output_size, + inbuf, input_size); + if (ret != SZ_OK) { + return ret; } - break; - - default: - VBDEBUG("Unsupported compression format: %08x\n", - info->compression); - return 1; + *out_size = output_size; + return VBERROR_SUCCESS; } - ret = display_callbacks_.dc_display_bitmap((ulong)raw_data, x, y); + VBDEBUG("Unsupported compression format: %08x\n", compression_type); + return VBERROR_INVALID_PARAMETER; +} - if (info->compression == COMPRESS_LZMA1) - VbExFree(raw_data); +VbError_t VbExDisplayImage(uint32_t x, uint32_t y, + void *buffer, uint32_t buffersize) +{ + int ret; + ret = display_callbacks_.dc_display_bitmap((ulong)buffer, x, y); if (ret) { VBDEBUG("LCD display error.\n"); - return 1; + return VBERROR_UNKNOWN; } return VBERROR_SUCCESS; |