DEADSOFTWARE

software: fix crashes on buffer resize
authorDeaDDooMER <deaddoomer@deadsoftware.ru>
Thu, 2 Apr 2020 06:14:10 +0000 (10:14 +0400)
committerDeaDDooMER <deaddoomer@deadsoftware.ru>
Thu, 2 Apr 2020 06:14:10 +0000 (10:14 +0400)
src/soft/render.c
src/soft/vga.c
src/soft/vga.h

index 74a3c0f898f2a776467ecd3c134161d82fca6e1f..bda872709396df868677befde09a226678e5b2b4 100644 (file)
@@ -1361,7 +1361,7 @@ void R_set_videomode (int w, int h, int fullscreen) {
     }
   } else {
     Y_get_videomode(&SCRW, &SCRH);
-    Y_get_buffer(&buffer, &buf_w, &buf_h, &pitch);
+    V_update_buffer();
     R_setgamma(gammaa);
   }
 }
@@ -1370,7 +1370,7 @@ void R_toggle_fullscreen (void) {
   Y_set_fullscreen(!Y_get_fullscreen());
   fullscreen = Y_get_fullscreen();
   Y_get_videomode(&SCRW, &SCRH);
-  Y_get_buffer(&buffer, &buf_w, &buf_h, &pitch);
+  V_update_buffer();
   R_setgamma(gammaa);
 }
 
index ce83101ec24dbabf5d61fad05295fb9915ca5705..a747a31495e8547818539bcfca7cb35d46d3c23f 100644 (file)
@@ -64,6 +64,11 @@ vgaimg *V_loadvgaimg (char *name) {
   return V_getvgaimg(F_getresid(name));
 }
 
+void V_update_buffer (void) {
+  Y_get_buffer(&buffer, &buf_w, &buf_h, &pitch);
+  V_setrect(0, 0, buf_w, buf_h);
+}
+
 static void draw_rect (int x, int y, int w, int h, int c) {
   int i;
   int x0 = max(x, cx1);
@@ -77,6 +82,8 @@ static void draw_rect (int x, int y, int w, int h, int c) {
 }
 
 void V_setrect (short x, short w, short y, short h) {
+  assert(w >= 0);
+  assert(h >= 0);
   cx1 = max(x, 0);
   cx2 = min(x + w - 1, buf_w - 1);
   cy1 = max(y, 0);
index dc91d2b90d343fae503973b9e89c58660ec62719..eb077023c347b9a392ce7ddc9af35fb26c581308 100644 (file)
@@ -103,6 +103,7 @@ void V_remap (vgaimg *i, colormap m);
 
 void V_remap_rect (int x, int y, int w, int h, byte *cmap);
 
+void V_update_buffer (void);
 void V_rotspr (int x, int y, vgaimg* i, int d);
 void V_center (int f);
 void V_offset (int ox, int oy);