X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fdos%2Fvidsys.c;fp=src%2Fdos%2Fvidsys.c;h=7b9f3d5114f4dc34628ea50186c8e4a4f85ac345;hb=af36400e1b3d2d591beaf66e1539884434e30475;hp=427dbb54e18a39bd1e5564a37f445feb8c6d9d3e;hpb=4e4ac855a9d53fd7dee3d640f3ab46740b991b5c;p=retroray diff --git a/src/dos/vidsys.c b/src/dos/vidsys.c index 427dbb5..7b9f3d5 100644 --- a/src/dos/vidsys.c +++ b/src/dos/vidsys.c @@ -1,10 +1,12 @@ #include #include +#include #include #include "vidsys.h" #include "vga.h" #include "drv.h" #include "cdpmi.h" +#include "logger.h" struct vid_driver *vid_drvlist[MAX_DRV]; int vid_numdrv; @@ -48,7 +50,7 @@ int vid_init(void) int newsz = max_modes ? max_modes * 2 : 128; void *tmp = realloc(modes, newsz * sizeof *modes); if(!tmp) { - fprintf(stderr, "failed to allocate modes list\n"); + errormsg("failed to allocate modes list\n"); return -1; } modes = tmp; @@ -59,18 +61,18 @@ int vid_init(void) } } - printf("found %d modes:\n", num_modes); + infomsg("found %d modes:\n", num_modes); for(i=0; idrv->name, vm->modeno, + len = infomsg("[%4s] %04x: %dx%d %dbpp", vm->drv->name, vm->modeno, vm->width, vm->height, vm->bpp); if(i + 1 >= num_modes) { - putchar('\n'); + infomsg("\n"); break; } - for(j=len; j<40; j++) putchar(' '); + for(j=len; j<40; j++) infomsg(" "); vm = modes[i + 1]; - printf("[%4s] %04x: %dx%d %dbpp\n", vm->drv->name, vm->modeno, + infomsg("[%4s] %04x: %dx%d %dbpp\n", vm->drv->name, vm->modeno, vm->width, vm->height, vm->bpp); } @@ -195,7 +197,71 @@ void vid_getpal(int idx, int count, struct vid_color *col) cur_mode->ops.getpal(idx, count, col); } -void vid_blitfb(void *fb, int vsync) +void vid_blitfb(void *fb, int pitch) { - cur_mode->ops.blitfb(fb, vsync); + if(pitch <= 0) { + pitch = cur_mode->pitch; + } + cur_mode->ops.blitfb(fb, pitch); +} + +void vid_blitfb32(uint32_t *src, int pitch) +{ + int i, j, winpos, winleft; + unsigned char *dest; + uint16_t *dest16; + + if(cur_mode->bpp == 32) { + vid_blitfb(src, pitch); + return; + } + + if(pitch <= 0) { + pitch = cur_mode->width << 2; + } + + if(vid_islinear()) { + winleft = INT_MAX; + } else { + winleft = 65536;/*cur_mode->win_size << 10;*/ + winpos = 0; + vid_setwin(0, 0); + } + + switch(cur_mode->bpp) { + case 8: + /* TODO */ + break; + + case 15: + /* TODO */ + break; + case 16: + /* TODO */ + break; + + case 24: + dest = vid_vmem; + for(i=0; iheight; i++) { + for(j=0; jwidth; j++) { + uint32_t pixel = src[j]; + if(winleft <= 0) { + winpos += cur_mode->win_step; + vid_setwin(0, winpos); + winleft = 65536;/*cur_mode->win_size << 10;*/ + dest = vid_vmem; + } + dest[0] = (pixel >> 16) & 0xff; + dest[1] = (pixel >> 8) & 0xff; + dest[2] = pixel & 0xff; + dest += 3; + winleft -= 3; + } + src = (uint32_t*)((char*)src + pitch); + } + break; + + default: + break; + } }