v12i002: Starchart 3.2 update to 3.2.1 part 2/4
ccount at ATHENA.MIT.EDU
ccount at ATHENA.MIT.EDU
Sat Apr 14 09:01:28 AEST 1990
Posting-number: Volume 12, Issue 2
Submitted-by: ccount at ATHENA.MIT.EDU
Archive-name: starchart2/part02
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 2 (of 4)."
# Contents: stch_pch.ab
# Wrapped by ccount at e40-008-10 on Wed Apr 4 19:12:05 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'stch_pch.ab' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'stch_pch.ab'\"
else
echo shar: Extracting \"'stch_pch.ab'\" \(34904 characters\)
sed "s/^X//" >'stch_pch.ab' <<'END_OF_FILE'
X+ int vtick_lim = 2;
X+ int vtext_lim = 20;
X+ int vtext_xoff = 24;
X+ int vtext_yoff = 0;
X+
X+ /* externs for labels */
X+ int x_nameoffset = 10, y_nameoffset = 0;
X+ int x_lbloffset = 0, y_lbloffset = 10;
X+ int x_magoffset = 7, y_magoffset = -15;
X+
X+ /* externs for legend: variables of positioning are here */
X+ int l_til = 220;
X+ int l_stil = 185;
X+
X+ int l_lmar1 = 40;
X+ int l_lmar2 = 65;
X+ int l_ltext = 95;
X+ int l_rmar1 = 205;
X+ int l_rmar2 = 230;
X+ int l_rtext = 260;
X+
X+ int l_line1 = 150;
X+ int l_line2 = 125;
X+ int l_line3 = 100;
X+ int l_line4 = 75;
X+ int l_line5 = 50;
X+ int l_line6 = 25;
X+
X+ /* Point sizes for font calls */
X+ int titlesize = 16;
X+ int subtlsize = 12;
X+ int namesize = 10;
X+ int lblsize = 8;
X+ int magsize = 8;
X+
X+ /* Fonts for font calls */
X+ int namefnt = TIMESROMAN;
X+ int lblfnt = HELV;
X+ int magfnt = COURIER;
X+ int titlefnt = TIMESBOLD;
X+ int subtlfnt = TIMESROMAN;
X+
X+ /*
X+ * Scale multiplier, minimum, mangitude change, maximum, for thumbnail,
X+ */
X+ double th_smul = THSMUL;
X+ double th_smin = THSMIN;
X+ double th_madj = THMADJ;
X+ double th_mmax = THMMAX;
X+
X+ #define MAX(a,b) ((a)>(b)?(a):(b))
X+ #define MIN(a,b) ((a)<(b)?(a):(b))
X+
X+ int star_size_adj = 0;
X+ int alwayslabel = 0;
X+
X+ /*
X+ * Generic Star Drawing Stuff
X+ */
X+
X+
X+ int n, oldmode, currentcolor;
X+ union REGS rg;
X+
X+
X+ /* Override graphics mode */
X+ D_control_arg(s)
X+ char *s;
X+ {
X+ int c, i, j;
X+ i = 0;
X+ j = 1;
X+ while (c = s[i++]) {
X+ if (c == 'D') {
X+ if (s[i] == '-') {
X+ j = -1;
X+ i++;
X+ } else if (s[i] == '+')
X+ i++;
X+ star_size_adj = s[i] - '0';
X+ if (star_size_adj < 0 || star_size_adj > 9)
X+ star_size_adj = 0;
X+ star_size_adj *= j;
X+ }
X+ if (c == 'X')
X+ alwayslabel = 1;
X+ }
X+ }
X+
X+ extern int readstar();
X+ extern int (*readfile) ();
X+
X+ struct IRGB {
X+ int i;
X+ int r;
X+ int g;
X+ int b;
X+ };
X+
X+ struct IRGB irgb[16] = {
X+ {0, 0, 0, 0},
X+ {1, 22, 22, 63},
X+ {2, 33, 33, 56},
X+ {3, 44, 44, 40},
X+ {4, 49, 49, 33},
X+ {5, 47, 47, 20},
X+ {20, 48, 29, 13},
X+ {7, 45, 45, 45},
X+ {56, 48, 15, 5},
X+ {57, 40, 0, 0},
X+ {58, 18, 18, 18},
X+ {59, 27, 27, 27},
X+ {60, 50, 0, 63},
X+ {61, 0, 60, 25},
X+ {62, 60, 29, 29},
X+ {63, 60, 60, 60}
X+ };
X+
X+ #define COLOR_BLACK 0
X+ #define COLOR_O_STAR 1
X+ #define COLOR_B_STAR 2
X+ #define COLOR_A_STAR 3
X+ #define COLOR_F_STAR 4
X+ #define COLOR_G_STAR 5
X+ #define COLOR_K_STAR 6
X+ #define COLOR_DEFTEXT 7
X+ #define COLOR_M_STAR 8
X+ #define COLOR_RED 9
X+ #define COLOR_DARKGRAY 10
X+ #define COLOR_LIGHTGRAY 11
X+ #define COLOR_VIOLET 12
X+ #define COLOR_GREEN 13
X+ #define COLOR_PINK 14
X+ #define COLOR_WHITE 15
X+
X+ #ifndef PLAIN_VGA
X+ #define NUM_HORPIXELS 800
X+ #define NUM_VERTPIXELS 600
X+ #define MODE_SET 98
X+ #else
X+ #define NUM_HORPIXELS 640
X+ #define NUM_VERTPIXELS 480
X+ #define MODE_SET 18
X+ #endif
X+
X+
X+
X+
X+ /* Planetary images */
X+
X+ char *Sun[] = {
X+ " ",
X+ " * ",
X+ " ***** ",
X+ "** ** ",
X+ "** * ** ",
X+ "** ** ",
X+ " ***** ",
X+ " * ",
X+ " ",
X+ NULL
X+ };
X+
X+ unsigned char xSun[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ char *Luna[] = {
X+ " ** ",
X+ " *** ",
X+ " *** ",
X+ " ** **",
X+ " ** **",
X+ " ** **",
X+ " *** ",
X+ " *** ",
X+ " ** ",
X+ NULL
X+ };
X+ unsigned char xLuna[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+
X+ char *Mercury[] = {
X+
X+ "** **",
X+ " **** ",
X+ "** **",
X+ "** **",
X+ "** **",
X+ " **** ",
X+ " ** ",
X+ " **** ",
X+ " ** ",
X+ NULL
X+ };
X+
X+ unsigned char xMercury[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ char *Venus[] = {
X+ " ** ",
X+ " **** ",
X+ "** **",
X+ "** **",
X+ "** **",
X+ " **** ",
X+ " ** ",
X+ " **** ",
X+ " ** ",
X+ NULL
X+ };
X+ unsigned char xVenus[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ char *Mars[] = {
X+ " **** ",
X+ " *** ",
X+ " *** ",
X+ " ** * ",
X+ " ** ",
X+ " ***** ",
X+ "** ** ",
X+ "** ** ",
X+ " ***** ",
X+ NULL
X+ };
X+ unsigned char xMars[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ char *Jupiter[] = {
X+ " ** ",
X+ "**** **",
X+ " ** ** ",
X+ " ** ** ",
X+ " ** ** ",
X+ " ** ** ",
X+ " ***** ",
X+ " ** ",
X+ " ** ",
X+ NULL
X+ };
X+ unsigned char xJupiter[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ char *Saturn[] = {
X+ " **** ",
X+ " ** ",
X+ " ** ",
X+ " ***** ",
X+ " ** **",
X+ " ** ** ",
X+ " ** ** ",
X+ " ** **",
X+ " *",
X+ NULL
X+ };
X+ unsigned char xSaturn[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ char *Uranus[] = {
X+ " ** ",
X+ " ****** ",
X+ "** ** **",
X+ " ** ",
X+ " ****** ",
X+ "** **",
X+ "** ** **",
X+ "** **",
X+ " ****** ",
X+ NULL
X+ };
X+ unsigned char xUranus[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ char *Neptune[] = {
X+ " ",
X+ "** ** **",
X+ "** ** **",
X+ "** ** **",
X+ "** ** **",
X+ " ****** ",
X+ " ** ",
X+ " **** ",
X+ " ** ",
X+ NULL
X+ };
X+ unsigned char xNeptune[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ char *Pluto[] = {
X+ "****** ",
X+ "** ** ",
X+ "** **",
X+ "** ** ",
X+ "****** ",
X+ "** ",
X+ "** ",
X+ "** ",
X+ "********",
X+ NULL
X+ };
X+ unsigned char xPluto[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ char *Comet[] = {
X+ " ",
X+ " ***",
X+ " *** ",
X+ " *** ",
X+ "********",
X+ "********",
X+ " *** ",
X+ " *** ",
X+ " ***",
X+ NULL
X+ };
X+ unsigned char xComet[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ char *Aster[] = {
X+ " ",
X+ "* * ",
X+ "* * ",
X+ " * * * ",
X+ " *** ",
X+ " *** ",
X+ " * * * ",
X+ "* * ",
X+ "* * ",
X+ NULL
X+ };
X+ unsigned char xAster[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ /* Galaxy images */
X+
X+ char *Gal_E[] = {
X+ " ",
X+ "** ",
X+ "**** ",
X+ " **** ",
X+ " ***** ",
X+ " ***** ",
X+ " **** ",
X+ " ****",
X+ " **",
X+ NULL
X+ };
X+ unsigned char xGal_E[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ char *Gal_S[] = {
X+ " ",
X+ " *** ",
X+ " * * ",
X+ " ** ",
X+ " **** ",
X+ " ** ",
X+ " * * ",
X+ " *** ",
X+ " ",
X+ NULL
X+ };
X+ unsigned char xGal_S[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ /* Cluster images */
X+
X+ char *Clu_G[] = {
X+ " ",
X+ " * ",
X+ " * * ",
X+ " * ",
X+ "* *** * ",
X+ " * ",
X+ " * * ",
X+ " * ",
X+ " ",
X+ NULL
X+ };
X+ unsigned char xClu_G[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ char *Clu_O[] = {
X+ " ",
X+ " * ",
X+ " * * ",
X+ " ",
X+ "* * ",
X+ " ",
X+ " * * ",
X+ " * ",
X+ " ",
X+ NULL
X+ };
X+ unsigned char xClu_O[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ /* Nebula images */
X+
X+ char *Neb_D[] = {
X+ " ",
X+ "******* ",
X+ "* * ",
X+ "* * ",
X+ "* * ",
X+ "* * ",
X+ "* * ",
X+ "******* ",
X+ " ",
X+ NULL
X+ };
X+ unsigned char xNeb_D[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ char *Neb_P[] = {
X+ " ",
X+ " * ",
X+ " * * * ",
X+ " * ",
X+ "******* ",
X+ " * ",
X+ " * * * ",
X+ " * ",
X+ " ",
X+ NULL
X+ };
X+ unsigned char xNeb_P[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ /* Other images */
X+
X+ char *Unk_U[] = {
X+ " ",
X+ " *** ",
X+ " * * ",
X+ " * * ",
X+ " * ",
X+ " * ",
X+ " * ",
X+ " ",
X+ " * ",
X+ NULL
X+ };
X+ unsigned char xUnk_U[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ char *Other_O[] = {
X+ " ",
X+ " ",
X+ "* * * ",
X+ " * * * ",
X+ "* * * ",
X+ " * * * ",
X+ "* * * ",
X+ " * * * ",
X+ " ",
X+ NULL
X+ };
X+ unsigned char xOther_O[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ char *C300[] = {
X+ "* ** ",
X+ " ***** ",
X+ " ** ",
X+ " ** ",
X+ " ** ",
X+ " ** ",
X+ " **** ",
X+ " ** ",
X+ " ** ",
X+ NULL
X+ };
X+ unsigned char xC300[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ char *C305[] = {
X+ "* **** ",
X+ " * ",
X+ " *** ",
X+ "** ",
X+ "** ",
X+ " ** ",
X+ " *** ",
X+ " ** ",
X+ " ** ",
X+ NULL
X+ };
X+ unsigned char xC305[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ char *C301[] = {
X+ " ",
X+ "** ",
X+ "****** ",
X+ "** ** ",
X+ "** ** ",
X+ "** ** ",
X+ " ** ",
X+ " ** ",
X+ " ** ",
X+ NULL
X+ };
X+ unsigned char xC301[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ char *C302[] = {
X+ " ",
X+ " ",
X+ " ",
X+ " *** ",
X+ " ** ",
X+ " ** ",
X+ " ** ",
X+ " ** ",
X+ " *** ",
X+ NULL
X+ };
X+ unsigned char xC302[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ char *C303[] = {
X+ " ",
X+ " ",
X+ "** ** ",
X+ "** ** ",
X+ "** ** ",
X+ "**** ",
X+ "** ** ",
X+ "** ** ",
X+ "** ** ",
X+ NULL
X+ };
X+ unsigned char xC303[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ char *C304[] = {
X+ "** ",
X+ " ** ",
X+ " ** ",
X+ " ** ",
X+ " ** ",
X+ " ** ",
X+ " **** ",
X+ " ** ** ",
X+ "** **",
X+ NULL
X+ };
X+ unsigned char xC304[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ char *C306[] = {
X+ " ",
X+ " **** ",
X+ " ** ** ",
X+ "** ** ",
X+ "** ** ",
X+ "** ** ",
X+ "***** ",
X+ "** ",
X+ "** ",
X+ NULL
X+ };
X+ unsigned char xC306[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ char *C307[] = {
X+ "* * * ",
X+ "* * * ",
X+ "* * * ",
X+ "* * * ",
X+ " * * * ",
X+ " *** ",
X+ " * ",
X+ " * ",
X+ " * ",
X+ NULL
X+ };
X+ unsigned char xC307[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+ char *C308[] = {
X+ " ",
X+ " ",
X+ " ",
X+ " * * ",
X+ "** ** ",
X+ "** * ** ",
X+ "** * ** ",
X+ "** * ** ",
X+ " ***** ",
X+ NULL
X+ };
X+ unsigned char xC308[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
X+
X+
X+
X+ void cimage(char **, unsigned char *);
X+
X+ void
X+ cimage(char **in, unsigned char *out)
X+ {
X+ int i, j, bits;
X+
X+ for (i = 0; i < 9; i++) {
X+ bits = 0;
X+ if (in[i][0] == '*')
X+ bits |= 128;
X+ if (in[i][1] == '*')
X+ bits |= 64;
X+ if (in[i][2] == '*')
X+ bits |= 32;
X+ if (in[i][3] == '*')
X+ bits |= 16;
X+ if (in[i][4] == '*')
X+ bits |= 8;
X+ if (in[i][5] == '*')
X+ bits |= 4;
X+ if (in[i][6] == '*')
X+ bits |= 2;
X+ if (in[i][7] == '*')
X+ bits |= 1;
X+ out[i] = bits;
X+ }
X+ }
X+ void dimage(int, int, unsigned char *);
X+
X+
X+
X+ int firsttimethrough = 1;
X+
X+
X+
X+
X+ /* Open the device */
X+ int
X+ D_open()
X+ {
X+ int i;
X+ float aspect;
X+ int limit;
X+
X+ readfile = readstar; /* No memory to spare on PC */
X+
X+ rg.h.ah = 0x0f;
X+ int86(16, &rg, &rg);
X+ oldmode = rg.h.al;
X+ if (MODE_SET == 18) {
X+ rg.x.ax = 18;
X+ } else if (MODE_SET == 98) { /* This will need to be changed for
X+ * other video cards */
X+ rg.x.ax = 0x6f05;
X+ rg.h.bl = 98;
X+ } else
X+ exit(1);
X+ int86(16, &rg, &rg);
X+
X+
X+ setmod(MODE_SET);
X+
X+
X+ /*
X+ * This next bit resets the VGA pallette registers to nice values. Since
X+ * the EGA doesn't have these registers, this program won't work there.
X+ * You could get it to work by dropping this "for" loop and changing the
X+ * #defines for the colors, and using graphics mode 16 (decimal). There
X+ * are 64 colors in an EGA, which probably will be enough. Use the BIOS
X+ * to set them.
X+ */
X+
X+ for (i = 0; i < 16; i++) {
X+ outp(0x3c8, irgb[i].i);
X+ outp(0x3c9, irgb[i].r);
X+ outp(0x3c9, irgb[i].g);
X+ outp(0x3c9, irgb[i].b);
X+ }
X+
X+ setcolor(COLOR_DEFTEXT);
X+
X+ yscale1 = NUM_VERTPIXELS - 1;
X+ yscale2 = (long) (13 * NUM_VERTPIXELS);
X+ xscale1 = (long) (0.5 + 0.9765625 * NUM_HORPIXELS);
X+ xlast = 0;
X+ ylast = yscale1;
X+ aspect = 1.;
X+ for (i = 0; i < 7; ++i) {
X+ if (yrad[i] < 1) {
X+ yrad[i] = 1;
X+ }
X+ }
X+ return TRUE;
X+ }
X+
X+ int
X+ setcolor(c)
X+ int c;
X+ {
X+ currentcolor = c;
X+ }
X+
X+ /* Close the device */
X+ D_close()
X+ {
X+ /* wait for keystroke */
X+ getch();
X+ /* reset screen */
X+ rg.x.ax = oldmode;
X+ int86(16, &rg, &rg);
X+ }
X+
X+ int cur__x, cur__y;
X+
X+ /* Move to (x, y) */
X+ D_move(x, y)
X+ int x, y;
X+ {
X+ cur__x = scx(x);
X+ cur__y = scy(y);
X+ }
X+
X+
X+ /* Draw a line of style line_style from the current point to (x, y) */
X+ /* Note, this replaces vecdraw vecdrawdot and vecdrawhyph */
X+ D_draw(x, y, line_style)
X+ int x, y;
X+ int line_style; /* SOLID, DOTTED, DASHED, etc. */
X+ {
X+ unsigned short ls;
X+ int tx, ty;
X+
X+ switch (line_style) {
X+ case SOLID:
X+ case VECSOLID:
X+ ls = COLOR_DEFTEXT;
X+ break;
X+ case DOTTED:
X+ case VECDOT:
X+ ls = COLOR_LIGHTGRAY;
X+ break;
X+ case DASHED:
X+ case VECDASH:
X+ ls = COLOR_DARKGRAY;
X+ }
X+ zsetup();
X+ zline(cur__x, cur__y, (tx = scx(x)), (ty = scy(y)), ls);
X+ curmod();
X+ cur__x = tx;
X+ cur__y = ty;
X+ }
X+ /*
X+ * This routine is encouraged to look at the extern cur_funtion and change
X+ * the line style drawn as desired
X+ */
X+
X+
X+ /* Move to (x1, y1) then draw a line of style line_style to (x2, y2) */
X+ D_movedraw(x1, y1, x2, y2, line_style)
X+ int x1, y1, x2, y2;
X+ int line_style; /* SOLID, DOTTED, DASHED, etc. */
X+ {
X+ D_move(x1, y1);
X+ D_draw(x2, y2, line_style);
X+ }
X+
X+
X+ /* Set the color to be used for lines and text */
X+ /*
X+ * color_str is a 2 char (+ '\0') string containing a specification for a
X+ * color, e.g. "G2" for the color of a star of spectral class G2, or "r7" for
X+ * red, level seven. The interpretation of the color string is left to the
X+ * device driver
X+ */
X+ D_color(color_str)
X+ char *color_str;
X+ {
X+ switch (color_str[0]) {
X+ case 'O':
X+ case 'b':
X+ setcolor(COLOR_O_STAR);
X+ break;
X+ case 'B':
X+ setcolor(COLOR_B_STAR);
X+ break;
X+ case 'A':
X+ setcolor(COLOR_A_STAR);
X+ break;
X+ case 'F':
X+ setcolor(COLOR_F_STAR);
X+ break;
X+ case 'y':
X+ case 'G':
X+ setcolor(COLOR_G_STAR);
X+ break;
X+ case 'K':
X+ case 'o':
X+ setcolor(COLOR_K_STAR);
X+ break;
X+ case 'M':
X+ setcolor(COLOR_M_STAR);
X+ break;
X+ case 'r':
X+ case 'C':
X+ case 'R':
X+ case 'N':
X+ case 'S':
X+ setcolor(COLOR_RED);
X+ break;
X+ case 'g':
X+ case 'c':
X+ setcolor(COLOR_GREEN);
X+ break;
X+ case 'p':
X+ setcolor(COLOR_VIOLET);
X+ break;
X+ case 16:
X+ setcolor(COLOR_PINK);
X+ break;
X+ default:
X+ setcolor(COLOR_DEFTEXT);
X+ break;
X+ }
X+ }
X+
X+
X+ /* Set the font and font size to be used for text. */
X+ /* Note order of args */
X+ D_fontsize(fsize, font)
X+ int fsize; /* Size of font */
X+ int font; /* e.g. TIMES, HELV, TIMES+ITALIC */
X+ {
X+ }
X+ /*
X+ * This routine is encouraged to look at the extern cur_funtion and change
X+ * the font used as desired
X+ */
X+
X+
X+ /*
X+ * Fill in one character using the 8x8 character table that BIOS uses to
X+ * write chars in graphics mode. Advance the xlast value by 8 bits.
X+ */
X+ one_char(c)
X+ int c;
X+ {
X+ char far *xtab;
X+ int i, j;
X+ int x, y;
X+
X+
X+ if ((c < 0)) {
X+ xlast += 8;
X+ return;
X+ }
X+ y = ylast - 4;
X+ x = xlast + 7;
X+ if (c < 300) {
X+ slettr(x, y, c, 7);
X+ } else {
X+ switch (c) {
X+ case 300:
X+ symbol(x, y, 9, 7, xC300);
X+ break;
X+ case 301:
X+ symbol(x, y, 9, 7, xC301);
X+ break;
X+ case 302:
X+ symbol(x, y - 2, 9, 7, xC302);
X+ break;
X+ case 303:
X+ symbol(x, y - 2, 9, 7, xC303);
X+ break;
X+ case 304:
X+ symbol(x, y - 2, 9, 7, xC304);
X+ xlast += 1;
X+ break;
X+ case 305:
X+ symbol(x, y, 9, 7, xC305);
X+ break;
X+ case 306:
X+ symbol(x, y - 2, 9, 7, xC306);
X+ break;
X+ case 307:
X+ symbol(x, y - 1, 9, 7, xC307);
X+ break;
X+ case 308:
X+ symbol(x, y - 2, 9, 7, xC308);
X+ xlast += 1;
X+ break;
X+ default:
X+ break;
X+ }
X+ }
X+ xlast += 8;
X+ }
X+
X+ static int intable[25] = {'a', 'b', 'g', 'd', 'e', 'z', 'h', 'q',
X+ 'i', 'k', 'l', 'm', 'n', 'x', 'o', 'p', 'r', 's', 't',
X+ 'u', 'j', 'c', 'y', 'w', 'f'};
X+ static int outtable[25] = {224, 225, 226, 235, 238, 300, 301, 233,
X+ 302, 303, 304, 230, 'v', 305, 'o', 227, 306, 229, 231,
X+ 'u', 237, 'x', 307, 308, 237};
X+
X+ greekfirsttime = 1;
X+
X+ /*
X+ * Display text string str at x,y, in current font and font size, using greek
X+ * characters (if possible) if gk_flag is TRUE
X+ */
X+ D_text(x, y, str, gk_flag)
X+ int x, y;
X+ char *str;
X+ int gk_flag;
X+ {
X+ int c, i;
X+ zsetup();
X+
X+ if (greekfirsttime) {
X+ cimage(C300, xC300);
X+ cimage(C301, xC301);
X+ cimage(C302, xC302);
X+ cimage(C303, xC303);
X+ cimage(C304, xC304);
X+ cimage(C305, xC305);
X+ cimage(C306, xC306);
X+ cimage(C307, xC307);
X+ cimage(C308, xC308);
X+ greekfirsttime = 0;
X+ }
X+ if (gk_flag == 2)
X+ gk_flag = 0;
X+ xlast = scx(x);
X+ ylast = scy(y);
X+ if (!gk_flag) {
X+ while ((c = *str++) != '\0') {
X+ one_char(c);
X+ }
X+ } else {
X+ if (isgreek(str[0]) && (isdigit(str[1]) || (str[1] == ' '))) {
X+ /*
X+ * Greek if first character is greek encoded, and the second is
X+ * space or a digit
X+ */
X+ c = 0;
X+ for (i = 0; i < 25; i++) {
X+ if (intable[i] == str[0]) {
X+ c = outtable[i];
X+ break;
X+ }
X+ }
X+ if (c) {
X+ one_char(c);
X+ one_char(str[1]);
X+ }
X+ } else { /* Star label, but not greek */
X+ /* remove leading spaces */
X+ while (*str == ' ')
X+ str++;
X+ while ((c = *str++) != '\0')
X+ one_char(c);
X+ }
X+
X+
X+
X+
X+ }
X+
X+ curmod();
X+
X+ }
X+
X+ isgreek(c)
X+ char c;
X+ {
X+ char *cp;
X+
X+ cp = "abgdezhqiklmnxoprstujcywf"; /* f and j are both phi */
X+ while (*cp && (*cp != c))
X+ cp++;
X+ return (*cp != '\0'); /* True if letter was in greek string */
X+ }
X+
X+
X+ /* Return input coordinate in device coords where there are pointing devices */
X+ D_inxy(x, y)
X+ int *x, *y;
X+ {
X+ }
X+
X+
X+ /*
X+ * Put non-displayed comment in output. Allowed in postscript, but few other
X+ * drivers will be able to support this.
X+ */
X+ D_comment(str)
X+ char *str;
X+ {
X+ /*
X+ * fprintf(stderr, "%s\n", str);
X+ */
X+ }
X+
X+ drawlen(x, y, dx, dy, len)
X+ {
X+ int x1, x2, y1;
X+
X+ x1 = x + dx * 2;
X+ y1 = y + dy * 2;
X+ x2 = x1 + len * 2 - 1;
X+ x1 = scx(x1);
X+ y1 = scy(y1);
X+ x2 = scx(x2);
X+ zsetup();
X+ zline(x2, y1, x1, y1, currentcolor);
X+ curmod();
X+ cur__x = x2;
X+ cur__y = y1;
X+ }
X+
X+
X+
X+ /* Interface Function */
X+ /* Draw object at x, y. properties set by other parameters */
X+ drawobj(x, y, mag, type, color_str, label_field, con_str, obj_name,
X+ comment_str, file_line,
X+ draw_glyph, draw_text, use_lbl, use_name, use_mag)
X+ int x, y;
X+ double mag; /* Magnitude of object */
X+ char *type; /* 2 chars, object code and subcode */
X+ char *color_str; /* 2 chars, spectral type for stars, color
X+ * code otherwise */
X+ char *label_field; /* 2 chars, Bayer or flamsteed for
X+ * stars, size in seconds for nebulae
X+ * and planets */
X+ char *con_str; /* 3 chars, the constellation the object is
X+ * in */
X+ char *obj_name; /* Name of object */
X+ char *comment_str; /* Comment field */
X+ char *file_line; /* The full line from the file, containing
X+ * the above if it is in standard format */
X+ int draw_glyph; /* Draw object symbol */
X+ int draw_text; /* Draw text */
X+ int use_lbl; /* Label object with the label_field string */
X+ int use_name; /* Label object with the obj_name string */
X+ int use_mag; /* Label object with a 2 or 3 character
X+ * string containing the magnitude * 10
X+ * without decimal point */
X+ {
X+ char magstr[10];
X+
X+
X+ if (firsttimethrough) {
X+ cimage(Sun, xSun);
X+ cimage(Luna, xLuna);
X+ cimage(Mercury, xMercury);
X+ cimage(Venus, xVenus);
X+ cimage(Mars, xMars);
X+ cimage(Jupiter, xJupiter);
X+ cimage(Saturn, xSaturn);
X+ cimage(Uranus, xUranus);
X+ cimage(Neptune, xNeptune);
X+ cimage(Pluto, xPluto);
X+ cimage(Comet, xComet);
X+ cimage(Aster, xAster);
X+ cimage(Gal_E, xGal_E);
X+ cimage(Gal_S, xGal_S);
X+ cimage(Clu_G, xClu_G);
X+ cimage(Clu_O, xClu_O);
X+ cimage(Neb_D, xNeb_D);
X+ cimage(Neb_P, xNeb_P);
X+ cimage(Unk_U, xUnk_U);
X+ cimage(Other_O, xOther_O);
X+
X+ firsttimethrough = 0;
X+ }
X+ /*
X+ * fprintf(stderr, "%d %d %f <%s> <%s> <%s> <%s> <%s> <%s> <%s>\n", x, y,
X+ * mag, type, color_str, label_field, con_str, obj_name, comment_str,
X+ * file_line);
X+ */
X+
X+ if (draw_glyph)
X+ switch (type[0]) {
X+ case 'S':
X+ drawStar(x, y, mag, type[1], color_str);
X+ break;
X+ case 'P':
X+ drawPlan(x, y, mag, type[1], color_str, size_obj(label_field),
X+ comment_str);
X+ goto extraname;
X+ /*
X+ * I, J. D. McDonald, have sworn to include a "goto" in every
X+ * program I write. This is a perfect use of one.
X+ */
X+ case 'N':
X+ drawNebu(x, y, mag, type[1], color_str, size_obj(label_field));
X+ goto extraname;
X+ case 'G':
X+ drawGalx(x, y, mag, type[1], color_str, size_obj(label_field));
X+ goto extraname;
X+ case 'C':
X+ drawClus(x, y, mag, type[1], color_str, size_obj(label_field));
X+ extraname:
X+ if (alwayslabel) {
X+ draw_text = 1;
X+ use_name = 1;
X+ }
X+ break;
X+ case 'U':
X+ drawUnknown(x, y, mag, type[1], color_str, size_obj(label_field));
X+ break;
X+ case 'O':
X+ drawOther(x, y, mag, type[1], color_str, size_obj(label_field));
X+ break;
X+ case 'V':
X+ case 'A':
X+ case 'I':
X+ break;
X+ case '#':
X+ default:
X+ break;
X+ };
X+
X+
X+ /*
X+ * use name or label
X+ */
X+ if (draw_text) {
X+ if (type[0] == 'I')
X+ D_color(color_str);
X+ else
X+ D_color(" ");
X+
X+ if (use_name && obj_name[0]) {
X+ D_fontsize(namesize, namefnt);
X+ D_text(x + x_nameoffset, y + y_nameoffset, obj_name, FALSE);
X+ } else if (use_lbl &&
X+ ((label_field[0] != ' ') || (label_field[1] != ' '))) {
X+ D_fontsize(lblsize, lblfnt);
X+ D_text(x + x_lbloffset, y + y_lbloffset, label_field, TRUE);
X+ }
X+ /* If you want to mag label other objects, change this */
X+ if (use_mag && (type[0] == 'S')) {
X+ sprintf(magstr, "%02d", (int) (mag * 10.0 + 0.5));
X+ D_fontsize(magsize, magfnt);
X+ D_text(x + x_magoffset, y + y_magoffset, magstr, FALSE);
X+ }
X+ }
X+ }
X+
X+ drawStar(x, y, mag, type, color)
X+ int x, y;
X+ double mag;
X+ char type, *color;
X+ {
X+ int *coord;
X+ int i;
X+ int i_mag;
X+ int maxlen;
X+
X+ mag -= star_size_adj;
X+
X+ if (mag < MIN_MAG) {
X+ mag = MIN_MAG;
X+ } else if (mag > MAX_MAG) {
X+ mag = MAX_MAG;
X+ }
X+
X+ i_mag = 9 - (int)(mag + 0.5);
X+
X+ D_color(color);
X+
X+ x = scx(x);
X+ y = scy(y);
X+ zsetup();
X+ if (i_mag > 1)
X+ fillelip(x, y, i_mag, i_mag, currentcolor);
X+ else if (i_mag == -2)
X+ zpoint(x, y, currentcolor);
X+ else if (i_mag == -1)
X+ zline(x, y, x+1, y, currentcolor);
X+ else if (i_mag == 0)
X+ fillelip(x,y,1,1,currentcolor);
X+ else
X+ rectfill(x-1,y-1,x+1,y+1,currentcolor);
X+
X+ if (type == 'D' && i_mag > 2) {
X+ zline(x - i_mag - 2, y, x + i_mag + 2, y, currentcolor);
X+ }
X+ if (type == 'V' && i_mag > 3) {
X+ ellipse(x, y, i_mag - 2, i_mag - 2, 0);
X+ }
X+ curmod();
X+ D_color(" ");
X+ }
X+
X+
X+ drawPlan(x, y, mag, pcode, color, plansize, comment_str)
X+ int x, y;
X+ double mag;
X+ char pcode, *color;
X+ long plansize;
X+ char *comment_str;
X+ {
X+
X+ D_color(color);
X+ zsetup();
X+ switch (pcode) {
X+ case 'S':
X+ symbol((int) scx(x) - 3, (int) scy(y) - 4, 9, currentcolor, xSun);
X+ break;
X+ case 'L':
X+ symbol((int) scx(x) - 3, (int) scy(y) - 4, 9, currentcolor, xLuna);
X+ break;
X+ case 'M':
X+ symbol((int) scx(x) - 3, (int) scy(y) - 4, 9, currentcolor, xMercury);
X+ break;
X+ case 'V':
X+ symbol((int) scx(x) - 3, (int) scy(y) - 4, 9, currentcolor, xVenus);
X+ break;
X+ case 'm':
X+ symbol((int) scx(x) - 3, (int) scy(y) - 4, 9, currentcolor, xMars);
X+ break;
X+ case 'J':
X+ symbol((int) scx(x) - 3, (int) scy(y) - 4, 9, currentcolor, xJupiter);
X+ break;
X+ case 's':
X+ symbol((int) scx(x) - 3, (int) scy(y) - 4, 9, currentcolor, xSaturn);
X+ break;
X+ case 'U':
X+ symbol((int) scx(x) - 3, (int) scy(y) - 4, 9, currentcolor, xUranus);
X+ break;
X+ case 'N':
X+ symbol((int) scx(x) - 3, (int) scy(y) - 4, 9, currentcolor, xNeptune);
X+ break;
X+ case 'P':
X+ symbol((int) scx(x) - 3, (int) scy(y) - 4, 9, currentcolor, xPluto);
X+ break;
X+ case 'C':
X+ symbol((int) scx(x) - 3, (int) scy(y) - 4, 9, currentcolor, xComet);
X+ break;
X+ case 'A':
X+ symbol((int) scx(x) - 3, (int) scy(y) - 4, 9, currentcolor, xAster);
X+ break;
X+ default:
X+ symbol((int) scx(x) - 3, (int) scy(y) - 4, 9, currentcolor, xUnk_U);
X+ break;
X+ }
X+ curmod();
X+ }
X+
X+
X+ drawGalx(x, y, mag, type, color, nebsize)
X+ int x, y;
X+ double mag;
X+ char type, *color;
X+ long nebsize; /* -1 should give default size */
X+ {
X+ D_color(color);
X+
X+ zsetup();
X+ switch (type) {
X+ case 'a':
X+ case 'b':
X+ case 'c':
X+ case 'd':
X+ case 'B':
X+ case 'S':
X+ case 'O':
X+ case 'Q':
X+ case 'I':
X+ symbol((int) scx(x) - 3, (int) scy(y) - 4, 9, currentcolor, xGal_S);
X+ break;
X+ default:
X+ symbol((int) scx(x) - 3, (int) scy(y) - 4, 9, currentcolor, xGal_E);
X+
X+ }
X+ curmod();
X+
X+ }
X+
X+ drawClus(x, y, mag, type, color, nebsize)
X+ int x, y;
X+ double mag;
X+ char type, *color;
X+ long nebsize; /* -1 should give default size */
X+ {
X+ D_color(color);
X+ zsetup();
X+ switch (type) {
X+ case 'G':
X+ symbol((int) scx(x) - 3, (int) scy(y) - 4, 9, currentcolor, xClu_G);
X+ break;
X+ default:
X+ symbol((int) scx(x) - 3, (int) scy(y) - 4, 9, currentcolor, xClu_O);
X+
X+ }
X+ curmod();
X+ }
X+
X+ drawNebu(x, y, mag, type, color, nebsize)
X+ int x, y;
X+ double mag;
X+ char type, *color;
X+ long nebsize; /* -1 should give default size */
X+ {
X+
X+ if (color[0] == ' ') {
X+ if (type == 'P')
X+ color[0] = 'g';
X+ else
X+ color[0] = 16;
X+ }
X+ D_color(color);
X+
X+ zsetup();
X+ switch (type) {
X+ case 'P':
X+ symbol((int) scx(x) - 3, (int) scy(y) - 4, 9, currentcolor, xNeb_P);
X+ break;
X+ default:
X+ symbol((int) scx(x) - 3, (int) scy(y) - 4, 9, currentcolor, xNeb_D);
X+
X+ }
X+ curmod();
X+ }
X+
X+ drawUnknown(x, y, mag, type, color, nebsize)
X+ int x, y;
X+ double mag;
X+ char type, *color;
X+ long nebsize; /* -1 should give default size */
X+ {
X+ D_color(color);
X+
X+ zsetup();
X+ symbol((int) scx(x) - 3, (int) scy(y) - 4, 9, currentcolor, xUnk_U);
X+ curmod();
X+ }
X+
X+ drawOther(x, y, mag, type, color, nebsize)
X+ int x, y;
X+ double mag;
X+ char type, *color;
X+ long nebsize; /* -1 should give default size */
X+ {
X+ D_color(color);
X+
X+ zsetup();
X+ symbol((int) scx(x) - 3, (int) scy(y) - 4, 9, currentcolor, xOther_O);
X+ curmod();
X+ }
X+
X+
X+
X+
X+ /* Note externs which are used */
X+
X+ chartlegend(win)
X+ mapwindow *win;
X+ {
X+ char ras[20], dls[20], outstr[40];
X+ if (!title[0])
X+ title = "LEGEND";
X+ rastr(ras, win->racen);
X+ declstr(dls, win->dlcen);
X+
X+ if (win->map_type != FULLPAGEMAP) {
X+ sprintf(outstr, "(%s,%s lim: %2.1f)", ras, dls, win->maglim);
X+ D_fontsize(titlesize, titlefnt);
X+ D_text(l_lmar1, l_til, title, FALSE);
X+ D_fontsize(subtlsize, subtlfnt);
X+ D_text(l_lmar1, l_stil, outstr, FALSE);
X+
X+ drawStar(l_lmar2, l_line1, 1.0, 'S', " ");
X+ D_fontsize(namesize, namefnt);
X+ D_text(l_ltext, l_line1, "<1.5", FALSE);
X+ if (win->maglim >= 2.5) {
X+ drawStar(l_rmar2, l_line1, 3.0, 'S', " ");
X+ D_fontsize(namesize, namefnt);
X+ D_text(l_rtext, l_line1, "<3.5", FALSE);
X+ }
X+ if (win->maglim >= 4.5) {
X+ drawStar(l_lmar2, l_line2, 5.0, 'S', " ");
X+ D_fontsize(namesize, namefnt);
X+ D_text(l_ltext, l_line2, "<5.5", FALSE);
X+ }
X+ if (win->maglim >= 6.5) {
X+ drawStar(l_rmar2, l_line2, 7.0, 'S', " ");
X+ D_fontsize(namesize, namefnt);
X+ D_text(l_rtext, l_line2, "<7.5", FALSE);
X+ }
X+ if (win->maglim >= 8.5) {
X+ drawStar(l_lmar2, l_line3, 9.0, 'S', " ");
X+ D_fontsize(namesize, namefnt);
X+ D_text(l_ltext, l_line3, "<9.5", FALSE);
X+ }
X+ if (win->maglim > 9.5) {
X+ drawStar(l_rmar2, l_line3, 10.0, 'S', " ");
X+ D_fontsize(namesize, namefnt);
X+ D_text(l_rtext, l_line3, ">9.5", FALSE);
X+ }
X+ D_fontsize(namesize, namefnt);
X+ D_text(l_ltext, l_line4, "double", FALSE);
X+ drawStar(l_lmar2, l_line4, 4.0, 'D', " ");
X+ D_fontsize(namesize, namefnt);
X+ D_text(l_rtext, l_line4, "variable", FALSE);
X+ drawStar(l_rmar2, l_line4, 2.0, 'V', " ");
X+
X+ D_fontsize(namesize, namefnt);
X+ D_text(l_ltext, l_line5, "planet", FALSE);
X+ drawPlan(l_lmar2, l_line5, 1.0, 'J', " ", (long) -1, "");
X+
X+ D_fontsize(namesize, namefnt);
X+ D_text(l_rtext, l_line5, "galaxy", FALSE);
X+ drawGalx(l_rmar2, l_line5, 1.0, 'E', " ", (long) -1);
X+ drawGalx(l_rmar1, l_line5, 1.0, 'S', " ", (long) -1);
X+
X+ D_fontsize(namesize, namefnt);
X+ D_text(l_ltext, l_line6, "nebula", FALSE);
X+ drawNebu(l_lmar2, l_line6, 1.0, 'D', " ", (long) -1);
X+ drawNebu(l_lmar1, l_line6, 1.0, 'P', " ", (long) -1);
X+
X+ D_fontsize(namesize, namefnt);
X+ D_text(l_rtext, l_line6, "cluster", FALSE);
X+ drawClus(l_rmar2, l_line6, 1.0, 'O', " ", (long) -1);
X+ drawClus(l_rmar1, l_line6, 1.0, 'G', " ", (long) -1);
X+ } else {
X+ D_fontsize(namesize, namefnt);
X+
X+ sprintf(outstr, "%s: %s,%s lim: %2.1f", title, ras, dls, win->maglim);
X+ D_text(15, 15, outstr, FALSE);
X+ }
X+ }
X+
X+ /* Functions for areas, drawn as lines for now */
X+ static struct {
X+ int x, y;
X+ } areapts[1000];
X+ static int nareapts;
X+ /* Move to (x, y) to begin an area */
X+ D_areamove(x, y)
X+ int x, y;
X+ {
X+ nareapts = 0;
X+ areapts[nareapts].x = x;
X+ areapts[nareapts].y = y;
X+ nareapts++;
X+ }
X+
X+ /* Add a segment to the area border */
X+ D_areaadd(x, y)
X+ int x, y;
X+ {
X+ areapts[nareapts].x = x;
X+ areapts[nareapts].y = y;
X+ nareapts++;
X+ }
X+
X+ /* Fill the area, after adding the last segment */
X+ D_areafill(x, y)
X+ int x, y;
X+ {
X+ int i;
X+
X+ areapts[nareapts].x = x;
X+ areapts[nareapts].y = y;
X+ nareapts++;
X+
X+
X+ D_move(areapts[0].x, areapts[0].y);
X+
X+ for (i = 1; i < nareapts; i++)
X+ D_draw(areapts[i].x, areapts[i].y);
X+ }
X+
X+
X+
X+ /* Draw an ellipse with width irx and height iry */
X+ /* from a routine by Tim Hogan in Dr. Dobb's Journal May '85 p.40 */
X+ /* Improved by calculating increments incrementally, thus removing all */
X+ /* multiplies from the loops. These multiplies were very bad since they */
X+ /* were (long)*(long). This code, when compiled by Microsoft C Version 5,*/
X+ /* can't be significantly improved by hand optimization. */
X+ /* Written Sept. 7, 1987 by J.D. McDonald (public domain) */
X+
X+ static long alpha, beta, alpha2, alpha4, beta2, beta4, d;
X+ static long ddx, ddy, alphadx, betady;
X+ static int dy, dx;
X+
X+ extern void e_start(); /* Starts off by writing right and left
X+ * points */
X+ extern void e_xd(); /* Moves one step to lower x (in all 4 quadrants) */
X+ extern void e_xdyu(); /* Moves to lower x, higher y */
X+ extern void e_yu(); /* Moves to higher y */
X+
X+ ellipse(x, y, irx, iry, c)
X+ int x, y, irx, iry;
X+ unsigned c;
X+ {
X+
X+ beta = (long) irx *(long) irx;
X+ alpha = (long) iry *(long) iry;
X+
X+ if (alpha == 0L)
X+ alpha = 1L;
X+ if (beta == 0L)
X+ beta = 1L;
X+
X+ dy = 0;
X+ dx = irx;
X+ alpha2 = alpha << 1;
X+ alpha4 = alpha2 << 1;
X+ beta2 = beta << 1;
X+ beta4 = beta2 << 1;
X+ alphadx = alpha * dx;
X+ betady = 0;
X+ ddx = alpha4 * (1 - dx);
X+ ddy = beta2 * 3;
X+
X+ d = alpha2 * ((long) (dx - 1) * dx) + alpha + beta2 * (1 - alpha);
X+ e_start(x - dx, x + dx, y, c);
X+
X+ do {
X+ if (d >= 0) {
X+ d += ddx;
X+ dx--;
X+ alphadx -= alpha;
END_OF_FILE
if test 34904 -ne `wc -c <'stch_pch.ab'`; then
echo shar: \"'stch_pch.ab'\" unpacked with wrong size!
fi
# end of 'stch_pch.ab'
fi
echo shar: End of archive 2 \(of 4\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 3 4 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 4 archives.
rm -f ark[1-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0
More information about the Comp.sources.misc
mailing list