home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume39 / hpcdtoppm / part03 < prev    next >
Text File  |  1993-08-16  |  36KB  |  1,333 lines

  1. Newsgroups: comp.sources.misc
  2. From: danisch@ira.uka.de (Hadmut Danisch)
  3. Subject: v39i004:  hpcdtoppm - convert Photo-CD file into portable pixmap v0.5pl1, Part03/03
  4. Message-ID: <1993Aug16.204136.22222@sparky.sterling.com>
  5. X-Md4-Signature: 5c3d5441541b6df87d4b11306f99467c
  6. Sender: kent@sparky.sterling.com (Kent Landfield)
  7. Organization: Sterling Software
  8. Date: Mon, 16 Aug 1993 20:41:36 GMT
  9. Approved: kent@sparky.sterling.com
  10.  
  11. Submitted-by: danisch@ira.uka.de (Hadmut Danisch)
  12. Posting-number: Volume 39, Issue 4
  13. Archive-name: hpcdtoppm/part03
  14. Environment: Photo-CD
  15. Supersedes: hpcdtoppm: Volume 34, Issue 83
  16.  
  17. #! /bin/sh
  18. # This is a shell archive.  Remove anything before this line, then feed it
  19. # into a shell via "sh file" or similar.  To overwrite existing files,
  20. # type "sh file -c".
  21. # Contents:  hpcdtoppm.0.5.pl1/Adding_code hpcdtoppm.0.5.pl1/Changes
  22. #   hpcdtoppm.0.5.pl1/Examples hpcdtoppm.0.5.pl1/README
  23. #   hpcdtoppm.0.5.pl1/README.TOO hpcdtoppm.0.5.pl1/ReadMe.NeXT
  24. #   hpcdtoppm.0.5.pl1/ReadMe.SGI hpcdtoppm.0.5.pl1/color.c
  25. #   hpcdtoppm.0.5.pl1/config.h hpcdtoppm.0.5.pl1/hpcdtoppm.h
  26. #   hpcdtoppm.0.5.pl1/ppm.c
  27. # Wrapped by kent@sparky on Mon Aug 16 10:49:23 1993
  28. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
  29. echo If this archive is complete, you will see the following message:
  30. echo '          "shar: End of archive 3 (of 3)."'
  31. if test -f 'hpcdtoppm.0.5.pl1/Adding_code' -a "${1}" != "-c" ; then 
  32.   echo shar: Will not clobber existing file \"'hpcdtoppm.0.5.pl1/Adding_code'\"
  33. else
  34.   echo shar: Extracting \"'hpcdtoppm.0.5.pl1/Adding_code'\" \(2027 characters\)
  35.   sed "s/^X//" >'hpcdtoppm.0.5.pl1/Adding_code' <<'END_OF_FILE'
  36. XSeveral people were changing the output image format
  37. Xof the decoder or asked for a different output format.
  38. X
  39. Xpbmplus enables the transformation to every image
  40. Xformat, but sometimes it is better to have the
  41. Xformat "inside". Therefore v0.5 is able to keep several
  42. Xformat 'drivers'. 
  43. X
  44. X
  45. XTo add a new output format:
  46. X
  47. X- Append a new tag to the enum type OUTFOR in hpcdtoppm.h
  48. X
  49. X- change O_DEFAULT to this tag in config.h if you want to
  50. X  have this format as the default format.
  51. X
  52. X- Insert a new 'if(...){...}' contruct to the procedure
  53. X  parseargs in main.c after the comment "Output options".
  54. X
  55. X- Insert description text to error.c and hpcdtoppm.man.
  56. X
  57. X- If your format needs only grayscale data, append your
  58. X  tag to the line "monochrome=(outfor==O_PGM)|| ..."
  59. X  in the main procedure in main.c .
  60. X
  61. X- If your format uses the paper size values, append your
  62. X  tag to the line "paper=(outfor==O_PS)|| ..."
  63. X  in the main procedure in main.c .
  64. X
  65. X- Insert your tag into the switch-statement in the
  66. X  procedure colconvert in color.c. If you need a
  67. X  8-bit-grayscale or 24-bit-rgb model, you just
  68. X  have to insert a "case O_YourTag :" . Otherwise
  69. X  you have to write your own colorconversion.
  70. X
  71. X- Insert your tag and procedure name into the switch-
  72. X  statement in the procedure writepicture in output.c. 
  73. X  If you have a three-plane-image you can use the do_3plane
  74. X  procedure with a pointer to your format writing
  75. X  procedure as the first argument, if you have one 
  76. X  image plane, use the do_1plane. Otherwise write 
  77. X  a similar do_nplane  procedure.
  78. X
  79. X- Write a procedure, which produces your format. You
  80. X  should use the parameter scheme as defined for the
  81. X  driver types OUT3PL and OUT1PL in hpcdtoppm.h.
  82. X
  83. X  This means:
  84. X  - a FILE *pointer to the output file
  85. X  - image width and height.
  86. X  
  87. X  - for each image plane the triple:
  88. X    - a pointer to the upper left position
  89. X    - a relative row step    ( in bytes )
  90. X    - a relative column step ( in bytes )
  91. X
  92. X- If it works, let me know it. :-) Send mail to
  93. X  danisch@ira.uka.de .   
  94. X
  95. X
  96. X
  97. XHadmut
  98. X
  99. X
  100. X
  101. X
  102. END_OF_FILE
  103.   if test 2027 -ne `wc -c <'hpcdtoppm.0.5.pl1/Adding_code'`; then
  104.     echo shar: \"'hpcdtoppm.0.5.pl1/Adding_code'\" unpacked with wrong size!
  105.   fi
  106.   # end of 'hpcdtoppm.0.5.pl1/Adding_code'
  107. fi
  108. if test -f 'hpcdtoppm.0.5.pl1/Changes' -a "${1}" != "-c" ; then 
  109.   echo shar: Will not clobber existing file \"'hpcdtoppm.0.5.pl1/Changes'\"
  110. else
  111.   echo shar: Extracting \"'hpcdtoppm.0.5.pl1/Changes'\" \(1816 characters\)
  112.   sed "s/^X//" >'hpcdtoppm.0.5.pl1/Changes' <<'END_OF_FILE'
  113. XChanges of hpcdtoppm:
  114. X
  115. Xv0.5 pl1:
  116. X
  117. X- Bug fixed in main.c, procedure f_ov. When writing all the
  118. X  images from overview files, a lot of file descriptors were
  119. X  opened, but never closed. This produced write errors if the
  120. X  machine has not enough file descriptors.
  121. X
  122. X- procedure clear renamed to clearimpl to avoid collision with
  123. X  other libraries
  124. X
  125. X- data types OUTGRAY and OUTRGB renamed to OUT1PL and OUT3PL,
  126. X  these data types are not bound to special color models.
  127. X
  128. X- gsave/grestore added to postscript output
  129. X
  130. Xv0.5:
  131. X
  132. X- Bug fixed in pgm writing procedure
  133. X
  134. X- Missing ':' added in BoundingBox line of encapsulated
  135. X  Postscript
  136. X
  137. X- postscript output with Floyd-Steinberg dithering added
  138. X
  139. X- orientation chooser for contact sheet option -C
  140. X
  141. X- accepts input from stdin (give '-' as filename)
  142. X
  143. X- -S option for subrectangles
  144. X
  145. X- procedure definitions in ANSI-C
  146. X
  147. X- "turn on head" added.
  148. X
  149. X
  150. Xv0.4:
  151. X
  152. X- Additional Options -m, -pos, -rep, -crop
  153. X
  154. X- pgm output added
  155. X
  156. X- postscript output added
  157. X
  158. X- Flip options
  159. X
  160. X- color corrections
  161. X
  162. X- primitive form of contact sheet
  163. X
  164. X- simple method of jumping over reading errors in
  165. X  Huffman code
  166. X
  167. X- optional Huffman-Lookuptable for speedup
  168. X
  169. X
  170. X
  171. Xv0.3:
  172. X- Additional Options -x, -a and -ycc
  173. X
  174. X- bcopy thrown out.
  175. X
  176. X- New datatype sBYTE for char. This fixes the problem with
  177. X  compilers which have the char unsigned. These got some
  178. X  'snow' in their pictures (merry christmas :-).
  179. X
  180. X- Address arithmetik bug fixed in writepicture
  181. X
  182. Xv0.2:
  183. X
  184. X- Small workaround for strange behavior of address-calculation
  185. X  of a c-compiler for NeXT.
  186. X
  187. X- Improved rounding for integer maths.
  188. X
  189. X- Thrown out floating arithmetic, changed color conversion to
  190. X  integer fixed point.
  191. X
  192. X- PPM-writing-routines added. You can choose whether you
  193. X  want to use pbmplus-routines or the included routines.
  194. X
  195. X- some ununused variables thrown out.
  196. X
  197. END_OF_FILE
  198.   if test 1816 -ne `wc -c <'hpcdtoppm.0.5.pl1/Changes'`; then
  199.     echo shar: \"'hpcdtoppm.0.5.pl1/Changes'\" unpacked with wrong size!
  200.   fi
  201.   # end of 'hpcdtoppm.0.5.pl1/Changes'
  202. fi
  203. if test -f 'hpcdtoppm.0.5.pl1/Examples' -a "${1}" != "-c" ; then 
  204.   echo shar: Will not clobber existing file \"'hpcdtoppm.0.5.pl1/Examples'\"
  205. else
  206.   echo shar: Extracting \"'hpcdtoppm.0.5.pl1/Examples'\" \(1568 characters\)
  207.   sed "s/^X//" >'hpcdtoppm.0.5.pl1/Examples' <<'END_OF_FILE'
  208. XThis are some examples of the use of hpcdtoppm, insert one
  209. Xof your images where a filename as img0010.pcd is used.
  210. X
  211. X"postscriptprinter" means something on your machine, what
  212. Xprints postscript output on paper.
  213. X
  214. X"xv" is a program for viewing images on X11.
  215. X
  216. X
  217. X
  218. Xhpcdtoppm img0005.pcd img0005.ppm
  219. X
  220. X   converts the image img0005.pcd to the ppm-format with resolution
  221. X   128x192. Output into the file img0005.ppm
  222. X
  223. X
  224. Xhpcdtoppm -3 -crop img0005.pcd | xv -
  225. X
  226. X   removes a black frame (some images are scanned with a black frame) and
  227. X   displays the image with resolution 512x768 on a X11-display (24-bit if possible).
  228. X
  229. X
  230. Xhpcdtoppm -l -5 -s -pgm img0005.pcd img0005.pgm
  231. X
  232. X   turns the images counter-clockwise to portrait, converts to 
  233. X   the 2048x3072 resolution, applies a sharpness-operator and writes
  234. X   it as 8-Bit-grayscale pgm to the file img0005.pgm.
  235. X
  236. X
  237. Xhpcdtoppm -l -5 -c+ -psd img0005.pcd img0005.ps
  238. X
  239. X   corrects the images brighter and converts to a 2048x3072 dithered
  240. X   postscript image. Fits on a sheet of paper if used on a 300dpi printer.
  241. X
  242. Xhpcdtoppm -s -S 1300-1850 1000-1260 -5 img0010.pcd | xv -8 -
  243. X
  244. X   displays a small subrectangle of the high resolution an your x11 screen.
  245. X
  246. Xhpcdtoppm -c+ -l -s -S 1300-1850 1000-1260 -5 -psd -pw 500 -dpi 300 img0010.pcd | postscriptprinter
  247. X
  248. X   prints out a dithered small subrectangle of your image.
  249. X
  250. X
  251. Xhpcdtoppm  -c+ -C 6 l -psd -dpi 300 -pw 500 overview.pcd |postscriptprinter
  252. X
  253. X   prints an index print; play with the number 6.
  254. X
  255. X
  256. Xhpcdtoppm -c+ -C 4 n -psd -dpi 300 -pw 500 overview.pcd |postscriptprinter
  257. X
  258. X   something similar
  259. X
  260. END_OF_FILE
  261.   if test 1568 -ne `wc -c <'hpcdtoppm.0.5.pl1/Examples'`; then
  262.     echo shar: \"'hpcdtoppm.0.5.pl1/Examples'\" unpacked with wrong size!
  263.   fi
  264.   # end of 'hpcdtoppm.0.5.pl1/Examples'
  265. fi
  266. if test -f 'hpcdtoppm.0.5.pl1/README' -a "${1}" != "-c" ; then 
  267.   echo shar: Will not clobber existing file \"'hpcdtoppm.0.5.pl1/README'\"
  268. else
  269.   echo shar: Extracting \"'hpcdtoppm.0.5.pl1/README'\" \(3691 characters\)
  270.   sed "s/^X//" >'hpcdtoppm.0.5.pl1/README' <<'END_OF_FILE'
  271. X
  272. XThis is Version 0.5 pl1 of hpcdtoppm, Hadmut's pcd to ppm converter.
  273. XIt has this name to be distinguishable in case someone
  274. Xelse is producing a program also called pcdtoppm.
  275. X
  276. XRead the README.TOO and edit the config.h and the Makefile !
  277. X
  278. XThis program converts Photo-CD-Images to the ppm-Format of
  279. Xpbmplus. You can compile the program in two ways:
  280. X
  281. X1. Use its own ppm-writing-routines. In this case
  282. X   you don't need ppm-includes or libraries. You
  283. X   have to define macro 'OWN_WRITE' in the source or
  284. X   by compiler-option. I am not sure, whether the
  285. X   format of the ppm-header is the same on non-unix
  286. X   machines. If you get problems with line-endings
  287. X   (things like CR, LF, CR/LF), modify the macro
  288. X   PPM_Header.
  289. X
  290. X2. You can use the pbmplus-routines. In this case
  291. X   you need some files from the pbmplus package to compile:
  292. X
  293. X   ppm.h pgm.h pbm.h pbmplus.h libppm.a libpgm.a libpbm.a
  294. X
  295. X
  296. XIMPORTANT: Some older versions of the gcc have problems with
  297. Xoptimization. They produce buggy code. This code will not
  298. Xdie with 'segmentation fault' or something like that, it 
  299. Xjust produces damaged images. 
  300. X
  301. XI did not have detailed information of the file-format and
  302. Xmost of my information i got by staring at the hex-dumps
  303. Xof an image file. So i am not absolutly sure, whether it
  304. Xworks on all Photo-CDs, because there are some bytes in
  305. Xthe header which i don't understand. But it works on
  306. Xmy Photo-CD.
  307. X
  308. XNote that you will get a 24 bit image. You can view these
  309. Xfiles with xv, but if you have an 8-bit-screen you will
  310. Xsometimes have some color-defects (if you have an 1-bit-screen
  311. Xyou will often have a lot of color-defects :-). 
  312. XIt will also take some time to show with xv.
  313. X
  314. XYou can produce nice overview prints if you get the icontact
  315. Xprogram of Mark B. Hanson and put something like
  316. X
  317. Xdecode    pcd    hpcdtoppm -1 -a
  318. X
  319. Xin your ~/.icrc 
  320. X
  321. Xor by use of the pcdindex script of Pieter S. van der
  322. XMeulen in this distribution.
  323. X
  324. X
  325. XIf you compile the program on a machine other than
  326. XSPARC please send me a short email which machine
  327. Xyou are using, whether you had problems or which
  328. Xchanges you have made.
  329. X
  330. XIf you port the program to any machine, please tell me,
  331. Xwhat you did and where to get the program. Within the
  332. Xlast weeks i got a lot of mail asking for the special
  333. XAmiga/NeXT/SGI/... version. Read the Special.* files.
  334. X
  335. X
  336. X
  337. XThanks to
  338. X
  339. X- Adolf Mathias (mathias@ira.uka.de) for writing some of the
  340. X  postscript drivers.
  341. X
  342. X- Pieter S. van der Meulen for the contact sheet script.
  343. X
  344. X- Jeff for finding out how to detect the orientation of the 
  345. X  Overview thumbnails [ Hi Jeff, how are you? :-) ]
  346. X
  347. X- A lot of people for sending mail about
  348. X  compilation on MS-DOS and OS/2 and many other machines.
  349. X
  350. X- lots and lots of people for sending me their improvements of the code.
  351. X  Sorry, but i can not read and analyze them all. I do not have so
  352. X  much time for the decoder, its my hobby, not my job. Often i get
  353. X  mail with a complete source and "Hi Hadmut, i have improved your
  354. X  code. It is now faster/smaller/better/something_else." But i don't
  355. X  know, *what* is changed. A simple diff doesn't work, they all were
  356. X  reformatting my source completely and i do not have the time to
  357. X  read all sources to find the real changes. There are a lot
  358. X  of real good ideas, but *please* tell me, where is the beef.
  359. X
  360. X- lots of people sending me just a formatted version of my code.
  361. X  Thanks to them all, and yes, i have indent(1). I prefer
  362. X  this way of formatting C-source.
  363. X
  364. X
  365. X
  366. X
  367. XHadmut Danisch  (danisch@ira.uka.de)
  368. XIAKS
  369. XUniversitaet Karlsruhe
  370. XPostfach 6980
  371. XAm Fasanengarten 5
  372. X
  373. XD-7500  Karlsruhe  (old postcode until 30.6.93)
  374. XD-76128 Karlsruhe  (new postcode from 1.7.93)
  375. X
  376. XGermany
  377. X
  378. XFAX: +49 721 696893
  379. XTel./FAX privat: +49 721 607306
  380. X
  381. X
  382. END_OF_FILE
  383.   if test 3691 -ne `wc -c <'hpcdtoppm.0.5.pl1/README'`; then
  384.     echo shar: \"'hpcdtoppm.0.5.pl1/README'\" unpacked with wrong size!
  385.   fi
  386.   # end of 'hpcdtoppm.0.5.pl1/README'
  387. fi
  388. if test -f 'hpcdtoppm.0.5.pl1/README.TOO' -a "${1}" != "-c" ; then 
  389.   echo shar: Will not clobber existing file \"'hpcdtoppm.0.5.pl1/README.TOO'\"
  390. else
  391.   echo shar: Extracting \"'hpcdtoppm.0.5.pl1/README.TOO'\" \(1553 characters\)
  392.   sed "s/^X//" >'hpcdtoppm.0.5.pl1/README.TOO' <<'END_OF_FILE'
  393. XHere are some additional informations for installing and use:
  394. X
  395. XI.   Edit the config.h and the Makefile !
  396. X
  397. XII.  Several people had 'snowy' images with v0.1 and v0.2.
  398. X     This happens when the machine handles the standard
  399. X     type char unsigned. Therefore the datatype sBYTE
  400. X     was introduced as 'signed char'. If your compiler
  401. X     doesn't understand this, change sBYTE to such a datatype
  402. X     of your compiler or use a commandlineoption like
  403. X     -DsBYTE=char .
  404. XIII. Not every image contains all resolutions (especially images
  405. X     from demo disks). You can't extract resolutions which are
  406. X     not contained.
  407. X
  408. XIV.  Some cdrom drives read more than the data sectors of the 
  409. X     PhotoCD files. They read additional sector headers etc.
  410. X     In this case to have to write a little conversion tool.
  411. X
  412. X     E.g.: Sony NEWS, model NWS-3720
  413. X           Write a simple filter program, which takes the file,
  414. X           cuts in slices of 0x920 size, takes out 0x800 data 
  415. X           with offset 8 of each slice and write them out in a new file.
  416. X
  417. X
  418. XV.   There are some problems when compiling for MS-DOS or OS/2.
  419. X     I don't like this, i don't have this and i don't use this. 
  420. X     Several people sent mail with tricks for compiling.
  421. X     The important things are:
  422. X     - Use the gcc compiler and
  423. X
  424. X     - change the fopen parameters from "w" to "wb" and from "r" to "rb".
  425. X     - or use the binmode.o routines.
  426. X
  427. XVI.  On a Sun Workstation you can mount the Photo-CD as a high-sierra
  428. X     file system with the command
  429. X     mount -r -t hsfs /dev/sr0 /cdrom
  430. X
  431. X    
  432. END_OF_FILE
  433.   if test 1553 -ne `wc -c <'hpcdtoppm.0.5.pl1/README.TOO'`; then
  434.     echo shar: \"'hpcdtoppm.0.5.pl1/README.TOO'\" unpacked with wrong size!
  435.   fi
  436.   # end of 'hpcdtoppm.0.5.pl1/README.TOO'
  437. fi
  438. if test -f 'hpcdtoppm.0.5.pl1/ReadMe.NeXT' -a "${1}" != "-c" ; then 
  439.   echo shar: Will not clobber existing file \"'hpcdtoppm.0.5.pl1/ReadMe.NeXT'\"
  440. else
  441.   echo shar: Extracting \"'hpcdtoppm.0.5.pl1/ReadMe.NeXT'\" \(244 characters\)
  442.   sed "s/^X//" >'hpcdtoppm.0.5.pl1/ReadMe.NeXT' <<'END_OF_FILE'
  443. X
  444. X
  445. XThere are at least two ports to the NeXT machine with
  446. Xgraphical user interface. One of them is called "pCD".
  447. XSince i do not get informed about these ports, i don't
  448. Xknow on which version of hpcdtoppm they are based and
  449. Xwhere to get them. 
  450. X
  451. X
  452. END_OF_FILE
  453.   if test 244 -ne `wc -c <'hpcdtoppm.0.5.pl1/ReadMe.NeXT'`; then
  454.     echo shar: \"'hpcdtoppm.0.5.pl1/ReadMe.NeXT'\" unpacked with wrong size!
  455.   fi
  456.   # end of 'hpcdtoppm.0.5.pl1/ReadMe.NeXT'
  457. fi
  458. if test -f 'hpcdtoppm.0.5.pl1/ReadMe.SGI' -a "${1}" != "-c" ; then 
  459.   echo shar: Will not clobber existing file \"'hpcdtoppm.0.5.pl1/ReadMe.SGI'\"
  460. else
  461.   echo shar: Extracting \"'hpcdtoppm.0.5.pl1/ReadMe.SGI'\" \(345 characters\)
  462.   sed "s/^X//" >'hpcdtoppm.0.5.pl1/ReadMe.SGI' <<'END_OF_FILE'
  463. X
  464. XThere is a special version of hpcdtoppm with extensions for
  465. XSGI machines. The extensions are written by
  466. X
  467. X    Rodney Hoinkes
  468. X    Head of Design Applications
  469. X    Centre for Landscape Research
  470. X    University of Toronto
  471. X    Email: rodney@dgp.utoronto.ca
  472. X
  473. XThe SGI version is available via ftp at
  474. Xexplorer.dgp.toronto.edu (128.100.1.129) in pub/sgi/sgiphotocd .
  475. X
  476. X
  477. X
  478. END_OF_FILE
  479.   if test 345 -ne `wc -c <'hpcdtoppm.0.5.pl1/ReadMe.SGI'`; then
  480.     echo shar: \"'hpcdtoppm.0.5.pl1/ReadMe.SGI'\" unpacked with wrong size!
  481.   fi
  482.   # end of 'hpcdtoppm.0.5.pl1/ReadMe.SGI'
  483. fi
  484. if test -f 'hpcdtoppm.0.5.pl1/color.c' -a "${1}" != "-c" ; then 
  485.   echo shar: Will not clobber existing file \"'hpcdtoppm.0.5.pl1/color.c'\"
  486. else
  487.   echo shar: Extracting \"'hpcdtoppm.0.5.pl1/color.c'\" \(4566 characters\)
  488.   sed "s/^X//" >'hpcdtoppm.0.5.pl1/color.c' <<'END_OF_FILE'
  489. X/* hpcdtoppm (Hadmut's pcdtoppm) v0.5pl1
  490. X*  Copyright (c) 1992, 1993 by Hadmut Danisch (danisch@ira.uka.de).
  491. X*  Permission to use and distribute this software and its
  492. X*  documentation for noncommercial use and without fee is hereby granted,
  493. X*  provided that the above copyright notice appear in all copies and that
  494. X*  both that copyright notice and this permission notice appear in
  495. X*  supporting documentation. It is not allowed to sell this software in 
  496. X*  any way. This software is not public domain.
  497. X*/
  498. X
  499. X#include "hpcdtoppm.h"
  500. X
  501. Xextern sINT RGB_BitSh1,RGB_Maximum1;
  502. Xextern sINT RGB_F_LL;
  503. Xextern sINT RGB_F_C1,RGB_O_C1;
  504. Xextern sINT RGB_F_C2,RGB_O_C2;
  505. Xextern sINT RGB_F_G1,RGB_F_G2,RGB_O_G;
  506. Xextern uBYTE RGB_corr0[],RGB_corr1[],RGB_corr2[];
  507. X
  508. X
  509. Xstatic uBYTE *RGB_corr=0;
  510. Xstatic sINT T_L[256],T_R[256],T_G[256],T_g[256],T_B[256];
  511. X
  512. X#define slen 3072
  513. X
  514. X
  515. X
  516. Xstatic void initcorr(void)
  517. X { 
  518. X  switch(corrmode)
  519. X   {case C_LINEAR: RGB_corr=RGB_corr0; break;
  520. X    case C_DARK:   RGB_corr=RGB_corr1; break;
  521. X    case C_BRIGHT: RGB_corr=RGB_corr2; break;
  522. X    default: error(E_INTERN);
  523. X   }
  524. X }
  525. X
  526. X
  527. X
  528. Xstatic void initctable(void)
  529. X {sINT i;
  530. X  static sINT init=0;
  531. X
  532. X  if(init) return;
  533. X
  534. X  init=1;
  535. X
  536. X  initcorr();
  537. X
  538. X  for(i=0;i<256;i++)
  539. X   {  T_L[i] = i * RGB_F_LL;
  540. X      T_R[i] = i * RGB_F_C2 + RGB_O_C2;
  541. X      T_G[i] = i * RGB_F_G1;
  542. X      T_g[i] = i * RGB_F_G2 + RGB_O_G;
  543. X      T_B[i] = i * RGB_F_C1 + RGB_O_C1;      
  544. X   }
  545. X  
  546. X }
  547. X
  548. X
  549. Xstatic void ycctorgb(implane *l,implane *c1,implane *c2)
  550. X {dim x,y,w,h;
  551. X  uBYTE *pl,*pc1,*pc2;
  552. X  sINT red,green,blue;
  553. X  sINT L;
  554. X
  555. X  melde("ycctorgb\n");
  556. X  initctable();
  557. X
  558. X  w=l->iwidth;
  559. X  h=l->iheight;
  560. X
  561. X  for(y=0;y<h;y++)
  562. X   {
  563. X    pl =  l->im + y *  l->mwidth;
  564. X    pc1= c1->im + y * c1->mwidth;
  565. X    pc2= c2->im + y * c2->mwidth;
  566. X
  567. X    for(x=0;x<w;x++)
  568. X     {
  569. X      L    =  T_L[*pl]; 
  570. X      red  = (L + T_R[*pc2]             )>>RGB_BitSh1;
  571. X      green= (L + T_G[*pc1] + T_g[*pc2] )>>RGB_BitSh1; 
  572. X      blue = (L + T_B[*pc1]             )>>RGB_BitSh1;
  573. X
  574. X      red   = TRIF(red,  0,RGB_Maximum1,0,red,  RGB_Maximum1);
  575. X      green = TRIF(green,0,RGB_Maximum1,0,green,RGB_Maximum1);
  576. X      blue  = TRIF(blue ,0,RGB_Maximum1,0,blue, RGB_Maximum1);
  577. X
  578. X      *(pl++ )=RGB_corr[red]; 
  579. X      *(pc1++)=RGB_corr[green]; 
  580. X      *(pc2++)=RGB_corr[blue];
  581. X     }
  582. X   }
  583. X }
  584. X#undef BitShift
  585. X
  586. X
  587. X
  588. X
  589. X
  590. Xstatic void sharpit(implane *l)
  591. X {sINT x,y,h,w,mw,akk;
  592. X  uBYTE f1[slen],f2[slen],*old,*akt,*ptr,*work,*help,*optr=0;
  593. X
  594. X  melde("sharpit\n");
  595. X
  596. X  if((!l) || (!l->im)) error(E_INTERN);
  597. X  if(l->iwidth > slen) error(E_INTERN);
  598. X
  599. X  old=f1; akt=f2;
  600. X  h=l->iheight;
  601. X  w=l->iwidth;
  602. X  mw=l->mwidth;
  603. X
  604. X  for(y=1;y<h-1;y++)
  605. X   {
  606. X    ptr=l->im+ y*mw;
  607. X    optr=ptr-mw;
  608. X    work=akt;
  609. X
  610. X    *(work++)= *(ptr++);
  611. X    for(x=1;x<w-1;x++)
  612. X     {  akk = 5*((sINT)ptr[0])- ((sINT)ptr[1])  - ((sINT)ptr[-1]) 
  613. X                              - ((sINT)ptr[mw]) - ((sINT)ptr[-mw]);
  614. X        NORM(akk);
  615. X        *(work++)=akk;
  616. X        ptr++;
  617. X     }
  618. X
  619. X    *(work++)= *(ptr++);
  620. X
  621. X    if(y>1) 
  622. X      for(x=0;x<w;x++)
  623. X        optr[x] = old[x];
  624. X
  625. X    help=old;old=akt;akt=help;
  626. X     
  627. X   }
  628. X
  629. X
  630. X
  631. X  akt=optr+mw;
  632. X  for(x=0;x<w;x++)
  633. X    *(akt++) = *(old++);
  634. X }
  635. X
  636. X
  637. X
  638. X
  639. X
  640. X
  641. X
  642. Xstatic void initmtable(void)
  643. X {sINT i,h;
  644. X  static sINT init=0;
  645. X
  646. X  if(init) return;
  647. X
  648. X  init=1;
  649. X
  650. X  initcorr();
  651. X
  652. X  for(i=0;i<256;i++)
  653. X   {  h = (i * RGB_F_LL)>>RGB_BitSh1;
  654. X      h = TRIF(h,0,RGB_Maximum1,0,h,RGB_Maximum1);
  655. X      T_L[i]=RGB_corr[h];
  656. X   }
  657. X  
  658. X }
  659. X
  660. X
  661. Xstatic void monocorr(implane *l)
  662. X {dim x,y,w,h;
  663. X  uBYTE *ptr;
  664. X
  665. X  melde("monocorr\n");
  666. X  initmtable();
  667. X
  668. X  w=l->iwidth;
  669. X  h=l->iheight;
  670. X
  671. X  for(y=0;y<h;y++)
  672. X   {
  673. X    ptr=  l->im + y *  l->mwidth;
  674. X    for(x=0;x<w;x++,ptr++)
  675. X     { *ptr = T_L[*ptr]; 
  676. X     }
  677. X   }
  678. X }
  679. X
  680. X
  681. X
  682. X
  683. X
  684. X
  685. X
  686. Xvoid colconvert(sizeinfo *si,implane *l,implane *c1,implane *c2)
  687. X
  688. X#define w (si->rdhlen)
  689. X#define h (si->rdvlen)
  690. X
  691. X {
  692. X  melde("colconvert\n");
  693. X
  694. X    if((!l ) || ( l->iwidth != w ) || ( l->iheight != h) || (! l->im)) error(E_INTERN);
  695. X
  696. X  if(!monochrome)
  697. X   {
  698. X    if((!c1) || (c1->iwidth != w ) || (c1->iheight != h) || (!c1->im)) error(E_INTERN);
  699. X    if((!c2) || (c2->iwidth != w ) || (c2->iheight != h) || (!c2->im)) error(E_INTERN);
  700. X   }
  701. X
  702. X  if (do_crop)  cropit(si,l,c1,c2);
  703. X  else          shrink(si,l,c1,c2);
  704. X  if (do_sharp) sharpit(l);
  705. X
  706. X  switch (outfor)
  707. X   {
  708. X    /*  RGB-Conversion */
  709. X    case O_PS:
  710. X    case O_EPS:
  711. X    case O_PPM: ycctorgb(l,c1,c2);
  712. X                break;
  713. X
  714. X    /* Grayscale Conversion */
  715. X    case O_PSG:
  716. X    case O_EPSG:
  717. X    case O_PSD:
  718. X    case O_EPSD:
  719. X    case O_PGM: monocorr(l);
  720. X                break;
  721. X
  722. X    /* No Conversion */
  723. X    case O_YCC:
  724. X                break;
  725. X
  726. X    default: error(E_INTERN);
  727. X   }
  728. X#undef w
  729. X#undef h
  730. X }
  731. X
  732. X
  733. X
  734. END_OF_FILE
  735.   if test 4566 -ne `wc -c <'hpcdtoppm.0.5.pl1/color.c'`; then
  736.     echo shar: \"'hpcdtoppm.0.5.pl1/color.c'\" unpacked with wrong size!
  737.   fi
  738.   # end of 'hpcdtoppm.0.5.pl1/color.c'
  739. fi
  740. if test -f 'hpcdtoppm.0.5.pl1/config.h' -a "${1}" != "-c" ; then 
  741.   echo shar: Will not clobber existing file \"'hpcdtoppm.0.5.pl1/config.h'\"
  742. else
  743.   echo shar: Extracting \"'hpcdtoppm.0.5.pl1/config.h'\" \(3735 characters\)
  744.   sed "s/^X//" >'hpcdtoppm.0.5.pl1/config.h' <<'END_OF_FILE'
  745. X/* hpcdtoppm (Hadmut's pcdtoppm) v0.5pl1
  746. X*  Copyright (c) 1992, 1993 by Hadmut Danisch (danisch@ira.uka.de).
  747. X*  Permission to use and distribute this software and its
  748. X*  documentation for noncommercial use and without fee is hereby granted,
  749. X*  provided that the above copyright notice appear in all copies and that
  750. X*  both that copyright notice and this permission notice appear in
  751. X*  supporting documentation. It is not allowed to sell this software in 
  752. X*  any way. This software is not public domain.
  753. X*/
  754. X
  755. X
  756. X
  757. X/* define OWN_WRITE either here or by compiler-option if you don't want to use
  758. X   the pbmplus-routines for writing */
  759. X/* #define OWN_WRITE */
  760. X
  761. X
  762. X
  763. X/* define DEBUG for some debugging informations */
  764. X/* #define DEBUG */
  765. X
  766. X
  767. X/* define LONG_HELP or SHORT_HELP, if you want to have an options
  768. X   list if parameters are bad */
  769. X#define LONG_HELP
  770. X
  771. X
  772. X/* define DO_DECL_EXT for external declaration of system and library calls */
  773. X#define DO_DECL_EXT
  774. X
  775. X
  776. X/* define FASTHUFF for faster Huffman decoding with tables.
  777. X** this makes a little speedup, but needs about 768 KByte memory
  778. X*/
  779. X#define FASTHUFF
  780. X
  781. X
  782. X
  783. X#ifdef OWN_WRITE
  784. X/* If the own routines are used, this is the size of the buffer in bytes.
  785. X   You can shrink if needed. */
  786. X#define own_BUsize 50000
  787. X
  788. X/* The header for the ppm-files */
  789. X#define PPM_Header "P6\n%d %d\n255\n"
  790. X#define PGM_Header "P5\n%d %d\n255\n"
  791. X
  792. X
  793. X#endif
  794. X
  795. X
  796. X
  797. X/* fopen Parameters, for some systems (MS-DOS :-( ) you need "wb" and "rb" */
  798. X#define W_OP "w"
  799. X#define R_OP "r"
  800. X
  801. X
  802. X
  803. X
  804. X
  805. X
  806. X
  807. X
  808. X
  809. X/* if you can't write to stdout in binary mode, you have to fdopen
  810. X   a FILE * in binary mode to stdout. This is important for system,
  811. X   where W_OP is something other than "w". Please define the
  812. X   Macro USE_FDOPEN in this case and check the instructions, where this
  813. X   macro is used.
  814. X*/
  815. X
  816. X/* #define USE_FDOPEN */
  817. X
  818. X
  819. X
  820. X
  821. X
  822. X
  823. X
  824. X
  825. X
  826. X/** Error detection **/
  827. X
  828. X#define error(x) eerror(x,__FILE__,__LINE__)
  829. X
  830. X
  831. X
  832. X/*
  833. X** Data Types
  834. X** Important: sBYTE must be a signed byte type !
  835. X** If your compiler doesn't understand "signed", remove it.
  836. X*/
  837. X
  838. X#ifndef sBYTE
  839. Xtypedef   signed char sBYTE;
  840. X#endif
  841. X
  842. Xtypedef unsigned char uBYTE;
  843. X
  844. X/* signed and unsigned 32-bit-integers 
  845. XsINT and uINT must at least have 32 bit. If you
  846. Xdon't have 32-bit-integers, take 64-bit and
  847. Xdefine the macro U_TOO_LONG !!!
  848. X
  849. XuINT and sINT must be suitable to the printf/scanf-format %d
  850. Xand %u and to the systemcalls as fread etc.
  851. X
  852. X*/
  853. X
  854. X#define uINT unsigned int
  855. X#define sINT          int
  856. X/* #define U_TOO_LONG */
  857. X
  858. X
  859. X
  860. X
  861. X
  862. X
  863. Xtypedef uINT dim;
  864. Xtypedef sINT sdim;
  865. X
  866. X
  867. X
  868. X
  869. X/* Floating point data type and string for sscanf */
  870. X#define FLTPT double
  871. X#define SSFLTPT "%lf"
  872. X
  873. X
  874. X
  875. X
  876. X
  877. X
  878. X
  879. X/* Default taken when no size parameter given,
  880. X** C_DEFAULT depends on your taste and video-hardware,
  881. X*/
  882. X
  883. X#define S_DEFAULT S_Base16
  884. X#define O_DEFAULT O_PPM
  885. X#define C_DEFAULT C_LINEAR
  886. X#define T_DEFAULT T_AUTO
  887. X
  888. X
  889. X/* Background for contact sheet */
  890. X#define CONTLUM neutrLum
  891. X#define CONTCH1 neutrCh1
  892. X#define CONTCH2 neutrCh2
  893. X
  894. X
  895. X
  896. X
  897. X/* Maximum Black value of frame for cutting of the
  898. X** frame. If MAX_BLACK is n, a frame is detected, when
  899. X** all Luma values are within [ 0 .. (n-1) ]
  900. X*/
  901. X#define MAX_BLACK 1
  902. X
  903. X/* Default Postscript paper size
  904. X** (German DIN A 4 )
  905. X*/
  906. X#define DEF_PAPER_LEFT    50.0
  907. X#define DEF_PAPER_BOTTOM  50.0
  908. X#define DEF_PAPER_WIDTH  500.0
  909. X#define DEF_PAPER_HEIGHT 750.0
  910. X#define DEF_DPI          300.0
  911. X
  912. X
  913. X
  914. X/* External Declarations */
  915. X#ifdef DO_DECL_EXT
  916. X
  917. Xextern void *malloc(unsigned);
  918. Xextern int  sscanf(char *,char *,...);    
  919. X
  920. Xextern int  fprintf(FILE *,char *,...);
  921. Xextern int  fclose(FILE *);
  922. Xextern int  fseek(FILE *,long,int);
  923. Xextern int  fread(void *,int,int,FILE *);
  924. Xextern int  fwrite(void *,int,int,FILE *);
  925. Xextern int  fputs(char *,FILE *);
  926. Xextern int  fputc(char  ,FILE *);
  927. Xextern int  fflush(FILE *);
  928. X
  929. X#endif
  930. X
  931. X
  932. X
  933. X
  934. X
  935. X
  936. X
  937. END_OF_FILE
  938.   if test 3735 -ne `wc -c <'hpcdtoppm.0.5.pl1/config.h'`; then
  939.     echo shar: \"'hpcdtoppm.0.5.pl1/config.h'\" unpacked with wrong size!
  940.   fi
  941.   # end of 'hpcdtoppm.0.5.pl1/config.h'
  942. fi
  943. if test -f 'hpcdtoppm.0.5.pl1/hpcdtoppm.h' -a "${1}" != "-c" ; then 
  944.   echo shar: Will not clobber existing file \"'hpcdtoppm.0.5.pl1/hpcdtoppm.h'\"
  945. else
  946.   echo shar: Extracting \"'hpcdtoppm.0.5.pl1/hpcdtoppm.h'\" \(4682 characters\)
  947.   sed "s/^X//" >'hpcdtoppm.0.5.pl1/hpcdtoppm.h' <<'END_OF_FILE'
  948. X/* hpcdtoppm (Hadmut's pcdtoppm) v0.5pl1
  949. X*  Copyright (c) 1992, 1993 by Hadmut Danisch (danisch@ira.uka.de).
  950. X*  Permission to use and distribute this software and its
  951. X*  documentation for noncommercial use and without fee is hereby granted,
  952. X*  provided that the above copyright notice appear in all copies and that
  953. X*  both that copyright notice and this permission notice appear in
  954. X*  supporting documentation. It is not allowed to sell this software in 
  955. X*  any way. This software is not public domain.
  956. X*/
  957. X
  958. X
  959. X#include <stdio.h>
  960. X#include <string.h>
  961. X#include <malloc.h>
  962. X#include <sys/types.h>
  963. X#include <ctype.h>
  964. X#include "config.h"
  965. X
  966. X
  967. X
  968. X
  969. X
  970. X
  971. X
  972. X
  973. X/* Format definitions */
  974. X
  975. X#define BaseW ((dim)768)
  976. X#define BaseH ((dim)512)
  977. X
  978. X#define SECSIZE 0x800
  979. X
  980. X#define SeHead   2
  981. X#define L_Head   (1+SeHead)
  982. X
  983. X#define SeBase16 18
  984. X#define L_Base16 (1+SeBase16)
  985. X
  986. X#define SeBase4  72
  987. X#define L_Base4  (1+SeBase4)
  988. X
  989. X#define SeBase   288
  990. X#define L_Base   (1+SeBase)
  991. X
  992. X
  993. X#define neutrLum 128
  994. X#define neutrCh1 156
  995. X#define neutrCh2 137
  996. X
  997. X
  998. X
  999. X
  1000. X
  1001. X
  1002. X
  1003. X/* Structures and definitions */
  1004. Xstruct _implane
  1005. X {dim  mwidth,mheight,
  1006. X       iwidth,iheight;
  1007. X  uBYTE *im,*mp;
  1008. X };
  1009. Xtypedef struct _implane implane;
  1010. X
  1011. X#define nullplane ((implane *) 0)
  1012. X
  1013. X
  1014. X
  1015. X
  1016. X
  1017. Xstruct _sizeinfo
  1018. X {dim w,h;  /* Image Resolution */
  1019. X  dim rdhoff,rdhlen, rdvoff, rdvlen; /* Size of Image in Memory */
  1020. X  dim imhoff,imhlen, imvoff, imvlen; /* Real Size of Image */
  1021. X };
  1022. Xtypedef struct _sizeinfo sizeinfo;
  1023. X
  1024. X
  1025. X
  1026. X
  1027. X
  1028. X
  1029. Xenum   TURNS  { T_UNSPEC,T_NONE,T_RIGHT,T_LEFT,T_HEAD,T_AUTO };
  1030. Xenum   SIZES  { S_UNSPEC,S_Base16,S_Base4,S_Base,S_4Base,S_16Base,S_Over,S_Contact };
  1031. Xenum   OUTFOR { O_UNSPEC,O_PPM,O_PGM,O_YCC,O_PS,O_EPS,O_PSG,O_EPSG,O_PSD,O_EPSD };
  1032. Xenum   CORR   { C_UNSPEC,C_LINEAR,C_DARK,C_BRIGHT };
  1033. X
  1034. Xenum   ERRORS { E_NONE,E_READ,E_WRITE,E_INTERN,E_ARG,E_OPT,E_MEM,E_HUFF,
  1035. X                E_SEQ,E_SEQ1,E_SEQ2,E_SEQ3,E_SEQ4,E_SEQ5,E_SEQ6,E_SEQ7,E_POS,E_IMP,E_OVSKIP,
  1036. X                E_TAUTO,E_TCANT,E_SUBR,E_PRPAR,E_CONFIG };
  1037. X
  1038. X
  1039. X
  1040. X
  1041. X
  1042. X/**** Macros ****/
  1043. X
  1044. X
  1045. X
  1046. X#ifdef DEBUG
  1047. X#define RPRINT  {fprintf(stderr,"R-Position %x\n",bufpos);}
  1048. X#else
  1049. X#define RPRINT
  1050. X#endif
  1051. X
  1052. X#define melde(x) {if (do_melde) fprintf(stderr,x);}
  1053. X
  1054. X
  1055. X#define READBUF   READ(sbuffer,sizeof(sbuffer))
  1056. X#define EREADBUF {if(READBUF < 1) error(E_READ);}
  1057. X
  1058. X#define SKIP(p)  { if (SKIPn(p)) error(E_READ);}
  1059. X#define SKIPr(p) { if (SKIPn(p)) return(E_READ);}
  1060. X
  1061. X
  1062. X#define TRIF(x,u,o,a,b,c) ((x)<(u)? (a) : ( (x)>(o)?(c):(b)  ))
  1063. X#define xNORM(x) x=TRIF(x,0,255,0,x,255)
  1064. X#define NORM(x) { if(x<0) x=0; else if (x>255) x=255;}
  1065. X
  1066. X#ifndef MIN
  1067. X#define MIN(a,b) (((a) < (b)) ? (a) : (b))
  1068. X#endif
  1069. X
  1070. X
  1071. X
  1072. X
  1073. X
  1074. X
  1075. X
  1076. X
  1077. X/* main.c */
  1078. Xextern void         close_all(void);
  1079. X
  1080. Xextern char         *ppmname,*pcdname;
  1081. Xextern sINT         do_diff,do_info,do_sharp,do_overskip,monochrome;
  1082. Xextern sINT         do_melde,do_rep,do_crop;
  1083. Xextern sINT         flvert,flhori;
  1084. Xextern uBYTE        sbuffer[SECSIZE];
  1085. Xextern enum TURNS   turn;
  1086. Xextern enum SIZES   size;
  1087. Xextern enum OUTFOR  outfor;
  1088. Xextern enum CORR    corrmode;
  1089. X
  1090. Xextern void         SEEK(int);
  1091. Xextern int          SKIPn(int);
  1092. Xextern int          READ(uBYTE *,int);
  1093. Xextern sINT         bufpos;
  1094. X
  1095. X
  1096. X
  1097. X
  1098. X/* error.c */
  1099. Xextern void         eerror(enum ERRORS,char *, int);
  1100. X
  1101. X
  1102. X/* color.c */
  1103. Xextern void         colconvert(sizeinfo *,implane *,implane *,implane *);
  1104. X
  1105. X/* tools.c */
  1106. Xextern void         clearimpl(implane *,sINT);
  1107. Xextern void         halve(implane *);
  1108. Xextern void         interpolate(implane *);
  1109. Xextern sINT         Skip4Base(void);
  1110. Xextern void         planealloc(implane *,dim,dim);
  1111. Xextern void         pastein(implane *,dim,dim,dim,dim,implane *, enum TURNS);
  1112. Xextern void         cropit(sizeinfo *,implane *,implane *,implane *);
  1113. Xextern void         shrink(sizeinfo *,implane *,implane *,implane *);
  1114. Xextern void         typecheck(void);
  1115. X
  1116. X
  1117. X/* format.c */
  1118. Xextern void         readhqt(sINT);
  1119. Xextern void         decode(sizeinfo *,int,implane *,implane *,implane *,sINT);
  1120. Xextern enum ERRORS  readplain(sizeinfo *,int,implane *,implane *,implane *);
  1121. X
  1122. X
  1123. X
  1124. X
  1125. X
  1126. X/* Type definitions for output format drives, used in output.c and the drivers */
  1127. X
  1128. Xtypedef void (OUT1PL)(FILE *,dim,dim, uBYTE *,sdim,sdim);
  1129. Xtypedef void (OUT3PL)(FILE *,dim,dim, uBYTE *,sdim,sdim, uBYTE *,sdim,sdim, uBYTE *,sdim,sdim); 
  1130. X
  1131. X/* output.c */
  1132. Xextern void         writepicture(FILE *,sizeinfo *,implane *,implane *,implane *,enum TURNS);
  1133. Xextern void         druckeid(void);
  1134. X
  1135. X
  1136. X/* ppm.c */
  1137. Xextern OUT3PL       write_ppm;
  1138. Xextern OUT1PL       write_pgm;
  1139. X
  1140. X/* postscr.c */
  1141. Xextern OUT3PL       write_epsrgb,write_psrgb;
  1142. Xextern OUT1PL       write_epsgrey,write_psgrey,write_epsdith,write_psdith;
  1143. X
  1144. Xextern FLTPT        PAPER_LEFT,PAPER_BOTTOM,PAPER_WIDTH,PAPER_HEIGHT,PRINTER_XDPI,PRINTER_YDPI,PRINTER_FAK;
  1145. Xextern sINT         PSIZE_SET,DPI_SET,FAK_SET;
  1146. X
  1147. END_OF_FILE
  1148.   if test 4682 -ne `wc -c <'hpcdtoppm.0.5.pl1/hpcdtoppm.h'`; then
  1149.     echo shar: \"'hpcdtoppm.0.5.pl1/hpcdtoppm.h'\" unpacked with wrong size!
  1150.   fi
  1151.   # end of 'hpcdtoppm.0.5.pl1/hpcdtoppm.h'
  1152. fi
  1153. if test -f 'hpcdtoppm.0.5.pl1/ppm.c' -a "${1}" != "-c" ; then 
  1154.   echo shar: Will not clobber existing file \"'hpcdtoppm.0.5.pl1/ppm.c'\"
  1155. else
  1156.   echo shar: Extracting \"'hpcdtoppm.0.5.pl1/ppm.c'\" \(3050 characters\)
  1157.   sed "s/^X//" >'hpcdtoppm.0.5.pl1/ppm.c' <<'END_OF_FILE'
  1158. X/* hpcdtoppm (Hadmut's pcdtoppm) v0.5pl1
  1159. X*  Copyright (c) 1992, 1993 by Hadmut Danisch (danisch@ira.uka.de).
  1160. X*  Permission to use and distribute this software and its
  1161. X*  documentation for noncommercial use and without fee is hereby granted,
  1162. X*  provided that the above copyright notice appear in all copies and that
  1163. X*  both that copyright notice and this permission notice appear in
  1164. X*  supporting documentation. It is not allowed to sell this software in 
  1165. X*  any way. This software is not public domain.
  1166. X*/
  1167. X
  1168. X#include "hpcdtoppm.h"
  1169. X
  1170. X
  1171. X
  1172. X
  1173. X#ifdef OWN_WRITE
  1174. X
  1175. X
  1176. Xstatic uBYTE BUF[own_BUsize];
  1177. X#define BUinit {BUcount=0;BUptr=BUF;}
  1178. X
  1179. X#define BUrgb_flush        {fwrite(BUF,BUcount*3,1,fout);BUinit; }
  1180. X#define BUrgb_write(r,g,b) {if(BUcount>=own_BUsize/3) BUrgb_flush; *BUptr++ = r ; *BUptr++ = g ; *BUptr++ = b ; BUcount++;}
  1181. X
  1182. X#define BUgreyflush        {fwrite(BUF,BUcount,1,fout);BUinit; }
  1183. X#define BUgreywrite(g)     {if(BUcount>=own_BUsize) BUgreyflush;  *BUptr++ = g ;  BUcount++;}
  1184. X
  1185. X
  1186. X
  1187. X
  1188. X
  1189. X
  1190. X
  1191. Xvoid write_ppm(FILE *fout,dim w,dim h, 
  1192. X               uBYTE *rptr,sdim rzeil,sdim rpix,  
  1193. X               uBYTE *gptr,sdim gzeil,sdim gpix,  
  1194. X               uBYTE *bptr,sdim bzeil,sdim bpix) 
  1195. X {register uBYTE *pr,*pg,*pb;
  1196. X  dim x,y;
  1197. X  static uBYTE *BUptr;
  1198. X  sINT   BUcount;
  1199. X
  1200. X  fprintf(fout,PPM_Header,w,h);
  1201. X  BUinit;
  1202. X  for(y=0;y<h;y++)
  1203. X   {
  1204. X     pr= rptr; rptr+=rzeil;
  1205. X     pg= gptr; gptr+=gzeil;
  1206. X     pb= bptr; bptr+=bzeil;
  1207. X     for(x=0;x<w;x++) 
  1208. X      {BUrgb_write(*pr,*pg,*pb);
  1209. X       pr+=rpix;  pg+=gpix;  pb+=bpix;
  1210. X      }
  1211. X   }
  1212. X  BUrgb_flush;
  1213. X
  1214. X }
  1215. X
  1216. X
  1217. X
  1218. X
  1219. X
  1220. X
  1221. Xvoid write_pgm(FILE *fout,dim w,dim h, uBYTE *ptr,sdim zeil,sdim pix) 
  1222. X {register uBYTE *p;
  1223. X  dim x,y;
  1224. X  static uBYTE *BUptr;
  1225. X  sINT   BUcount;
  1226. X
  1227. X
  1228. X  fprintf(fout,PGM_Header,w,h);
  1229. X  BUinit;
  1230. X  for(y=0;y<h;y++)
  1231. X   {
  1232. X    p= ptr; ptr+=zeil;
  1233. X
  1234. X    for(x=0;x<w;x++) 
  1235. X     {BUgreywrite(*p);
  1236. X      p+=pix;
  1237. X     }
  1238. X   }
  1239. X  BUgreyflush;
  1240. X }
  1241. X
  1242. X
  1243. X#else
  1244. X#include "ppm.h"
  1245. X
  1246. Xvoid write_ppm(FILE *fout,dim w,dim h, 
  1247. X               uBYTE *rptr,sdim rzeil,sdim rpix,  
  1248. X               uBYTE *gptr,sdim gzeil,sdim gpix,  
  1249. X               uBYTE *bptr,sdim bzeil,sdim bpix) 
  1250. X {register uBYTE *pr,*pg,*pb;
  1251. X  dim x,y;
  1252. X  pixel *pixrow;
  1253. X  register pixel* pP;
  1254. X
  1255. X
  1256. X  ppm_writeppminit(fout,w,h,(pixval) 255, 0);
  1257. X  pixrow = ppm_allocrow( w );
  1258. X  for(y=0;y<h;y++)
  1259. X   {
  1260. X    pr= rptr; rptr+=rzeil;
  1261. X    pg= gptr; gptr+=gzeil;
  1262. X    pb= bptr; bptr+=bzeil;
  1263. X
  1264. X    for(pP= pixrow,x=0;x<w;x++)
  1265. X     {
  1266. X      PPM_ASSIGN(*pP,((sINT)*pr),((sINT)*pg),((sINT)*pb));
  1267. X      pP++;  pr+=rpix;  pg+=gpix;  pb+=bpix;
  1268. X     }
  1269. X    ppm_writeppmrow( fout, pixrow, w, (pixval) 255, 0 );
  1270. X        
  1271. X   }
  1272. X  pm_close(fout);
  1273. X
  1274. X }
  1275. X
  1276. Xvoid write_pgm(FILE *fout,dim w,dim h, uBYTE *ptr,sdim zeil,sdim pix) 
  1277. X {register uBYTE *p;
  1278. X  dim x,y;
  1279. X  gray *grayrow;
  1280. X  register gray* pP;
  1281. X
  1282. X
  1283. X  pgm_writepgminit(fout,w,h,(pixval) 255, 0);
  1284. X  grayrow = pgm_allocrow( w );
  1285. X  for(y=0;y<h;y++)
  1286. X   {
  1287. X    p= ptr; ptr+=zeil;
  1288. X
  1289. X    for(pP= grayrow,x=0;x<w;x++)
  1290. X     {
  1291. X      *pP= ((gray)*p);
  1292. X      pP++;  p+=pix;
  1293. X     }
  1294. X    pgm_writepgmrow( fout, grayrow, w, (pixval) 255, 0 );
  1295. X        
  1296. X   }
  1297. X  pm_close(fout);
  1298. X
  1299. X }
  1300. X
  1301. X
  1302. X
  1303. X
  1304. X#endif
  1305. X
  1306. X
  1307. X
  1308. END_OF_FILE
  1309.   if test 3050 -ne `wc -c <'hpcdtoppm.0.5.pl1/ppm.c'`; then
  1310.     echo shar: \"'hpcdtoppm.0.5.pl1/ppm.c'\" unpacked with wrong size!
  1311.   fi
  1312.   # end of 'hpcdtoppm.0.5.pl1/ppm.c'
  1313. fi
  1314. echo shar: End of archive 3 \(of 3\).
  1315. cp /dev/null ark3isdone
  1316. MISSING=""
  1317. for I in 1 2 3 ; do
  1318.     if test ! -f ark${I}isdone ; then
  1319.     MISSING="${MISSING} ${I}"
  1320.     fi
  1321. done
  1322. if test "${MISSING}" = "" ; then
  1323.     echo You have unpacked all 3 archives.
  1324.     rm -f ark[1-9]isdone
  1325. else
  1326.     echo You still must unpack the following archives:
  1327.     echo "        " ${MISSING}
  1328. fi
  1329. exit 0
  1330. exit 0 # Just in case...
  1331.