diff options
Diffstat (limited to 'astro/xworld/files/patch-xworld.c')
-rw-r--r-- | astro/xworld/files/patch-xworld.c | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/astro/xworld/files/patch-xworld.c b/astro/xworld/files/patch-xworld.c new file mode 100644 index 000000000000..8a81ab6dc5e0 --- /dev/null +++ b/astro/xworld/files/patch-xworld.c @@ -0,0 +1,140 @@ +--- xworld.c.orig 1999-07-28 15:39:11 UTC ++++ xworld.c +@@ -63,6 +63,8 @@ + #define BORDER 5 + #define SLEEP 120 + ++#define MIN(x,y) (((x)<(y))?(x):(y)) ++ + char *MainTitle[] = {"Hello, world"}; + char *IconTitle[] = {"xworld"}; + +@@ -92,6 +94,26 @@ usage() + exit(1); + } + ++ ++static char * ++alloc_image(XImage *image) ++{ ++ char *Map; ++ int ix, iy, j; ++ Map = (char *)malloc(image->height * image->bytes_per_line); ++ if (Map == NULL) { ++ fprintf(stderr, "xworld: not enough memory\n"); ++ exit(1); ++ } ++ image->data = Map; ++ ++ for(j = 0, ix = 0; ix < image->width; ix++) ++ for (iy = 0; iy < image->height; iy++) ++ XPutPixel(image, ix, iy, j++ % NCOLORS); ++ ++ return Map; ++} ++ + int + main(int argc, char **argv) + { +@@ -305,29 +327,16 @@ main(int argc, char **argv) + xcolor[i].blue = color[i].blue; + if (XAllocColor(display, cmap, &xcolor[i]) == 0) { + fprintf(stderr, "xworld: can't allocate colors\n"); ++#if 0 + exit(-1); ++#endif + } + } + + /* + * generate startup image + */ +- Map = (char *)malloc(size*size*sizeof(char)); +- if (Map == NULL) { +- fprintf(stderr, "xworld: not enough memory\n"); +- exit(1); +- } +- +- j = 0; +- for (iy = 0; iy < size; iy++) { +- i = iy % (NCOLORS + 1); +- for (ix = 0; ix < size; ix++) { +- *(Map + j++) = xcolor[i].pixel; +- if (i++ >= NCOLORS) i = 0; +- } +- } +- +- image->data = Map; ++ Map = alloc_image(image); + + gc = XCreateGC(display, win, 0, 0); + +@@ -414,21 +423,21 @@ main(int argc, char **argv) + * Map elevations to colors + */ + if (i != SOK) { +- *(Map + j) = xcolor[BLACK].pixel; ++ XPutPixel(image, ix, iy, xcolor[BLACK].pixel); + continue; + } + if (Value > level[NLEVELS - 1]) { +- *(Map + j) = xcolor[HIGH].pixel; ++ XPutPixel(image, ix, iy, xcolor[HIGH].pixel); + continue; + } + for (i = 0; i <= NLEVELS - 1; i++) { + if (Value <= level[i]) { +- *(Map + j) = xcolor[i].pixel; ++ XPutPixel(image, ix, iy, xcolor[i].pixel); + break; + } + } + } else +- *(Map + j) = xcolor[BLACK].pixel; ++ XPutPixel(image, ix, iy, xcolor[BLACK].pixel); + } + } + XPutImage(display, win, gc, image, 0, 0, 0, 0, size, size); +@@ -444,8 +453,12 @@ main(int argc, char **argv) + ConfigureEvent = (XConfigureEvent *)&event; + size = ConfigureEvent->width; + if (ConfigureEvent->height != size) { ++#if 0 + fprintf(stderr, "xworld: error: width != height\n"); + exit(1); ++#else ++ size = MIN(size, ConfigureEvent->height); ++#endif + } + if (size != old_size) { + old_size = size; +@@ -453,28 +466,14 @@ main(int argc, char **argv) + r1 = n/2; + r2 = size/2; + XDestroyImage(image); +- free(Map); + image = XCreateImage(display, visual, depth, format, + 0, 0, size, size, bitmap_pad, 0); + if (image == NULL) { + fprintf(stderr, "xworld: can't create XImage\n"); + exit(1); + } +- Map = (char *)malloc(size*size*sizeof(char)); +- if (Map == NULL) { +- fprintf(stderr, "xworld: not enough memory\n"); +- exit(1); +- } +- image->data = Map; ++ Map = alloc_image(image); + +- j = 0; +- for (iy = 0; iy < size; iy++) { +- i = iy % (NCOLORS + 1); +- for (ix = 0; ix < size; ix++) { +- *(Map + j++) = xcolor[i].pixel; +- if (i++ >= NCOLORS) i = 0; +- } +- } + XPutImage(display, win, gc, image, 0, 0, 0, 0, + size, size); + break; |