home *** CD-ROM | disk | FTP | other *** search
/ Garbo / Garbo.cdr / pc / source / star.lzh / star.12 < prev    next >
Encoding:
Text File  |  1990-03-27  |  46.2 KB  |  1,747 lines

  1. #! /bin/sh
  2. # This is a shell archive.  Remove anything before this line, then unpack
  3. # it by saving it into a file and typing "sh file".  To overwrite existing
  4. # files, type "sh file -c".  You can also feed this as standard input via
  5. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  6. # will see the following message at the end:
  7. #        "End of archive 12 (of 32)."
  8. # Contents:  starchart/starm2.c starchart/starst.c
  9. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  10. if test -f 'starchart/starm2.c' -a "${1}" != "-c" ; then 
  11.   echo shar: Will not clobber existing file \"'starchart/starm2.c'\"
  12. else
  13. echo shar: Extracting \"'starchart/starm2.c'\" \(21802 characters\)
  14. sed "s/^X//" >'starchart/starm2.c' <<'END_OF_FILE'
  15. X/*
  16. X * starm2.c, more routines formerly in starchart.c/starmain.c
  17. X *        revision 3.1 August, 1989 
  18. X *
  19. X * Portions Copyright (c) 1987 by Alan Paeth (awpaeth@watcgl)
  20. X *
  21. X * Copyright (c) 1990 by Craig Counterman. All rights reserved.
  22. X *
  23. X * This software may be redistributed freely, not sold.
  24. X * This copyright notice and disclaimer of warranty must remain
  25. X *    unchanged. 
  26. X *
  27. X * No representation is made about the suitability of this
  28. X * software for any purpose.  It is provided "as is" without express or
  29. X * implied warranty, to the extent permitted by applicable law.
  30. X *
  31. X */
  32. X
  33. X
  34. Xstatic char rcsid[]="$Header: starm2.c,v 1.13 90/03/08 20:20:37 ccount Exp $";
  35. X
  36. X#include <stdio.h>
  37. X#include <math.h>
  38. X#ifndef SYSV
  39. X#include <strings.h>
  40. X#else
  41. X#include <string.h>
  42. X#endif
  43. X#include <ctype.h>
  44. X
  45. X#include "star3.h"
  46. X
  47. X#ifndef READMODE
  48. X#define READMODE "r"
  49. X#endif
  50. X#define OPENFAIL 0
  51. X#define LINELEN 82
  52. X
  53. X#ifndef MAXPATHLEN
  54. X#define MAXPATHLEN 1025
  55. X#endif
  56. X
  57. X/* PI / 180 = .0174532925199 */
  58. X#define DCOS(x) (cos((x)*.0174532925199))
  59. X#define DSIN(x) (sin((x)*.0174532925199))
  60. X#define DTAN(x) (tan((x)*.0174532925199))
  61. X#define DASIN(x) (asin(x)/.0174532925199)
  62. X#define DATAN2(x,y) (atan2(x,y)/.0174532925199)
  63. X#define MAX(a,b) ((a)>(b)?(a):(b))
  64. X#define MIN(a,b) ((a)<(b)?(a):(b))
  65. X
  66. Xextern int cur_function;
  67. Xextern int cur_map_type;
  68. Xextern int cur_map_tag;
  69. Xextern char *cur_tag_field;
  70. Xextern char *cur_file_name;
  71. Xextern user_interact;
  72. Xextern precess;
  73. X
  74. X/* Set by initxform
  75. X   One could use elements of the mapwindow structure,
  76. X   but these should be faster for the current window */
  77. Xextern int xproj_mode;
  78. Xextern double xwest, xeast, xnorth, xsouth, xbot;
  79. Xextern int cenx, ceny, strty;
  80. Xextern double xracen, sindlcen, cosdlcen, chart_scale;
  81. Xextern double yscale;
  82. Xextern double xc_scale;
  83. Xextern double inv_;
  84. X
  85. X/* xform globals */
  86. Xextern double xf_west, xf_east, xf_north, xf_south, xf_bottom;
  87. Xextern int xf_xcen, xf_ycen, xf_ybot;
  88. Xextern int xf_w_left, xf_w_right, xf_w_top, xf_w_bot;
  89. X
  90. Xextern double xf_c_scale;
  91. X
  92. X
  93. Xextern int htick_lim, htext_lim;
  94. Xextern int htext_xoff, htext_yoff;
  95. Xextern int vtick_lim, vtext_lim;
  96. Xextern int vtext_xoff, vtext_yoff;
  97. X
  98. X
  99. Xextern char *boundfile;
  100. Xextern char boundftype;
  101. Xextern char *patternfile;
  102. Xextern char pattftype;
  103. Xextern char *cnamefile;
  104. Xextern char cnameftype;
  105. Xextern char *mapfiles[];
  106. Xextern int mapftypes[];
  107. Xextern int nummapfiles;
  108. X
  109. Xextern char *progname;
  110. X
  111. X/* read file function indirection to allow for use of alternate file readers */
  112. Xint readstar();
  113. Xint buf_readstar();
  114. Xextern int (*readfile)();
  115. X
  116. X/* Readstar globals */
  117. Xextern double obj_lat, obj_lon, obj_mag;
  118. Xextern char obj_type[], obj_color[], obj_label[];
  119. Xextern char obj_constell[], obj_name[];
  120. Xextern char *obj_commnt, fileline[];
  121. X
  122. X
  123. X/* Chart element routines */
  124. X
  125. X/* Uses xf_north etc. from initxform */
  126. Xchartoutline(win)
  127. X     mapwindow *win;
  128. X{
  129. X  double start, inc;
  130. X  int xloc, xloc2, yloc, yloc2, div, i;
  131. X  int inregion;
  132. X  int R;
  133. X  double phi;
  134. X
  135. X  cur_function = CHRTOUTLN;
  136. X
  137. X  if (win->proj_mode == STEREOGR) {
  138. X    R = MIN(win->height, win->width) / 2 + 1;
  139. X    D_move(xf_xcen, xf_ycen+R);
  140. X    for (phi = 5.0; phi <= 360.0; phi += 5.0)
  141. X      D_draw(xf_xcen + (int)(R*DSIN(phi) + 0.5), 
  142. X         xf_ycen + (int)(R*DCOS(phi) + 0.5), SOLID);
  143. X  } else if (win->proj_mode == SANSONS) {
  144. X    xform(xf_south, xf_west, &xloc,  &yloc, &inregion);
  145. X    xform(xf_south, xf_east, &xloc2, &yloc2, &inregion);
  146. X    D_movedraw(xloc, yloc, xloc2, yloc2, SOLID);
  147. X    xform(xf_north, xf_west, &xloc,  &yloc, &inregion);
  148. X    xform(xf_north, xf_east, &xloc2, &yloc2, &inregion);
  149. X    D_movedraw(xloc, yloc, xloc2, yloc2, SOLID);
  150. X    
  151. X    inc = (xf_north - xf_south);
  152. X    div = (int)(inc);
  153. X    if (div < 1) div = 1;
  154. X    inc /= div;
  155. X    start = xf_south;
  156. X    xform(start, xf_west, &xloc, &yloc, &inregion);
  157. X    D_move(xloc, yloc);
  158. X    for (i=0; i < div; i++) {
  159. X      start += inc;
  160. X      xform(start, xf_west, &xloc, &yloc, &inregion);
  161. X      D_draw(xloc, yloc, SOLID);
  162. X    }
  163. X    start = xf_south;
  164. X    xform(start, xf_east, &xloc, &yloc, &inregion);
  165. X    D_move(xloc, yloc);
  166. X    for (i=0; i < div; i++) {
  167. X      start += inc;
  168. X      xform(start, xf_east, &xloc, &yloc, &inregion);
  169. X      D_draw(xloc, yloc, SOLID);
  170. X    }
  171. X    charthgrid(win, 15.0, 18);
  172. X    charthgrid(win, 5.0, 12);
  173. X    charthgrid(win, 1.0, 6);
  174. X    chartvgrid(win, 10.0, 18);
  175. X    chartvgrid(win, 5.0 , 12);
  176. X    chartvgrid(win, 1.0, 6);
  177. X  } else if (win->proj_mode == RECTANGULAR) {
  178. X    xform(xf_south, xf_west, &xloc,  &yloc, &inregion);
  179. X    xform(xf_south, xf_east, &xloc2, &yloc2, &inregion);
  180. X    D_movedraw(xloc, yloc, xloc2, yloc2, SOLID);
  181. X    xform(xf_north, xf_west, &xloc,  &yloc, &inregion);
  182. X    xform(xf_north, xf_east, &xloc2, &yloc2, &inregion);
  183. X    D_movedraw(xloc, yloc, xloc2, yloc2, SOLID);
  184. X
  185. X    xform(xf_north, xf_west, &xloc,  &yloc, &inregion);
  186. X    xform(xf_south, xf_west, &xloc2, &yloc2, &inregion);
  187. X    D_movedraw(xloc, yloc, xloc2, yloc2, SOLID);
  188. X    xform(xf_north, xf_east, &xloc,  &yloc, &inregion);
  189. X    xform(xf_south, xf_east, &xloc2, &yloc2, &inregion);
  190. X    D_movedraw(xloc, yloc, xloc2, yloc2, SOLID);
  191. X    
  192. X    charthgrid(win, 15.0, 18);
  193. X    charthgrid(win, 5.0, 12);
  194. X    charthgrid(win, 1.0, 6);
  195. X    chartvgrid(win, 10.0, 18);
  196. X    chartvgrid(win, 5.0 , 12);
  197. X    chartvgrid(win, 1.0, 6);
  198. X  } else { /* GNOMONIC or ORTHOGR */
  199. X    D_movedraw(xf_w_left, xf_w_bot, xf_w_right, xf_w_bot, SOLID);
  200. X    D_movedraw(xf_w_right, xf_w_bot, xf_w_right, xf_w_top, SOLID);
  201. X    D_movedraw(xf_w_right, xf_w_top, xf_w_left, xf_w_top, SOLID);
  202. X    D_movedraw(xf_w_left, xf_w_top, xf_w_left, xf_w_bot, SOLID);
  203. X  }
  204. X}
  205. X
  206. Xcharthgrid(win, inc, hgt)
  207. X     mapwindow *win;
  208. X     double inc;
  209. X     int hgt;
  210. X{
  211. X  double start, stop, ras;
  212. X  int xloc, xloc2, yloc, xloc3, yloc3;
  213. X  int inregion;
  214. X
  215. X  cur_function = CHRTHTICK;
  216. X
  217. X/* r.a. ticks always appear at the bottom, regardless of (invert) */
  218. X/* xf_bottom is the bottom, wether north or south, set in intixform */
  219. X  start = modup(xf_west, inc);
  220. X  stop = moddown(xf_east, inc);
  221. X  xform(xf_bottom, start, &xloc, &yloc, &inregion);
  222. X  xform(xf_bottom, start+inc, &xloc2, &yloc, &inregion);
  223. X  if (xloc - xloc2 > htick_lim)
  224. X    for (ras = start; ras <= stop; ras += inc)
  225. X      {
  226. X    xform(xf_bottom, ras, &xloc3, &yloc3, &inregion);
  227. X    D_movedraw(xloc3, yloc3-hgt, xloc3, yloc3, SOLID);
  228. X    if (xloc - xloc2 > htext_lim)
  229. X      {
  230. X        char tstr[20];
  231. X        rastr(tstr, ras);
  232. X        D_fontsize(10, HELV);
  233. X        D_text(xloc3+htext_xoff, yloc-htext_yoff, tstr, FALSE);
  234. X      }
  235. X      }
  236. X}
  237. X
  238. Xchartvgrid(win, inc, wid)
  239. X     mapwindow *win;
  240. X     double inc;
  241. X     int wid;
  242. X{
  243. X  double start, stop, dl;
  244. X  int xloc, yloc, yloc2, xloc3, yloc3;
  245. X  int inregion;
  246. X  
  247. X  cur_function = CHRTVTICK;
  248. X
  249. X  start = modup(xf_south, inc);
  250. X  stop = moddown(xf_north, inc);
  251. X  xform(start, xf_west, &xloc, &yloc, &inregion);
  252. X  xform(start+inc, xf_west, &xloc, &yloc2, &inregion);
  253. X  if (abs(yloc2 - yloc) > vtick_lim)
  254. X    {
  255. X      for (dl = start; dl <= stop; dl += inc)
  256. X    {
  257. X      xform(dl, xf_west, &xloc3, &yloc3, &inregion);
  258. X      D_movedraw(xloc3, yloc3, xloc3+wid, yloc3, SOLID);
  259. X      if (abs(yloc2 - yloc) > vtext_lim)
  260. X        {
  261. X          char tstr[20];
  262. X          declstr(tstr, dl);
  263. X          D_fontsize(10, HELV);
  264. X          D_text(xloc3+vtext_xoff, yloc3+vtext_yoff, tstr, FALSE);
  265. X        }
  266. X    }
  267. X    }
  268. X}
  269. X
  270. Xdouble modup(a, b)
  271. X     double a, b;
  272. X{
  273. X  double new;
  274. X  new = ((double)((int)(a/b))*b);
  275. X  if (new >= a) return(new);
  276. X  return(new += b);
  277. X}
  278. X
  279. Xdouble moddown(a, b)
  280. X     double a, b;
  281. X{
  282. X  double new;
  283. X  new = ((double)((int)(a/b))*b);
  284. X  if (new <= a) return(new);
  285. X  return (new -= b);
  286. X}
  287. X
  288. X/* return TRUE if a (in degrees) is west of b */
  289. X/* west is towards lower values of RA, e.g. 60 is west of 90 */
  290. Xint westof(a, b)
  291. X     double a, b;
  292. X{
  293. X  double diff;
  294. X
  295. X  diff = b - a;
  296. X  if (diff > 180) diff -= 360;
  297. X  if (diff < -180) diff += 360;
  298. X
  299. X  return (diff > 0);
  300. X}
  301. X
  302. X
  303. X/* return TRUE if a (in degrees) is east of b */
  304. X/* east is towards higher values of RA, e.g. 90 is east of 60 */
  305. Xint eastof(a, b)
  306. X     double a, b;
  307. X{
  308. X  double diff;
  309. X
  310. X  diff = b - a;
  311. X  if (diff > 180) diff -= 360;
  312. X  if (diff < -180) diff += 360;
  313. X
  314. X  return (diff < 0);
  315. X}
  316. X
  317. Xrastr(str, ras)
  318. X     char *str;
  319. X     double ras;
  320. X{
  321. X  int hrs, min;
  322. X  if (ras <   0.0) ras += 360.0;
  323. X  if (ras > 360.0) ras -= 360.0;
  324. X  hrs = (int)(ras/15.0);
  325. X  min = (int)((ras - hrs * 15.0) * 4.0);
  326. X  sprintf(str, "%2dh", hrs);
  327. X  if (min) sprintf(str, "%s%02dm", str, min);
  328. X}
  329. X
  330. Xdeclstr(str, dl)
  331. X     char *str;
  332. X     double dl;
  333. X{
  334. X  int deg, min;
  335. X  if (dl == 0.0) sprintf(str, "%s", " ");
  336. X  else if (dl > 0.0) sprintf(str, "%s", "+");
  337. X  else
  338. X    {
  339. X      sprintf(str, "%s", "-");
  340. X      dl = -dl;
  341. X    }
  342. X  deg = (int)(dl);
  343. X  min = (int)((dl - deg) * 60.0);
  344. X  sprintf(str, "%s%02dd", str, deg);
  345. X  if (min) sprintf(str, "%s%02dm", str, min);
  346. X}
  347. X
  348. Xchartragrid(win)
  349. X     mapwindow *win;
  350. X{
  351. X  double glonc, glatc, glon;
  352. X  double olon, olat;
  353. X  int xloc, yloc, xloc2, yloc2;
  354. X  double tlat1, tlon1, tlat2, tlon2;
  355. X
  356. X  if (!win->draw_ragrid) return;
  357. X  
  358. X  cur_function = GRID_RA;
  359. X
  360. X  for (glonc = 0.0; glonc <= 360.0; glonc += win->ra_step) {
  361. X    glon = glonc + win->ra_strt;
  362. X    if (glon < 0.0) glon += 360.0;
  363. X    if (glon > 360.0) glon -= 360.0;
  364. X    olon = glon;
  365. X    olat = glatc = -90.0;
  366. X    for (glatc = -90.0; glatc <= 90.0; glatc += 10.0) {
  367. X      if (clipr_xform(olat, olon, glatc, glon,
  368. X              &xloc, &yloc, &xloc2, &yloc2, TRUE,
  369. X              &tlat1, &tlon1, &tlat2, &tlon2)) {
  370. X    drawcurveline(tlat1, tlon1, tlat2, tlon2,
  371. X              xloc, yloc, xloc2, yloc2, DOTTED, TRUE, 0);
  372. X      }
  373. X      olat = glatc;
  374. X    }
  375. X  }
  376. X}
  377. X
  378. Xchartdecgrid(win)
  379. X     mapwindow *win;
  380. X{
  381. X  double glonc, glatc, glat;
  382. X  double olon, olat;
  383. X  int xloc, yloc, xloc2, yloc2;
  384. X  double tlat1, tlon1, tlat2, tlon2;  
  385. X  
  386. X  if (!win->draw_decgrid) return;
  387. X  
  388. X  cur_function = GRID_DEC;
  389. X  
  390. X  for (glatc = 0; glatc <= 90.0; glatc += win->dec_step) {
  391. X    glat = glatc + win->dec_strt;
  392. X    if (glat < 0.0) glat = 0.0;
  393. X    if (glat > 90.0) glat = 90.0;
  394. X    olat = glat;
  395. X    olon = glonc = 0.0;
  396. X    for (glonc = 0.0; glonc <= 360.0; glonc += 10.0) {
  397. X      if (clipr_xform(olat, olon, glat, glonc,
  398. X              &xloc, &yloc, &xloc2, &yloc2, FALSE,
  399. X              &tlat1, &tlon1, &tlat2, &tlon2)) {
  400. X    drawcurveline(tlat1, tlon1, tlat2, tlon2,
  401. X              xloc, yloc, xloc2, yloc2, DOTTED, FALSE, 0);
  402. X      }
  403. X      olon = glonc;
  404. X    }
  405. X  }
  406. X  for (glatc = 0; glatc >= -90.0; glatc -= win->dec_step) {
  407. X    glat = glatc + win->dec_strt;
  408. X    if (glat < -90.0) glat = -90.0;
  409. X    if (glat > 0.0) glat = 0.0;
  410. X    olat = glat;
  411. X    olon = glonc = 0.0;
  412. X    for (glonc = 0.0; glonc <= 360.0; glonc += 10.0) {
  413. X      if (clipr_xform(olat, olon, glat, glonc,
  414. X              &xloc, &yloc, &xloc2, &yloc2, FALSE,
  415. X              &tlat1, &tlon1, &tlat2, &tlon2)) {
  416. X    drawcurveline(tlat1, tlon1, tlat2, tlon2,
  417. X              xloc, yloc, xloc2, yloc2, DOTTED, FALSE, 0);
  418. X      }
  419. X      olon = glonc;
  420. X    }
  421. X  }
  422. X}
  423. X
  424. X
  425. X
  426. Xchartecliptic(win)
  427. X     mapwindow *win;
  428. X{
  429. X  double sineps, coseps;
  430. X  int i;
  431. X  double lat, lon, olat, olon;
  432. X  int xloc, yloc, xloc2, yloc2;
  433. X  double tlat1, tlon1, tlat2, tlon2;  
  434. X
  435. X  cur_function = ECLIPT;
  436. X
  437. X  sineps = DSIN(23.439);
  438. X  coseps = DCOS(23.439);
  439. X  
  440. X  olat = 0.0;
  441. X  olon = 0.0;
  442. X  for (i = 1; i <= 361; i += 10) {
  443. X    lat = DASIN(sineps*DSIN(i));
  444. X    lon = DATAN2((coseps*DSIN(i)), (DCOS(i)));
  445. X    if (lon < 0.0) lon += 360.0; /* Eliminate discontinuity at -180 */
  446. X    if (clipr_xform(olat, olon, lat, lon,
  447. X            &xloc, &yloc, &xloc2, &yloc2, FALSE,
  448. X            &tlat1, &tlon1, &tlat2, &tlon2)) {
  449. X    drawcurveline(tlat1, tlon1, tlat2, tlon2,
  450. X              xloc, yloc, xloc2, yloc2, DASHED, TRUE, 0);
  451. X
  452. X    }
  453. X    olat = lat;
  454. X    olon = lon;
  455. X  }
  456. X}
  457. X
  458. X
  459. Xchartboundaries(win)
  460. X     mapwindow *win;
  461. X{
  462. X  FILE *sfile;
  463. X  if ((sfile = fopen(boundfile, READMODE)) == OPENFAIL) return(0);
  464. X
  465. X  cur_function = CONSTBOUND;
  466. X  cur_file_name = boundfile;
  467. X
  468. X  chartobjects(win, sfile, boundftype, 100.0, 100.0, -100.0,
  469. X                /* maglim, lbllim low, gklim high */
  470. X           FALSE, 100.0, -100.0, ALLFILES);
  471. X                /* don't label with magnitudes */
  472. X  fclose(sfile);
  473. X
  474. X  cur_file_name = "";
  475. X
  476. X  return(1);
  477. X}
  478. X
  479. Xchartpatterns(win)
  480. X     mapwindow *win;
  481. X{
  482. X  FILE *sfile;
  483. X  if ((sfile = fopen(patternfile, READMODE)) == OPENFAIL) return(0);
  484. X
  485. X  cur_function = CONSTPATTRN;
  486. X  cur_file_name = patternfile;
  487. X
  488. X  chartobjects(win, sfile, pattftype, 100.0, 100.0, -100.0,
  489. X                /* maglim, lbllim low, gklim high */
  490. X           FALSE, 100.0, -100.0, ALLFILES);
  491. X                /* don't label with magnitudes */
  492. X  fclose(sfile);
  493. X
  494. X  cur_file_name = "";
  495. X
  496. X  return(1);
  497. X}
  498. X
  499. Xchartconstlnames(win)
  500. X     mapwindow *win;
  501. X{
  502. X  FILE *sfile;
  503. X  if ((sfile = fopen(cnamefile, READMODE)) == OPENFAIL) return(0);
  504. X
  505. X  cur_function = CONSTNAME;
  506. X  cur_file_name = cnamefile;
  507. X
  508. X  chartobjects(win, sfile, cnameftype, 100.0, 100.0, -100.0,
  509. X                /* maglim, lbllim low, gklim high */
  510. X           FALSE, 100.0, -100.0, ALLFILES);
  511. X                /* don't label with magnitudes */
  512. X  fclose(sfile);
  513. X
  514. X  cur_file_name = "";
  515. X
  516. X  return(1);
  517. X}
  518. X
  519. Xchartmain(win, draw_mode)
  520. X     mapwindow *win;
  521. X     int draw_mode;
  522. X{
  523. X  int i;
  524. X  char commline[132];
  525. X  
  526. X  for(i=0;i < win->numfiles; i++) {
  527. X#ifdef INTERACTIVE_CONTROL
  528. X    if (user_interact)
  529. X      if (D_break()) break;
  530. X#endif
  531. X    sprintf(commline, "file %d, type %d, '%s'\n",i,win->file[i].type,
  532. X        win->file[i].name);
  533. X    D_comment(commline);
  534. X    if (!chartfile(win, win->file[i].name, win->file[i].type,
  535. X           win->file[i].maglim, win->file[i].lbllim, 
  536. X           win->file[i].gklim, win->file[i].draw_maglbl,
  537. X           win->file[i].maglmin, win->file[i].maglmax, draw_mode))
  538. X      fprintf(stderr, "%s: error, open fail on '%s'\n",
  539. X          progname, win->file[i].name);
  540. X  }
  541. X  D_color("  ");        /* Reset color */
  542. X}
  543. X
  544. Xchartfile(win, filename, filetype, maglim, lbllim, gklim,
  545. X      draw_maglbl, maglmin, maglmax, draw_mode)
  546. X     mapwindow *win;
  547. X     char *filename;
  548. X     int filetype;
  549. X     double maglim, lbllim, gklim;
  550. X     int draw_maglbl;
  551. X     double maglmin, maglmax;
  552. X     int draw_mode;
  553. X{
  554. X  FILE *file1, *file2;
  555. X  double padding;
  556. X  double f_east, f_north, f_west, f_south;
  557. X  char ibuf[2020], fname[1030], ftypestr[32], commline[1200];
  558. X  int n;
  559. X  int xloc, yloc, inr1, inr2, inr3, inr4;
  560. X  int usethis;
  561. X  int ftype;
  562. X
  563. X  if ((file1 = fopen(filename, READMODE)) == OPENFAIL) return(FALSE);
  564. X
  565. X  cur_function = CHARTFILE;
  566. X  cur_file_name = filename;
  567. X
  568. X  if (filetype == INDEXTYPE) {
  569. X    /* read each line of index file, parse data on the files indexed:
  570. X       region included file name
  571. X         use an indexed file
  572. X        if any corner is in the plot region,
  573. X       or if the center of the plot is in the file region */
  574. X    /* file region is padded to avoid possible problems with
  575. X       corners being out of the plot but some part falling in the area
  576. X       which may occur in some clip windows shapes */
  577. X    if ((win->proj_mode == STEREOGR) || (win->proj_mode == GNOMONIC)
  578. X    || (win->proj_mode == ORTHOGR))
  579. X      padding = win->scale;
  580. X    else padding = 1.0;
  581. X
  582. X    while (!feof(file1)) {
  583. X#ifdef INTERACTIVE_CONTROL
  584. X      if (user_interact)
  585. X    if (D_break()) break;
  586. X#endif
  587. X      fgets(ibuf, 2000, file1);
  588. X      n = sscanf(ibuf, "%lf %lf %lf %lf %1000s %30s\n", &f_east, &f_north,
  589. X         &f_west, &f_south, fname, ftypestr);
  590. X      if ((n != 6) || feof(file1)) continue;
  591. X
  592. X      f_east *= 15.0;
  593. X      f_west *= 15.0;
  594. X
  595. X      f_east += padding;
  596. X      f_west -= padding;
  597. X      f_north += padding;
  598. X      f_south -= padding;
  599. X      if (f_east > 360.0) f_east -= 360.0;
  600. X      if (f_west < 0.0) f_west += 360.0;
  601. X      if (f_north > 90.0) f_north = 90.0;
  602. X      if (f_south < -90.0) f_south = -90.0;
  603. X
  604. X      xform(f_north, f_east, &xloc, &yloc, &inr1);
  605. X      xform(f_south, f_east, &xloc, &yloc, &inr2);
  606. X      xform(f_north, f_west, &xloc, &yloc, &inr3);
  607. X      xform(f_south, f_west, &xloc, &yloc, &inr4);
  608. X
  609. X      usethis = (inr1 || inr2 || inr3 || inr4);
  610. X
  611. X      /* If any corner of the file is in the region, use it. (test done above)
  612. X     Otherwise if any corner of the region is in the file, use the file.
  613. X     Uses xf_north, xf_south, xf_east, xf_west set by initxform()
  614. X     Note, east is left when you look at the sky */
  615. X
  616. X      if (!usethis) {
  617. X    usethis |= ((xf_north >= f_south) && (xf_north <= f_north)
  618. X            && (eastof(xf_east,f_west)) && (westof(xf_east,f_east)));
  619. X                                                  /* Upper left is in */
  620. X    usethis |= ((xf_north >= f_south) && (xf_north <= f_north)
  621. X            && (eastof(xf_west,f_west)) && (westof(xf_west,f_east)));
  622. X                                                  /* Upper right is in */
  623. X    usethis |= ((xf_south >= f_south) && (xf_south <= f_north)
  624. X            && (eastof(xf_east,f_west)) && (westof(xf_east,f_east)));
  625. X                                                  /* lower left is in */
  626. X    usethis |= ((xf_south >= f_south) && (xf_south <= f_north)
  627. X            && (eastof(xf_west,f_west)) && (westof(xf_west,f_east)));
  628. X                                                  /* lower right is in */
  629. X    usethis |= (
  630. X            (  ((xf_north >= f_south) && (xf_north <= f_north))
  631. X             ||((xf_south >= f_south) && (xf_south <= f_north))
  632. X             ||((f_north >= xf_south) && (f_north <= xf_north))
  633. X             ||((f_south >= xf_south) && (f_south <= xf_north))
  634. X             )
  635. X            &&
  636. X            (  ((eastof(xf_east,f_west)) && (westof(xf_east,f_east)))
  637. X             ||((eastof(xf_west,f_west)) && (westof(xf_west,f_east)))
  638. X             ||((eastof(f_east,xf_west)) && (westof(f_east,xf_east)))
  639. X             ||((eastof(f_west,xf_west)) && (westof(f_west,xf_east)))
  640. X             )
  641. X            );
  642. X                /* North or south of area is between
  643. X                   north and south boundaries,
  644. X                   and east or west of area is between
  645. X                   east and west boundaries. */
  646. X      }
  647. X
  648. X      if (usethis) {
  649. X    if ((file2 = fopen(fname, READMODE)) == OPENFAIL) {
  650. X      fprintf(stderr, "%s: error, couldn't open '%s' for reading.\n",
  651. X          progname, fname);
  652. X    } else {
  653. X      cur_file_name = fname;
  654. X
  655. X      ftype = tr_fty(ftypestr);
  656. X      sprintf(commline, "'%s', type %d\n",fname, ftype);
  657. X      D_comment(commline);
  658. X      if (ftype == INDEXTYPE)  {
  659. X        fprintf(stderr,
  660. X  "%s: error, can't use type INDEXTYPE file '%s' from another index file.\n",
  661. X            progname, fname);
  662. X      } else {
  663. X        chartobjects(win, file2, ftype, maglim, lbllim, gklim,
  664. X             draw_maglbl, maglmin, maglmax, draw_mode);
  665. X      }
  666. X      fclose(file2);
  667. X      cur_file_name = "";
  668. X    }
  669. X      }
  670. X    }
  671. X  } else {
  672. X    chartobjects(win, file1, filetype, maglim, lbllim, gklim,
  673. X         draw_maglbl, maglmin, maglmax, draw_mode);
  674. X  }
  675. X  fclose(file1);
  676. X  cur_file_name = "";
  677. X  return(TRUE);
  678. X}
  679. X
  680. X
  681. Xdouble o_lat, o_lon;        /* save areas for track clipping */
  682. Xchar area_stat;
  683. X
  684. Xchartobjects(win, file, ftype, maglim, lbllim, gklim,
  685. X         draw_maglbl, maglmin, maglmax, draw_mode)
  686. X     mapwindow *win;
  687. X     FILE *file;
  688. X     int ftype;
  689. X     double maglim, lbllim, gklim;
  690. X     int draw_mode;
  691. X     int draw_maglbl;
  692. X     double maglmin, maglmax;
  693. X{
  694. X  int xloc, yloc, xloc2, yloc2;
  695. X  int inregion;
  696. X  double tlat1, tlon1, tlat2, tlon2;
  697. X  int glyph_mode, name_mode, magl_mode, vec_mode, area_mode, all_mode;
  698. X  int use_label, use_name, use_mag;
  699. X
  700. X  /* Modes:
  701. X     ALLGLYPHS        All symbols
  702. X     ALLNAMES        All names (and greek)
  703. X     ALLMAGLBLS        All magnitude labels
  704. X     ALLVECTORS        All vectors
  705. X     ALLAREAS        All areas
  706. X     ALLFILES        All of the above
  707. X  */
  708. X
  709. X  glyph_mode = ((draw_mode == ALLFILES) || (draw_mode == ALLGLYPHS));
  710. X  name_mode = ((draw_mode == ALLFILES) || (draw_mode == ALLNAMES));
  711. X  magl_mode = ((draw_mode == ALLFILES) || (draw_mode == ALLMAGLBLS));
  712. X  vec_mode = ((draw_mode == ALLFILES) || (draw_mode == ALLVECTORS));
  713. X  area_mode = ((draw_mode == ALLFILES) || (draw_mode == ALLAREAS));
  714. X  all_mode = (draw_mode == ALLFILES);
  715. X  
  716. X  for(;;) {
  717. X    if ((*readfile)(file, ftype)) break;
  718. X/*    if ((obj_mag > maglim) && (obj_type[0] == 'S')) break;*/
  719. X
  720. X    if (obj_type[0] == '#') continue;
  721. X
  722. X#ifdef INTERACTIVE_CONTROL
  723. X    if (user_interact)
  724. X      if (D_break()) break;
  725. X#endif
  726. X
  727. X    if ( (obj_mag <= maglim) )
  728. X      {
  729. X    if (precess) do_precess(&obj_lat, &obj_lon);
  730. X    xform(obj_lat, obj_lon, &xloc, &yloc, &inregion);
  731. X    if ((!inregion) && (obj_type[0] != 'V')
  732. X        && (obj_type[0] != 'A')) continue;
  733. X    use_label = (((obj_type[0] == 'S') || (obj_type[0] == 'I')) &&
  734. X             (obj_mag <= gklim) &&
  735. X             (all_mode || name_mode));
  736. X    use_name =  ((obj_mag <= lbllim) && name_mode);
  737. X    use_mag =  (draw_maglbl && (obj_mag <= maglmax) &&
  738. X            (obj_mag >= maglmin) && magl_mode);
  739. X
  740. X    if (inregion)
  741. X      drawobj(xloc, yloc, obj_mag, obj_type, obj_color, obj_label,
  742. X          obj_constell, obj_name,
  743. X          obj_commnt, fileline,
  744. X          glyph_mode,
  745. X          name_mode || magl_mode,
  746. X          use_label,
  747. X          use_name,
  748. X          use_mag);
  749. X    if (obj_type[0] == 'V') {
  750. X      D_color(obj_color);
  751. X      if ((obj_type[1] == 'M') || (obj_type[1] == 'm')) {     /* move */
  752. X        o_lat = obj_lat;
  753. X        o_lon = obj_lon;
  754. X      } else {             /* draw */
  755. X        if (vec_mode && clipr_xform(o_lat, o_lon, obj_lat, obj_lon,
  756. X                    &xloc, &yloc, &xloc2, &yloc2,
  757. X                    (isupper(obj_type[1])),
  758. X                    &tlat1, &tlon1, &tlat2, &tlon2)) {
  759. X          switch (obj_type[1]) {
  760. X          case 'D':
  761. X          case 'd':
  762. X        drawcurveline(tlat1, tlon1, tlat2, tlon2, xloc, yloc,
  763. X                  xloc2, yloc2, VECDOT, (obj_type[1] == 'D'), 0);
  764. X        break;
  765. X          case 'H':
  766. X          case 'h':
  767. X        drawcurveline(tlat1, tlon1, tlat2, tlon2, xloc, yloc,
  768. X                  xloc2, yloc2, VECDASH, (obj_type[1] == 'H'), 0);
  769. X        break;
  770. X          case 'S':
  771. X          case 's':
  772. X          default:
  773. X        drawcurveline(tlat1, tlon1, tlat2, tlon2, xloc, yloc,
  774. X                  xloc2, yloc2, VECSOLID, isupper(obj_type[1]), 0);
  775. X        break;
  776. X
  777. X          }
  778. X        }
  779. X        o_lat = obj_lat;
  780. X        o_lon = obj_lon;
  781. X      }
  782. X      D_color("  ");
  783. X    } else if ((obj_type[0] == 'A') && area_mode) {
  784. X      D_color(obj_color);
  785. X      if ((obj_type[1] == 'M') || (obj_type[1] == 'm')) {
  786. X                /* move */
  787. X        areastart(obj_lat, obj_lon, (obj_type[1] == 'M'));
  788. X        area_stat = 'M';
  789. X      } else if ((obj_type[1] == 'A') || (obj_type[1] == 'a')) {
  790. X                /* add segment */
  791. X        areaadd(obj_lat, obj_lon, (obj_type[1] == 'A'));
  792. X        area_stat = obj_type[1];
  793. X      } else if ((obj_type[1] == 'F') || (obj_type[1] == 'f')) {
  794. X                /* fill */
  795. X        if ((area_stat == 'A') || (area_stat == 'a'))
  796. X                /* Else, likely an error */
  797. X          areaadd(obj_lat, obj_lon, (obj_type[1] == 'F'));
  798. X        areafinish();
  799. X        area_stat = obj_type[1];
  800. X      };
  801. X      D_color("  ");
  802. X    }
  803. X      }
  804. X  }
  805. X}
  806. END_OF_FILE
  807. if test 21802 -ne `wc -c <'starchart/starm2.c'`; then
  808.     echo shar: \"'starchart/starm2.c'\" unpacked with wrong size!
  809. fi
  810. # end of 'starchart/starm2.c'
  811. fi
  812. if test -f 'starchart/starst.c' -a "${1}" != "-c" ; then 
  813.   echo shar: Will not clobber existing file \"'starchart/starst.c'\"
  814. else
  815. echo shar: Extracting \"'starchart/starst.c'\" \(21986 characters\)
  816. sed "s/^X//" >'starchart/starst.c' <<'END_OF_FILE'
  817. X/*
  818. X * GDOS Display driver for starchart.c ATARI ST - Version
  819. X */
  820. X
  821. X/*
  822. X * Modified from 2.1 to starchart 3.0.  Holger Zessel, Nov 1989
  823. X */
  824. Xstatic char rcsid[]="$Header: starst.c,v 1.1 90/03/08 20:14:37 ccount Exp $";
  825. X
  826. X#include <stdio.h>
  827. X#include <math.h>
  828. X#ifndef SYSV
  829. X#include <strings.h>
  830. X#else
  831. X#include <string.h>
  832. X#endif
  833. X#include <ctype.h>    /* isprint(), iscntrl(), etc. */
  834. X#include <osbind.h>   /* Operating system bindings */
  835. X#include <vdibind.h>  /* The virtual device interface routines */
  836. X#include <stdio.h>
  837. X#include "star3.h" /* Starchart information */
  838. X
  839. X/* Global line A variables used by vdi; MUST be included */
  840. Xint contrl[12], intin[128], ptsin[128], intout[128], ptsout[128];
  841. X/* Array used by vs_clip() */
  842. Xint cliparray[] = { 0, 0, 32767, 32767 };
  843. X
  844. Xint work_in[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 };
  845. Xint work_out[57];
  846. Xint dummy;
  847. Xint vdihandle; /* Virtual device's handle */
  848. Xint vdihandle_save;
  849. Xint device=1; /* GDOS-Outputdevice */
  850. X
  851. X#define TRUE 1
  852. X#ifdef NULL
  853. X#undef NULL
  854. X#endif
  855. X#define NULL 0
  856. X    
  857. X/*
  858. X** Starchart was designed for 1024x768 pixels.  These macros scale the
  859. X** image to the 32768*32768 Atari ST GDOS-resolution in normalized mode.
  860. X*/
  861. X#define xadjust(x) ((x) * 32)
  862. X#define yadjust(y) ((y) * 42.667)
  863. X
  864. X
  865. X/* Externs */
  866. Xextern int g_argc;
  867. Xextern char **g_argv;
  868. X
  869. Xextern char *title;    /* Title of page */
  870. X
  871. Xextern mapwindow *mapwin[MAXWINDOWS];
  872. Xextern int numwins;
  873. X
  874. Xextern int cur_function;
  875. Xextern int cur_map_type;
  876. Xextern int cur_map_tag;
  877. Xextern char *cur_tag_field;
  878. X
  879. X
  880. X/* Scale multiplier, minimum,
  881. X   magnitude change, maximum, for thumbnail,*/
  882. X#define THSMUL 1.2
  883. X#define THSMIN 12.0
  884. X#define THMADJ 2.5
  885. X#define THMMAX 5.0
  886. X
  887. X
  888. X/* Exports */
  889. X
  890. X/* The variables in the first few lines MUST be set by driver */
  891. Xmapwindow fullpage = {
  892. X  880, 700, 20, 65,    /* width, height, x and y offsets */
  893. X  5.9, 2.0, 2.05,    /* default limiting mags for glyph, name, label */
  894. X
  895. X/* The next several variables SHOULD be set by the driver,
  896. X   but are only used by the driver */
  897. X  FULLPAGEMAP,        /* Type of map: THUMBNAIL may have
  898. X               some restrictions */
  899. X  0,            /* May be used by driver for whatever */
  900. X  "String",        /* May be used by driver for whatever */
  901. X  
  902. X/* The next several variables may be set by the driver, but the main routines
  903. X   may reset them (and the driver routines may then override that) */
  904. X  SANSONS,        /* Projection mode */
  905. X  FALSE, FALSE,        /* Draw grids */
  906. X  0.5, 5.0,        /* grid step size */
  907. X  0.0, 0.0,        /* grid origin */
  908. X
  909. X  FALSE,        /* Invert (flip north south) */
  910. X};
  911. X
  912. X/* The variables in the first few lines MUST be set by driver */
  913. Xmapwindow mainmap = {
  914. X  880, 500, 20, 265,    /* width, height, x and y offsets */
  915. X  5.9, 2.0, 2.05,    /* default limiting mags for glyph, name, label */
  916. X
  917. X/* The next several variables SHOULD be set by the driver,
  918. X   but are only used by the driver */
  919. X  MAINMAP,        /* Type of map: THUMBNAIL may have
  920. X               some restrictions */
  921. X  0,            /* May be used by driver for whatever */
  922. X  "String",        /* May be used by driver for whatever */
  923. X
  924. X/* The next several variables may be set by the driver, but the main routines
  925. X   may reset them (and the driver routines may then override that) */
  926. X  SANSONS,        /* Projection mode */
  927. X  FALSE, FALSE,        /* Draw grids */
  928. X  0.5, 5.0,        /* grid step size */
  929. X  0.0, 0.0,        /* grid origin */
  930. X
  931. X  FALSE,        /* Invert (flip north south) */
  932. X};
  933. X
  934. X
  935. X/* The variables in the first few lines MUST be set by driver */
  936. Xmapwindow thumbmap = {
  937. X  480, 195, 420, 35,    /* width, height, x and y offsets */
  938. X#ifndef ATARI_ST
  939. X  3.0+THMADJ, 1.0+THMADJ, 2.05+THMADJ,
  940. X#else
  941. X  5.5, 3.5, 4.55,
  942. X#endif
  943. X            /* default limiting mags for glyph, name, label */
  944. X
  945. X/* The next several variables SHOULD be set by the driver,
  946. X   but are only used by the driver */
  947. X  THUMBNAIL,        /* Type of map: THUMBNAIL may have
  948. X               some restrictions */
  949. X  0,            /* May be used by driver for whatever */
  950. X  "String",        /* May be used by driver for whatever */
  951. X
  952. X/* The next several variables may be set by the driver, but the main routines
  953. X   may reset them (and the driver routines may then override that) */
  954. X  SANSONS,        /* Projection mode */
  955. X  FALSE, FALSE,        /* Draw grids */
  956. X  0.5, 5.0,        /* grid step size */
  957. X  0.0, 0.0,        /* grid origin */
  958. X
  959. X  FALSE,        /* Invert (flip north south) */
  960. X};
  961. X
  962. X/* h & v tick text controls */
  963. Xint htick_lim = 2;
  964. Xint htext_lim = 80;
  965. Xint htext_xoff = 2;
  966. Xint htext_yoff = 17;
  967. Xint vtick_lim = 2;
  968. Xint vtext_lim = 20;
  969. Xint vtext_xoff = 24;
  970. Xint vtext_yoff = -4;
  971. X
  972. X/* Scale multiplier, minimum,
  973. X   magnitude change, maximum, for thumbnail,*/
  974. Xdouble th_smul=THSMUL;
  975. Xdouble th_smin=THSMIN;
  976. Xdouble th_madj=THMADJ;
  977. Xdouble th_mmax=THMMAX;
  978. X
  979. X#define MAX(a,b) ((a)>(b)?(a):(b))
  980. X#define MIN(a,b) ((a)<(b)?(a):(b))
  981. X
  982. Xint CURRX, CURRY;
  983. X
  984. X
  985. X
  986. X/* Device control argument */
  987. XD_control_arg(s)
  988. Xchar *s;
  989. X{
  990. X  int i = 0;
  991. X  int c;
  992. X  char *p;
  993. X
  994. X  switch (*s) {
  995. X  case 'd':    /* output-device */
  996. X    device = atoi(&s[1]); /* device immediately after 'd' */
  997. X      break;
  998. X  default:
  999. X    fprintf(stderr,"Wrong device control string!\n");
  1000. X    exit(1);
  1001. X    break;
  1002. X  }
  1003. X}
  1004. X
  1005. X
  1006. X
  1007. Xstatic open_virtual_device()
  1008. X{
  1009. X      int i;
  1010. X          if(appl_init()<0) /* Initialize the application and register it with AES */
  1011. X      {
  1012. X          fprintf(stderr,"could not appl_init !!\n");
  1013. X          exit(1);
  1014. X      }
  1015. X          vdihandle = graf_handle(&i, &i, &i, &i); /* Get a VDI handle */
  1016. X      work_in[0]=(device==31) ? vdihandle:device;
  1017. X      work_in[10]=(device==31) ? 2:0;
  1018. X          v_opnvwk(work_in, &vdihandle, work_out); /* Open the virtual workscreen */
  1019. X      if (vdihandle == 0)
  1020. X      {
  1021. X          fprintf(stderr,"could not open virtual workstation!\n");
  1022. X          appl_exit();
  1023. X          exit(1);
  1024. X      }
  1025. X      work_in[10]=0;
  1026. X}
  1027. X
  1028. X/* Open the device */
  1029. XD_open()
  1030. X{
  1031. X     int i;
  1032. X
  1033. X     if (!vqgdos())
  1034. X     {
  1035. X         fprintf(stderr,"No gdos loaded !!\n");
  1036. X         exit(1);
  1037. X     }
  1038. X
  1039. X     fprintf(stderr,"Device=%d\n",device);
  1040. X     if ((device >= 1)&&(device <= 4))
  1041. X     {
  1042. X      Cursconf(0,0);
  1043. X      open_virtual_device();
  1044. X      v_hide_c(vdihandle);
  1045. X          v_clrwk(vdihandle);
  1046. X          (void)vst_font(vdihandle,1);
  1047. X     }
  1048. X     else
  1049. X     {      int fontindex;
  1050. X           char fontname[33];
  1051. X
  1052. X      if (device == 31)
  1053. X      {
  1054. X          open_virtual_device(); /* seems to be necessary for metafiles*/
  1055. X        work_in[10]=2;
  1056. X        vdihandle_save = vdihandle; /* save handle */
  1057. X      }
  1058. X          work_in[0]=device;
  1059. X          v_opnwk(work_in, &vdihandle, work_out); /* Open the virtual workscreen */
  1060. X      if (vdihandle == 0)
  1061. X      {
  1062. X          fprintf(stderr,"could not open physical workstation!\n");
  1063. X          exit(1);
  1064. X      }
  1065. X          (void)vst_load_fonts(vdihandle, 0);
  1066. X      fontindex = vqt_name(vdihandle,1,fontname);
  1067. X      vst_font(vdihandle, fontindex);
  1068. X     }
  1069. X
  1070. X     if (device == 31)
  1071. X     {
  1072. X       intin[0]=0;
  1073. X       intin[1]=2100;
  1074. X       intin[2]=3050;
  1075. X       v_write_meta(vdihandle,3,intin,0,ptsin);
  1076. X     }
  1077. X     vs_clip(vdihandle, 1, cliparray); /* Set the clipping rectangle */
  1078. X     vsf_color(vdihandle, 1);
  1079. X     vsf_interior(vdihandle, 1);
  1080. X     vsf_perimeter(vdihandle, 0);
  1081. X     vsf_style(vdihandle,8);
  1082. X     vswr_mode(vdihandle, 2);
  1083. X     vst_rotation(vdihandle, 0);
  1084. X     vst_color(vdihandle,1);
  1085. X
  1086. X}
  1087. X
  1088. X#ifdef ATARI_ST
  1089. XD_die(a,b)
  1090. Xchar *a,*b;
  1091. X{
  1092. X    D_close();
  1093. X}
  1094. X#endif
  1095. X
  1096. X/* Close the device */
  1097. XD_close()
  1098. X{
  1099. X     char text[80];
  1100. X     if ((device >=1) && (device <= 4)) /* Screen */
  1101. X     {
  1102. X          gets(text);
  1103. X          v_clsvwk(vdihandle); /* Close the virtual workscreen */
  1104. X          appl_exit(); /* Remove the application from AES */
  1105. X      v_show_c(vdihandle,1);
  1106. X      Cursconf(1,0);
  1107. X     }
  1108. X     else
  1109. X     {
  1110. X      if (device == 31)
  1111. X        v_meta_extents(vdihandle,0,0,0x7fff,0x7fff);
  1112. X        
  1113. X          v_updwk(vdihandle);
  1114. X          v_clswk(vdihandle); /* Close the physical workscreen */
  1115. X
  1116. X      if (device == 31)
  1117. X           {
  1118. X          vdihandle = vdihandle_save;
  1119. X              v_clsvwk(vdihandle); /* Close the virtual workscreen */
  1120. X              appl_exit(); /* Remove the application from AES */
  1121. X          }
  1122. X
  1123. X     }
  1124. X}
  1125. X
  1126. X
  1127. X/* Move to (x, y) */
  1128. XD_move(x, y)
  1129. X     int x, y;
  1130. X{
  1131. X     CURRX = x;
  1132. X     CURRY = y;
  1133. X}
  1134. X
  1135. X
  1136. X/* Draw a line of style line_style from the current point to (x, y) */
  1137. X/* Note, this replaces vecdraw vecdrawdot and vecdrawhyph */
  1138. XD_draw(x, y, line_style)
  1139. X     int x, y;
  1140. X     int line_style;    /* SOLID, DOTTED, DASHED, etc. */
  1141. X{
  1142. X     int line[4];
  1143. X     switch(line_style) {
  1144. X     case SOLID:
  1145. X    vsl_type(vdihandle,1);
  1146. X    break;
  1147. X     case DOTTED:
  1148. X     case VECDOT:
  1149. X    vsl_type(vdihandle,7);
  1150. X         vsl_udsty(vdihandle, 0xaaaa);
  1151. X         break;
  1152. X     case DASHED:
  1153. X     case VECDASH:
  1154. X         vsl_type(vdihandle,5);
  1155. X         break;
  1156. X     default:
  1157. X        vsl_type(vdihandle,1);
  1158. X        break;
  1159. X     }
  1160. X     line[0] = xadjust(CURRX);
  1161. X     line[1] = yadjust(CURRY);
  1162. X     line[2] = xadjust(CURRX = x);
  1163. X     line[3] = yadjust(CURRY = y);
  1164. X     v_pline(vdihandle, 2, line);
  1165. X}
  1166. X
  1167. X/* This routine is encouraged to look at the extern cur_funtion
  1168. X   and change the line style drawn as desired */
  1169. X
  1170. X
  1171. X/* Move to (x1, y1) then draw a line of style line_style to (x2, y2) */
  1172. XD_movedraw(x1, y1, x2, y2, line_style)
  1173. X     int x1, y1, x2, y2;
  1174. X     int line_style;    /* SOLID, DOTTED, DASHED, etc. */
  1175. X{
  1176. X  D_move(x1, y1);
  1177. X  D_draw(x2, y2, line_style);
  1178. X}
  1179. X
  1180. X
  1181. X/* Set the color to be used for lines and text */
  1182. X/* color_str is a 2 char (+ '\0') string containing
  1183. X   a specification for a color,
  1184. X   e.g. "G2" for the color of a star of spectral class G2, or "r7" for
  1185. X   red, level seven.  The interpretation of the color string is left to
  1186. X   the device driver */
  1187. XD_color(color_str)
  1188. X     char *color_str;
  1189. X{
  1190. X  switch (color_str[0]) {
  1191. X  case 'O':
  1192. X    break;
  1193. X  case 'B':
  1194. X    break;
  1195. X  case 'A':
  1196. X    break;
  1197. X  case 'F':
  1198. X    break;
  1199. X  case 'G':
  1200. X    break;
  1201. X  case 'K':
  1202. X    break;
  1203. X  case 'M':
  1204. X    break;
  1205. X  case 'R':
  1206. X  case 'N':
  1207. X  case 'S':
  1208. X    break;
  1209. X  case 'r':
  1210. X  case 'g':
  1211. X  case 'b':
  1212. X  case 'y':
  1213. X  case 'c':
  1214. X  case 'p':
  1215. X  case 'o':
  1216. X  case 'w':
  1217. X    break;
  1218. X  case ' ':
  1219. X  default:
  1220. X    break;
  1221. X  }
  1222. X}
  1223. X
  1224. X
  1225. X/* Set the font and font size to be used for text. */
  1226. X/* Note order of args */
  1227. XD_fontsize(fsize, font)
  1228. X     int fsize;    /* Size of font */
  1229. X     int font;    /* e.g. TIMES, HELV, TIMES+ITALIC */
  1230. X{
  1231. X            (void)vst_point(vdihandle,fsize,&dummy,&dummy,&dummy,&dummy);
  1232. X/*          (void)vst_height(vdihandle,fsize,&dummy,&dummy,&dummy,&dummy);*/
  1233. X}
  1234. X/* This routine is encouraged to look at the extern cur_funtion
  1235. X   and change the font used as desired */
  1236. X
  1237. X
  1238. X/* Display text string str at x,y, in current font and font size.
  1239. X   if star_lbl is TRUE, string is a star label, use
  1240. X     greek characters (if possible) */
  1241. XD_text(x, y, str, star_lbl)
  1242. X     int x, y;
  1243. X     char *str;
  1244. X     int star_lbl;
  1245. X{
  1246. X     int x1,y1;
  1247. X
  1248. X     if (*str == '\0') /* Don't bother if the string is empty */
  1249. X          return;
  1250. X
  1251. X     if (star_lbl) {
  1252. X        /* remove leading spaces */
  1253. X        while (*str == ' ') str++;
  1254. X     /* can't display greek characters */
  1255. X     }
  1256. X
  1257. X     x1 = xadjust(x);
  1258. X     y1 = yadjust(y);
  1259. X     if (y1 > 32750)
  1260. X          y1 = 32750; /* Make sure the bottom line shows up */
  1261. X
  1262. X     vswr_mode(vdihandle, 1);
  1263. X     v_gtext(vdihandle,x1,y1,str);
  1264. X     vswr_mode(vdihandle, 2);
  1265. X
  1266. X
  1267. X}
  1268. X
  1269. X
  1270. X
  1271. X/* Return input coordinate in device coords where there are pointing devices */
  1272. XD_inxy(x, y)
  1273. X     int *x, *y;
  1274. X{
  1275. X}
  1276. X
  1277. X
  1278. X/* Put non-displayed comment in output.  Allowed in postscript, but
  1279. X   few other drivers will be able to support this. */ 
  1280. XD_comment(str)
  1281. X     char *str;
  1282. X{
  1283. X#if 0
  1284. X  fprintf(stderr, "%s\n", str);
  1285. X#endif
  1286. X}
  1287. X
  1288. X
  1289. X/**
  1290. XHigher level functions
  1291. X**/
  1292. X
  1293. X/* Point sizes for font calls */
  1294. X#define TITLESIZE 12
  1295. X#define SUBTLSIZE 12
  1296. X#ifdef NAMESIZE
  1297. X#undef NAMESIZE
  1298. X#endif
  1299. X#define NAMESIZE 7
  1300. X#define LBLSIZE 7
  1301. X#define MAGSIZE 7
  1302. X
  1303. X#ifdef STARIMAGES
  1304. Xint namesize = NAMESIZE;
  1305. Xint lblsize  = LBLSIZE;
  1306. Xint magsize  = MAGSIZE;
  1307. X#endif
  1308. X
  1309. X/* Fonts for font calls */
  1310. X#define NAMEFNT TIMESROMAN
  1311. X#define LBLFNT HELV
  1312. X#define MAGFNT COURIER
  1313. X#define TITLEFNT TIMESBOLD
  1314. X#define SUBTLFNT TIMESROMAN
  1315. X
  1316. X#ifdef STARIMAGES
  1317. Xint namefnt = NAMEFNT;
  1318. Xint lblfnt  = LBLFNT;
  1319. Xint magfnt  = MAGFNT;
  1320. X#endif
  1321. X
  1322. Xint x_nameoffset = 10, y_nameoffset = 0;
  1323. Xint x_lbloffset = 0, y_lbloffset = 10;
  1324. Xint x_magoffset = 15, y_magoffset = -15;
  1325. X
  1326. X
  1327. X#ifndef STARIMAGES
  1328. X
  1329. X/* Interface Function */
  1330. X/* Draw object at x, y.  properties set by other parameters */
  1331. Xdrawobj(x, y, mag, type, color_str, label_field, con_str, obj_name,
  1332. X    comment_str, file_line,
  1333. X    draw_glyph, draw_text, use_lbl, use_name, use_mag)
  1334. X
  1335. X     int x, y;
  1336. X     double mag;    /* Magnitude of object */
  1337. X     char *type;    /* 2 chars, object code and subcode */
  1338. X     char *color_str;    /* 2 chars, spectral type for stars, 
  1339. X               color code otherwise */
  1340. X     char *label_field;    /* 2 chars, Bayer or flamsteed for stars,
  1341. X               size in seconds for nebulae and
  1342. X               planets */
  1343. X     char *con_str;    /* 3 chars, the constellation the object is in */
  1344. X     char *obj_name;    /* Name of object */
  1345. X     char *comment_str;    /* Comment field */
  1346. X     char *file_line;    /* The full line from the file,
  1347. X               containing the above if it is in
  1348. X               standard format */
  1349. X     int draw_glyph;    /* Draw object symbol */
  1350. X     int draw_text;    /* Draw text */
  1351. X     int use_lbl;    /* Label object with the label_field string */
  1352. X     int use_name;    /* Label object with the obj_name string */
  1353. X     int use_mag;    /* Label object with a 2 or 3 character string
  1354. X               containing the magnitude * 10 without
  1355. X               decimal point */
  1356. X{
  1357. X  char magstr[10];
  1358. X
  1359. X/*fprintf(stderr, "%d %d %f <%s> <%s> <%s> <%s> <%s> <%s> <%s>\n", x, y, mag,
  1360. X    type, color_str, label_field, con_str, obj_name, comment_str,
  1361. X    file_line);*/
  1362. X
  1363. X  if (draw_glyph)
  1364. X    switch(type[0]) {
  1365. X    case 'S':    drawStar(x,y,mag,type[1],color_str);
  1366. X      break;
  1367. X    case 'P':    drawPlan(x,y,mag,type[1],color_str, size_obj(label_field),
  1368. X             comment_str);
  1369. X      break;
  1370. X    case 'N':    drawNebu(x,y,mag,type[1],color_str, size_obj(label_field));
  1371. X      break;
  1372. X    case 'G':    drawGalx(x,y,mag,type[1],color_str, size_obj(label_field));
  1373. X      break;
  1374. X    case 'C':    drawClus(x,y,mag,type[1],color_str, size_obj(label_field));
  1375. X      break;
  1376. X    case 'U':
  1377. X      drawUnknown(x,y,mag,type[1],color_str, size_obj(label_field));
  1378. X      break;
  1379. X    case 'O':
  1380. X      drawOther(x,y,mag,type[1],color_str, size_obj(label_field));
  1381. X      break;
  1382. X    case 'V':
  1383. X    case 'A':
  1384. X    case 'I':
  1385. X      break;
  1386. X    case '#':
  1387. X    default:
  1388. X      break;
  1389. X    };
  1390. X
  1391. X
  1392. X/*
  1393. X * use name or label
  1394. X */
  1395. X  if (draw_text) {
  1396. X    if (type[0] == 'I')
  1397. X      D_color(color_str);
  1398. X    else
  1399. X      D_color("  ");
  1400. X
  1401. X    if (use_name && obj_name[0]) {
  1402. X      D_fontsize(NAMESIZE, NAMEFNT);
  1403. X      D_text(x+x_nameoffset, y+y_nameoffset, obj_name, FALSE);
  1404. X    } else if (use_lbl &&
  1405. X           ((label_field[0] != ' ') || (label_field[1] != ' '))) {
  1406. X      D_fontsize(LBLSIZE, LBLFNT);
  1407. X      D_text(x+x_lbloffset, y+y_lbloffset, label_field, TRUE);
  1408. X    }
  1409. X/* If you want to mag label other objects, change this */
  1410. X    if (use_mag && (type[0] == 'S')) {
  1411. X      sprintf(magstr, "%02d", (int)(mag*10.0+0.5));
  1412. X      D_fontsize(MAGSIZE, MAGFNT);
  1413. X      D_text(x+x_magoffset, y+y_magoffset, magstr, FALSE);
  1414. X    }
  1415. X  }
  1416. X}
  1417. X
  1418. XdrawStar(x, y, mag, type, color)
  1419. X    int x, y;
  1420. X    double mag;
  1421. X    char type, *color;
  1422. X{
  1423. X    double mag2,mag3;
  1424. X    mag2 = (250 - (mag+1)*30);
  1425. X    mag2= (mag2<=0)?1:mag2;
  1426. X    vsf_perimeter(vdihandle, 1);
  1427. X    v_circle(vdihandle, (int)xadjust(x), (int)yadjust(y), (int)mag2);
  1428. X    vsf_perimeter(vdihandle, 0);
  1429. X
  1430. X    if ((type == 'V') && (mag<7))
  1431. X    {
  1432. X        mag3 = mag2 * 2.0;
  1433. X        vsf_interior(vdihandle, 0);
  1434. X        vsf_perimeter(vdihandle, 1);
  1435. X        v_circle(vdihandle, (int)xadjust(x), (int)yadjust(y), (int)mag3);
  1436. X        vsf_perimeter(vdihandle, 0);
  1437. X        vsf_interior(vdihandle, 1);
  1438. X    }
  1439. X    else
  1440. X    if (((type == 'B') || (type == 'D')) && (mag<7))
  1441. X    {
  1442. X        int line[4];
  1443. X        line[1]=line[3]=(int)yadjust(y);
  1444. X        line[0]= (int)(xadjust(x)-mag2-(mag2/4.0));
  1445. X        line[2]= (int)(xadjust(x)+mag2+(mag2/4.0));
  1446. X        v_pline(vdihandle, 2, line);
  1447. X    }
  1448. X}
  1449. X
  1450. XdrawPlan(x, y, mag, pcode, color, plansize)
  1451. X     int x,y;
  1452. X     double mag;
  1453. X     char pcode, *color;
  1454. X     long plansize;
  1455. X
  1456. X{
  1457. X     vsf_interior(vdihandle, 0);
  1458. X     drawStar(x, y, mag, 'S', color);
  1459. X     vsf_interior(vdihandle, 1);
  1460. X}
  1461. X
  1462. XdrawGalx(x, y, mag, type, color, nebsize)
  1463. X     int x, y;
  1464. X     double mag;
  1465. X     char type, *color;
  1466. X     long nebsize;        /* -1 should give default size */
  1467. X{
  1468. X     vsf_interior(vdihandle, 0);
  1469. X     vsf_perimeter(vdihandle, 1);
  1470. X     v_ellipse(vdihandle, (int)xadjust(x), (int)yadjust(y),(int)xadjust(12),(int)yadjust(8));
  1471. X     vsf_perimeter(vdihandle, 0);
  1472. X     vsf_interior(vdihandle, 1);
  1473. X}
  1474. X
  1475. XdrawClus(x, y, mag, type, color, nebsize)
  1476. X     int x, y;
  1477. X     double mag;
  1478. X     char type, *color;
  1479. X     long nebsize;        /* -1 should give default size */
  1480. X{
  1481. X     switch(type) {
  1482. X    case 'G': {
  1483. X             int pxyarray[4];
  1484. X             int x1=(int)xadjust(x);
  1485. X        int y1=(int)yadjust(y);
  1486. X        int dx=(int)xadjust(6);
  1487. X        int dy=(int)yadjust(6);
  1488. X
  1489. X        vsf_interior(vdihandle, 0);
  1490. X        vsf_perimeter(vdihandle, 1);
  1491. X/*        v_circle(vdihandle, x1, y1, 300); */
  1492. X        v_ellipse(vdihandle, x1, y1, (int)xadjust(10),(int)yadjust(10));
  1493. X        vsf_perimeter(vdihandle, 0);
  1494. X        vsf_interior(vdihandle, 1);
  1495. X        pxyarray[0]=pxyarray[2]=x1;
  1496. X        pxyarray[1]=y1+dy;
  1497. X        pxyarray[3]=y1-dy;
  1498. X        v_pline(vdihandle, 2, pxyarray);
  1499. X        pxyarray[0]=x1-dx;
  1500. X        pxyarray[2]=x1+dx;
  1501. X        pxyarray[1]=pxyarray[3]=y1;
  1502. X        v_pline(vdihandle, 2, pxyarray);
  1503. X        break;
  1504. X    }
  1505. X         case 'O':
  1506. X         default:
  1507. X        vsf_interior(vdihandle, 0);
  1508. X        vsl_type(vdihandle,3);
  1509. X        /* vsl_type(vdihandle,7);*/
  1510. X        /* vsl_udsty(vdihandle, 0xcccc);*/
  1511. X        vsf_perimeter(vdihandle, 1);
  1512. X        v_arc(vdihandle, (int)xadjust(x), (int)yadjust(y), 300,0,3600);
  1513. X        vsf_perimeter(vdihandle, 0);
  1514. X        vsl_type(vdihandle,1);
  1515. X        vsf_interior(vdihandle, 1);
  1516. X        break;
  1517. X     }
  1518. X}
  1519. X
  1520. XdrawNebu(x, y, mag, type, color, nebsize)
  1521. X     int x, y;
  1522. X     double mag;
  1523. X     char type, *color;
  1524. X     long nebsize;        /* -1 should give default size */
  1525. X{
  1526. X     int pxyarray[4];
  1527. X     int x1=(int)xadjust(x);
  1528. X     int y1=(int)yadjust(y);
  1529. X     int dx=(int)xadjust(5);
  1530. X     int dy=(int)yadjust(5);
  1531. X     /* box of 5 edgelength */
  1532. X     pxyarray[0]= x1 - dx;
  1533. X     pxyarray[1]= y1 - dy;
  1534. X     pxyarray[2]= x1 + dx;
  1535. X     pxyarray[3]= y1 + dy;
  1536. X     vsf_interior(vdihandle, 0);
  1537. X     vsl_type(vdihandle,1);
  1538. X     vsf_perimeter(vdihandle, 1);
  1539. X     v_bar(vdihandle,pxyarray);
  1540. X     vsf_perimeter(vdihandle, 0);
  1541. X     vsl_type(vdihandle,1);
  1542. X     vsf_interior(vdihandle, 1);
  1543. X}
  1544. X
  1545. XdrawUnknown(x, y, mag, type, color, nebsize)
  1546. X     int x, y;
  1547. X     double mag;
  1548. X     char type, *color;
  1549. X     long nebsize;        /* -1 should give default size */
  1550. X{
  1551. X}
  1552. X
  1553. XdrawOther(x, y, mag, type, color, nebsize)
  1554. X     int x, y;
  1555. X     double mag;
  1556. X     char type, *color;
  1557. X     long nebsize;        /* -1 should give default size */
  1558. X{
  1559. X}
  1560. X
  1561. X#else STARIMAGES
  1562. X
  1563. X/*
  1564. X** Draw a horizontal line.
  1565. X*/
  1566. X
  1567. Xdrawlen (x, y, dx, dy, len)
  1568. Xint x, y, dx, dy, len;
  1569. X{
  1570. X/*  D_movedraw(x+dx, y+dy,
  1571. X         x+dx+len,
  1572. X         y+dy, SOLID); another solution ! */
  1573. X#undef DRAWTEST
  1574. X#ifdef DRAWTEST
  1575. X     int line[4],i;
  1576. X     double cx,cy;
  1577. X
  1578. X     cx=xadjust(x);
  1579. X     cy=yadjust(y)+dy*5;
  1580. X
  1581. X     line[0] = cx + dx*5;
  1582. X     line[2] = cx + dx*5 + len*10 - 10;
  1583. X
  1584. X     for (i=-5; i<=5 ; i++)
  1585. X     {
  1586. X         line[1] = line[3] = cy + i;
  1587. X         v_pline(vdihandle, 2, line);
  1588. X     }
  1589. X#else
  1590. X     int line[4];
  1591. X
  1592. X     line[0] = xadjust(x) + dx;
  1593. X     line[2] = xadjust(x) + dx + len - 1;
  1594. X     line[1] = line[3] = yadjust(y) + dy;
  1595. X     v_pline(vdihandle, 2, line);
  1596. X#endif
  1597. X}
  1598. X
  1599. X#endif STARIMAGES
  1600. X
  1601. X/* Functions for areas, drawn as lines for now */
  1602. X/* Move to (x, y) to begin an area */
  1603. XD_areamove(x, y)
  1604. X     int x, y;
  1605. X{
  1606. X  D_move(x, y);
  1607. X}
  1608. X
  1609. X/* Add a segment to the area border */
  1610. XD_areaadd(x, y)
  1611. X     int x, y;
  1612. X{
  1613. X  D_draw(x, y, SOLID);
  1614. X}
  1615. X
  1616. X/* Fill the area, after adding the last segment */
  1617. XD_areafill(x, y)
  1618. X     int x, y;
  1619. X{
  1620. X  D_draw(x, y, SOLID);
  1621. X}
  1622. X
  1623. X
  1624. X/* Variables of positioning are here */
  1625. X#define L_TIL 220
  1626. X#define L_STIL 185
  1627. X
  1628. X#define L_LMAR1 40
  1629. X#define L_LMAR2 65
  1630. X#define L_LTEXT 95
  1631. X#define L_RMAR1 205
  1632. X#define L_RMAR2 230
  1633. X#define L_RTEXT 260
  1634. X
  1635. X#define L_LINE1 150
  1636. X#define L_LINE2 125
  1637. X#define L_LINE3 100
  1638. X#define L_LINE4 75
  1639. X#define L_LINE5 50
  1640. X#define L_LINE6 25
  1641. X
  1642. X
  1643. Xchartlegend(win)
  1644. X     mapwindow *win;
  1645. X{
  1646. X  char ras[20], dls[20], outstr[40];
  1647. X  if (!title[0]) title = "LEGEND";
  1648. X  rastr(ras, win->racen);
  1649. X  declstr(dls, win->dlcen);
  1650. X
  1651. X  if (win->map_type != FULLPAGEMAP) {
  1652. X    sprintf(outstr, "(%s,%s lim: %2.1f)", ras, dls, win->maglim);
  1653. X    D_fontsize(TITLESIZE, TITLEFNT); D_text(L_LMAR1, L_TIL, title, FALSE);
  1654. X    D_fontsize(SUBTLSIZE, SUBTLFNT); D_text(L_LMAR1, L_STIL, outstr, FALSE);
  1655. X    
  1656. X    drawStar(L_LMAR2, L_LINE1, 0.0, 'S', "  ");
  1657. X    D_fontsize(NAMESIZE, NAMEFNT);
  1658. X    D_text(L_LTEXT, L_LINE1,"<0.5", FALSE);
  1659. X    if (win->maglim >= 0.5)
  1660. X      {
  1661. X    drawStar(L_RMAR2, L_LINE1, 1.0, 'S', "  ");
  1662. X    D_fontsize(NAMESIZE, NAMEFNT);
  1663. X    D_text( L_RTEXT, L_LINE1,"<1.5", FALSE);
  1664. X      }
  1665. X    if (win->maglim >= 1.5)
  1666. X      {
  1667. X    drawStar(L_LMAR2, L_LINE2, 2.0, 'S', "  ");
  1668. X    D_fontsize( NAMESIZE, NAMEFNT);
  1669. X    D_text(L_LTEXT, L_LINE2,"<2.5", FALSE);
  1670. X      }
  1671. X    if (win->maglim >= 2.5)
  1672. X      {
  1673. X    drawStar(L_RMAR2, L_LINE2, 3.0, 'S', "  ");
  1674. X    D_fontsize( NAMESIZE, NAMEFNT);
  1675. X    D_text(L_RTEXT, L_LINE2,"<3.5", FALSE);
  1676. X      }
  1677. X    if (win->maglim >= 3.5)
  1678. X      {
  1679. X    drawStar(L_LMAR2, L_LINE3, 4.0, 'S', "  ");
  1680. X    D_fontsize( NAMESIZE, NAMEFNT);
  1681. X    D_text(L_LTEXT, L_LINE3,"<4.5", FALSE);
  1682. X      }
  1683. X    if (win->maglim > 4.5)
  1684. X      {
  1685. X    drawStar(L_RMAR2, L_LINE3, 5.0, 'S', "  ");
  1686. X    D_fontsize( NAMESIZE, NAMEFNT);
  1687. X    D_text(L_RTEXT, L_LINE3,">4.5", FALSE);
  1688. X      }
  1689. X    
  1690. X    D_fontsize(NAMESIZE, NAMEFNT);
  1691. X    D_text(L_LTEXT,L_LINE4,"double", FALSE);
  1692. X    drawStar(L_LMAR2,L_LINE4,2.0, 'D', "  ");
  1693. X    D_fontsize(NAMESIZE, NAMEFNT);
  1694. X    D_text(L_RTEXT,L_LINE4,"variable",FALSE);
  1695. X    drawStar(L_RMAR2,L_LINE4,2.0, 'V', "  ");
  1696. X
  1697. X    D_fontsize(NAMESIZE, NAMEFNT);
  1698. X    D_text(L_LTEXT,L_LINE5,"planet", FALSE);
  1699. X    drawPlan(L_LMAR2,L_LINE5,1.0, ' ', "  ", (long) -1);
  1700. X
  1701. X    D_fontsize(NAMESIZE, NAMEFNT);
  1702. X    D_text(L_RTEXT,L_LINE5,"galaxy", FALSE);
  1703. X    drawGalx(L_RMAR2,L_LINE5,1.0, 'E', "  ", (long) -1);
  1704. X    drawGalx(L_RMAR1,L_LINE5,1.0, 'S', "  ", (long) -1);
  1705. X
  1706. X    D_fontsize(NAMESIZE, NAMEFNT);
  1707. X    D_text(L_LTEXT,L_LINE6,"nebula", FALSE);
  1708. X    drawNebu(L_LMAR2,L_LINE6,1.0, 'D', "  ", (long) -1);
  1709. X    drawNebu( L_LMAR1,L_LINE6,1.0, 'P', "  ", (long) -1);
  1710. X
  1711. X    D_fontsize(NAMESIZE, NAMEFNT);
  1712. X    D_text(L_RTEXT,L_LINE6,"cluster", FALSE);
  1713. X    drawClus(L_RMAR2,L_LINE6,1.0, 'O', "  ", (long) -1);
  1714. X    drawClus(L_RMAR1,L_LINE6,1.0, 'G', "  ", (long) -1);
  1715. X  } else {
  1716. X    D_fontsize(NAMESIZE, NAMEFNT);
  1717. X
  1718. X    sprintf(outstr, "%s: %s,%s lim: %2.1f", title, ras, dls, win->maglim);
  1719. X    D_text(15, 15, outstr, FALSE);
  1720. X  }
  1721. X}
  1722. END_OF_FILE
  1723. if test 21986 -ne `wc -c <'starchart/starst.c'`; then
  1724.     echo shar: \"'starchart/starst.c'\" unpacked with wrong size!
  1725. fi
  1726. # end of 'starchart/starst.c'
  1727. fi
  1728. echo shar: End of archive 12 \(of 32\).
  1729. cp /dev/null ark12isdone
  1730. MISSING=""
  1731. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 ; do
  1732.     if test ! -f ark${I}isdone ; then
  1733.     MISSING="${MISSING} ${I}"
  1734.     fi
  1735. done
  1736. if test "${MISSING}" = "" ; then
  1737.     echo You have unpacked all 32 archives.
  1738.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1739. else
  1740.     echo You still need to unpack the following archives:
  1741.     echo "        " ${MISSING}
  1742. fi
  1743. ##  End of shell archive.
  1744. exit 0
  1745.  
  1746.  
  1747.