718a201ed4
Submitted by Vladimir Kotal <vlada@openbsd.cz>. XWorld displays a pretty picture of our earth as it would look if viewed from the direction of the sun. The window is regularly updated. You can use xworld in lieu of a clock.
142 lines
4.5 KiB
Plaintext
142 lines
4.5 KiB
Plaintext
$OpenBSD: patch-xworld_c,v 1.1.1.1 2001/08/12 11:40:23 naddy Exp $
|
|
--- xworld.c.orig Wed Jul 28 17:39:11 1999
|
|
+++ xworld.c Sat Aug 11 21:23:01 2001
|
|
@@ -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;
|