home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / x / volume10 / xv / part10 < prev    next >
Text File  |  1990-12-09  |  44KB  |  1,380 lines

  1. Path: uunet!wuarchive!cs.utexas.edu!sun-barr!newstop!sun!exodus!appserv!halibut.cis.upenn.edu
  2. From: bradley@halibut.cis.upenn.edu (John Bradley)
  3. Newsgroups: comp.sources.x
  4. Subject: v10i088: xv - display and manipulate images, Part10/10
  5. Message-ID: <326@appserv.Eng.Sun.COM>
  6. Date: 27 Nov 90 20:08:47 GMT
  7. References: <csx-10i079:xv@uunet.UU.NET>
  8. Sender: news@exodus.Eng.Sun.COM
  9. Lines: 1363
  10. Approved: argv@sun.com
  11.  
  12. Submitted-by: bradley@halibut.cis.upenn.edu (John Bradley)
  13. Posting-number: Volume 10, Issue 88
  14. Archive-name: xv/part10
  15.  
  16. #!/bin/sh
  17. # to extract, remove the header and type "sh filename"
  18. if `test ! -s ./README`
  19. then
  20. echo "writting ./README"
  21. cat > ./README << '\BARFOO\'
  22. Installation
  23. ------------
  24. If you don't plan to use Imake, copy 'Makefile.std' (a regular old-style
  25. minimalist makefile, not one created by Imake) to 'Makefile'.
  26.  
  27. Check the Makefile for the configuration option(s).  There are unfortunately
  28. quite a few these days, to support a number of different machines.  The
  29. program builds just fine on Suns running SunOS 4.0, VAXes running Ultrix, 
  30. and DECstations running UWS, without any options whatsoever.  If you're
  31. on a SYSV-based machine, you'll probably need '-DSYSV' and '-DDIRENT'.
  32. Read the file for more specific info.
  33.  
  34. Otherwise, check the Imakefile, and make the program however you normally 
  35. would.  Be sure to 'make depend' before building the program.
  36.  
  37. Caveats
  38. -------
  39.  
  40. XV has been developed on a Sun4/280 running SunOS 4.0, using both the normal
  41. 'cc' and gcc-1.37 compilers.  There shouldn't be anything grotesque enough
  42. in the code to break any other compilers.  
  43.  
  44. The viewing environment has mainly been an IBM RT with an 8-bit color display.
  45. The window managers of choice have been TWM (recently) and UWM (in the past).
  46.  
  47. It has been compiled and tested on the following systems:  Sun 4 running SunOS 
  48. 4.0, VAXstation 3500 running Ultrix 3.0, MicroVax II running Ultrix 2.0, 
  49. DecStation 3100 running UWS 2.0, IBM RISC System/6000 running AIX 3.0.
  50.  
  51. It has displayed on the following systems:  IBM RT (8-bit color), Sun 3 
  52. (1-bit B/W), Sun 3 (8-bit grayscale), Sun 4 (1-bit B/W), MicroVax II (8-bit
  53. color), MicroVax II (4-bit grayscale), a variety of HPs (4-bit color, 6-bit 
  54. color, 8-bit color, and 24-bit color), and Visual, NCD, Tektronix, and
  55. HDS X terminals (1-bit B/W abd 8-bit color).
  56.  
  57. Provided you don't have some odd-ball 5-bit StaticColor display, it should
  58. work for you.
  59.  
  60. 'vsprintf.c' has been included for the benefit of those on machines that
  61. don't have it.  (IBM RT AOS 4.3 and BSD 4.3 on VAX)
  62.  
  63.  
  64. Bizarrities
  65. -----------
  66.  
  67. There are problems with using XV under 'dxwm', DEC's window manager.  You'll
  68. have to specify '-dxwm' to enable a couple of kludges, and even then XV is
  69. unable to MOVE its window AT ALL.  (This was with dxwm controlling my X11R4
  70. IBM RT display.  Your mileage (dxwm controlling a DEC server, ferinstance)
  71. may vary.
  72.  
  73. XV would appear to exercise a pair of bugs in TWM, the version from the X11R4 
  74. tape.  Perhaps they've been fixed by now.
  75.  
  76. Colormap Installation:  under twm, if you have multiple XVs running, and each
  77. has their own colormap, sometimes the colormap doesn't get properly installed 
  78. if you move the mouse directly from one XV to the other, quickly, so that it 
  79. doesn't see the mouse go into the root window, or any other window.  If you 
  80. move the mouse outside the window and move it back in, it SHOULD install the
  81. colormap correctly.
  82.  
  83. Colormap Installation: Note, if an alternate colormap is installed, it will
  84. ONLY be installed when the mouse is inside the IMAGE window.  It will not be
  85. installed when the mouse is in any other XV windows.  This is because I can't
  86. guarantee that the other windows will still have contrasting
  87. foreground/background colors when the alternate colormap is installed.  It is
  88. assumed that if you put the mouse in a window, you will want to use that
  89. window, so you'd better be able to READ that window...
  90.  
  91. There's a bug in my version of TWM that creeps up if you have titlebars 
  92. turned off.  Essentially, XV tells the window manager to make the window a
  93. certain size.  TWM (wrongly) adds enough room at the top to put its title bar 
  94. there, but doesn't draw it, since titlebars are turned off.  XV gets back a
  95. ConfigureNotify event on the window with the new size, which is large by 20-odd
  96. pixels in height.  There's no way to detect this behavior that I know of.
  97. Workaround:  wait for a fixed version of TWM, until then, run (at least XV) 
  98. with titlebars on.
  99.  
  100.  
  101.  
  102. Modifying XV
  103. ------------
  104.  
  105. ADDING A NEW FILE FORMAT TO XV
  106.  
  107. This category is split up into two sections, reading a new file format, and 
  108. writing a new file format, because it's perfectly conceivable that you'd want 
  109. to do one but not the other.  In some cases, it's even possible that you could
  110. only (realistically, read "easily") do one or the other.  (Example:  you want
  111. to be able to write an Encapsulated PostScript image, but you'd never be able
  112. to read PostScript files without writing a complete postscript interpreter, 
  113. something that's thankfully outside the context of this program.)
  114.  
  115. Alternately, you might also want to be able to directly display the output of
  116. some Mutant Ray Tracer (or whatever) without going through a conversion
  117. program, yet you'd NEVER want to create more Mutant-Ray-Tracer-format pictures
  118. with xv...
  119.  
  120. Whatever.  The following instructions are being written as I add PBM/PGM/PPM 
  121. capability to the program, so A) it's likely to be fairly accurate, and B) for
  122. example purposes, I'll be talking about the PBM/PGM/PPM code specifically.
  123.  
  124. READING A NEW FILE FORMAT
  125.  
  126. -------
  127. NOTE:  Despite the wide variety of displays and file formats XV deals with,
  128. internally it only manipulates 8-bit colormapped images.  If you're loading
  129. an 8-bit colormapped image, such as a GIF image, no prob.  If you're loading
  130. an 8-or-less-bits format that doesn't have a colormap (such as an 8-bit 
  131. greyscale image, or a 1-bit B/W bitmap) your Load() routine will have to 
  132. generate an appropriate colormap.  And if you're loading up a 24 bit RGB file,
  133. you'll have to compress it down to 8 bits by calling Conf24to8()...
  134. -------
  135.  
  136. Make a copy of xvpm.c, calling it something appropriate.  I'm adding PBM 
  137. capabilities, so I think xvpbm.c is a fine file name.
  138.  
  139. Edit the Makefile so that your new module will be compiled.  Add 'xvpbm.o' 
  140. (or whatever)
  141.  
  142. Edit the new module.
  143.  
  144. You'll need to #include "xv.h", of course.
  145.  
  146. The module should have one externally callable function that does the work of
  147. loading up the file.  The function is called with two arguments, a filename
  148. and the number of colors available on this display, like so:
  149.  
  150. /*******************************************/
  151. int LoadPBM(fname,nc)
  152.     char *fname;   int nc;
  153. /*******************************************/
  154.  
  155. The file name will be the complete file name (absolute, not relative to any 
  156. directory).  Note:  if xv is reading from <stdin>, don't worry about it.
  157. stdin is automatically copied to a /tmp/xv****** file to make life considerably
  158. simpler (and some times possible at all)
  159.  
  160. The number of colors argument is going to be (2 << # of bit planes) (or 'ncols'
  161. if specified on the command line).  Either way, this only comes into play if 
  162. you have to do a 24-to-8 bit conversion.  More on that later.
  163.  
  164. The function returns '0' on success, non-zero on failure.
  165.  
  166. The function is expected to load up the following global variables:
  167.     byte *pic;    this is a wide*high array of bytes, one byte per pixel,
  168.             starting at the top-left corner, and proceeding in 
  169.             scan-line order.  There is no padding of any sort at 
  170.             the end of a scan line.  The code is expected to 
  171.             malloc() the memory for this image.
  172.  
  173.     int pWIDE, pHIGH;
  174.             these variables specify the size of the image that
  175.             has been loaded, in pixels.
  176.  
  177.     byte r[256], g[256], b[256];
  178.             the desired colormap.  As specified above, 'pic' is
  179.             an 8-bits per pixel image.  A given pixel value in pic
  180.             maps to an RGB color through these arrays.  In each
  181.             array, a value of 0 means 'off', and a value of 255
  182.             means 'fully on'.  Note:  the arrays do not have to
  183.             be completely set.  Only RGB entries for pixels that
  184.             actually exist in the 'pic' need to be set.  For 
  185.             example, if the pic is known to be a B/W bitmap with
  186.             pixel values of 0 and 1, you'd only have to set
  187.             {r,g,b}[0] and {r,g,b}[1].
  188.  
  189. The function should also call 'SetISTR(ISTR_FORMAT, fmt, args)' to set the
  190. "Format:" string in the Info box.  It should call the function as soon as
  191. possible (ie, once it knows the format of the picture, but before it's tried
  192. to load/parse all of the image data...)
  193.  
  194.  
  195. Diagnostics:
  196.  
  197. Non-fatal errors in your Load() routine should be handled by calling
  198. SetISTR(ISTR_WARNING, fmt, args...).  This will print the string in the info
  199. box and in the ctrl box.
  200.  
  201. Non-fatal errors would be things like 'can't open file'...
  202.  
  203. Fatal errors should be handled by calling 'FatalError(error_string)'.  
  204. This function prints the string to stderr, and exits the program with an error
  205. code.  The classic fatal error is 'unable to malloc...'.
  206.  
  207.  
  208. Handling 24-bit RGB pictures:
  209.  
  210. If (as in the case of PPM files) you're file format has 24 bits of information
  211. per pixel, you'll have to get it down to 8 bits and a colormap for XV to make
  212. any use of it.  A function 'Conv25to8(pic24, w, h, nc)' is provided, so
  213. don't worry about it.
  214.  
  215. To use it, you'll have to load your picture into a WIDE*HIGH*3 array of bytes.
  216. (You'll be expected to malloc() this array.)  This array begins at the top left
  217. corner, and proceeds in scan-line order.  The first byte of the array is the
  218. red component of pixel0, followed by the green component of pixel0, followed by
  219. the blue component of pixel0, followed by the red component of pixel1, etc...
  220. There is no padding of any kind.
  221.  
  222. Once you've got this image built, call 'Conv24to8()' with a pointer to the
  223. 24bit image, the width and height of the image, and the number of colors to
  224. 'shoot for' in the resulting 8-bit picture.  This is the same parameter that
  225. was passed to your Load() routine, so just pass it along.
  226.  
  227. If successful, Conv24to8() will return '0'.  It will have generated 'pic', and
  228. filled in values in all the global variables that your Load() routine is
  229. expected to set.  You should now free() the memory associated with the 24-bit
  230. version of your image and leave your Load() function.
  231.  
  232. Read the source in xvpbm.c for further info on writing the Load() routine.
  233.  
  234. ----------
  235.  
  236. Once you have a working Load() routine, you'll want to do some other crap...
  237.  
  238. Edit xv.h and add two function prototypes for any global functions you've
  239. written (presumably just LoadPBM() (in this case)).  You'll need to add a full
  240. function prototype (with parameter types) in the #ifdef __STDC__ section (near
  241. the bottom), and a function reference (just the return type) in the #else /*
  242. non-ANSI */ section at the bottom.
  243.  
  244.  
  245.  
  246. Edit xv.c:
  247.  
  248.  
  249. ***  Add a filetype #define near the top.  Find the section:
  250.  
  251. > /* file types that can be read */
  252. > #define UNKNOWN 0
  253. > #define GIF     1
  254. > #define PM      2
  255.  
  256. And add one more to the list, in this case: "#define PBM 3"
  257.  
  258. Note: I only added one filetype to this list, despite the fact that
  259. I'm really adding three (or six, really) different file formats to the
  260. program.  This is because all of these file formats are related, and
  261. are handled by the same Load...() function.
  262.  
  263.  
  264.  
  265. *** now tell the openPic() routine about your Load...() routine
  266.  
  267. find the following (in openPic()):
  268.  
  269. >    filetype = UNKNOWN;
  270. >    if (strncmp(magicno,"GIF87",5)==0) filetype = GIF;
  271. >    else if (strncmp(magicno,"VIEW",4)==0 ||
  272. >             strncmp(magicno,"WEIV",4)==0) filetype = PM;
  273.  
  274. Add another 'else' case that will set filetype if it's your format:
  275.  
  276. >    else if (magicno[0] == 'P' && magicno[1]>='1' &&
  277. >             magicno[1]<='6') filetype = PBM;
  278.  
  279.  
  280. And add another case to the switch statement (a few lines further down)
  281.  
  282. >  switch (filetype) {
  283. >  case GIF: i = LoadGIF(filename);      break;
  284. >  case PM:  i = LoadPM(filename,ncols); break;
  285. >  }
  286.  
  287. add:
  288.  
  289. >  case PBM: i = LoadPBM(filename,ncols); break;
  290.  
  291.  
  292. That should do it.  Consult the file xvpm.c or xvpbm.c for further information.
  293. Remember: do as I mean, not as I say.
  294.  
  295. -----------------------------------------------------------------------------
  296.  
  297.  
  298.  
  299.  
  300. WRITING A NEW FILE FORMAT
  301.  
  302. -------
  303. NOTE:  Despite the wide variety of displays and file formats XV deals with,
  304. internally it only manipulates 8-bit colormapped images.  As a result, writing
  305. out 24bit RGB images is a horrible waste, and is to be avoided if your file
  306. format can handle colortable images...
  307. -------
  308.  
  309. If you haven't already done so (if/when you created the Load...() function):
  310.   Make a copy of xvpm.c, calling it something appropriate.  I'm adding PBM 
  311.   capabilities, so I think xvpbm.c is a fine file name.
  312.  
  313.   Edit the Makefile so that your new module will be compiled.  Add 'xvpbm.o' 
  314.   (or whatever)
  315.  
  316.   Edit the new module.
  317.  
  318.   You'll need to #include "xv.h", of course.
  319.  
  320.  
  321. The module should have one externally callable function that does the work of
  322. writing the file.  The function is called with a vitual plethora of arguments.
  323. At a minimum, you'll be given a FILE * to an already open-for-writing stream,
  324. a pointer to an 8-bits per pixel image, the width and height of that image, 
  325. pointers to 256-entry red, green, and blue colormaps, the number of colors
  326. actually used in the colormaps, and the 'color style' from the 'Save' dialog 
  327. box.
  328.  
  329. You may pass more parameters, since you're going to be adding the call to this
  330. function later on.  For example, in my PBM code, I pass one more parameter,
  331. 'raw' (whether to save the file as RAW or ASCII) to handle two very similar
  332. formats.  (Rather than haveing WritePBMRaw() and WritePBMAscii()...)
  333.  
  334. Your function definition should look something like this:
  335.  
  336. /*******************************************/
  337. int WritePBM(fp,pic,w,h,rmap,gmap,bmap,numcols,colorstyle,raw)
  338.     FILE *fp;
  339.     byte *pic;
  340.     int   w,h;
  341.     byte *rmap, *gmap, *bmap;
  342.     int   numcols, colorstyle, raw;
  343. /*******************************************/
  344.  
  345. Write the function as you deem appropriate.
  346.  
  347. Some Notes:
  348.   *  your function should return '0' if successful, non-zero if not
  349.   *  don't close 'fp'
  350.   *  pic is a w*h byte array, starting at top-left, and proceeding in normal
  351.     scan-line order
  352.  
  353.   *  colorstyle can (currently) take on three values:
  354.     0=FULL COLOR.  This could mean either 24-bit RGB, or an 8-bit colormap
  355.       or any other color format.  r[pix],g[pix],b[pix] specifies the color
  356.       of pixel 'pix'.  
  357.  
  358.     1=GREYSCALE, preferably 8 bits.  Two caveats:  you MUST use the 
  359.       colormap to determine what grey value to write.  For all you know,
  360.       pixel value '0' in pic could map to white, '1' could map to black, 
  361.       and '2' could map to a half-intensity grey.  
  362.  
  363.       The other note:  unless the original picture was a greyscale, (which
  364.       SHOULDN'T be tested for), the colormap is going to have actual 
  365.       colors in it.  You'll want to map RGB colors into greyscale values
  366.       using 'the standard formula'  (roughly .33R + .5G +.17B).  The
  367.       following code shows how to quickly write a raw greyscale image:
  368.  
  369.       if (colorstyle == 1) {    /* GreyScale: 8 bits per pixel */
  370.         byte rgb[256];
  371.         for (i=0; i<numcols; i++) rgb[i] = MONO(rmap[i],gmap[i],bmap[i]);
  372.         for (i=0, p=pic; i<w*h; i++, p++)
  373.           putc(rgb[*p],fp);
  374.       }
  375.  
  376.     2=B/W STIPPLE:  The stippling algorithm will have already been 
  377.       preformed by the time your function is called.  'pic' will be an
  378.       image consisting of the pixel values '1' and '0'.  (pic will STILL
  379.       be organized the same way (ie, one byte per pixel))
  380.  
  381.       1 = WHITE, 0 = BLACK
  382.  
  383.  
  384.     * for FULL COLOR or GREYSCALE images, you will be guaranteed that all
  385.       pixel values in pic are in the range [0 - numcols-1] (inclusive).
  386.  
  387.  
  388. That done, edit 'xv.h' and add a pair of function declarations for your new
  389. function.  (one full ANSI-style prototype, and one that just declares the
  390. return type).  (Copy the declarations for 'WritePM()'.)
  391.  
  392. Edit 'xvdir.c'.  This is the module that controls the 'Save' dialog box.
  393.  
  394. Add another 'format' type to the 'formatRB' button list:
  395. In the function 'CreateDirW()', find the block that (starts like):
  396.  
  397. >  formatRB = RBCreate(NULL, dirW, 26, y, "GIF", infofg, infobg);
  398. >  RBCreate(formatRB, dirW, 26, y+18, "PM", infofg, infobg);
  399.  
  400. copy the last 'RBCreate' call in the list, add '18' to the 'y+**' argument,
  401. and stick in an appropriate format type name.  In this case, I'm adding
  402. two formats (PBM raw and PBM ascii) so I'll add these two lines:
  403.  
  404. >  RBCreate(formatRB, dirW, 26, y+36, "PBM/PGM/PPM raw", infofg, infobg);
  405. >  RBCreate(formatRB, dirW, 26, y+54, "PBM/PGM/PPM ascii", infofg, infobg);
  406.  
  407. Depending how many formats you've added, you may have to move the 
  408. 'Normal Size' & 'At Current Expansion' buttons down.  Right above the RBCreate
  409. calls that have that string in them is a 'y = y + **' assignment.  Add 18 to
  410. the constant for each 'format' line that you added above.
  411.  
  412.  
  413. In the function DoSave(), find the following block:
  414. >  i = RBWhich(formatRB);
  415. >  switch (i) {
  416. >  case 0:  rv = WriteGIF(fp,thepic,w, h, r, g, b,numcols,RBWhich(colorRB));
  417. >           break;
  418. >  case 1:  rv = WritePM (fp,thepic,w, h, r, g, b,numcols,RBWhich(colorRB));
  419. >           break;
  420. >  }
  421.  
  422. and add cases for your function(s), like so:
  423.  
  424. >  case 2:  rv = WritePBM(fp,thepic,w, h, r, g, b,numcols,RBWhich(colorRB),1);
  425. >           break;
  426. >  case 3:  rv = WritePBM(fp,thepic,w, h, r, g, b,numcols,RBWhich(colorRB),0);
  427. >           break;
  428.  
  429.  
  430. \BARFOO\
  431. else
  432.   echo "will not over write ./README"
  433. fi
  434. if `test ! -s ./PATCHLEVEL`
  435. then
  436. echo "writting ./PATCHLEVEL"
  437. cat > ./PATCHLEVEL << '\BARFOO\'
  438. Current patchlevel:  2
  439.  
  440. Rev: 10/9/90    (patchlevel 0  -  initial release)
  441.  
  442. Rev: 10/17/90   (patchlevel 1)
  443. ------------------------------
  444. Imakefile added            (David Elliot    (dce@smsc.sony.com))
  445. System V release 4 mods        (David Elliot    (dce@smsc.sony.com))
  446. Bug in 'quick check' fixed    (Arthur Olson    (ado@elsie.nci.nih.gov))
  447. Mods for Convex machines    (Anthony Datri   (datri@convex.com))
  448. 'vprintf' module added         (Jonathan Kamens (jik@pit-manager.mit.edu))
  449. window creation bug fixed
  450. added icon
  451. fixed 'Input Focus' probs
  452. added '-w' flag to bggen
  453. various cleanups to shut up 'noisy' compilers
  454.  
  455.  
  456. Rev: 11/26/90  (patchlevel 2)
  457. -----------------------------
  458. added workaround for 'X Protocol Errors' on broken servers (XFreeColors())
  459.     (see the '-bfc' option)
  460. fixed core dump when cropping on certain displays
  461. misc. #ifdefs for HPs
  462. fixed problem with fish cursor remaining around too long
  463. more SVR4 #ifdefs            (David Elliott,  dce@smsc.sony.com)
  464. fixed bug in tracking pixel values    (Bob Finch,      bob@gli.com)
  465. misc #ifdefs for ISC 386/ix 2.0.2    (Mark Snitily    mark@zok.uucp)
  466. misc #ifdefs for AT&T machines         (Eric Raymond   eric@snark.thyrsus.com)
  467. misc #ifdefs for Silicon Graphics       (Paul Close     pdc@lunch.wpd.sgi.com)
  468. Added POSIX signal handling        (Mike Patnode   (mikep@sco.com))
  469. Port to SCO UNIX/ODT            (Mike Patnode   (mikep@sco.com))
  470.  
  471. fixed problem with using '-max' and '-fixed' at same time
  472.             (Greg Spencer   greg@longs.lance.colostate.edu)
  473.  
  474. modification to work with Virtual Root Windows (ala swm and tvtwm)
  475.             (Bill Kucharski  kucharsk@solbourne.com)
  476.  
  477. the 'save-as' filename is now set to the 'current' filename
  478.  
  479. Also, if you double click on 'plain' files in the directory box,
  480.     it will set the 'save-as' filename accordingly.
  481.  
  482. Added ability to view images centered on the root window, without
  483.     any tiling.  Added associated options ('-center', '-rfg', '-rbg',
  484.     and '-rpat')
  485.  
  486. Workaround for twm 'No title bars' bug  
  487.              (Steve Swales  steve@bat.lle.rochester.edu)
  488.  
  489. Bidirectional Rotate commands added
  490.  
  491. Maxpect command added:  (Maximum size, but preserve aspect ratio)
  492.  
  493. AutoCrop command added:  (Crops out solid borders.)
  494.  
  495. Potential support for 32-bit displays.  (Hasn't been tested.  Don't have one.)
  496. \BARFOO\
  497. else
  498.   echo "will not over write ./PATCHLEVEL"
  499. fi
  500. if `test ! -s ./Makefile`
  501. then
  502. echo "writting ./Makefile"
  503. cat > ./Makefile << '\BARFOO\'
  504. # Makefile for xv
  505. #
  506.  
  507. # your C compiler of choice
  508. CC = cc
  509.  
  510. ################ CONFIGURATION OPTIONS #################
  511.  
  512. # if you are running on a SysV-based machine, such as HP, Silicon Graphics,
  513. # etc, uncomment the following line to get you most of the way there.  
  514. #
  515. #UNIX = -DSVR4
  516.  
  517. # If you are running on a POSIX-compatible machine, such as an
  518. # IBM RS6000, you MAY need to uncomment the 'NEED_DIRENT' line.
  519. # To determine if such is the case, do a 'man readdir' on your machine.  If
  520. # readdir() returns a pointer to 'struct direct', you will not have
  521. # to change anything.  If, however, readdir() returns a pointer to
  522. # 'struct dirent', you will have to add the '-DDIRENT' to CFLAGS
  523. #
  524. #NEED_DIRENT = -DDIRENT
  525.  
  526.  
  527. # If, when 'Applying' colors, or when loading new pictures, you get an
  528. # X Protocol Error on the XFreeColors() call, your X Server is Wrong.
  529. # Several workarounds:  You can specify '-bfc' on the command line, or
  530. # set the 'xv.brokeFreeCols' resource to 'true'.  Alternately, you can
  531. # uncomment the BROKECOLS line below to compile in the workarounds
  532. # permanently.  If you do this, '-bfc' will toggle OFF the workarounds.
  533. # Noteworthy Offenders:  AIX 3.1 on IBM 6000, and OLW on Suns
  534. #
  535. #BROKECOLS = -DBROKEFREECOLS
  536.  
  537.  
  538. # IF YOUR MACHINE DOESN'T HAVE 'vprintf()' OR 'vsprintf()'
  539. #
  540. # Vax BSD and IBM AOS don't have vprintf or vsprintf.
  541. # Note that our local library versions of sprintf have been updated
  542. # to return int, the number of characters in the formatted string,
  543. # whereas the versions in stock 4.3BSD do not so return.  You may
  544. # have to remove the "-DINTSPRINTF" below if you're compiling for
  545. # stock 4.3BSD or for some other Vax or RT library package where
  546. # sprintf returns char *.
  547. #
  548. # Also, I define NOVOID on the Vax because I'm using pcc to compile.
  549. # If you use gcc or some other better compiler, this should not be
  550. # necessary.  I define NOSTDHDRS on the RT because we don't have
  551. # standard ANSI header files installed for the RT, even though the RT
  552. # compiler claims to be ANSI-compliant.
  553. #
  554. #  (for BSD 4.3 VAX, uncomment the following line)
  555. #VPRINTF = -DNEED_VPRINTF -DINTSPRINTF -DLONGINT -DNOVOID
  556. #  (for (stock) IBM RT AOS 4.3, uncomment the following line)
  557. #VPRINTF = -DNEED_VPRINTF -DLONGINT -DNOSTDHDRS
  558.  
  559.  
  560. # If your machine does not have the 'setitimer()' call, but does
  561. # have the 'usleep()' call, uncomment the following line:
  562. #
  563. #TIMERS = -DUSLEEP
  564. #
  565. # alternately, if your machine does not have EITHER the 'setitimer()' or
  566. # the 'usleep()' call, uncomment the following line:
  567. #
  568. #TIMERS = -DNOTIMER
  569.  
  570.  
  571. # If you are using an AT&T machine, uncomment the following line
  572. # If you have ptoblems compiling xv.c and xvdir.c because of the DIR
  573. # reference in dirent.h, append '-DATT' to the following line:
  574. #
  575. #ATT = -DSYSV -DDIRENT -DUSLEEP -DATT
  576.  
  577.  
  578. # For SCO and ODT machines, uncomment the following:
  579. #
  580. #SCO = -Dsco -DPOSIX -DNOTIMER
  581. #
  582. # Itimers will be in 3.2v3 (yeah!) but that won't be out in the public's
  583. # hands for a while.  Hey, it's just the fish anyways.
  584. #
  585. # Also, you'll want to change LIBS to
  586. #
  587. #  -lX11 -lm -lsocket -lmalloc -lc -lx
  588. #
  589. # -lx must be after -lc so you get the right directory routines.
  590. #
  591.  
  592.  
  593. CFLAGS = -O2 $(NEED_DIRENT) $(BROKECOLS) $(VPRINTF) $(TIMERS) $(ATT) $(SCO) \
  594.     $(UNIX)
  595.  
  596. LIBS = -lX11 -lm
  597.  
  598. BITMAPS = bitmaps/grasp bitmaps/penn bitmaps/down bitmaps/down1 \
  599.       bitmaps/up bitmaps/up1 bitmaps/scrlgray bitmaps/gray50 \
  600.       bitmaps/gray25 bitmaps/i_fifo bitmaps/i_chr bitmaps/i_dir \
  601.       bitmaps/i_blk bitmaps/i_lnk bitmaps/i_sock bitmaps/i_reg \
  602.       bitmaps/rb_off bitmaps/rb_on bitmaps/rb_off1 bitmaps/rb_on1 \
  603.       bitmaps/fc_left bitmaps/fc_leftm bitmaps/fc_mid bitmaps/fc_midm \
  604.       bitmaps/fc_right bitmaps/fc_rightm bitmaps/fc_left1 \
  605.       bitmaps/fc_left1m bitmaps/fc_right1 bitmaps/fc_right1m \
  606.       bitmaps/icon
  607.  
  608. OBJS =     xv.o xvmisc.o xv24to8.o xvgif.o xvpm.o xvinfo.o xvctrl.o xvscrl.o \
  609.     xvgifwr.o xvdir.o xvbutt.o xvpbm.o xvxbm.o xvgam.o xvfish.o \
  610.     vprintf.o
  611.  
  612. MISC = README PATCHLEVEL
  613.  
  614. .c.o:    ; $(CC) -c $(CFLAGS) -o $@ $*.c
  615.  
  616. all: xv bggen
  617.  
  618. xv: $(OBJS)
  619.     $(CC) $(CFLAGS) -o xv $(OBJS) $(LIBS)
  620.  
  621. bggen: bggen.c
  622.     $(CC) $(CFLAGS) -o bggen bggen.c
  623.     
  624. clean:
  625.     rm -f $(OBJS)
  626.  
  627. tar:
  628.     tar cf xv.tar Makefile* Imakefile *.c *.h bitmaps docs $(MISC)
  629.  
  630. xv.3100: bitmaps.h
  631.     cc -O3 *.c -o xv $(XLIB)
  632.  
  633. $(OBJS):   xv.h
  634. xv.o:      bitmaps.h
  635. xvmisc.o:  bitmaps.h
  636. xvinfo.o:  bitmaps.h
  637. xvctrl.o:  bitmaps.h
  638. xvscrl.o:  bitmaps.h
  639. xvbutt.o:  bitmaps.h
  640.  
  641. bitmaps.h: $(BITMAPS)
  642.     cat $(BITMAPS) > bitmaps.h
  643.  
  644. \BARFOO\
  645. else
  646.   echo "will not over write ./Makefile"
  647. fi
  648. if `test ! -s ./Makefile.std`
  649. then
  650. echo "writting ./Makefile.std"
  651. cat > ./Makefile.std << '\BARFOO\'
  652. # Makefile for xv
  653. #
  654.  
  655. # your C compiler of choice
  656. CC = cc
  657.  
  658. ################ CONFIGURATION OPTIONS #################
  659.  
  660. # if you are running on a SysV-based machine, such as HP, Silicon Graphics,
  661. # etc, uncomment the following line to get you most of the way there.  
  662. #
  663. #UNIX = -DSVR4
  664.  
  665. # If you are running on a POSIX-compatible machine, such as an
  666. # IBM RS6000, you MAY need to uncomment the 'NEED_DIRENT' line.
  667. # To determine if such is the case, do a 'man readdir' on your machine.  If
  668. # readdir() returns a pointer to 'struct direct', you will not have
  669. # to change anything.  If, however, readdir() returns a pointer to
  670. # 'struct dirent', you will have to add the '-DDIRENT' to CFLAGS
  671. #
  672. #NEED_DIRENT = -DDIRENT
  673.  
  674.  
  675. # If, when 'Applying' colors, or when loading new pictures, you get an
  676. # X Protocol Error on the XFreeColors() call, your X Server is Wrong.
  677. # Several workarounds:  You can specify '-bfc' on the command line, or
  678. # set the 'xv.brokeFreeCols' resource to 'true'.  Alternately, you can
  679. # uncomment the BROKECOLS line below to compile in the workarounds
  680. # permanently.  If you do this, '-bfc' will toggle OFF the workarounds.
  681. # Noteworthy Offenders:  AIX 3.1 on IBM 6000, and OLW on Suns
  682. #
  683. #BROKECOLS = -DBROKEFREECOLS
  684.  
  685.  
  686. # IF YOUR MACHINE DOESN'T HAVE 'vprintf()' OR 'vsprintf()'
  687. #
  688. # Vax BSD and IBM AOS don't have vprintf or vsprintf.
  689. # Note that our local library versions of sprintf have been updated
  690. # to return int, the number of characters in the formatted string,
  691. # whereas the versions in stock 4.3BSD do not so return.  You may
  692. # have to remove the "-DINTSPRINTF" below if you're compiling for
  693. # stock 4.3BSD or for some other Vax or RT library package where
  694. # sprintf returns char *.
  695. #
  696. # Also, I define NOVOID on the Vax because I'm using pcc to compile.
  697. # If you use gcc or some other better compiler, this should not be
  698. # necessary.  I define NOSTDHDRS on the RT because we don't have
  699. # standard ANSI header files installed for the RT, even though the RT
  700. # compiler claims to be ANSI-compliant.
  701. #
  702. #  (for BSD 4.3 VAX, uncomment the following line)
  703. #VPRINTF = -DNEED_VPRINTF -DINTSPRINTF -DLONGINT -DNOVOID
  704. #  (for (stock) IBM RT AOS 4.3, uncomment the following line)
  705. #VPRINTF = -DNEED_VPRINTF -DLONGINT -DNOSTDHDRS
  706.  
  707.  
  708. # If your machine does not have the 'setitimer()' call, but does
  709. # have the 'usleep()' call, uncomment the following line:
  710. #
  711. #TIMERS = -DUSLEEP
  712. #
  713. # alternately, if your machine does not have EITHER the 'setitimer()' or
  714. # the 'usleep()' call, uncomment the following line:
  715. #
  716. #TIMERS = -DNOTIMER
  717.  
  718.  
  719. # If you are using an AT&T machine, uncomment the following line
  720. # If you have ptoblems compiling xv.c and xvdir.c because of the DIR
  721. # reference in dirent.h, append '-DATT' to the following line:
  722. #
  723. #ATT = -DSYSV -DDIRENT -DUSLEEP -DATT
  724.  
  725.  
  726. # For SCO and ODT machines, uncomment the following:
  727. #
  728. #SCO = -Dsco -DPOSIX -DNOTIMER
  729. #
  730. # Itimers will be in 3.2v3 (yeah!) but that won't be out in the public's
  731. # hands for a while.  Hey, it's just the fish anyways.
  732. #
  733. # Also, you'll want to change LIBS to
  734. #
  735. #  -lX11 -lm -lsocket -lmalloc -lc -lx
  736. #
  737. # -lx must be after -lc so you get the right directory routines.
  738. #
  739.  
  740.  
  741. CFLAGS = -O $(NEED_DIRENT) $(BROKECOLS) $(VPRINTF) $(TIMERS) $(ATT) $(SCO) \
  742.     $(UNIX)
  743.  
  744. LIBS = -lX11 -lm
  745.  
  746. BITMAPS = bitmaps/grasp bitmaps/penn bitmaps/down bitmaps/down1 \
  747.       bitmaps/up bitmaps/up1 bitmaps/scrlgray bitmaps/gray50 \
  748.       bitmaps/gray25 bitmaps/i_fifo bitmaps/i_chr bitmaps/i_dir \
  749.       bitmaps/i_blk bitmaps/i_lnk bitmaps/i_sock bitmaps/i_reg \
  750.       bitmaps/rb_off bitmaps/rb_on bitmaps/rb_off1 bitmaps/rb_on1 \
  751.       bitmaps/fc_left bitmaps/fc_leftm bitmaps/fc_mid bitmaps/fc_midm \
  752.       bitmaps/fc_right bitmaps/fc_rightm bitmaps/fc_left1 \
  753.       bitmaps/fc_left1m bitmaps/fc_right1 bitmaps/fc_right1m \
  754.       bitmaps/icon
  755.  
  756. OBJS =     xv.o xvmisc.o xv24to8.o xvgif.o xvpm.o xvinfo.o xvctrl.o xvscrl.o \
  757.     xvgifwr.o xvdir.o xvbutt.o xvpbm.o xvxbm.o xvgam.o xvfish.o \
  758.     vprintf.o
  759.  
  760. MISC = README PATCHLEVEL
  761.  
  762. .c.o:    ; $(CC) -c $(CFLAGS) -o $@ $*.c
  763.  
  764. all: xv bggen
  765.  
  766. xv: $(OBJS)
  767.     $(CC) $(CFLAGS) -o xv $(OBJS) $(LIBS)
  768.  
  769. bggen: bggen.c
  770.     $(CC) $(CFLAGS) -o bggen bggen.c
  771.     
  772. clean:
  773.     rm -f $(OBJS)
  774.  
  775. tar:
  776.     tar cf xv.tar Makefile* Imakefile *.c *.h bitmaps docs $(MISC)
  777.  
  778. xv.3100: bitmaps.h
  779.     cc -O3 *.c -o xv $(XLIB)
  780.  
  781. $(OBJS):   xv.h
  782. xv.o:      bitmaps.h
  783. xvmisc.o:  bitmaps.h
  784. xvinfo.o:  bitmaps.h
  785. xvctrl.o:  bitmaps.h
  786. xvscrl.o:  bitmaps.h
  787. xvbutt.o:  bitmaps.h
  788.  
  789. bitmaps.h: $(BITMAPS)
  790.     cat $(BITMAPS) > bitmaps.h
  791.  
  792. \BARFOO\
  793. else
  794.   echo "will not over write ./Makefile.std"
  795. fi
  796. if `test ! -s ./Imakefile`
  797. then
  798. echo "writting ./Imakefile"
  799. cat > ./Imakefile << '\BARFOO\'
  800. /*
  801.  * if you are running on a SysV-based machine, such as HP, Silicon Graphics,
  802.  * etc, uncomment the following line to get you *most* of the way there.
  803.  */
  804. /* UNIX = -DSVR4 */
  805.  
  806. /*
  807.  * If you are running on a POSIX-compatible machine, such as an
  808.  * IBM RS6000, you MAY need uncomment the 'NEED_DIRENT' line.
  809.  * To determine if such is the case, do a 'man readdir' on your machine.  If
  810.  * readdir() returns a pointer to 'struct direct', you will not have
  811.  * to change anything.  If, however, readdir() returns a pointer to
  812.  * 'struct dirent', you will have to add the '-DDIRENT' to CFLAGS
  813.  */
  814. /* NEED_DIRENT = -DDIRENT */
  815.  
  816.  
  817. /* If, when 'Applying' colors, or when loading new pictures, you get an
  818.  * X Protocol Error on the XFreeColors() call, your X Server is Wrong.
  819.  * Several workarounds:  You can specify '-bfc' on the command line, or
  820.  * set the 'xv.brokeFreeCols' resource to 'true'.  Alternately, you can
  821.  * uncomment the BROKECOLS line below to compile in the workarounds
  822.  * permanently.  If you do this, '-bfc' will toggle OFF the workarounds.
  823.  *
  824.  * Noteworthy Offenders:  AIX 3.1 on IBM 6000, and OLW on Suns
  825.  */
  826. /* BROKECOLS = -DBROKEFREECOLS */
  827.  
  828.  
  829. /* IF YOUR MACHINE DOESN'T HAVE 'vprintf()' OR 'vsprintf()'
  830.  *
  831.  * Vax BSD and IBM AOS don't have vprintf or vsprintf.
  832.  * Note that our local library versions of sprintf have been updated
  833.  * to return int, the number of characters in the formatted string,
  834.  * whereas the versions in stock 4.3BSD do not so return.  You may
  835.  * have to remove the "-DINTSPRINTF" below if you're compiling for
  836.  * stock 4.3BSD or for some other Vax or RT library package where
  837.  * sprintf returns char *.
  838.  *
  839.  * Also, I define NOVOID on the Vax because I'm using pcc to compile.
  840.  * If you use gcc or some other better compiler, this should not be
  841.  * necessary.  I define NOSTDHDRS on the RT because we don't have
  842.  * standard ANSI header files installed for the RT, even though the RT
  843.  * compiler claims to be ANSI-compliant.
  844.  */
  845. #if defined(VaxArchitecture) && !defined(UltrixArchitecture)
  846. VPRINTF=    -DNEED_VPRINTF -DINTSPRINTF -DLONGINT -DNOVOID
  847. #else 
  848. #  if defined(RtArchitecture) && !defined(AIXArchitecture)
  849. VPRINTF=    -DNEED_VPRINTF -DINTSPRINTF -DLONGINT -DNOSTDHDRS
  850. #  endif
  851. #endif
  852.  
  853.  
  854. /* If your machine does not have the 'setitimer()' call, but does
  855.  * have the 'usleep()' call, uncomment the following line:
  856.  */
  857. /* TIMERS = -DUSLEEP */
  858. /*
  859.  * alternately, if your machine does not have EITHER the 'setitimer()' or
  860.  * the 'usleep()' call, uncomment the following line:
  861.  */
  862. /* TIMERS = -DNOTIMER */
  863.  
  864.  
  865. /* If you are using an AT&T machine, uncomment the following line
  866.  * If you have ptoblems compiling xv.c and xvdir.c because of the DIR
  867.  * reference in dirent.h, append '-DATT' to the following line:
  868.  */
  869. /* ATT = -DSYSV -DDIRENT -DUSLEEP -DATT */
  870.  
  871.  
  872. #if defined(SCOArchitecture)
  873. DEFINES= -DPOSIX -DNOITIMER
  874. SYS_LIBRARIES=        $(XLIB) -lm -lc -lx
  875. #else
  876. SYS_LIBRARIES=        $(XLIB) -lm
  877. #endif
  878.  
  879. CCOPTIONS= $(UNIX) $(NEED_DIRENT) $(BROKECOLS) $(VPRINTF) $(TIMERS) $(ATT)
  880.  
  881. SYS_LIBRARIES=    -lX11 -lm
  882.  
  883. BITMAPS = bitmaps/grasp bitmaps/penn bitmaps/down bitmaps/down1 \
  884.           bitmaps/up bitmaps/up1 bitmaps/scrlgray bitmaps/gray50 \
  885.           bitmaps/gray25 bitmaps/i_fifo bitmaps/i_chr bitmaps/i_dir \
  886.           bitmaps/i_blk bitmaps/i_lnk bitmaps/i_sock bitmaps/i_reg \
  887.           bitmaps/rb_off bitmaps/rb_on bitmaps/rb_off1 bitmaps/rb_on1 \
  888.           bitmaps/fc_left bitmaps/fc_leftm bitmaps/fc_mid bitmaps/fc_midm \
  889.           bitmaps/fc_right bitmaps/fc_rightm bitmaps/fc_left1 \
  890.           bitmaps/fc_left1m bitmaps/fc_right1 bitmaps/fc_right1m \
  891.       bitmaps/icon
  892.  
  893. SRCS1 =    xv.c xv24to8.c xvbutt.c xvctrl.c xvdir.c xvfish.c xvgam.c\
  894.     xvgif.c xvgifwr.c xvinfo.c xvmisc.c xvpbm.c xvpm.c xvscrl.c\
  895.     xvxbm.c vprintf.c
  896.  
  897. OBJS1 =    xv.o xv24to8.o xvbutt.o xvctrl.o xvdir.o xvfish.o xvgam.o\
  898.     xvgif.o xvgifwr.o xvinfo.o xvmisc.o xvpbm.o xvpm.o xvscrl.o \
  899.     xvxbm.o vprintf.o
  900.  
  901. SRCS2=    bggen.c
  902. OBJS2=    bggen.o
  903.  
  904. PROGRAMS= xv bggen
  905.  
  906. ComplexProgramTarget_1(xv,,)
  907. ComplexProgramTarget_2(bggen,,)
  908.  
  909. InstallNonExec(docs/xv.man,$(MANDIR)/xv.ManSuffix)
  910. InstallNonExec(docs/bggen.man,$(MANDIR)/bggen.ManSuffix)
  911.  
  912. tar:
  913.     tar cf xv.tar Makefile *.c *.h bitmaps docs $(MISC)
  914.  
  915. bitmaps.h: $(BITMAPS)
  916.     cat $(BITMAPS) > bitmaps.h
  917.  
  918. depend:: bitmaps.h
  919.  
  920. \BARFOO\
  921. else
  922.   echo "will not over write ./Imakefile"
  923. fi
  924. if `test ! -s ./bggen.c`
  925. then
  926. echo "writting ./bggen.c"
  927. cat > ./bggen.c << '\BARFOO\'
  928. /*
  929.  * bggen.c  -  a program that generates backgrounds for use with XV
  930.  *
  931.  * by John Bradley, University of Pennsylvania
  932.  *   (bradley@cis.upenn.edu)
  933.  *
  934.  *      Rev: 8/31/90
  935.  *      Rev: 10/17/90  -  added '-w' option
  936.  */
  937.  
  938. /*
  939.  * Copyright 1989, 1990 by the University of Pennsylvania
  940.  *
  941.  * Permission to use, copy, and distribute for non-commercial purposes,
  942.  * is hereby granted without fee, providing that the above copyright
  943.  * notice appear in all copies and that both the copyright notice and this
  944.  * permission notice appear in supporting documentation.
  945.  *
  946.  * The software may be modified for your own purposes, but modified versions
  947.  * may not be distributed.
  948.  *
  949.  * This software is provided "as is" without any express or implied warranty.
  950.  */
  951.  
  952.  
  953.  
  954. #include <stdio.h>
  955.  
  956. #define DEFSIZE 1024
  957. #define MAXCOLS  128
  958.  
  959. struct color { int r,g,b; int y; } cols[MAXCOLS], *cur, *nex;
  960.  
  961. int bmask[8] = { 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff };
  962.  
  963.  
  964. main(argc,argv)
  965. int    argc;
  966. char **argv;
  967. {
  968.   int i,j,cnt,numcols;
  969.   int high = DEFSIZE;
  970.   int wide = 1;
  971.   int bits = 8;
  972.   int r, g, b;
  973.  
  974.   cnt = 0;  numcols = 0;
  975.   for (i=1; i<argc; i++) {
  976.     if (!strcmp(argv[i],"-s")) high = atoi(argv[++i]);
  977.  
  978.     else if (!strcmp(argv[i],"-w")) wide = atoi(argv[++i]);
  979.  
  980.     else if (!strcmp(argv[i],"-b")) bits = atoi(argv[++i]);
  981.  
  982.     else if (argv[i][0]=='-') break;     /* any other '-' option is unknown */
  983.  
  984.     else {
  985.       switch (cnt) {
  986.       case 0:  cols[numcols].r = atoi(argv[i]);  break;
  987.       case 1:  cols[numcols].g = atoi(argv[i]);  break;
  988.       case 2:  cols[numcols].b = atoi(argv[i]);  break;
  989.       }
  990.       cnt++;
  991.  
  992.       if (cnt==3) {
  993.     if (numcols<MAXCOLS) numcols++;
  994.     cnt = 0;
  995.       }
  996.     }
  997.   }
  998.  
  999.  
  1000.   if (cnt || numcols==0 || high<1 || bits<1 || bits>8) {
  1001.     fprintf(stderr,"usage:  %s [-s size] [-w width] [-b bits] %s\n\n",
  1002.         argv[0], "r1 g1 b1 [r2 g2 b2 ...]");
  1003.     fprintf(stderr,"\tThis will generate a WIDTHxSIZE vertical color band.\n");
  1004.     fprintf(stderr,"\t(Default: 1x%d)  To set your background\n",DEFSIZE);
  1005.     fprintf(stderr,"\t'bits' is the number of significant bits in the\n");
  1006.     fprintf(stderr,"\tcolor specifications.  (1-8)\n");
  1007.     fprintf(stderr,"\tpipe the resulting output into this cmd:\n");
  1008.     fprintf(stderr,"\t\t'xv -root -quit -slow24'\n\n");
  1009.     exit(1);
  1010.   }
  1011.  
  1012.   printf("P3 %d %d 255\n",wide,high);
  1013.  
  1014.   /* special case code for numcols==1 */
  1015.  
  1016.   if (numcols==1) {
  1017.     for (i=0; i<high; i++) 
  1018.       for (j=0; j<wide; j++)
  1019.     printf("%d %d %d\n",cols[0].r,cols[0].g,cols[0].b);
  1020.   }
  1021.   else {
  1022.  
  1023.     /* fill in 'y' field of cols[] */
  1024.     for (i=0; i<numcols; i++)
  1025.       cols[i].y = ((high-1) * i) / (numcols-1);
  1026.  
  1027.     cur = &cols[0];  nex = cur+1;
  1028.  
  1029.     for (i=0; i<high; i++) {
  1030.       /* advance to next pair of colors if we're outside region */
  1031.       while (nex->y < i) { cur++; nex++; }
  1032.  
  1033.       r = cur->r + ((nex->r - cur->r) * (i - cur->y)) / (nex->y - cur->y);
  1034.       g = cur->g + ((nex->g - cur->g) * (i - cur->y)) / (nex->y - cur->y);
  1035.       b = cur->b + ((nex->b - cur->b) * (i - cur->y)) / (nex->y - cur->y);
  1036.  
  1037.       r = r & bmask[bits-1];
  1038.       g = g & bmask[bits-1];
  1039.       b = b & bmask[bits-1];
  1040.  
  1041.       for (j=0; j<wide; j++)
  1042.     printf("%d %d %d\n",r,g,b);
  1043.     }
  1044.   }
  1045. }
  1046.  
  1047.  
  1048.  
  1049.  
  1050. \BARFOO\
  1051. else
  1052.   echo "will not over write ./bggen.c"
  1053. fi
  1054. if `test ! -s ./vprintf.c`
  1055. then
  1056. echo "writting ./vprintf.c"
  1057. cat > ./vprintf.c << '\BARFOO\'
  1058. #ifdef NEED_VPRINTF
  1059.  
  1060. #include <stdio.h>
  1061.  
  1062. /* Portable vsprintf  by Robert A. Larson <blarson@skat.usc.edu> */
  1063. /* Portable vfprintf  by Robert A. Larson <blarson@skat.usc.edu> */
  1064.  
  1065. /* Copyright 1989 Robert A. Larson.
  1066.  * Distribution in any form is allowed as long as the author
  1067.  * retains credit, changes are noted by their author and the
  1068.  * copyright message remains intact.  This program comes as-is
  1069.  * with no warentee of fitness for any purpouse.
  1070.  *
  1071.  * Thanks to Doug Gwen, Chris Torek, and others who helped clarify
  1072.  * the ansi printf specs.
  1073.  *
  1074.  * Please send any bug fixes and improvments to blarson@skat.usc.edu .
  1075.  * The use of goto is NOT a bug.
  1076.  */
  1077.  
  1078. /* Feb    7, 1989        blarson        First usenet release */
  1079.  
  1080. /* This code implements the vsprintf function, without relying on
  1081.  * the existance of _doprint or other system specific code.
  1082.  *
  1083.  * Define NOVOID if void * is not a supported type.
  1084.  *
  1085.  * Two compile options are available for efficency:
  1086.  *    INTSPRINTF    should be defined if sprintf is int and returns
  1087.  *            the number of chacters formated.
  1088.  *    LONGINT        should be defined if sizeof(long) == sizeof(int)
  1089.  *
  1090.  *    They only make the code smaller and faster, they need not be
  1091.  *    defined.
  1092.  *
  1093.  * UNSIGNEDSPECIAL should be defined if unsigned is treated differently
  1094.  * than int in argument passing.  If this is definded, and LONGINT is not,
  1095.  * the compiler must support the type unsingned long.
  1096.  *
  1097.  * Most quirks and bugs of the available sprintf fuction are duplicated,
  1098.  * however * in the width and precision fields will work correctly
  1099.  * even if sprintf does not support this, as will the n format.
  1100.  *
  1101.  * Bad format strings, or those with very long width and precision
  1102.  * fields (including expanded * fields) will cause undesired results.
  1103.  */
  1104.  
  1105. #ifdef OSK        /* os9/68k can take advantage of both */
  1106. #define LONGINT
  1107. #define INTSPRINTF
  1108. #endif
  1109.  
  1110. /* This must be a typedef not a #define! */
  1111. #ifdef NOVOID
  1112. typedef char *pointer;
  1113. #else
  1114. typedef void *pointer;
  1115. #endif
  1116.  
  1117. #ifdef    INTSPRINTF
  1118. #define Sprintf(string,format,arg)    (sprintf((string),(format),(arg)))
  1119. #else
  1120. #define Sprintf(string,format,arg)    (\
  1121.     sprintf((string),(format),(arg)),\
  1122.     strlen(string)\
  1123. )
  1124. #endif
  1125.  
  1126. #if defined(__STDC__) && !defined(NOSTDHDRS)
  1127. #include <stdarg.h>
  1128. #else
  1129. #include <varargs.h>
  1130. #endif
  1131.  
  1132. typedef int *intp;
  1133.  
  1134. int vsprintf(dest, format, args)
  1135. char *dest;
  1136. register char *format;
  1137. va_list args;
  1138. {
  1139.     register char *dp = dest;
  1140.     register char c;
  1141.     register char *tp;
  1142.     char tempfmt[64];
  1143. #ifndef LONGINT
  1144.     int longflag;
  1145. #endif
  1146.  
  1147.     tempfmt[0] = '%';
  1148.     while( (c = *format++) != 0) {
  1149.     if(c=='%') {
  1150.         tp = &tempfmt[1];
  1151. #ifndef LONGINT
  1152.         longflag = 0;
  1153. #endif
  1154. continue_format:
  1155.         switch(c = *format++) {
  1156.         case 's':
  1157.             *tp++ = c;
  1158.             *tp = '\0';
  1159.             dp += Sprintf(dp, tempfmt, va_arg(args, char *));
  1160.             break;
  1161.         case 'u':
  1162.         case 'x':
  1163.         case 'o':
  1164.         case 'X':
  1165. #ifdef UNSIGNEDSPECIAL
  1166.             *tp++ = c;
  1167.             *tp = '\0';
  1168. #ifndef LONGINT
  1169.             if(longflag)
  1170.             dp += Sprintf(dp, tempfmt, va_arg(args, unsigned long));
  1171.             else
  1172. #endif
  1173.             dp += Sprintf(dp, tempfmt, va_arg(args, unsigned));
  1174.             break;
  1175. #endif
  1176.         case 'd':
  1177.         case 'c':
  1178.         case 'i':
  1179.             *tp++ = c;
  1180.             *tp = '\0';
  1181. #ifndef LONGINT
  1182.             if(longflag)
  1183.             dp += Sprintf(dp, tempfmt, va_arg(args, long));
  1184.             else
  1185. #endif
  1186.             dp += Sprintf(dp, tempfmt, va_arg(args, int));
  1187.             break;
  1188.         case 'f':
  1189.         case 'e':
  1190.         case 'E':
  1191.         case 'g':
  1192.         case 'G':
  1193.             *tp++ = c;
  1194.             *tp = '\0';
  1195.             dp += Sprintf(dp, tempfmt, va_arg(args, double));
  1196.             break;
  1197.         case 'p':
  1198.             *tp++ = c;
  1199.             *tp = '\0';
  1200.             dp += Sprintf(dp, tempfmt, va_arg(args, pointer));
  1201.             break;
  1202.         case '-':
  1203.         case '+':
  1204.         case '0':
  1205.         case '1':
  1206.         case '2':
  1207.         case '3':
  1208.         case '4':
  1209.         case '5':
  1210.         case '6':
  1211.         case '7':
  1212.         case '8':
  1213.         case '9':
  1214.         case '.':
  1215.         case ' ':
  1216.         case '#':
  1217.         case 'h':
  1218.             *tp++ = c;
  1219.             goto continue_format;
  1220.         case 'l':
  1221. #ifndef LONGINT
  1222.             longflag = 1;
  1223.             *tp++ = c;
  1224. #endif
  1225.             goto continue_format;
  1226.         case '*':
  1227.             tp += Sprintf(tp, "%d", va_arg(args, int));
  1228.             goto continue_format;
  1229.         case 'n':
  1230.             *va_arg(args, intp) = dp - dest;
  1231.             break;
  1232.         case '%':
  1233.         default:
  1234.             *dp++ = c;
  1235.             break;
  1236.         }
  1237.     } else *dp++ = c;
  1238.     }
  1239.     *dp = '\0';
  1240.     return dp - dest;
  1241. }
  1242.  
  1243.  
  1244. int vfprintf(dest, format, args)
  1245. FILE *dest;
  1246. register char *format;
  1247. va_list args;
  1248. {
  1249.     register char c;
  1250.     register char *tp;
  1251.     register int count = 0;
  1252.     char tempfmt[64];
  1253. #ifndef LONGINT
  1254.     int longflag;
  1255. #endif
  1256.  
  1257.     tempfmt[0] = '%';
  1258.     while(c = *format++) {
  1259.     if(c=='%') {
  1260.         tp = &tempfmt[1];
  1261. #ifndef LONGINT
  1262.         longflag = 0;
  1263. #endif
  1264. continue_format:
  1265.         switch(c = *format++) {
  1266.         case 's':
  1267.             *tp++ = c;
  1268.             *tp = '\0';
  1269.             count += fprintf(dest, tempfmt, va_arg(args, char *));
  1270.             break;
  1271.         case 'u':
  1272.         case 'x':
  1273.         case 'o':
  1274.         case 'X':
  1275. #ifdef UNSIGNEDSPECIAL
  1276.             *tp++ = c;
  1277.             *tp = '\0';
  1278. #ifndef LONGINT
  1279.             if(longflag)
  1280.             count += fprintf(dest, tempfmt, va_arg(args, unsigned long));
  1281.             else
  1282. #endif
  1283.             count += fprintf(dest, tempfmt, va_arg(args, unsigned));
  1284.             break;
  1285. #endif
  1286.         case 'd':
  1287.         case 'c':
  1288.         case 'i':
  1289.             *tp++ = c;
  1290.             *tp = '\0';
  1291. #ifndef LONGINT
  1292.             if(longflag)
  1293.             count += fprintf(dest, tempfmt, va_arg(args, long));
  1294.             else
  1295. #endif
  1296.             count += fprintf(dest, tempfmt, va_arg(args, int));
  1297.             break;
  1298.         case 'f':
  1299.         case 'e':
  1300.         case 'E':
  1301.         case 'g':
  1302.         case 'G':
  1303.             *tp++ = c;
  1304.             *tp = '\0';
  1305.             count += fprintf(dest, tempfmt, va_arg(args, double));
  1306.             break;
  1307.         case 'p':
  1308.             *tp++ = c;
  1309.             *tp = '\0';
  1310.             count += fprintf(dest, tempfmt, va_arg(args, pointer));
  1311.             break;
  1312.         case '-':
  1313.         case '+':
  1314.         case '0':
  1315.         case '1':
  1316.         case '2':
  1317.         case '3':
  1318.         case '4':
  1319.         case '5':
  1320.         case '6':
  1321.         case '7':
  1322.         case '8':
  1323.         case '9':
  1324.         case '.':
  1325.         case ' ':
  1326.         case '#':
  1327.         case 'h':
  1328.             *tp++ = c;
  1329.             goto continue_format;
  1330.         case 'l':
  1331. #ifndef LONGINT
  1332.             longflag = 1;
  1333.             *tp++ = c;
  1334. #endif
  1335.             goto continue_format;
  1336.         case '*':
  1337.             tp += Sprintf(tp, "%d", va_arg(args, int));
  1338.             goto continue_format;
  1339.         case 'n':
  1340.             *va_arg(args, intp) = count;
  1341.             break;
  1342.         case '%':
  1343.         default:
  1344.             putc(c, dest);
  1345.             count++;
  1346.             break;
  1347.         }
  1348.     } else {
  1349.         putc(c, dest);
  1350.         count++;
  1351.     }
  1352.     }
  1353.     return count;
  1354. }
  1355.  
  1356. vprintf(format, args)
  1357. char *format;
  1358. va_list args;
  1359. {
  1360.     return vfprintf(stdout, format, args);
  1361. }
  1362.  
  1363. #endif
  1364. \BARFOO\
  1365. else
  1366.   echo "will not over write ./vprintf.c"
  1367. fi
  1368. echo "Finished archive 10 of 10"
  1369. exit
  1370.  
  1371. dan
  1372. ----------------------------------------------------
  1373. O'Reilly && Associates   argv@sun.com / argv@ora.com
  1374. Opinions expressed reflect those of the author only.
  1375. --
  1376. dan
  1377. ----------------------------------------------------
  1378. O'Reilly && Associates   argv@sun.com / argv@ora.com
  1379. Opinions expressed reflect those of the author only.
  1380.