@ -38,14 +38,19 @@ static int bmp_info (ulong addr);
/*
* Allocate and decompress a BMP image using gunzip ( ) .
*
* Returns a pointer to the decompressed image data . Must be freed by
* the caller after use .
* Returns a pointer to the decompressed image data . This pointer is
* aligned to 32 - bit - aligned - address + 2.
* See doc / README . displaying - bmps for explanation .
*
* The allocation address is passed to ' alloc_addr ' and must be freed
* by the caller after use .
*
* Returns NULL if decompression failed , or if the decompressed data
* didn ' t contain a valid BMP signature .
*/
# ifdef CONFIG_VIDEO_BMP_GZIP
bmp_image_t * gunzip_bmp ( unsigned long addr , unsigned long * lenp )
bmp_image_t * gunzip_bmp ( unsigned long addr , unsigned long * lenp ,
void * * alloc_addr )
{
void * dst ;
unsigned long len ;
@ -55,12 +60,19 @@ bmp_image_t *gunzip_bmp(unsigned long addr, unsigned long *lenp)
* Decompress bmp image
*/
len = CONFIG_SYS_VIDEO_LOGO_MAX_SIZE ;
dst = malloc ( CONFIG_SYS_VIDEO_LOGO_MAX_SIZE ) ;
/* allocate extra 3 bytes for 32-bit-aligned-address + 2 alignment */
dst = malloc ( CONFIG_SYS_VIDEO_LOGO_MAX_SIZE + 3 ) ;
if ( dst = = NULL ) {
puts ( " Error: malloc in gunzip failed! \n " ) ;
return NULL ;
}
if ( gunzip ( dst , CONFIG_SYS_VIDEO_LOGO_MAX_SIZE , ( uchar * ) addr , & len ) ! = 0 ) {
bmp = dst ;
/* align to 32-bit-aligned-address + 2 */
bmp = ( bmp_image_t * ) ( ( ( ( unsigned int ) dst + 1 ) & ~ 3 ) + 2 ) ;
if ( gunzip ( bmp , CONFIG_SYS_VIDEO_LOGO_MAX_SIZE , ( uchar * ) addr , & len ) ! = 0 ) {
free ( dst ) ;
return NULL ;
}
@ -68,8 +80,6 @@ bmp_image_t *gunzip_bmp(unsigned long addr, unsigned long *lenp)
puts ( " Image could be truncated "
" (increase CONFIG_SYS_VIDEO_LOGO_MAX_SIZE)! \n " ) ;
bmp = dst ;
/*
* Check for bmp mark ' BM '
*/
@ -81,10 +91,12 @@ bmp_image_t *gunzip_bmp(unsigned long addr, unsigned long *lenp)
debug ( " Gzipped BMP image detected! \n " ) ;
* alloc_addr = dst ;
return bmp ;
}
# else
bmp_image_t * gunzip_bmp ( unsigned long addr , unsigned long * lenp )
bmp_image_t * gunzip_bmp ( unsigned long addr , unsigned long * lenp ,
void * * alloc_addr )
{
return NULL ;
}
@ -189,11 +201,12 @@ U_BOOT_CMD(
static int bmp_info ( ulong addr )
{
bmp_image_t * bmp = ( bmp_image_t * ) addr ;
void * bmp_alloc_addr = NULL ;
unsigned long len ;
if ( ! ( ( bmp - > header . signature [ 0 ] = = ' B ' ) & &
( bmp - > header . signature [ 1 ] = = ' M ' ) ) )
bmp = gunzip_bmp ( addr , & len ) ;
bmp = gunzip_bmp ( addr , & len , & bmp_alloc_addr ) ;
if ( bmp = = NULL ) {
printf ( " There is no valid bmp file at the given address \n " ) ;
@ -205,8 +218,8 @@ static int bmp_info(ulong addr)
printf ( " Bits per pixel: %d \n " , le16_to_cpu ( bmp - > header . bit_count ) ) ;
printf ( " Compression : %d \n " , le32_to_cpu ( bmp - > header . compression ) ) ;
if ( ( unsigned long ) bmp ! = addr )
free ( bmp ) ;
if ( bmp_alloc_ addr)
free ( bmp_alloc_addr ) ;
return ( 0 ) ;
}
@ -225,11 +238,12 @@ int bmp_display(ulong addr, int x, int y)
{
int ret ;
bmp_image_t * bmp = ( bmp_image_t * ) addr ;
void * bmp_alloc_addr = NULL ;
unsigned long len ;
if ( ! ( ( bmp - > header . signature [ 0 ] = = ' B ' ) & &
( bmp - > header . signature [ 1 ] = = ' M ' ) ) )
bmp = gunzip_bmp ( addr , & len ) ;
bmp = gunzip_bmp ( addr , & len , & bmp_alloc_addr ) ;
if ( ! bmp ) {
printf ( " There is no valid bmp file at the given address \n " ) ;
@ -244,8 +258,8 @@ int bmp_display(ulong addr, int x, int y)
# error bmp_display() requires CONFIG_LCD or CONFIG_VIDEO
# endif
if ( ( unsigned long ) bmp ! = addr )
free ( bmp ) ;
if ( bmp_alloc_ addr)
free ( bmp_alloc_addr ) ;
return ret ;
}