socsvn commit: r269557 - soc2014/seiya/bootsplash/sys/dev/fb
seiya at FreeBSD.org
seiya at FreeBSD.org
Sat Jun 14 13:27:58 UTC 2014
Author: seiya
Date: Sat Jun 14 13:27:57 2014
New Revision: 269557
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=269557
Log:
support BMP files compressed by RLE8
Modified:
soc2014/seiya/bootsplash/sys/dev/fb/bmp.c
Modified: soc2014/seiya/bootsplash/sys/dev/fb/bmp.c
==============================================================================
--- soc2014/seiya/bootsplash/sys/dev/fb/bmp.c Sat Jun 14 12:56:07 2014 (r269556)
+++ soc2014/seiya/bootsplash/sys/dev/fb/bmp.c Sat Jun 14 13:27:57 2014 (r269557)
@@ -138,7 +138,7 @@
bmp_draw(video_adapter_t *adp, BMP_INFO *bmp_info, int sx, int sy, int iy,
int width, int height)
{
- int i;
+ int i, next_line;
static int cleared;
if (bmp_info->data == NULL) { /* init failed, do nothing */
@@ -184,12 +184,34 @@
bmp_info->index += bmp_info->width * (bmp_info->height - iy - height);
break;
- case BI_RLE4: case BI_RLE8:
- for (i = bmp_info->height; i > iy + height; i--){
- while (*bmp_info->index != 0 && *(bmp_info->index+1))
- bmp_info->index++;
+ case BI_RLE4:
+ return(1); /* TODO */
+
+ case BI_RLE8:
+ for (i = bmp_info->height; i > iy + height; i--) {
+
+ for(next_line = 0; next_line == 0;){
+ if (*bmp_info->index) {
+ bmp_info->index += 2;
+ } else {
+ switch(*(bmp_info->index+1)) {
+ case 0: /* end of line */
+ bmp_info->index += 2;
+ next_line = 1;
+ break;
+ case 1: /* end of bitmap */
+ bmp_info->index = NULL;
+ return(1);
+ case 2: /* move */
+ bmp_info->index += 4;
+ break;
+ default: /* literal bitmap data */
+ bmp_info->index += 2 + *(bmp_info->index + 1) + (*(bmp_info->index + 1) & 1);
+ break;
+ }
+ }
+ }
}
- bmp_info->index += 2;
break;
}
@@ -371,12 +393,10 @@
bmp_DecodeRLE8(BMP_INFO *info, int line, int sx, int width)
{
int i;
- int count; /* number of drawn pixels */
- int x,y; /* screen position */
+ int x,y; /* screen position on screen */
- count = 0;
- x = sx; /* starting position */
y = line;
+ x = sx;
/* loop reading data */
for(;;) {
@@ -385,17 +405,9 @@
* two colour indexes to alternate between for the run
*/
if (*info->index) {
- for (i = 0; i < *info->index && count < width; i++, count++, x++)
+ for (i = 0; i < *info->index && (x - sx) < width; i++, x++)
bmp_SetPix(info, x, y, *(info->index+1));
- /* go to the next line */
- if(count == width){
- for (; *info->index != 0 && *(info->index+1) != 0; info->index++)
- ;
- info->index += 2;
- return;
- }
-
info->index += 2;
/*
* A leading zero is an escape; it may signal the end of the
@@ -415,20 +427,10 @@
info->index += 4;
break;
default: /* literal bitmap data */
- for (i = 0; i < *(info->index + 1) && count < width; i++, count++, x++)
+ for (i = 0; i < *(info->index + 1) && (x - sx) < width; i++, x++)
bmp_SetPix(info, x, y, *(info->index + 2 + i));
- /* go to the next line */
- if(count == width){
- for (; *info->index != 0 && *(info->index+1) != 0; info->index++)
- ;
- info->index += 2;
- return;
- }
-
- /* must be an even count */
- info->index += 2 + i + (i & 1);
-
+ info->index += 2 + i + (i & 1);
break;
}
}
More information about the svn-soc-all
mailing list