X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fdos%2Fmain.c;h=e7aae2cafe2a0bc2d339a64ca52f673696653e0e;hb=4a690a4a5268847c24e8edb08ba558a36bbd6d3c;hp=ecbba9f74b4784e62c329d7e853ade0a8a0bc388;hpb=f36f642406d972f4a6644dc9a022e7c037a801c1;p=retroray diff --git a/src/dos/main.c b/src/dos/main.c index ecbba9f..e7aae2c 100644 --- a/src/dos/main.c +++ b/src/dos/main.c @@ -18,27 +18,43 @@ along with this program. If not, see . #include #include #include +#include #include #include "app.h" #include "keyb.h" -#include "gfx.h" +#include "vidsys.h" #include "cdpmi.h" #include "mouse.h" #include "logger.h" #include "options.h" #include "cpuid.h" +#include "util.h" +#include "rtk.h" + +static INLINE int clamp(int x, int a, int b) +{ + if(x < a) return a; + if(x > b) return b; + return x; +} static void draw_cursor(int x, int y); +static void draw_rband(rtk_rect *r); static uint32_t *vmem; -static int quit, disp_pending; +static int quit, dirty_valid; +static rtk_rect dirty; +static int mx, my, prev_mx, prev_my; +static rtk_rect rband, prev_rband; + int main(int argc, char **argv) { int i; int vmidx; - int mx, my, bnstate, bndiff; - static int prev_mx = -1, prev_my, prev_bnstate; + int mdx, mdy, bnstate, bndiff; + static int prev_bnstate; + char *env; #ifdef __DJGPP__ __djgpp_nearptr_enable(); @@ -56,21 +72,24 @@ int main(int argc, char **argv) fprintf(stderr, "No mouse detected. Make sure the mouse driver is installed\n"); return 1; } - set_mouse_limits(0, 0, 639, 479); - mx = 320; - my = 240; - set_mouse(mx, my); - add_log_file("retroray.log"); + if((env = getenv("RRLOG"))) { + if(tolower(env[0]) == 'c' && tolower(env[1]) == 'o' && tolower(env[2]) == 'm' + && isdigit(env[3])) { + add_log_console(env); + } else { + add_log_file(env); + } + } - if(init_video() == -1) { + if(vid_init() == -1) { return 1; } - if((vmidx = match_video_mode(640, 480, 32)) == -1) { + if((vmidx = vid_findmode(640, 480, 32)) == -1) { return 1; } - if(!(vmem = set_video_mode(vmidx, 1))) { + if(!(vmem = vid_setmode(vmidx))) { return 1; } @@ -81,12 +100,12 @@ int main(int argc, char **argv) if(app_init() == -1) { goto break_evloop; } - disp_pending = 1; + app_redisplay(0, 0, 0, 0); app_reshape(win_width, win_height); mx = win_width / 2; my = win_height / 2; - set_mouse(mx, my); + prev_mx = prev_my = -1; for(;;) { int key; @@ -103,47 +122,39 @@ int main(int argc, char **argv) } while((key = kb_getkey()) != -1) { - app_keyboard(key, 1); + if(key == 'r' && (modkeys & KEY_MOD_CTRL)) { + app_redisplay(0, 0, 0, 0); + } else { + app_keyboard(key, 1); + } if(quit) goto break_evloop; } - bnstate = read_mouse(&mx, &my); + bnstate = read_mouse_bn(); bndiff = bnstate ^ prev_bnstate; prev_bnstate = bnstate; - if(bndiff) { - dbgmsg("bndiff: %04x\n", bndiff); - } + read_mouse_rel(&mdx, &mdy); + mx = clamp(mx + mdx, 0, win_width - 1); + my = clamp(my + mdy, 0, win_height - 1); + mdx = mx - prev_mx; + mdy = my - prev_my; if(bndiff & 1) app_mouse(0, bnstate & 1, mx, my); if(bndiff & 2) app_mouse(1, bnstate & 2, mx, my); if(bndiff & 4) app_mouse(3, bnstate & 4, mx, my); - if(prev_my == -1) { - prev_mx = mx; - prev_my = my; - } else { - draw_cursor(prev_mx, prev_my); - } - if((mx ^ prev_mx) | (my ^ prev_my)) { + if((mdx | mdy) != 0) { app_motion(mx, my); } - if(disp_pending) { - disp_pending = 0; - app_display(); - } - - draw_cursor(mx, my); - prev_mx = mx; - prev_my = my; + app_display(); app_swap_buffers(); } break_evloop: app_shutdown(); - set_text_mode(); - cleanup_video(); + vid_cleanup(); kb_shutdown(); return 0; } @@ -153,14 +164,57 @@ long app_getmsec(void) return time(0) * 1000; /* TODO */ } -void app_redisplay(void) +void app_redisplay(int x, int y, int w, int h) { - disp_pending = 1; + rtk_rect r; + + if((w | h) == 0) { + r.x = r.y = 0; + r.width = win_width; + r.height = win_height; + } else { + r.x = x; + r.y = y; + r.width = w; + r.height = h; + } + + if(dirty_valid) { + rtk_rect_union(&dirty, &r); + } else { + dirty = r; + } + dirty_valid = 1; } void app_swap_buffers(void) { - blit_frame(framebuf, opt.vsync); + if(opt.vsync) { + vid_vsync(); + } + if(dirty_valid) { + if(dirty.width < win_width || dirty.height < win_height) { + uint32_t *src = framebuf + dirty.y * win_width + dirty.x; + vid_blit32(dirty.x, dirty.y, dirty.width, dirty.height, src, 0); + } else { + vid_blitfb32(framebuf, 0); + } + dirty_valid = 0; + } + if(prev_mx >= 0) { + draw_cursor(prev_mx, prev_my); + } + draw_cursor(mx, my); + prev_mx = mx; + prev_my = my; + + if(prev_rband.width) { + draw_rband(&prev_rband); + } + if(rband.width) { + draw_rband(&rband); + } + prev_rband = rband; } void app_quit(void) @@ -180,10 +234,22 @@ void app_vsync(int vsync) { } +void app_rband(int x, int y, int w, int h) +{ + if(!(w | h)) { + w = h = 0; + } + + rband.x = x; + rband.y = y; + rband.width = w; + rband.height = h; +} + static void draw_cursor(int x, int y) { int i; - uint32_t *fbptr = framebuf + y * win_width + x; + uint32_t *fbptr = vmem + y * win_width + x; for(i=0; i<3; i++) { int offs = i + 1; @@ -193,3 +259,31 @@ static void draw_cursor(int x, int y) if(x < win_width - offs - 1) fbptr[offs] ^= 0xffffff; } } + +static void draw_rband(rtk_rect *r) +{ + int i; + rtk_rect rect; + uint32_t *fbptr, *bptr; + + rect = *r; + rtk_fix_rect(&rect); + + if(rect.width <= 0 || rect.height <= 0) { + return; + } + + fbptr = vmem + rect.y * win_width + rect.x; + bptr = fbptr + win_width * (rect.height - 1); + + for(i=0; i