]> git.zerfleddert.de Git - micropolis/blobdiff - src/sim/g_bigmap.c
fix for crash when falling back from shared memory to wired mode.
[micropolis] / src / sim / g_bigmap.c
index 695cd883814e850811e6a153ee8de5d9d41989f6..2b2bb9dd04ca41d604162433f21a2ff714f1d5d8 100644 (file)
@@ -169,6 +169,15 @@ MemDrawBeegMapRect(SimView *view, int x, int y, int w, int h)
 #define ROW8_16(n) ROW4_16(n) ROW4_16(n+4)
 #define ROW16_16() ROW8_16(0) ROW8_16(8)
 
+#define ROW1_32(n) \
+      memcpy((char *)image, (char *)mem + (4 * 16 * (n)), 4 * 16); \
+      image = (unsigned QUAD *)(((unsigned char *)image) + lineBytes);
+
+#define ROW2_32(n) ROW1_32(n) ROW1_32(n+1)
+#define ROW4_32(n) ROW2_32(n) ROW2_32(n+2)
+#define ROW8_32(n) ROW4_32(n) ROW4_32(n+4)
+#define ROW16_32() ROW8_32(0) ROW8_32(8)
+
          switch (view->x->depth) {
 
          case 8:
@@ -182,6 +191,9 @@ MemDrawBeegMapRect(SimView *view, int x, int y, int w, int h)
 
          case 24:
          case 32:
+           ROW16_32();
+           break;
+
          default:
            /* XXX: handle different depths */
            break;
@@ -298,9 +310,11 @@ WireDrawBeegMapRect(SimView *view, short x, short y, short w, short h)
 
       if (tile != *ha) {
        *ha = tile;
-       XCopyArea(view->x->dpy, view->x->big_tile_pixmap, view->pixmap,
+       if (view->x->big_tile_pixmap) {
+         XCopyArea(view->x->dpy, view->x->big_tile_pixmap, view->pixmap,
                  view->x->gc, 0, tile * 16, 16, 16,
                  col * 16, row * 16);
+       }
       }
     }
     map += mm;
Impressum, Datenschutz