Date: Wed, 18 Jun 2014 06:33:24 GMT From: seiya@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r269715 - soc2014/seiya/bootsplash/sys/dev/fb Message-ID: <201406180633.s5I6XOR5008508@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: seiya Date: Wed Jun 18 06:33:23 2014 New Revision: 269715 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=269715 Log: bmp: tiny enhance 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 Wed Jun 18 05:35:09 2014 (r269714) +++ soc2014/seiya/bootsplash/sys/dev/fb/bmp.c Wed Jun 18 06:33:23 2014 (r269715) @@ -224,6 +224,46 @@ return(0); } +/* +** bmp_draw_line +** +** Given (info), set the pixels from (x_origin) to (x_origin) + (count) at (y) to (val) +** +*/ +static void +bmp_draw_line(BMP_INFO *info, int y, int x_origin, int count, int val) +{ + int i; + int sofs; + int newbank; + + /* + * range check to avoid explosions + */ + if ((x_origin < 0) || (x_origin + count >= info->swidth) || (y < 0) || (y >= info->sheight)) + return; + + /* + * calculate offset into video memory + */ + sofs = (y * info->adp->va_line_width) + x_origin; + + switch(info->sdepth) { + case 1: break; /* TODO */ + case 4: break; /* TODO */ + + case 8: + for(i = 0; i < count; i++, sofs++) { + newbank = sofs / info->adp->va_window_size; + if (info->bank != newbank) { + vidd_set_win_org(info->adp, newbank*info->adp->va_window_size); + info->bank = newbank; + } + *(info->vidmem + (sofs % info->adp->va_window_size)) = val; + } + break; + } +} /* ** bmp_SetPix @@ -393,6 +433,7 @@ bmp_DecodeRLE8(BMP_INFO *info, int line, int sx, int width) { int i; + int count; /* pixels to be drawn at the `y`th line */ int x,y; /* screen position on screen */ y = line; @@ -405,10 +446,11 @@ * two colour indexes to alternate between for the run */ if (*info->index) { - for (i = 0; i < *info->index && (x - sx) < width; i++, x++) - bmp_SetPix(info, x, y, *(info->index+1)); - + count = ((width - x - sx - 1) > *info->index)? *info->index : (width - x - sx - 1); + bmp_draw_line(info, y, x, count, *(info->index+1)); + x += count; info->index += 2; + /* * A leading zero is an escape; it may signal the end of the * bitmap, a cursor move, or some absolute data.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201406180633.s5I6XOR5008508>