home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource1 / ast40dos / xgeneral.c < prev    next >
C/C++ Source or Header  |  1994-01-04  |  42KB  |  1,421 lines

  1. /*
  2. ** Astrolog (Version 4.00) File: xgeneral.c
  3. **
  4. ** IMPORTANT NOTICE: the graphics database and chart display routines
  5. ** used in this program are Copyright (C) 1991-1993 by Walter D. Pullen
  6. ** (cruiser1@stein.u.washington.edu). Permission is granted to freely
  7. ** use and distribute these routines provided one doesn't sell,
  8. ** restrict, or profit from them in any way. Modification is allowed
  9. ** provided these notices remain with any altered or edited versions of
  10. ** the program.
  11. **
  12. ** The main planetary calculation routines used in this program have
  13. ** been Copyrighted and the core of this program is basically a
  14. ** conversion to C of the routines created by James Neely as listed in
  15. ** Michael Erlewine's 'Manual of Computer Programming for Astrologers',
  16. ** available from Matrix Software. The copyright gives us permission to
  17. ** use the routines for personal use but not to sell them or profit from
  18. ** them in any way.
  19. **
  20. ** The PostScript code within the core graphics routines are programmed
  21. ** and Copyright (C) 1992-1993 by Brian D. Willoughby
  22. ** (brianw@sounds.wa.com). Conditions are identical to those above.
  23. **
  24. ** The extended accurate ephemeris databases and formulas are from the
  25. ** calculation routines in the program "Placalc" and are programmed and
  26. ** Copyright (C) 1989,1991,1993 by Astrodienst AG and Alois Treindl
  27. ** (alois@azur.ch). The use of that source code is subject to
  28. ** regulations made by Astrodienst Zurich, and the code is not in the
  29. ** public domain. This copyright notice must not be changed or removed
  30. ** by any user of this program.
  31. **
  32. ** Initial programming 8/28,30, 9/10,13,16,20,23, 10/3,6,7, 11/7,10,21/1991.
  33. ** X Window graphics initially programmed 10/23-29/1991.
  34. ** PostScript graphics initially programmed 11/29-30/1992.
  35. ** Last code change made 12/31/1993.
  36. */
  37.  
  38. #include "astrolog.h"
  39.  
  40. #ifdef GRAPH
  41.  
  42. int xpen, ypen;
  43.  
  44.  
  45. /*
  46. ******************************************************************************
  47. ** Bitmap File Routines.
  48. ******************************************************************************
  49. */
  50.  
  51. /* Write the bitmap array to a previously opened file in a format that   */
  52. /* can be read in by the Unix X commands bitmap and xsetroot. The 'mode' */
  53. /* parameter defines how much white space is put in the file.            */
  54.  
  55. void WriteXBitmap(data, name, mode)
  56. FILE *data;
  57. char *name, mode;
  58. {
  59.   int x, y, i, temp = 0;
  60.   uint value;
  61.  
  62.   fprintf(data, "#define %s_width %d\n" , name, chartx);
  63.   fprintf(data, "#define %s_height %d\n", name, charty);
  64.   fprintf(data, "static %s %s_bits[] = {",
  65.     mode != 'V' ? "char" : "short", name);
  66.   for (y = 0; y < charty; y++) {
  67.     x = 0;
  68.     do {
  69.  
  70.       /* Process each row, eight columns at a time. */
  71.  
  72.       if (y + x > 0)
  73.         fprintf(data, ",");
  74.       if (temp == 0)
  75.         fprintf(data, "\n%s",
  76.           mode == 'N' ? "  " : (mode == 'C' ? " " : ""));
  77.       value = 0;
  78.       for (i = (mode != 'V' ? 7 : 15); i >= 0; i--)
  79.         value = (value << 1) +
  80.           (!(PGET(bm, x+i, y)^(xreverse*15))^xreverse && (x + i < chartx));
  81.       if (mode == 'N')
  82.         putc(' ', data);
  83.       fprintf(data, "0x");
  84.       if (mode == 'V')
  85.         fprintf(data, "%c%c",
  86.           INTTOHEX(value >> 12), INTTOHEX((value >> 8) & 15));
  87.       fprintf(data, "%c%c",
  88.         INTTOHEX((value >> 4) & 15), INTTOHEX(value & 15));
  89.       temp++;
  90.  
  91.       /* Is it time to skip to the next line while writing the file yet? */
  92.  
  93.       if ((mode == 'N' && temp >= 12) ||
  94.           (mode == 'C' && temp >= 15) ||
  95.           (mode == 'V' && temp >= 11))
  96.         temp = 0;
  97.       x += (mode != 'V' ? 8 : 16);
  98.     } while (x < chartx);
  99.   }
  100.   fprintf(data, "};\n");
  101. }
  102.  
  103.  
  104. /* Write the bitmap array to a previously opened file in a simple boolean    */
  105. /* Ascii rectangle, one char per pixel, where '#' represents an off bit and  */
  106. /* '-' an on bit. The output format is identical to the format generated by  */
  107. /* the Unix bmtoa command, and it can be converted into a bitmap with atobm. */
  108.  
  109. void WriteAscii(data)
  110. FILE *data;
  111. {
  112.   int x, y, i;
  113.  
  114.   for (y = 0; y < charty; y++) {
  115.     for (x = 0; x < chartx; x++) {
  116.       i = PGET(bm, x, y);
  117.       if (xcolor)
  118.         putc(INTTOHEX(i), data);
  119.       else
  120.         putc(i ? '-' : '#', data);
  121.     }
  122.     putc('\n', data);
  123.   }
  124. }
  125.  
  126.  
  127. /* Write the bitmap array to a previously opened file in the bitmap format  */
  128. /* used in Microsoft Windows for its .bmp extension files. This is a pretty */
  129. /* efficient format, only requiring one bit per pixel and a small header.   */
  130.  
  131. void WriteBmp(data)
  132. FILE *data;
  133. {
  134.   int x, y;
  135.   dword value;
  136.  
  137.   /* BitmapFileHeader */
  138.   PutByte('B'); PutByte('M');
  139.   PutLong(14+40 + (xcolor ? 64 : 8) +
  140.     (long)4*charty*((chartx-1 >> (xcolor ? 3 : 5))+1));
  141.   PutWord(0); PutWord(0);
  142.   PutLong(14+40 + (xcolor ? 64 : 8));
  143.   /* BitmapInfo / BitmapInfoHeader */
  144.   PutLong(40);
  145.   PutLong(chartx); PutLong(charty);
  146.   PutWord(1); PutWord(xcolor ? 4 : 1);
  147.   PutLong(0 /*BI_RGB*/); PutLong(0);
  148.   PutLong(0); PutLong(0);
  149.   PutLong(0); PutLong(0);
  150.   /* RgbQuad */
  151.   if (xcolor)
  152.     for (x = 0; x < 16; x++) {
  153.       PutByte(RGBB(rgbbmp[x])); PutByte(RGBG(rgbbmp[x]));
  154.       PutByte(RGBR(rgbbmp[x])); PutByte(0);
  155.     }
  156.   else {
  157.     PutLong(0);
  158.     PutByte(255); PutByte(255); PutByte(255); PutByte(0);
  159.   }
  160.   /* Data */
  161.   for (y = charty-1; y >= 0; y--) {
  162.     value = 0;
  163.     for (x = 0; x < chartx; x++) {
  164.       if ((x & (xcolor ? 7 : 31)) == 0 && x > 0) {
  165.         PutLong(value);
  166.         value = 0;
  167.       }
  168.       if (xcolor)
  169.         value |= (dword)PGET(bm, x, y) << ((x & 7 ^ 1) << 2);
  170.       else
  171.         if (PGET(bm, x, y))
  172.           value |= (dword)1 << (x & 31 ^ 7);
  173.     }
  174.     PutLong(value);
  175.   }
  176. }
  177.  
  178.  
  179. /* Output the bitmap in memory to a file. This basically consists of just    */
  180. /* calling some routine to actually write a bitmap to a file, although we    */
  181. /* need to prompt the user for a filename if it wasn't specified beforehand. */
  182.  
  183. void WriteFile()
  184. {
  185.   char line[STRING];
  186.   FILE *data;
  187.  
  188. #ifdef PS
  189.   if (psfile) {
  190.       PSend();
  191.     return;
  192.   }
  193. #endif
  194.   if (outputfile == NULL && (metafile || (xbitmap && bitmapmode == 'B')))
  195.     fprintf(stdout, "(It is recommended to specify an extension of '.%s'.)\n",
  196.       xbitmap ? "bmp" : "wmf");
  197.   loop {
  198.     if (outputfile == NULL) {
  199.       sprintf(line, "Enter name of file to write %s to",
  200.         xbitmap ? "bitmap" : "metafile");
  201.       InputString(line, line);
  202.       outputfile = line;
  203.     }
  204.     data = fopen(outputfile, "wb");
  205.     if (data != NULL)
  206.       break;
  207.     else {
  208.       PrintWarning("Couldn't create output file.");
  209.       outputfile = NULL;
  210.     }
  211.   }
  212.   if (xbitmap) {
  213.     if (bitmapmode == 'B')
  214.       WriteBmp(data);
  215.     else if (bitmapmode == 'A')
  216.       WriteAscii(data);
  217.     else
  218.       WriteXBitmap(data, outputfile, bitmapmode);
  219.   }
  220. #ifdef META
  221.   else
  222.     WriteMeta(data);
  223. #endif
  224.   fclose(data);
  225. }
  226.  
  227.  
  228. /*
  229. ******************************************************************************
  230. ** PostScript File Routines.
  231. ******************************************************************************
  232. */
  233.  
  234. #ifdef PS
  235.  
  236. /* Global variables used by the PostScript generator. */
  237.  
  238. FILE *psdata;
  239. int strokecount = 0, currentlinecap = 0, currentdash = 0, currentfont = 0;
  240. real currentlinewidth = 1.0;
  241.  
  242. /* Table of PostScript header alias lines used by the program. */
  243.  
  244. char PSfunctions[] =
  245. "/languagelevel where{pop languagelevel}{1}ifelse\
  246.  2 lt{\n\
  247. /sf{exch findfont exch\
  248.  dup type/arraytype eq{makefont}{scalefont}ifelse setfont}bind def\n\
  249. /rf{gsave newpath\n\
  250. 4 -2 roll moveto\
  251.  dup 0 exch rlineto exch 0 rlineto neg 0 exch rlineto closepath\n\
  252. fill grestore}bind def\n\
  253. /rc{newpath\n\
  254. 4 -2 roll moveto\
  255.  dup 0 exch rlineto exch 0 rlineto neg 0 exch rlineto closepath\n\
  256. clip newpath}bind def\n\
  257. }{/sf/selectfont load def/rf/rectfill load def\
  258. /rc/rectclip load def}ifelse\n\
  259. /center{0 begin gsave dup 4 2 roll\
  260.  translate newpath 0 0 moveto\
  261.  false charpath flattenpath pathbbox\
  262.  /URy exch def/URx exch def/LLy exch def/LLx exch def\
  263.  URx LLx sub 0.5 mul