home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume43 / hpcdtoppm / part02 < prev    next >
Internet Message Format  |  1994-06-10  |  61KB

  1. From: danisch@ira.uka.de (Hadmut Danisch)
  2. Newsgroups: comp.sources.misc
  3. Subject: v43i040:  hpcdtoppm - convert Photo-CD file into portable pixmap, v0.6, Part02/03
  4. Date: 10 Jun 1994 11:19:36 -0500
  5. Organization: Sterling Software
  6. Sender: kent@sparky.sterling.com
  7. Approved: kent@sparky.sterling.com
  8. Message-ID: <2ta3qo$fc2@sparky.sterling.com>
  9. X-Md4-Signature: 17382c35361155d8c7c1f08313c8207e
  10.  
  11. Submitted-by: danisch@ira.uka.de (Hadmut Danisch)
  12. Posting-number: Volume 43, Issue 40
  13. Archive-name: hpcdtoppm/part02
  14. Environment: Photo-CD
  15. Supersedes: hpcdtoppm: Volume 39, Issue 2-4
  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.6/const.c hpcdtoppm.0.6/error.c
  22. #   hpcdtoppm.0.6/format.c hpcdtoppm.0.6/postscr.c hpcdtoppm.0.6/ppm.c
  23. # Wrapped by kent@sparky on Fri Jun 10 11:08:32 1994
  24. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
  25. echo If this archive is complete, you will see the following message:
  26. echo '          "shar: End of archive 2 (of 3)."'
  27. if test -f 'hpcdtoppm.0.6/const.c' -a "${1}" != "-c" ; then 
  28.   echo shar: Will not clobber existing file \"'hpcdtoppm.0.6/const.c'\"
  29. else
  30.   echo shar: Extracting \"'hpcdtoppm.0.6/const.c'\" \(14364 characters\)
  31.   sed "s/^X//" >'hpcdtoppm.0.6/const.c' <<'END_OF_FILE'
  32. X/* hpcdtoppm (Hadmut's pcdtoppm) v0.6
  33. X*  Copyright (c) 1992, 1993, 1994 by Hadmut Danisch (danisch@ira.uka.de).
  34. X*  Permission to use and distribute this software and its
  35. X*  documentation for noncommercial use and without fee is hereby granted,
  36. X*  provided that the above copyright notice appear in all copies and that
  37. X*  both that copyright notice and this permission notice appear in
  38. X*  supporting documentation. It is not allowed to sell this software in 
  39. X*  any way. This software is not public domain.
  40. X*/
  41. X
  42. X#include "hpcdtoppm.h"
  43. X
  44. X
  45. XsINT RGB_BitSh1=8;
  46. XsINT RGB_Maximum1=1023;
  47. X
  48. X
  49. XsINT RGB_F_LL=1391;
  50. XsINT RGB_F_C1=2271;
  51. XsINT RGB_O_C1=-353784;
  52. XsINT RGB_F_C2=1865;
  53. XsINT RGB_O_C2=-255023;
  54. XsINT RGB_F_G1=-441;
  55. XsINT RGB_F_G2=-949;
  56. XsINT RGB_O_G =199313;
  57. X
  58. X
  59. XuBYTE RGB_corr0[]={
  60. X  0,  0,  0,  0,  1,  1,  1,  1,  2,  2,  2,  2,  3,  3,  3,  3,
  61. X  4,  4,  4,  4,  5,  5,  5,  5,  6,  6,  6,  6,  7,  7,  7,  7,
  62. X  8,  8,  8,  8,  9,  9,  9,  9, 10, 10, 10, 10, 11, 11, 11, 11,
  63. X 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15,
  64. X 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19,
  65. X 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23,
  66. X 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27,
  67. X 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31,
  68. X 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35,
  69. X 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39,
  70. X 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43,
  71. X 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47,
  72. X 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51,
  73. X 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55,
  74. X 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59,
  75. X 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 63,
  76. X 64, 64, 64, 64, 65, 65, 65, 65, 66, 66, 66, 66, 67, 67, 67, 67,
  77. X 68, 68, 68, 68, 69, 69, 69, 69, 70, 70, 70, 70, 71, 71, 71, 71,
  78. X 72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75,
  79. X 76, 76, 76, 76, 77, 77, 77, 77, 78, 78, 78, 78, 79, 79, 79, 79,
  80. X 80, 80, 80, 80, 81, 81, 81, 81, 82, 82, 82, 82, 83, 83, 83, 83,
  81. X 84, 84, 84, 84, 85, 85, 85, 85, 86, 86, 86, 86, 87, 87, 87, 87,
  82. X 88, 88, 88, 88, 89, 89, 89, 89, 90, 90, 90, 90, 91, 91, 91, 91,
  83. X 92, 92, 92, 92, 93, 93, 93, 93, 94, 94, 94, 94, 95, 95, 95, 95,
  84. X 96, 96, 96, 96, 97, 97, 97, 97, 98, 98, 98, 98, 99, 99, 99, 99,
  85. X100,100,100,100,101,101,101,101,102,102,102,102,103,103,103,103,
  86. X104,104,104,104,105,105,105,105,106,106,106,106,107,107,107,107,
  87. X108,108,108,108,109,109,109,109,110,110,110,110,111,111,111,111,
  88. X112,112,112,112,113,113,113,113,114,114,114,114,115,115,115,115,
  89. X116,116,116,116,117,117,117,117,118,118,118,118,119,119,119,119,
  90. X120,120,120,120,121,121,121,121,122,122,122,122,123,123,123,123,
  91. X124,124,124,124,125,125,125,125,126,126,126,126,127,127,127,127,
  92. X128,128,128,128,129,129,129,129,130,130,130,130,131,131,131,131,
  93. X132,132,132,132,133,133,133,133,134,134,134,134,135,135,135,135,
  94. X136,136,136,136,137,137,137,137,138,138,138,138,139,139,139,139,
  95. X140,140,140,140,141,141,141,141,142,142,142,142,143,143,143,143,
  96. X144,144,144,144,145,145,145,145,146,146,146,146,147,147,147,147,
  97. X148,148,148,148,149,149,149,149,150,150,150,150,151,151,151,151,
  98. X152,152,152,152,153,153,153,153,154,154,154,154,155,155,155,155,
  99. X156,156,156,156,157,157,157,157,158,158,158,158,159,159,159,159,
  100. X160,160,160,160,161,161,161,161,162,162,162,162,163,163,163,163,
  101. X164,164,164,164,165,165,165,165,166,166,166,166,167,167,167,167,
  102. X168,168,168,168,169,169,169,169,170,170,170,170,171,171,171,171,
  103. X172,172,172,172,173,173,173,173,174,174,174,174,175,175,175,175,
  104. X176,176,176,176,177,177,177,177,178,178,178,178,179,179,179,179,
  105. X180,180,180,180,181,181,181,181,182,182,182,182,183,183,183,183,
  106. X184,184,184,184,185,185,185,185,186,186,186,186,187,187,187,187,
  107. X188,188,188,188,189,189,189,189,190,190,190,190,191,191,191,191,
  108. X192,192,192,192,193,193,193,193,194,194,194,194,195,195,195,195,
  109. X196,196,196,196,197,197,197,197,198,198,198,198,199,199,199,199,
  110. X200,200,200,200,201,201,201,201,202,202,202,202,203,203,203,203,
  111. X204,204,204,204,205,205,205,205,206,206,206,206,207,207,207,207,
  112. X208,208,208,208,209,209,209,209,210,210,210,210,211,211,211,211,
  113. X212,212,212,212,213,213,213,213,214,214,214,214,215,215,215,215,
  114. X216,216,216,216,217,217,217,217,218,218,218,218,219,219,219,219,
  115. X220,220,220,220,221,221,221,221,222,222,222,222,223,223,223,223,
  116. X224,224,224,224,225,225,225,225,226,226,226,226,227,227,227,227,
  117. X228,228,228,228,229,229,229,229,230,230,230,230,231,231,231,231,
  118. X232,232,232,232,233,233,233,233,234,234,234,234,235,235,235,235,
  119. X236,236,236,236,237,237,237,237,238,238,238,238,239,239,239,239,
  120. X240,240,240,240,241,241,241,241,242,242,242,242,243,243,243,243,
  121. X244,244,244,244,245,245,245,245,246,246,246,246,247,247,247,247,
  122. X248,248,248,248,249,249,249,249,250,250,250,250,251,251,251,251,
  123. X252,252,252,252,253,253,253,253,254,254,254,254,255,255,255,255
  124. X};
  125. X
  126. X
  127. XuBYTE RGB_corr1[]={
  128. X  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  129. X  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
  130. X  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
  131. X  2,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
  132. X  3,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  4,  4,  4,
  133. X  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  5,  5,  5,  5,  5,
  134. X  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  6,  6,  6,  6,  6,
  135. X  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  7,  7,  7,  7,  7,  7,
  136. X  7,  7,  7,  7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  8,  8,  8,
  137. X  8,  8,  8,  8,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
  138. X  9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11,
  139. X 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12,
  140. X 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14,
  141. X 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16,
  142. X 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17,
  143. X 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19,
  144. X 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21,
  145. X 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 24,
  146. X 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26,
  147. X 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28,
  148. X 28, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 31, 31,
  149. X 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33,
  150. X 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36,
  151. X 36, 36, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 39, 39, 39,
  152. X 39, 39, 39, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 42, 42,
  153. X 42, 42, 42, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45, 45,
  154. X 45, 45, 45, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 48, 48, 48,
  155. X 48, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51,
  156. X 52, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 54, 55, 55,
  157. X 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 57, 58, 58, 58, 58,
  158. X 59, 59, 59, 59, 60, 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62,
  159. X 62, 63, 63, 63, 63, 63, 64, 64, 64, 64, 65, 65, 65, 65, 66, 66,
  160. X 66, 66, 67, 67, 67, 67, 68, 68, 68, 68, 69, 69, 69, 69, 69, 70,
  161. X 70, 70, 70, 71, 71, 71, 71, 72, 72, 72, 73, 73, 73, 73, 74, 74,
  162. X 74, 74, 75, 75, 75, 75, 76, 76, 76, 76, 77, 77, 77, 77, 78, 78,
  163. X 78, 78, 79, 79, 79, 80, 80, 80, 80, 81, 81, 81, 81, 82, 82, 82,
  164. X 83, 83, 83, 83, 84, 84, 84, 84, 85, 85, 85, 86, 86, 86, 86, 87,
  165. X 87, 87, 87, 88, 88, 88, 89, 89, 89, 89, 90, 90, 90, 91, 91, 91,
  166. X 91, 92, 92, 92, 93, 93, 93, 94, 94, 94, 94, 95, 95, 95, 96, 96,
  167. X 96, 96, 97, 97, 97, 98, 98, 98, 99, 99, 99, 99,100,100,100,101,
  168. X101,101,102,102,102,102,103,103,103,104,104,104,105,105,105,106,
  169. X106,106,107,107,107,107,108,108,108,109,109,109,110,110,110,111,
  170. X111,111,112,112,112,113,113,113,114,114,114,114,115,115,115,116,
  171. X116,116,117,117,117,118,118,118,119,119,119,120,120,120,121,121,
  172. X121,122,122,122,123,123,123,124,124,124,125,125,126,126,126,127,
  173. X127,127,128,128,128,129,129,129,130,130,130,131,131,131,132,132,
  174. X132,133,133,134,134,134,135,135,135,136,136,136,137,137,137,138,
  175. X138,139,139,139,140,140,140,141,141,141,142,142,143,143,143,144,
  176. X144,144,145,145,146,146,146,147,147,147,148,148,149,149,149,150,
  177. X150,150,151,151,152,152,152,153,153,153,154,154,155,155,155,156,
  178. X156,157,157,157,158,158,158,159,159,160,160,160,161,161,162,162,
  179. X162,163,163,164,164,164,165,165,166,166,166,167,167,168,168,168,
  180. X169,169,170,170,170,171,171,172,172,172,173,173,174,174,174,175,
  181. X175,176,176,177,177,177,178,178,179,179,179,180,180,181,181,182,
  182. X182,182,183,183,184,184,184,185,185,186,186,187,187,187,188,188,
  183. X189,189,190,190,190,191,191,192,192,193,193,193,194,194,195,195,
  184. X196,196,197,197,197,198,198,199,199,200,200,200,201,201,202,202,
  185. X203,203,204,204,204,205,205,206,206,207,207,208,208,209,209,209,
  186. X210,210,211,211,212,212,213,213,214,214,214,215,215,216,216,217,
  187. X217,218,218,219,219,220,220,220,221,221,222,222,223,223,224,224,
  188. X225,225,226,226,227,227,228,228,228,229,229,230,230,231,231,232,
  189. X232,233,233,234,234,235,235,236,236,237,237,238,238,239,239,240,
  190. X240,241,241,242,242,243,243,244,244,245,245,245,246,246,247,247,
  191. X248,248,249,249,250,250,251,251,252,252,253,253,254,254,255,255
  192. X};
  193. X
  194. X
  195. XuBYTE RGB_corr2[]={
  196. X  0,  1,  2,  3,  4,  5,  6,  7,  9, 10, 11, 12, 13, 14, 15, 16,
  197. X 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 32,
  198. X 33, 34, 35, 36, 37, 37, 38, 39, 40, 40, 41, 42, 42, 43, 44, 45,
  199. X 45, 46, 46, 47, 48, 48, 49, 50, 50, 51, 51, 52, 53, 53, 54, 54,
  200. X 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 63, 63,
  201. X 64, 64, 65, 65, 66, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71,
  202. X 71, 72, 72, 73, 73, 73, 74, 74, 75, 75, 76, 76, 76, 77, 77, 78,
  203. X 78, 79, 79, 79, 80, 80, 81, 81, 81, 82, 82, 83, 83, 83, 84, 84,
  204. X 85, 85, 85, 86, 86, 86, 87, 87, 88, 88, 88, 89, 89, 89, 90, 90,
  205. X 91, 91, 91, 92, 92, 92, 93, 93, 93, 94, 94, 95, 95, 95, 96, 96,
  206. X 96, 97, 97, 97, 98, 98, 98, 99, 99, 99,100,100,100,101,101,101,
  207. X102,102,102,103,103,103,104,104,104,104,105,105,105,106,106,106,
  208. X107,107,107,108,108,108,109,109,109,109,110,110,110,111,111,111,
  209. X112,112,112,112,113,113,113,114,114,114,114,115,115,115,116,116,
  210. X116,116,117,117,117,118,118,118,118,119,119,119,120,120,120,120,
  211. X121,121,121,121,122,122,122,123,123,123,123,124,124,124,124,125,
  212. X125,125,126,126,126,126,127,127,127,127,128,128,128,128,129,129,
  213. X129,129,130,130,130,130,131,131,131,131,132,132,132,132,133,133,
  214. X133,133,134,134,134,134,135,135,135,135,136,136,136,136,137,137,
  215. X137,137,138,138,138,138,139,139,139,139,140,140,140,140,140,141,
  216. X141,141,141,142,142,142,142,143,143,143,143,143,144,144,144,144,
  217. X145,145,145,145,146,146,146,146,146,147,147,147,147,148,148,148,
  218. X148,148,149,149,149,149,150,150,150,150,150,151,151,151,151,152,
  219. X152,152,152,152,153,153,153,153,153,154,154,154,154,155,155,155,
  220. X155,155,156,156,156,156,156,157,157,157,157,157,158,158,158,158,
  221. X159,159,159,159,159,160,160,160,160,160,161,161,161,161,161,162,
  222. X162,162,162,162,163,163,163,163,163,164,164,164,164,164,165,165,
  223. X165,165,165,166,166,166,166,166,167,167,167,167,167,168,168,168,
  224. X168,168,169,169,169,169,169,170,170,170,170,170,171,171,171,171,
  225. X171,171,172,172,172,172,172,173,173,173,173,173,174,174,174,174,
  226. X174,174,175,175,175,175,175,176,176,176,176,176,177,177,177,177,
  227. X177,177,178,178,178,178,178,179,179,179,179,179,179,180,180,180,
  228. X180,180,181,181,181,181,181,181,182,182,182,182,182,183,183,183,
  229. X183,183,183,184,184,184,184,184,184,185,185,185,185,185,186,186,
  230. X186,186,186,186,187,187,187,187,187,187,188,188,188,188,188,189,
  231. X189,189,189,189,189,190,190,190,190,190,190,191,191,191,191,191,
  232. X191,192,192,192,192,192,192,193,193,193,193,193,193,194,194,194,
  233. X194,194,194,195,195,195,195,195,195,196,196,196,196,196,196,197,
  234. X197,197,197,197,197,198,198,198,198,198,198,199,199,199,199,199,
  235. X199,200,200,200,200,200,200,201,201,201,201,201,201,201,202,202,
  236. X202,202,202,202,203,203,203,203,203,203,204,204,204,204,204,204,
  237. X205,205,205,205,205,205,205,206,206,206,206,206,206,207,207,207,
  238. X207,207,207,207,208,208,208,208,208,208,209,209,209,209,209,209,
  239. X210,210,210,210,210,210,210,211,211,211,211,211,211,211,212,212,
  240. X212,212,212,212,213,213,213,213,213,213,213,214,214,214,214,214,
  241. X214,215,215,215,215,215,215,215,216,216,216,216,216,216,216,217,
  242. X217,217,217,217,217,217,218,218,218,218,218,218,219,219,219,219,
  243. X219,219,219,220,220,220,220,220,220,220,221,221,221,221,221,221,
  244. X221,222,222,222,222,222,222,222,223,223,223,223,223,223,223,224,
  245. X224,224,224,224,224,224,225,225,225,225,225,225,225,226,226,226,
  246. X226,226,226,226,227,227,227,227,227,227,227,228,228,228,228,228,
  247. X228,228,229,229,229,229,229,229,229,230,230,230,230,230,230,230,
  248. X231,231,231,231,231,231,231,231,232,232,232,232,232,232,232,233,
  249. X233,233,233,233,233,233,234,234,234,234,234,234,234,234,235,235,
  250. X235,235,235,235,235,236,236,236,236,236,236,236,237,237,237,237,
  251. X237,237,237,237,238,238,238,238,238,238,238,239,239,239,239,239,
  252. X239,239,239,240,240,240,240,240,240,240,241,241,241,241,241,241,
  253. X241,241,242,242,242,242,242,242,242,243,243,243,243,243,243,243,
  254. X243,244,244,244,244,244,244,244,244,245,245,245,245,245,245,245,
  255. X246,246,246,246,246,246,246,246,247,247,247,247,247,247,247,247,
  256. X248,248,248,248,248,248,248,248,249,249,249,249,249,249,249,249,
  257. X250,250,250,250,250,250,250,250,251,251,251,251,251,251,251,252,
  258. X252,252,252,252,252,252,252,253,253,253,253,253,253,253,253,254,
  259. X254,254,254,254,254,254,254,255,255,255,255,255,255,255,255,255
  260. X};
  261. X
  262. X
  263. XsINT dithtab[]={
  264. X  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  265. X  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
  266. X  0,  0,  1,  2,  2,  3,  3,  4,  5,  5,  6,  7,  8,  8,  9, 10,
  267. X 11, 12, 13, 14, 15, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26,
  268. X 27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 42, 43, 44, 46, 47,
  269. X 49, 50, 51, 53, 54, 56, 57, 59, 60, 62, 64, 65, 67, 68, 70, 71,
  270. X 73, 75, 76, 78, 80, 81, 83, 85, 86, 88, 90, 91, 93, 95, 96, 98,
  271. X100,102,103,105,107,109,110,112,114,116,117,119,121,123,124,126,
  272. X128,130,131,133,135,137,138,140,142,144,145,147,149,151,152,154,
  273. X156,157,159,161,163,164,166,168,169,171,173,174,176,178,179,181,
  274. X183,184,186,187,189,190,192,194,195,197,198,200,201,203,204,206,
  275. X207,208,210,211,213,214,215,217,218,219,221,222,223,224,226,227,
  276. X228,229,230,231,233,234,235,236,237,238,239,240,241,242,243,243,
  277. X244,245,246,247,248,248,249,250,250,251,252,252,253,253,254,255,
  278. X255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  279. X255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  280. X};
  281. X
  282. X
  283. END_OF_FILE
  284.   if test 14364 -ne `wc -c <'hpcdtoppm.0.6/const.c'`; then
  285.     echo shar: \"'hpcdtoppm.0.6/const.c'\" unpacked with wrong size!
  286.   fi
  287.   # end of 'hpcdtoppm.0.6/const.c'
  288. fi
  289. if test -f 'hpcdtoppm.0.6/error.c' -a "${1}" != "-c" ; then 
  290.   echo shar: Will not clobber existing file \"'hpcdtoppm.0.6/error.c'\"
  291. else
  292.   echo shar: Extracting \"'hpcdtoppm.0.6/error.c'\" \(9116 characters\)
  293.   sed "s/^X//" >'hpcdtoppm.0.6/error.c' <<'END_OF_FILE'
  294. X/* hpcdtoppm (Hadmut's pcdtoppm) v0.6
  295. X*  Copyright (c) 1992, 1993, 1994 by Hadmut Danisch (danisch@ira.uka.de).
  296. X*  Permission to use and distribute this software and its
  297. X*  documentation for noncommercial use and without fee is hereby granted,
  298. X*  provided that the above copyright notice appear in all copies and that
  299. X*  both that copyright notice and this permission notice appear in
  300. X*  supporting documentation. It is not allowed to sell this software in 
  301. X*  any way. This software is not public domain.
  302. X*/
  303. X
  304. X#include "hpcdtoppm.h"
  305. X#define X(a,b) ((a == b) ? "->" : "  ")
  306. X
  307. Xvoid eerror(enum ERRORS e,char *file,int line)
  308. X {
  309. X  
  310. X  switch(e)
  311. X   {case E_NONE:   return;
  312. X    case E_IMP:    fprintf(stderr,"Sorry, Not yet implemented. [%s:%d]\n",file,line); break;
  313. X    case E_READ:   fprintf(stderr,"Error while reading.\n"); break;
  314. X    case E_WRITE:  fprintf(stderr,"Error while writing.\n"); break;
  315. X    case E_INTERN: fprintf(stderr,"Internal error. [%s:%d]\n",file,line); break;
  316. X    case E_ARG:    fprintf(stderr,"Error in Arguments !\n\n"); 
  317. X#ifdef SHORT_HELP
  318. X                   fprintf(stderr,"Usage: hpcdtoppm [options] pcd-file [ppm-file]\n");
  319. X                   fprintf(stderr,"       ( - means stdin )\n");
  320. X                   fprintf(stderr,"Opts:         [ -> = Default ] \n\n");
  321. X                   fprintf(stderr,"   [-x] [-s] [-d] [-i] [-m]\n");
  322. X                   fprintf(stderr,"   [-crop] [-pos] [-rep] [-vert] [-hori] [-S h v]\n");
  323. X                   fprintf(stderr,"   [-n] [-r] [-l] [-h] [-a]\n");
  324. X                   fprintf(stderr,"   [-ppm] [-pgm] [-ycc] [-ps] [-eps] [-psg] [-epsg] [-psd] [-epsd]\n");
  325. X                   fprintf(stderr,"   [-pl f] [-pb f] [-pw f] [-ph f] [-dpi f] [-fak f]\n");
  326. X                   fprintf(stderr,"   [-c0] [-c-] [-c+]\n");
  327. X                   fprintf(stderr,"   [-0] [-C d s] [-1] [-2] [-3] [-4] [-5] [-6]\n");
  328. X
  329. X#endif
  330. X#ifdef LONG_HELP
  331. X                   fprintf(stderr,"Usage: hpcdtoppm [options] pcd-file [ppm-file]\n");
  332. X                   fprintf(stderr,"       ( - means stdin )\n");
  333. X                   fprintf(stderr,"Opts:         [ -> = Default ] \n\n");
  334. X
  335. X                   fprintf(stderr,"     -x     Overskip mode (tries to improve color quality.)\n");
  336. X                   fprintf(stderr,"     -s     Apply simple sharpness-operator on the Luma-channel.\n");
  337. X                   fprintf(stderr,"     -d     Show differential picture only.\n");
  338. X                   fprintf(stderr,"     -i     Give some (buggy) informations from fileheader.\n");
  339. X                   fprintf(stderr,"     -m     Show the decoding steps to stderr.\n");
  340. X                   fprintf(stderr,"     -crop  Try to cut off the black frame.\n");
  341. X                   fprintf(stderr,"     -pos   Print file position of image to stderr.\n");
  342. X                   fprintf(stderr,"     -rep   Try to jump over defects in the Huffman Code.\n");
  343. X                   fprintf(stderr,"     -vert  Flip image vert.\n");
  344. X                   fprintf(stderr,"     -hori  Flip image horiz.\n");
  345. X                   fprintf(stderr,"     -S h v Decode subrectangle with hori. and vert. boundaries h,v,\n");
  346. X                   fprintf(stderr,"            h,v of the form a-b or a+b, a and b integer or float [0.0...1.0]\n");
  347. X                   fprintf(stderr,"\n");
  348. X
  349. X                   fprintf(stderr," %s  -n     Don't rotate.\n",                                 X(T_DEFAULT,T_NONE));
  350. X                   fprintf(stderr," %s  -r     Rotate clockwise for portraits.\n" ,              X(T_DEFAULT,T_RIGHT));
  351. X                   fprintf(stderr," %s  -l     Rotate counter-clockwise for portraits.\n",       X(T_DEFAULT,T_LEFT));
  352. X                   fprintf(stderr," %s  -h     Rotate twice, turn on head.\n",                   X(T_DEFAULT,T_HEAD));
  353. X                   fprintf(stderr," %s  -a     Try to find out orientation automatically.\n",    X(T_DEFAULT,T_AUTO));
  354. X                   fprintf(stderr,"\n");
  355. X
  356. X                   fprintf(stderr," %s  -ppm   output rgb  (ppm-format). \n",                    X(O_DEFAULT,O_PPM));
  357. X                   fprintf(stderr," %s  -pgm   output gray (pgm-format). \n",                    X(O_DEFAULT,O_PGM));
  358. X                   fprintf(stderr," %s  -ycc   output ycc  (ppm-format). \n",                    X(O_DEFAULT,O_YCC));
  359. X                   fprintf(stderr," %s  -ps    output postscript (rgb). \n",                     X(O_DEFAULT,O_PS));
  360. X                   fprintf(stderr," %s  -eps   output encapsulated postscript (rgb). \n",        X(O_DEFAULT,O_EPS));
  361. X                   fprintf(stderr," %s  -psg   output postscript (grayscale). \n",               X(O_DEFAULT,O_PSG));
  362. X                   fprintf(stderr," %s  -epsg  output encapsulated postscript (grayscale). \n",  X(O_DEFAULT,O_EPSG));
  363. X                   fprintf(stderr," %s  -psd   output postscript (b&w dithered). \n",            X(O_DEFAULT,O_PSG));
  364. X                   fprintf(stderr," %s  -epsd  output encapsulated postscript (b&w dithered).\n",X(O_DEFAULT,O_EPSG));
  365. X                   fprintf(stderr,"     -pl  f Postscript paper left position    [ Def:  %8.3f ]\n",DEF_PAPER_LEFT);
  366. X                   fprintf(stderr,"     -pb  f Postscript paper bottom position  [ Def:  %8.3f ]\n",DEF_PAPER_BOTTOM);
  367. X                   fprintf(stderr,"     -pw  f Postscript paper width            [ Def:  %8.3f ]\n",DEF_PAPER_WIDTH);
  368. X                   fprintf(stderr,"     -ph  f Postscript paper height           [ Def:  %8.3f ]\n",DEF_PAPER_HEIGHT);
  369. X                   fprintf(stderr,"     -dpi f Postscript resolution for dith.   [ Def:  %8.3f ]\n",DEF_DPI);
  370. X                   fprintf(stderr,"     -fak f Scaling factor for dith.          [ Def:     1.0   ]\n");
  371. X                   fprintf(stderr,"\n");
  372. X
  373. X                   fprintf(stderr," %s  -c0    don't correct (linear).\n", X(C_DEFAULT,C_LINEAR));
  374. X                   fprintf(stderr," %s  -c-    correct darker.\n",         X(C_DEFAULT,C_DARK));
  375. X                   fprintf(stderr," %s  -c+    correct brighter.\n",       X(C_DEFAULT,C_BRIGHT));
  376. X                   fprintf(stderr,"\n");
  377. X
  378. X                   fprintf(stderr," %s  -0     Extract thumbnails from Overview file.\n",        X(S_DEFAULT,S_Over));
  379. X                   fprintf(stderr," %s  -C d s Extract contact sheet from Overview file, d images width,\n",X(S_DEFAULT,S_Contact)); 
  380. X                   fprintf(stderr,"            with contact sheet orientation s ( one of n l r h).\n");
  381. X                   fprintf(stderr," %s  -1     Extract  128x192   from Image file.\n",           X(S_DEFAULT,S_Base16));
  382. X                   fprintf(stderr," %s  -2     Extract  256x384   from Image file.\n",           X(S_DEFAULT,S_Base4));
  383. X                   fprintf(stderr," %s  -3     Extract  512x768   from Image file.\n",           X(S_DEFAULT,S_Base));
  384. X                   fprintf(stderr," %s  -4     Extract 1024x1536  from Image file.\n",           X(S_DEFAULT,S_4Base));
  385. X                   fprintf(stderr," %s  -5     Extract 2048x3072  from Image file.\n",           X(S_DEFAULT,S_16Base));
  386. X                   fprintf(stderr," %s  -6     Extract 4096x6144  from Image file and 64Base-Directory.\n",           X(S_DEFAULT,S_64Base));
  387. X                   fprintf(stderr,"\n");
  388. X#endif
  389. X                   break;
  390. X    case E_OPT:    fprintf(stderr,"These Options are not allowed together.\n");break;
  391. X    case E_MEM:    fprintf(stderr,"Not enough memory !\n"); break;
  392. X    case E_HUFF:   fprintf(stderr,"Error in Huffman-Code-Table\n"); break;
  393. X    case E_SEQ:    fprintf(stderr,"Error in Huffman-Sequence, try option -rep\n"); break;
  394. X    case E_SEQ1:   fprintf(stderr,"Error1 in Huffman-Sequence, try option -rep\n"); break;
  395. X    case E_SEQ2:   fprintf(stderr,"Error2 in Huffman-Sequence, try option -rep\n"); break;
  396. X    case E_SEQ3:   fprintf(stderr,"Error3 in Huffman-Sequence, try option -rep\n"); break;
  397. X    case E_SEQ4:   fprintf(stderr,"Error4 in Huffman-Sequence, try option -rep\n"); break;
  398. X    case E_SEQ5:   fprintf(stderr,"Error5 in Huffman-Sequence, try option -rep\n"); break;
  399. X    case E_SEQ6:   fprintf(stderr,"Error6 in Huffman-Sequence, try option -rep\n"); break;
  400. X    case E_SEQ7:   fprintf(stderr,"Error7 in Huffman-Sequence, try option -rep\n"); break;
  401. X    case E_POS:    fprintf(stderr,"Error in file-position\n"); break;
  402. X    case E_OVSKIP: fprintf(stderr,"Can't read this resolution in overskip-mode\n"); break;
  403. X    case E_TAUTO:  fprintf(stderr,"Can't determine the orientation in overview mode\n");break;
  404. X    case E_SUBR:   fprintf(stderr,"Error in Subrectangle Parameters\n");break;
  405. X    case E_PRPAR:  fprintf(stderr,"Bad printing parameters\n");break;
  406. X    case E_CONFIG: fprintf(stderr,"Something is wrong with your configuration [see %s:%d]\n",file,line);
  407. X                   fprintf(stderr,"Edit the config.h and recompile...\n"); break;
  408. X    case E_TCANT:  fprintf(stderr,"Sorry, can't determine orientation for this file.\n");
  409. X                   fprintf(stderr,"Please give orientation parameters. \n");break;
  410. X    case E_FOPEN:  fprintf(stderr,"Can't open file\n"); break;
  411. X    default:       fprintf(stderr,"Unknown error %d ???  [%s:%d]\n",e,file,line);break;
  412. X   }
  413. X  close_all();
  414. X  exit(9);
  415. X }
  416. X
  417. X
  418. END_OF_FILE
  419.   if test 9116 -ne `wc -c <'hpcdtoppm.0.6/error.c'`; then
  420.     echo shar: \"'hpcdtoppm.0.6/error.c'\" unpacked with wrong size!
  421.   fi
  422.   # end of 'hpcdtoppm.0.6/error.c'
  423. fi
  424. if test -f 'hpcdtoppm.0.6/format.c' -a "${1}" != "-c" ; then 
  425.   echo shar: Will not clobber existing file \"'hpcdtoppm.0.6/format.c'\"
  426. else
  427.   echo shar: Extracting \"'hpcdtoppm.0.6/format.c'\" \(18842 characters\)
  428.   sed "s/^X//" >'hpcdtoppm.0.6/format.c' <<'END_OF_FILE'
  429. X/* hpcdtoppm (Hadmut's pcdtoppm) v0.6
  430. X*  Copyright (c) 1992, 1993, 1994 by Hadmut Danisch (danisch@ira.uka.de).
  431. X*  Permission to use and distribute this software and its
  432. X*  documentation for noncommercial use and without fee is hereby granted,
  433. X*  provided that the above copyright notice appear in all copies and that
  434. X*  both that copyright notice and this permission notice appear in
  435. X*  supporting documentation. It is not allowed to sell this software in 
  436. X*  any way. This software is not public domain.
  437. X*/
  438. X
  439. X#include "hpcdtoppm.h"
  440. X
  441. Xstruct pcdquad { uBYTE len,highseq,lowseq,key;};
  442. Xstruct pcdhqt  { uBYTE entries; struct pcdquad entry[256];};
  443. Xstruct myhqt   { uINT seq,mask,len; uBYTE key; };
  444. X
  445. Xstatic struct myhqt myhuff0[256],myhuff1[256],myhuff2[256];
  446. Xstatic sINT          myhufflen0=0,myhufflen1=0,myhufflen2=0;
  447. X
  448. X
  449. X
  450. X
  451. Xstatic void readhqtsub(struct pcdhqt *quelle,struct myhqt *ziel,sINT *anzahl)
  452. X#define E ((uINT) 1)
  453. X {sINT i;
  454. X  struct pcdquad *sub;
  455. X  struct myhqt *help;
  456. X  *anzahl=(quelle->entries)+1;
  457. X
  458. X  for(i=0;i<*anzahl;i++)
  459. X   {sub = (struct pcdquad *)(((uBYTE *)quelle)+1+i*sizeof(*sub));
  460. X    help=ziel+i;
  461. X
  462. X    help->seq = (((uINT) sub->highseq) << 24) |(((uINT) sub->lowseq) << 16);
  463. X    help->len = ((uINT) sub->len) +1;
  464. X    help->key = sub->key;
  465. X
  466. X#ifdef DEBUGhuff
  467. X   fprintf(stderr," Anz: %d A1: %08x  A2: %08x X:%02x %02x %02x %02x Seq:  %08x   Laenge:  %d %d\n",
  468. X          *anzahl,(uINT)sbuffer,(uINT)sub,
  469. X          ((uBYTE *)sub)[0],((uBYTE *)sub)[1],((uBYTE *)sub)[2],((uBYTE *)sub)[3],
  470. X          help->seq,help->len,sizeof(uBYTE));
  471. X#endif
  472. X
  473. X    if(help->len > 16) error(E_HUFF);
  474. X
  475. X    help->mask = ~ ( (E << (32-help->len)) -1); 
  476. X
  477. X  }
  478. X#ifdef DEBUG
  479. X  for(i=0;i<*anzahl;i++)
  480. X   {help=ziel+i;
  481. X    fprintf(stderr,"H: %3d  %08lx & %08lx (%2d) = %02x = %5d  %8x\n",
  482. X        i, help->seq,help->mask,help->len,help->key,(sBYTE)help->key,
  483. X        help->seq & (~help->mask));
  484. X   }
  485. X#endif
  486. X
  487. X#undef E
  488. X}
  489. X
  490. X
  491. X
  492. X
  493. X
  494. X
  495. X
  496. Xvoid readhqt(sINT n)
  497. X {
  498. X  uBYTE *ptr;
  499. X
  500. X  melde("readhqt\n");
  501. X  EREADBUF;
  502. X  ptr = sbuffer;
  503. X
  504. X  readhqtsub((struct pcdhqt *)ptr,myhuff0,&myhufflen0);
  505. X
  506. X  if(n<2) return;
  507. X  ptr+= 1 + 4* myhufflen0;
  508. X  readhqtsub((struct pcdhqt *)ptr,myhuff1,&myhufflen1);
  509. X
  510. X  if(n<3) return;
  511. X  ptr+= 1 + 4* myhufflen1;
  512. X  readhqtsub((struct pcdhqt *)ptr,myhuff2,&myhufflen2);
  513. X
  514. X}
  515. X
  516. Xvoid readhqtx(sINT n)
  517. X {
  518. X  uBYTE *ptr;
  519. X
  520. X  melde("readhqtx\n");
  521. X  ptr = sbuffer;
  522. X
  523. X  readhqtsub((struct pcdhqt *)ptr,myhuff0,&myhufflen0);
  524. X
  525. X  if(n<2) return;
  526. X  ptr+= 1 + 4* myhufflen0;
  527. X  readhqtsub((struct pcdhqt *)ptr,myhuff1,&myhufflen1);
  528. X
  529. X  if(n<3) return;
  530. X  ptr+= 1 + 4* myhufflen1;
  531. X  readhqtsub((struct pcdhqt *)ptr,myhuff2,&myhufflen2);
  532. X
  533. X}
  534. X
  535. X
  536. X
  537. X
  538. X
  539. X
  540. X
  541. X
  542. X
  543. X#ifdef FASTHUFF
  544. X
  545. Xstatic struct myhqt *HTAB0[0x10000],*HTAB1[0x10000],*HTAB2[0x10000];
  546. X
  547. Xstatic void inithuff(sINT hlen,struct myhqt *ptr,struct myhqt *TAB[])
  548. X {sINT i,n;
  549. X  sINT seq,len;
  550. X  struct myhqt *help;
  551. X
  552. X  for(i=0;i<0x10000;i++) TAB[i]=0;
  553. X
  554. X  for(n=0;n<hlen;n++)
  555. X   {help=ptr+n;
  556. X    seq=(help->seq)>>16;
  557. X    len=help->len;
  558. X
  559. X    for(i=0;i<(1<<(16-len));i++)
  560. X      TAB[seq | i] = help;
  561. X   }
  562. X }
  563. X#endif
  564. X
  565. X
  566. X
  567. X
  568. Xstatic char *pn[]={"Luma Channel","Chroma1 Channel","Chroma2 Channel"};
  569. X
  570. X
  571. Xvoid decode(sizeinfo *si,int fak,implane *f,implane *f1,implane *f2,sINT autosync)
  572. X {dim w,h,hoff,hlen,hende,voff,vlen,vende,anfang,ende;
  573. X  sINT htlen,sum,do_inform,part;
  574. X  uINT sreg,maxwidth;
  575. X  uINT inh,n,zeile,segment,ident;
  576. X  struct myhqt *hp;
  577. X
  578. X  uBYTE *nptr;
  579. X  uBYTE *lptr;
  580. X
  581. X#define nextbuf  {  nptr=sbuffer; if(READBUF<1) { if(!do_rep) error(E_READ); \
  582. X                                                  fprintf(stderr,"Read error\n"); \
  583. X                                                  return; } }
  584. X#define checkbuf { if (nptr >= sbuffer + sizeof(sbuffer)) nextbuf; }
  585. X
  586. X#ifdef U_TOO_LONG
  587. X#define shiftreg(n) sreg = (sreg<< n ) & 0xffffffff;
  588. X#else
  589. X#define shiftreg(n) sreg<<=n;
  590. X#endif
  591. X
  592. X#define shiftout(n){ shiftreg(n); inh-=n; \
  593. X                     while (inh<=24) \
  594. X                      {checkbuf; \
  595. X                       sreg |= ((uINT)(*(nptr++)))<<(24-inh);\
  596. X                       inh+=8;\
  597. X                      }\
  598. X                    }  
  599. X#define issync     ((sreg & 0xffffff00) == 0xfffffe00) 
  600. X#define brutesync  ((sreg & 0x00fff000) == 0x00fff000) 
  601. X#define seeksync { while (!brutesync) shiftout(8); while (!issync) shiftout(1);}
  602. X
  603. X#ifdef FASTHUFF
  604. X  struct myhqt **HTAB;
  605. X  HTAB=0;
  606. X  inithuff(myhufflen0,myhuff0,HTAB0);
  607. X  inithuff(myhufflen1,myhuff1,HTAB1);
  608. X  inithuff(myhufflen2,myhuff2,HTAB2);
  609. X#define SETHUFF0 HTAB=HTAB0;
  610. X#define SETHUFF1 HTAB=HTAB1;
  611. X#define SETHUFF2 HTAB=HTAB2;
  612. X#define FINDHUFF(x) {x=HTAB[sreg>>16];}
  613. X
  614. X#else
  615. X
  616. X  sINT i;
  617. X  struct myhqt *htptr;
  618. X  htptr=0;
  619. X#define SETHUFF0 { htlen=myhufflen0 ; htptr = myhuff0 ; }
  620. X#define SETHUFF1 { htlen=myhufflen1 ; htptr = myhuff1 ; }
  621. X#define SETHUFF2 { htlen=myhufflen2 ; htptr = myhuff2 ; }
  622. X#define FINDHUFF(x)  {for(i=0, x=htptr;(i<htlen) && ((sreg & x ->mask)!= x->seq); i++,x++); \
  623. X                      if(i>=htlen) x=0;}
  624. X#endif
  625. X
  626. X  melde("decode\n");
  627. X  anfang=ende=0;
  628. X
  629. X  if(fak >= 0)
  630. X   {w   =si->w     *fak;
  631. X    h   =si->h     *fak;
  632. X    hoff=si->rdhoff*fak;  if(hoff & 1 ) error(E_INTERN);  /* Must be all even */
  633. X    hlen=si->rdhlen*fak;  if(hlen & 1 ) error(E_INTERN); hende=hlen+hoff;
  634. X    voff=si->rdvoff*fak;  if(voff & 1 ) error(E_INTERN);
  635. X    vlen=si->rdvlen*fak;  if(vlen & 1 ) error(E_INTERN); vende=vlen+voff;
  636. X   }
  637. X  else
  638. X   {fak = -fak;
  639. X    w   =si->w     /fak;
  640. X    h   =si->h     /fak;
  641. X    hoff=si->rdhoff/fak;  if(hoff & 1 ) error(E_INTERN);  /* Must be all even */
  642. X    hlen=si->rdhlen/fak;  if(hlen & 1 ) error(E_INTERN); hende=hlen+hoff; 
  643. X    voff=si->rdvoff/fak;  if(voff & 1 ) error(E_INTERN);
  644. X    vlen=si->rdvlen/fak;  if(vlen & 1 ) error(E_INTERN); vende=vlen+voff;
  645. X   }
  646. X
  647. X
  648. X  if( f  && ((! f->im) || ( f->iheight != vlen  ) ||  (f->iwidth != hlen  ))) error(E_INTERN);
  649. X  if( f1 && ((!f1->im) || (f1->iheight != vlen/2) || (f1->iwidth != hlen/2))) error(E_INTERN);
  650. X  if( f2 && ((!f2->im) || (f2->iheight != vlen/2) || (f2->iwidth != hlen/2))) error(E_INTERN);
  651. X
  652. X  htlen=sreg=maxwidth=0;
  653. X  zeile=0;
  654. X  nextbuf;
  655. X  inh=32;
  656. X  lptr=0;
  657. X  part=do_inform=0;
  658. X  shiftout(16);
  659. X  shiftout(16);
  660. X
  661. X  if(autosync) seeksync;
  662. X  
  663. X  if(!issync)
  664. X   { if(!do_rep) error(E_SEQ6);
  665. X     else 
  666. X      {fprintf(stderr,"Image does not start with synchron mark, seeking...\n");
  667. X       seeksync;
  668. X       do_inform=1;
  669. X      }
  670. X   }
  671. X
  672. X  n=0;
  673. X
  674. X  for(;;)
  675. X   {
  676. X    if (issync)
  677. X     {shiftout(24);
  678. X      ident=sreg>>16;
  679. X      shiftout(16);
  680. X
  681. X      zeile=(ident>>1) & 0x1fff;
  682. X      segment=ident>>14;
  683. X      if(do_inform) {fprintf(stderr,"Synchron mark found Line %d\n",zeile);do_inform=0;}
  684. X#ifdef DEBUG
  685. X      fprintf(stderr,"Id %4x Zeile: %6d Seg %3d Pix bisher: %5d  Position: %8lx+%5lx=%8x\n",
  686. X          ident,zeile,segment,n,bufpos,nptr-sbuffer,bufpos+nptr-sbuffer);
  687. X#endif
  688. X
  689. X
  690. X      if(lptr && (n!=maxwidth)) 
  691. X       {if(!do_rep)error(E_SEQ1);
  692. X        else fprintf(stderr,"Line %d in %s : wrong length of last line (%d)\n",zeile,pn[part],n);
  693. X       }
  694. X      n=0;
  695. X
  696. X      if(zeile==h) {RPRINT; return; }
  697. X      if(zeile >h) 
  698. X       { if(!do_rep) error(E_SEQ2);
  699. X         else 
  700. X          {fprintf(stderr,"Wrong line number %d, ignoring line\n",zeile);
  701. X           seeksync;
  702. X           n=maxwidth;
  703. X           do_inform=1;
  704. X          }
  705. X       }    
  706. X      else switch(segment)
  707. X       {
  708. X        case 1: if(!do_rep) error(E_SEQ3);
  709. X                fprintf(stderr,"Abnormal line tag in %d, interpreting as Luma tag\n",zeile);
  710. X        case 0: maxwidth=w;
  711. X                if((!f) && autosync) {seeksync; n=maxwidth; break;}
  712. X                if(!f) error(E_SEQ7);
  713. X                if((zeile<voff) || (zeile >= vende)) {seeksync; n=maxwidth; break;}
  714. X                anfang=hoff; ende=hende;
  715. X                lptr=f->im + (zeile-voff)*f->mwidth;
  716. X                SETHUFF0;
  717. X                part=0;
  718. X                break;
  719. X
  720. X        case 2: maxwidth=w>>1;
  721. X                if(!f1) return;
  722. X                /*if((!f1) && autosync) {seeksync; break;}*/
  723. X                if((zeile<voff) || (zeile >= vende)) {seeksync; n=maxwidth; break;}
  724. X                anfang=hoff>>1; ende=hende>>1;
  725. X                lptr=f1->im + ((zeile-voff)>>1)*f1->mwidth;
  726. X                SETHUFF1;
  727. X                part=1;
  728. X                break;
  729. X        case 3: maxwidth=w>>1;
  730. X                if(!f2) return;
  731. X                /*if((!f2) && autosync) {seeksync; break;}*/
  732. X                if((zeile<voff) || (zeile >= vende)) {seeksync; n=maxwidth; break;}
  733. X                anfang=hoff>>1; ende=hende>>1;
  734. X                lptr=f2->im + ((zeile-voff)>>1)*f2->mwidth;
  735. X                SETHUFF2;
  736. X                part=2;
  737. X                break;
  738. X
  739. X        default:error(E_SEQ3);
  740. X    }
  741. X     }
  742. X    else
  743. X     {
  744. X      if(!lptr)      error(E_SEQ6);
  745. X
  746. X      if(n>maxwidth) 
  747. X        {
  748. X#ifdef DEBUG
  749. X         fprintf(stderr,"Register: %08lx Pos: %08lx\n",sreg,bufpos+nptr-sbuffer);
  750. X#endif
  751. X         if (!do_rep) error(E_SEQ4);
  752. X         else { fprintf(stderr,"Missing synchron mark in %s line %d\n",pn[part],zeile);
  753. X                seeksync;
  754. X                do_inform=1;
  755. X                n=maxwidth;
  756. X              }
  757. X       }
  758. X      else
  759. X       {FINDHUFF(hp);
  760. X        if(!hp)
  761. X         { if(!do_rep) error(E_SEQ5);
  762. X           fprintf(stderr,"Unable to decode, ignoring rest of line\n");
  763. X           seeksync;
  764. X           n=maxwidth;
  765. X           do_inform=1;
  766. X         }
  767. X        else
  768. X         {if((n>= anfang) && (n<ende))
  769. X           {sum=((sINT)(*lptr)) + ((sBYTE)hp->key);
  770. X            NORM(sum);
  771. X            *(lptr++) = sum;
  772. X           }
  773. X
  774. X          n++; 
  775. X          shiftout(hp->len);
  776. X         }
  777. X       }
  778. X     }
  779. X
  780. X   }
  781. X
  782. X
  783. X#undef nextbuf  
  784. X#undef checkbuf 
  785. X#undef shiftout
  786. X#undef issync
  787. X#undef seeksync
  788. X
  789. X }
  790. X
  791. X
  792. X
  793. X/* Decode the 64Base files */
  794. Xvoid decodex(FILE **fp, int tag , struct ic_descr *descr,sizeinfo *si,int fak,implane *f,sINT autosync)
  795. X {dim w,h,hoff,hlen,hende,voff,vlen,vende,anfang,ende;
  796. X  sINT htlen,sum,do_inform,part;
  797. X  uINT sreg,maxwidth;
  798. X  uINT inh,n,pos,zeile,segment,ident,sector,offset,length;
  799. X  struct myhqt *hp;
  800. X
  801. X  uBYTE *nptr;
  802. X  uBYTE *lptr;
  803. X  int bufcont;
  804. X
  805. X
  806. X
  807. X#define nextbuf  {  nptr=sbuffer; \
  808. X                    do\
  809. X                     {bufcont=fread(sbuffer,1,sizeof(sbuffer),*fp);\
  810. X                      if(bufcont<1)\
  811. X                       {if(feof(*fp)) fp++;\
  812. X                        else if(!do_rep) error(E_READ);\
  813. X                        else {fprintf(stderr,"Read error\n"); return;}\
  814. X                        if(!*fp)      return; }\
  815. X                     } while (bufcont<1); }
  816. X
  817. X
  818. X#define checkbuf { if (nptr >= sbuffer + bufcont) nextbuf; }
  819. X
  820. X#ifdef U_TOO_LONG
  821. X#define shiftreg(n) sreg = (sreg<< n ) & 0xffffffff;
  822. X#else
  823. X#define shiftreg(n) sreg<<=n;
  824. X#endif
  825. X
  826. X#define shiftout(n){ shiftreg(n); inh-=n; \
  827. X                     while (inh<=24) \
  828. X                      {checkbuf; \
  829. X                       sreg |= ((uINT)(*(nptr++)))<<(24-inh);\
  830. X                       inh+=8;\
  831. X                      }\
  832. X                    }  
  833. X#define issync     ((sreg & 0xffffff00) == 0xfffffe00) 
  834. X#define brutesync  ((sreg & 0x00fff000) == 0x00fff000) 
  835. X#define seeksync { while ((!brutesync) && (bufcont>0)) shiftout(8); \
  836. X                   while ((!issync) && (bufcont>0)) shiftout(1);}
  837. X
  838. X#ifdef FASTHUFF
  839. X  struct myhqt **HTAB;
  840. X  HTAB=0;
  841. X  switch(tag)
  842. X   {case 0:  inithuff(myhufflen0,myhuff0,HTAB0); break;
  843. X    case 1:  inithuff(myhufflen1,myhuff1,HTAB1); break;
  844. X    case 2:  inithuff(myhufflen2,myhuff2,HTAB2); break;
  845. X    default: error(E_INTERN);
  846. X   }
  847. X#define SETHUFF0 HTAB=HTAB0;
  848. X#define SETHUFF1 HTAB=HTAB1;
  849. X#define SETHUFF2 HTAB=HTAB2;
  850. X#define FINDHUFF(x) {x=HTAB[sreg>>16];}
  851. X
  852. X#else
  853. X
  854. X  sINT i;
  855. X  struct myhqt *htptr;
  856. X  htptr=0;
  857. X#define SETHUFF0 { htlen=myhufflen0 ; htptr = myhuff0 ; }
  858. X#define SETHUFF1 { htlen=myhufflen1 ; htptr = myhuff1 ; }
  859. X#define SETHUFF2 { htlen=myhufflen2 ; htptr = myhuff2 ; }
  860. X#define FINDHUFF(x)  {for(i=0, x=htptr;(i<htlen) && ((sreg & x ->mask)!= x->seq); i++,x++); \
  861. X                      if(i>=htlen) x=0;}
  862. X#endif
  863. X
  864. X
  865. X
  866. X
  867. X
  868. X
  869. X
  870. X  melde("decodex\n");
  871. X  anfang=ende=0;
  872. X  maxwidth=FILE32(descr->length);
  873. X  h       =FILE16(descr->height);
  874. X  offset  =FILE16(descr->offset);
  875. X  length  =FILE32(descr->length);
  876. X
  877. X
  878. X  if(fak >= 0)
  879. X   {w   =si->w     *fak;
  880. X    h   =si->h     *fak;
  881. X    hoff=si->rdhoff*fak;  if(hoff & 1 ) error(E_INTERN);  
  882. X    hlen=si->rdhlen*fak;  if(hlen & 1 ) error(E_INTERN); hende=hlen+hoff;
  883. X    voff=si->rdvoff*fak;  if(voff & 1 ) error(E_INTERN);
  884. X    vlen=si->rdvlen*fak;  if(vlen & 1 ) error(E_INTERN); vende=vlen+voff;
  885. X   }
  886. X  else
  887. X   {fak = -fak;
  888. X    w   =si->w     /fak;
  889. X    h   =si->h     /fak;
  890. X    hoff=si->rdhoff/fak;  if(hoff & 1 ) error(E_INTERN);  
  891. X    hlen=si->rdhlen/fak;  if(hlen & 1 ) error(E_INTERN); hende=hlen+hoff; 
  892. X    voff=si->rdvoff/fak;  if(voff & 1 ) error(E_INTERN);
  893. X    vlen=si->rdvlen/fak;  if(vlen & 1 ) error(E_INTERN); vende=vlen+voff;
  894. X   }
  895. X
  896. X
  897. X  if(!f) error(E_INTERN);
  898. X
  899. X#ifdef DEBUG
  900. X  fprintf(stderr,"fak %d\n",fak);
  901. X  fprintf(stderr,"f->im %x  \n",(unsigned)f->im);
  902. X  fprintf(stderr,"f->iheight  %d   %d\n",f->iheight,vlen);
  903. X  fprintf(stderr,"f->iwidth   %d   %d\n",f->iwidth,hlen);
  904. X  fprintf(stderr,"hoffset %d hende %d voffset %d vende %d\n",hoff,hende,voff,vende);
  905. X#endif
  906. X
  907. X  if((! f->im) || ( f->iheight != vlen  ) ||  (f->iwidth != hlen  )) error(E_INTERN);
  908. X
  909. X
  910. X  switch(tag)
  911. X   {case 0: SETHUFF0; break;
  912. X    case 1: SETHUFF1; break;
  913. X    case 2: SETHUFF2; break;
  914. X    default: error(E_INTERN);
  915. X   }
  916. X
  917. X
  918. X
  919. X  htlen=sreg=0;
  920. X  zeile=0;
  921. X  nextbuf;
  922. X  inh=32;
  923. X  lptr=0;
  924. X  part=do_inform=0;
  925. X  shiftout(16);
  926. X  shiftout(16);
  927. X
  928. X  if(autosync) seeksync;
  929. X  
  930. X  if(!issync)
  931. X   { if(!do_rep) error(E_SEQ6);
  932. X     else 
  933. X      {fprintf(stderr,"Image does not start with synchron mark, seeking...\n");
  934. X       seeksync;
  935. X       do_inform=1;
  936. X      }
  937. X   }
  938. X
  939. X
  940. X  n=pos=0;
  941. X
  942. X
  943. X  for(;;)
  944. X   {if (issync)
  945. X     {shiftout(24);
  946. X      ident=(sreg>>8) & 0xffffff;
  947. X      shiftout(24);
  948. X
  949. X      segment=(ident>>20) & 0xf;
  950. X      zeile  =(ident>>6 ) & 0x3fff;
  951. X      sector =(ident>>1 ) & 0x1f;
  952. X
  953. X      if(segment != tag) {fprintf(stderr,"Falsches Segment\n"); return;}
  954. X      if(do_inform)      {fprintf(stderr,"Synchron mark found Line %d\n",zeile);do_inform=0;}
  955. X
  956. X      if(zeile <  voff ) {n=maxwidth; seeksync; continue;}
  957. X      if(zeile >= vende) return;
  958. X   
  959. X
  960. X
  961. X#ifdef DEBUG
  962. X      fprintf(stderr,"Id %4x Zeile: %6d Seg %3d Sect %d Pix bisher: %5d \n",
  963. X          ident,zeile,segment,sector,n);
  964. X#endif
  965. X
  966. X
  967. X      if(lptr && (n!=maxwidth)) 
  968. X       {if(!do_rep)error(E_SEQ1);
  969. X        else fprintf(stderr,"Line %d in %s : wrong length of last line (%d)\n",zeile,pn[part],n);
  970. X       }
  971. X
  972. X
  973. X      n=0;
  974. X
  975. X      if(zeile==h) {RPRINT; return; }
  976. X      if(zeile >h) 
  977. X       { if(!do_rep) error(E_SEQ2);
  978. X         else 
  979. X          {fprintf(stderr,"Wrong line number %d, ignoring line\n",zeile);
  980. X           seeksync;
  981. X           n=maxwidth;
  982. X           do_inform=1;
  983. X          }
  984. X       }    
  985. X      else 
  986. X        {switch(tag)
  987. X          {case 0: anfang=hoff; ende=hende;
  988. X                   pos=offset + sector*length;
  989. X                   if((pos>=ende) || (pos+length < anfang)) { n=maxwidth; seeksync; continue;}
  990. X                   lptr=f->im + (zeile-voff)*f->mwidth + (pos>anfang?(pos-anfang):0)  ;
  991. X
  992. X                   break;
  993. X           case 1:
  994. X           case 2: anfang=hoff; ende=hende;
  995. X                   pos=(offset>>1) + sector*length;
  996. X                   if((pos>=ende) || (pos+length < anfang)) { n=maxwidth; seeksync; continue;}
  997. X                   lptr=f->im + (zeile-voff)*f->mwidth + (pos>anfang?(pos-anfang):0)  ;
  998. X
  999. X                   break;
  1000. X
  1001. X
  1002. X           default: error(E_INTERN);
  1003. X          }
  1004. X        }
  1005. X     }
  1006. X    else /* for if (issync) */
  1007. X     {if(!lptr)      error(E_SEQ6);
  1008. X
  1009. X      FINDHUFF(hp);
  1010. X      if(!hp)
  1011. X       { if(!do_rep) error(E_SEQ5);
  1012. X         fprintf(stderr,"Unable to decode %08x, ignoring rest of line\n",sreg);
  1013. X         seeksync;
  1014. X         n=maxwidth;
  1015. X         do_inform=1;
  1016. X       }
  1017. X      else
  1018. X       {if((pos >= anfang) && (pos<ende)) 
  1019. X           {sum=((sINT)(*lptr)) + ((sBYTE)hp->key);    
  1020. X            NORM(sum);   
  1021. X            *(lptr++) = sum;  
  1022. X           }
  1023. X        n++; pos++;
  1024. X        shiftout(hp->len);
  1025. X        if(n==maxwidth) 
  1026. X         { if ((zeile >= vende -1) && (pos >= hende)) return;
  1027. X           seeksync;
  1028. X         }
  1029. X       }
  1030. X     }
  1031. X   }
  1032. X
  1033. X
  1034. X
  1035. X
  1036. X#undef nextbuf  
  1037. X#undef checkbuf 
  1038. X#undef shiftout
  1039. X#undef issync
  1040. X#undef seeksync
  1041. X
  1042. X }
  1043. X
  1044. X
  1045. X
  1046. X
  1047. X
  1048. X
  1049. X
  1050. X
  1051. X
  1052. X
  1053. X
  1054. X
  1055. Xenum ERRORS readplain(sizeinfo *si,int fak,implane *l,implane *c1,implane *c2)
  1056. X {dim i,w,h,hoff,hlen,voff,vlen;
  1057. X  uBYTE *pl=0,*pc1=0,*pc2=0;
  1058. X
  1059. X  melde("readplain\n");
  1060. X
  1061. X#ifdef DEBUG
  1062. X  fprintf(stderr,"readplain %d %d %d %d %d %d %d\n",fak,si->w,si->h,si->rdhoff,si->rdhlen,si->rdvoff,si->rdvlen);
  1063. X#endif
  1064. X
  1065. X  if(fak >= 0)
  1066. X   {w   =si->w     *fak;
  1067. X    h   =si->h     *fak;
  1068. X    hoff=si->rdhoff*fak;  if(hoff & 1 ) error(E_INTERN);  /* Must be all even */
  1069. X    hlen=si->rdhlen*fak;  if(hlen & 1 ) error(E_INTERN);
  1070. X    voff=si->rdvoff*fak;  if(voff & 1 ) error(E_INTERN);
  1071. X    vlen=si->rdvlen*fak;  if(vlen & 1 ) error(E_INTERN);
  1072. X   }
  1073. X  else
  1074. X   {fak = -fak;
  1075. X    w   =si->w     /fak;
  1076. X    h   =si->h     /fak;
  1077. X    hoff=si->rdhoff/fak;  if(hoff & 1 ) error(E_INTERN);  /* Must be all even */
  1078. X    hlen=si->rdhlen/fak;  if(hlen & 1 ) error(E_INTERN);
  1079. X    voff=si->rdvoff/fak;  if(voff & 1 ) error(E_INTERN);
  1080. X    vlen=si->rdvlen/fak;  if(vlen & 1 ) error(E_INTERN);
  1081. X   }
  1082. X
  1083. X
  1084. X    
  1085. X  if(l)
  1086. X   { if ((l->mwidth<hlen) || (l->mheight<vlen) || (!l->im)) error(E_INTERN);
  1087. X     l->iwidth=hlen;
  1088. X     l->iheight=vlen;
  1089. X     pl=l->im;
  1090. X   }
  1091. X
  1092. X  if(c1)
  1093. X   { if ((c1->mwidth<(hlen>>1)) || (c1->mheight<(vlen>>1)) || (!c1->im)) error(E_INTERN);
  1094. X     c1->iwidth=hlen>>1;
  1095. X     c1->iheight=vlen>>1;
  1096. X     pc1=c1->im;
  1097. X   }
  1098. X
  1099. X  if(c2)
  1100. X   { if ((c2->mwidth<(hlen>>1)) || (c2->mheight<(vlen>>1)) || (!c2->im)) error(E_INTERN);
  1101. X     c2->iwidth=hlen>>1;
  1102. X     c2->iheight=vlen>>1;
  1103. X     pc2=c2->im;
  1104. X   }
  1105. X
  1106. X  if(voff) SKIPr(w*3*(voff>>1));
  1107. X
  1108. X  for(i=0;i<vlen>>1;i++)
  1109. X   {
  1110. X    if(pl)
  1111. X     { if(hlen==w)
  1112. X        {if(READ(pl,w)<1) return(E_READ);
  1113. X         pl+= l->mwidth;
  1114. X
  1115. X         if(READ(pl,w)<1) return(E_READ);
  1116. X         pl+= l->mwidth;
  1117. X        }
  1118. X       else
  1119. X        {SKIPr(hoff);
  1120. X
  1121. X         if(READ(pl,hlen)<1) return(E_READ);
  1122. X         pl+= l->mwidth;
  1123. X         
  1124. X         SKIPr(w-hlen);    /* w - hlen - hoff + hoff */ 
  1125. X
  1126. X         if(READ(pl,hlen)<1) return(E_READ);
  1127. X         pl+= l->mwidth;
  1128. X
  1129. X         SKIPr(w-hoff-hlen);         
  1130. X        }
  1131. X     }
  1132. X    else SKIPr(2*w);
  1133. X     
  1134. X    if(pc1)
  1135. X     {
  1136. X       if(hlen==w)
  1137. X        {
  1138. X         if(READ(pc1,w>>1)<1) return(E_READ);
  1139. X         pc1+= c1->mwidth;
  1140. X        }
  1141. X       else
  1142. X        {SKIPr((hoff)>>1);
  1143. X         if(READ(pc1,hlen>>1)<1) return(E_READ);
  1144. X         pc1+= c1->mwidth;
  1145. X         SKIPr((w-hoff-hlen)>>1);
  1146. X        }
  1147. X     }
  1148. X    else SKIPr(w>>1);
  1149. X     
  1150. X    if(pc2)
  1151. X     {
  1152. X       if(hlen==w)
  1153. X        {
  1154. X         if(READ(pc2,w>>1)<1) return(E_READ);
  1155. X         pc2+= c2->mwidth;
  1156. X        }
  1157. X       else
  1158. X        {SKIPr((hoff)>>1);
  1159. X         if(READ(pc2,hlen>>1)<1) return(E_READ);
  1160. X         pc2+= c2->mwidth;
  1161. X         SKIPr((w-hoff-hlen)>>1);
  1162. X        }
  1163. X     }
  1164. X    else SKIPr(w>>1);
  1165. X
  1166. X
  1167. X   }
  1168. X  RPRINT;
  1169. X  return E_NONE;
  1170. X }
  1171. END_OF_FILE
  1172.   if test 18842 -ne `wc -c <'hpcdtoppm.0.6/format.c'`; then
  1173.     echo shar: \"'hpcdtoppm.0.6/format.c'\" unpacked with wrong size!
  1174.   fi
  1175.   # end of 'hpcdtoppm.0.6/format.c'
  1176. fi
  1177. if test -f 'hpcdtoppm.0.6/postscr.c' -a "${1}" != "-c" ; then 
  1178.   echo shar: Will not clobber existing file \"'hpcdtoppm.0.6/postscr.c'\"
  1179. else
  1180.   echo shar: Extracting \"'hpcdtoppm.0.6/postscr.c'\" \(10053 characters\)
  1181.   sed "s/^X//" >'hpcdtoppm.0.6/postscr.c' <<'END_OF_FILE'
  1182. X/* hpcdtoppm (Hadmut's pcdtoppm) v0.6
  1183. X*  Copyright (c) 1992, 1993, 1994 by Hadmut Danisch (danisch@ira.uka.de).
  1184. X*  Permission to use and distribute this software and its
  1185. X*  documentation for noncommercial use and without fee is hereby granted,
  1186. X*  provided that the above copyright notice appear in all copies and that
  1187. X*  both that copyright notice and this permission notice appear in
  1188. X*  supporting documentation. It is not allowed to sell this software in 
  1189. X*  any way. This software is not public domain.
  1190. X*/
  1191. X
  1192. X#include "hpcdtoppm.h"
  1193. X#define DITH_NEUTR 128
  1194. X
  1195. XFLTPT PAPER_LEFT    =DEF_PAPER_LEFT;
  1196. XFLTPT PAPER_BOTTOM  =DEF_PAPER_BOTTOM;
  1197. XFLTPT PAPER_WIDTH   =DEF_PAPER_WIDTH;
  1198. XFLTPT PAPER_HEIGHT  =DEF_PAPER_HEIGHT;
  1199. XFLTPT PRINTER_XDPI  =DEF_DPI;
  1200. XFLTPT PRINTER_YDPI  =DEF_DPI;
  1201. XFLTPT PRINTER_FAK   =1.0;
  1202. XsINT  PSIZE_SET=0,DPI_SET=0,FAK_SET=0;
  1203. X
  1204. X
  1205. Xstatic char pshdr[]="%%Creator: hpcdtoppm v0.6\n";
  1206. Xstatic char hex[]="0123456789ABCDEF";
  1207. X#define HEX(x) {fputc(hex[((x)>>4)&0xf],fout);fputc(hex[(x)&0xf],fout);}
  1208. X
  1209. X
  1210. X/* find an appropriate scaling coefficient and generate a ps header
  1211. X * including a BoundingBox comment and a translate/scale sequence to 
  1212. X * fit the pixw*pixh image into a square on paper with PS user coordinates 
  1213. X * x,y,w,h 
  1214. X */
  1215. Xstatic void size_dependant(FILE *fout,sINT pixw,sINT pixh,
  1216. X                           FLTPT x,FLTPT y,FLTPT w,FLTPT h)
  1217. X{ FLTPT scale=(FLTPT)w/pixw,scaley=(FLTPT)h/pixh;
  1218. X
  1219. X  if(scale>scaley) scale=scaley;
  1220. X  x+=w/2.0;y+=h/2.0;
  1221. X  fprintf(fout,"%%%%BoundingBox: %.8g %.8g %.8g %.8g\n",
  1222. X     x-scale*pixw/2.0,y-scale*pixh/2.0,
  1223. X     x+scale*pixw/2.0,y+scale*pixh/2.0);
  1224. X  fprintf(fout,"%s",pshdr);
  1225. X  fputs("%%Pages: 1 1\n",fout);
  1226. X
  1227. X  if(pcdname) fprintf(fout,"%%%%Title: %s\n",pcdname);
  1228. X  fputs("%%EndComments\n\n",fout);
  1229. X
  1230. X  fprintf(fout,"%f %f translate\n",x-scale*pixw/2.0,y-scale*pixh/2.0);
  1231. X  fprintf(fout,"%f %f scale\n",scale*pixw,scale*pixh);
  1232. X}
  1233. X
  1234. X
  1235. X
  1236. Xstatic void end_postscript(FILE *fout)
  1237. X {
  1238. X  fputs("%%EOF\n\n",fout);
  1239. X }
  1240. X
  1241. X
  1242. X
  1243. X
  1244. Xstatic void sub_psgrey(FILE *fout,dim w,dim h, uBYTE *ptr,sdim zeil,sdim pix)
  1245. X{ dim x,y;
  1246. X  register uBYTE *p;
  1247. X  sINT c;
  1248. X
  1249. X  size_dependant(fout,w,h,PAPER_LEFT,PAPER_BOTTOM,PAPER_WIDTH,PAPER_HEIGHT);
  1250. X  fprintf(fout,"%d string\n",w);
  1251. X  fprintf(fout,"%d %d 8\n",w,h);    /* always 8 bit per channel */
  1252. X  fprintf(fout,"[%d 0 0 %d 0 %d]\n",w,-h,h);
  1253. X  fputs("{currentfile 1 index readhexstring pop} image\n",fout);
  1254. X  
  1255. X  c=0;
  1256. X  for(y=0;y<h;y++,ptr+=zeil)
  1257. X    for(p=ptr,x=0;x<w;x++,p+=pix)
  1258. X      {HEX(*p);
  1259. X       if(!(++c % 36)) fputs("\n",fout);
  1260. X      }
  1261. X
  1262. X  fputs("\npop\n\n",fout);
  1263. X}
  1264. X
  1265. X
  1266. X
  1267. X
  1268. X
  1269. X
  1270. X
  1271. Xvoid write_epsgrey(FILE *fout,dim w,dim h, uBYTE *ptr,sdim zeil,sdim pix)
  1272. X{ 
  1273. X  fputs("%!PS-Adobe-2.0 EPSF-2.0\n",fout);
  1274. X  sub_psgrey(fout,w,h, ptr,zeil,pix);
  1275. X  end_postscript(fout);
  1276. X}
  1277. X
  1278. Xvoid write_psgrey(FILE *fout,dim w,dim h, uBYTE *ptr,sdim zeil,sdim pix)
  1279. X{ 
  1280. X  fputs("%!PS-Adobe-2.0\n",fout);
  1281. X  sub_psgrey(fout,w,h, ptr,zeil,pix);
  1282. X  fputs("showpage\n",fout);
  1283. X  end_postscript(fout);
  1284. X}
  1285. X
  1286. X
  1287. X
  1288. X
  1289. X
  1290. X
  1291. X
  1292. X
  1293. X
  1294. X
  1295. X
  1296. Xstatic void sub_psrgb(FILE *fout,dim w,dim h, 
  1297. X                      uBYTE *rptr,sdim rzeil,sdim rpix,  
  1298. X              uBYTE *gptr,sdim gzeil,sdim gpix,  
  1299. X              uBYTE *bptr,sdim bzeil,sdim bpix) 
  1300. X{ dim x,y;
  1301. X  register uBYTE *pr,*pg,*pb;
  1302. X  sINT c;
  1303. X
  1304. X  size_dependant(fout,w,h,PAPER_LEFT,PAPER_BOTTOM,PAPER_WIDTH,PAPER_HEIGHT);
  1305. X  fprintf(fout,"%d string\n",w*3);
  1306. X  fprintf(fout,"%d %d 8\n",w,h);    /* always 8 bit per channel */
  1307. X  fprintf(fout,"[%d 0 0 %d 0 %d]\n",w,-h,h);
  1308. X  fputs("{currentfile 1 index readhexstring pop} false 3 colorimage\n",fout);
  1309. X  
  1310. X  c=0; 
  1311. X  for(y=0;y<h;y++,rptr+=rzeil,gptr+=gzeil,bptr+=bzeil)
  1312. X    for(pr=rptr,pg=gptr,pb=bptr,x=0;x<w;x++,pr+=rpix,pg+=gpix,pb+=bpix)
  1313. X      {HEX(*pr);HEX(*pg);HEX(*pb);
  1314. X       if(!(++c % 12)) fputs("\n",fout);
  1315. X      }
  1316. X
  1317. X  fputs("\npop\n\n",fout);
  1318. X}
  1319. X
  1320. X
  1321. Xvoid write_epsrgb(FILE *fout,dim w,dim h, 
  1322. X                      uBYTE *rptr,sdim rzeil,sdim rpix,  
  1323. X              uBYTE *gptr,sdim gzeil,sdim gpix,  
  1324. X              uBYTE *bptr,sdim bzeil,sdim bpix) 
  1325. X{ 
  1326. X  fputs("%!PS-Adobe-2.0 EPSF-2.0\n",fout);
  1327. X  sub_psrgb(fout,w,h, rptr,rzeil,rpix,gptr,gzeil,gpix,bptr,bzeil,bpix);
  1328. X  end_postscript(fout);
  1329. X}
  1330. X
  1331. X
  1332. X
  1333. Xvoid write_psrgb(FILE *fout,dim w,dim h, 
  1334. X                      uBYTE *rptr,sdim rzeil,sdim rpix,  
  1335. X              uBYTE *gptr,sdim gzeil,sdim gpix,  
  1336. X              uBYTE *bptr,sdim bzeil,sdim bpix) 
  1337. X{ 
  1338. X  fputs("%!PS-Adobe-2.0\n",fout);
  1339. X  sub_psrgb(fout,w,h, rptr,rzeil,rpix,gptr,gzeil,gpix,bptr,bzeil,bpix);
  1340. X  fputs("showpage\n",fout);
  1341. X  end_postscript(fout);
  1342. X}
  1343. X
  1344. X
  1345. X
  1346. X
  1347. X
  1348. X
  1349. X
  1350. X
  1351. X
  1352. Xtypedef sINT dt;
  1353. Xextern sINT dithtab[];
  1354. X#define DS 4
  1355. X#define DA (1<<(DS-1))
  1356. X#define DT 127
  1357. X
  1358. Xstatic void fakcopy(dim worig,dim horig, uBYTE *ptr1,sdim zeil,sdim pix,
  1359. X                    sdim wx,sINT zn,dt *dest)
  1360. X {FLTPT owf,ohf,wbruch,hbruch,m1,m2,ha,hb;
  1361. X  dim   owd,ohd,x;
  1362. X  uBYTE *ptr2;
  1363. X  sINT  md;
  1364. X  
  1365. X  ohf=zn/PRINTER_FAK;
  1366. X  ohd=(dim)ohf;
  1367. X  hbruch=ohf-(FLTPT)ohd;
  1368. X  if(ohd>=horig) error(E_INTERN);
  1369. X
  1370. X  ptr1+=zeil*ohd;
  1371. X  ptr2= (ohd < horig - 1) ? ptr1+zeil : ptr1;
  1372. X
  1373. X  dest[-1]=DITH_NEUTR;
  1374. X
  1375. X  for(x=0;x<wx;x++)
  1376. X   {owf=x/PRINTER_FAK;
  1377. X    owd=(dim)owf;
  1378. X    wbruch=owf-(FLTPT)owd;
  1379. X    if(owd>=worig) error(E_INTERN);
  1380. X
  1381. X    if(owd<worig-1)
  1382. X     {ha=(FLTPT)ptr1[owd*pix];
  1383. X      hb=(FLTPT)ptr1[(owd+1)*pix];
  1384. X      m1=ha+wbruch*(hb-ha);
  1385. X
  1386. X      ha=(FLTPT)ptr2[owd*pix];
  1387. X      hb=(FLTPT)ptr2[(owd+1)*pix];
  1388. X      m2=ha+wbruch*(hb-ha);
  1389. X     }
  1390. X    else
  1391. X     { m1=(FLTPT)ptr1[owd*pix];
  1392. X       m2=(FLTPT)ptr2[owd*pix];
  1393. X     }
  1394. X    md=(sINT)(m1+hbruch*(m2-m1));
  1395. X    if(md<0 || md>255) {fprintf(stderr,"md %d\n",md); error(E_INTERN);}
  1396. X    *(dest++)=dithtab[md];
  1397. X
  1398. X   }
  1399. X  
  1400. X  dest[0]=DITH_NEUTR;
  1401. X }
  1402. X
  1403. Xstatic void sub_psdith(FILE *fout,dim worig,dim horig, uBYTE *ptr,sdim zeil,sdim pix)
  1404. X{ register uBYTE *p;
  1405. X  sINT c,i,ii,j,reg,bit;
  1406. X  dt new,diff;
  1407. X  dt *dP1,*dP2,*akt,*nex,*help,*rrun;
  1408. X  dim ww=0,wl=0,wr=0,hh=0,ho=0,hu=0,wx=0,hx=0;
  1409. X  int ccase;
  1410. X  FLTPT PW=0.0,PH=0.0;
  1411. X
  1412. X#define copy(n,d) {if(FAK_SET) fakcopy(worig,horig,ptr,zeil,pix,wx,n,d); \
  1413. X                   else{p=ptr+((n)*zeil); rrun=d;\
  1414. X                        for(ii=0;ii<wx;ii++,p+=pix,rrun++) *rrun = dithtab[*p]; \
  1415. X                        d[-1]=d[wx]=DITH_NEUTR; }}
  1416. X
  1417. X
  1418. X#define pr(x) { reg= (reg<<1) | x; bit++;    \
  1419. X     if(bit==8) {HEX(reg);   \
  1420. X                 if(!(++c % 36)) fputs("\n",fout);\
  1421. X                 bit=reg=0;}}
  1422. X
  1423. X#define flush { while(bit) pr(1); }
  1424. X#define fill pr(1)
  1425. X
  1426. X
  1427. X
  1428. X#define MakeFit(wi,he) {  ww=(wi+7) & (~7);   wl=(ww-wi)/2;  wr=ww-wi-wl; \
  1429. X                          hh=(he+7) & (~7);   ho=(hh-he)/2;  hu=hh-he-ho; }
  1430. X
  1431. X
  1432. X  
  1433. X  ccase=( FAK_SET   ? 4 : 0 ) |
  1434. X        ( DPI_SET   ? 2 : 0 ) |
  1435. X        ( PSIZE_SET ? 1 : 0 ) ;
  1436. X
  1437. X  switch (ccase)
  1438. X   {case 0: /*  no option or -dpi option */
  1439. X    case 2: hx=horig;
  1440. X            wx=worig;
  1441. X            MakeFit(wx,hx);
  1442. X            PW=ww*72.0/PRINTER_XDPI;
  1443. X            PH=hh*72.0/PRINTER_YDPI;
  1444. X            break;
  1445. X
  1446. X    case 1: /* paper size set with -pw and/or -ph */
  1447. X            hx=horig;
  1448. X            wx=worig;
  1449. X            MakeFit(wx,hx);
  1450. X            PW=PAPER_WIDTH;
  1451. X            PH=PAPER_HEIGHT;
  1452. X            break;
  1453. X
  1454. X    case 6: /* -fak option (and perhaps -dpi) */
  1455. X    case 4: hx=PRINTER_FAK*horig+0.5;
  1456. X            wx=PRINTER_FAK*worig+0.5;
  1457. X            MakeFit(wx,hx);
  1458. X            PW=ww*72.0/PRINTER_XDPI;
  1459. X            PH=hh*72.0/PRINTER_YDPI; 
  1460. X            break;
  1461. X
  1462. X    case 5: /* -fak and papersize */
  1463. X            hx=PRINTER_FAK*horig+0.5;
  1464. X            wx=PRINTER_FAK*worig+0.5;
  1465. X            MakeFit(wx,hx);
  1466. X            PW=PAPER_WIDTH;
  1467. X            PH=PAPER_HEIGHT;
  1468. X            break;
  1469. X
  1470. X    case 3: /* papersize and dpi set, probably the most important case */
  1471. X            PW=PAPER_WIDTH;
  1472. X            PH=PAPER_HEIGHT;
  1473. X
  1474. X            FAK_SET=1;
  1475. X            {FLTPT fw,fh;
  1476. X             fw=PW/72.0*PRINTER_XDPI/worig;
  1477. X             fh=PH/72.0*PRINTER_YDPI/horig;
  1478. X             PRINTER_FAK=MIN(fw,fh);
  1479. X            }
  1480. X            hx=PRINTER_FAK*horig+0.5;
  1481. X            wx=PRINTER_FAK*worig+0.5;
  1482. X            MakeFit(wx,hx);
  1483. X            PW=ww*72.0/PRINTER_XDPI;
  1484. X            PH=hh*72.0/PRINTER_YDPI; 
  1485. X            break;
  1486. X
  1487. X
  1488. X    case 7: /* size, dpi and factor set, this case should have been
  1489. X               cought earlier... */
  1490. X    default: error(E_INTERN);
  1491. X   };
  1492. X
  1493. X  if(FAK_SET && (PRINTER_FAK<=0.0  || PRINTER_FAK >=1000.0)) error(E_PRPAR);
  1494. X  if(PW<=0.0 || PH<=0.0) error(E_PRPAR);
  1495. X
  1496. X  if(wx < 4 || hx < 4) error(E_PRPAR);
  1497. X
  1498. X
  1499. X  if (!(dP1=(dt *)malloc((wx+2)*sizeof(dt)))) error(E_MEM);
  1500. X  if (!(dP2=(dt *)malloc((wx+2)*sizeof(dt)))) error(E_MEM);
  1501. X
  1502. X
  1503. X
  1504. X  size_dependant(fout,ww,hh,PAPER_LEFT,PAPER_BOTTOM,PW,PH);
  1505. X
  1506. X  fprintf(fout,"%d string\n",ww);
  1507. X  fprintf(fout,"%d %d 1\n",ww,hh);    /* always 8 bit per channel */
  1508. X  fprintf(fout,"[%d 0 0 %d 0 %d]\n",ww,-hh,hh);
  1509. X  fputs("{currentfile 1 index readhexstring pop} image\n",fout);
  1510. X  
  1511. X  c=bit=reg=0;
  1512. X  akt=dP1+1;
  1513. X  nex=dP2+1;
  1514. X
  1515. X  for(i=0;i<ho;i++)
  1516. X    for(j=0;j<ww;j++)
  1517. X      fill;
  1518. X
  1519. X  copy(0,nex);
  1520. X  for(i=0;i<hx;i++)
  1521. X   {help=akt; akt=nex; nex=help;
  1522. X    if(i<hx-1) copy(i+1,nex);
  1523. X
  1524. X    if(i&1)
  1525. X      for(j=0;j<wx;j++)
  1526. X       { new=akt[j]>DT ? 255 : 0;
  1527. X         diff = akt[j]-new;
  1528. X         akt[j]=new;
  1529. X         akt[j+1]+=(diff*7 + DA)>>DS;
  1530. X         nex[j+1]+=(diff   + DA)>>DS;
  1531. X         nex[j  ]+=(diff*5 + DA)>>DS;
  1532. X         nex[j-1]+=(diff*3 + DA)>>DS;
  1533. X       }
  1534. X    else
  1535. X      for(j=wx-1;j>=0;j--)
  1536. X       { new=akt[j]>DT ? 255 : 0;
  1537. X         diff = akt[j]-new;
  1538. X         akt[j]=new;
  1539. X         akt[j-1]+=(diff*7 + DA)>>DS;
  1540. X         nex[j-1]+=(diff   + DA)>>DS;
  1541. X         nex[j  ]+=(diff*5 + DA)>>DS;
  1542. X         nex[j+1]+=(diff*3 + DA)>>DS;
  1543. X       }
  1544. X
  1545. X
  1546. X    for(j=0;j<wl;j++) fill;
  1547. X
  1548. X    for(j=0;j<wx;j++)
  1549. X     {if (akt[j]>DT) { pr(1); }
  1550. X      else           { pr(0); }
  1551. X     }
  1552. X
  1553. X    for(j=0;j<wr;j++) fill;
  1554. X
  1555. X    flush;
  1556. X   }
  1557. X
  1558. X  for(i=0;i<hu;i++)
  1559. X    for(j=0;j<ww;j++)
  1560. X      fill;
  1561. X  flush;
  1562. X
  1563. X  fputs("\npop\n\n",fout);
  1564. X  free(dP1);
  1565. X  free(dP2);
  1566. X}
  1567. X
  1568. X
  1569. Xvoid write_epsdith(FILE *fout,dim w,dim h, uBYTE *ptr,sdim zeil,sdim pix)
  1570. X{ 
  1571. X  fputs("%!PS-Adobe-2.0 EPSF-2.0\n",fout);
  1572. X  sub_psdith(fout,w,h, ptr,zeil,pix);
  1573. X  end_postscript(fout);
  1574. X}
  1575. X
  1576. Xvoid write_psdith(FILE *fout,dim w,dim h, uBYTE *ptr,sdim zeil,sdim pix)
  1577. X{ 
  1578. X  fputs("%!PS-Adobe-2.0\n",fout);
  1579. X  sub_psdith(fout,w,h, ptr,zeil,pix);
  1580. X  fputs("showpage\n",fout);
  1581. X  end_postscript(fout);
  1582. X}
  1583. X
  1584. X
  1585. X
  1586. END_OF_FILE
  1587.   if test 10053 -ne `wc -c <'hpcdtoppm.0.6/postscr.c'`; then
  1588.     echo shar: \"'hpcdtoppm.0.6/postscr.c'\" unpacked with wrong size!
  1589.   fi
  1590.   # end of 'hpcdtoppm.0.6/postscr.c'
  1591. fi
  1592. if test -f 'hpcdtoppm.0.6/ppm.c' -a "${1}" != "-c" ; then 
  1593.   echo shar: Will not clobber existing file \"'hpcdtoppm.0.6/ppm.c'\"
  1594. else
  1595.   echo shar: Extracting \"'hpcdtoppm.0.6/ppm.c'\" \(3053 characters\)
  1596.   sed "s/^X//" >'hpcdtoppm.0.6/ppm.c' <<'END_OF_FILE'
  1597. X/* hpcdtoppm (Hadmut's pcdtoppm) v0.6
  1598. X*  Copyright (c) 1992, 1993, 1994 by Hadmut Danisch (danisch@ira.uka.de).
  1599. X*  Permission to use and distribute this software and its
  1600. X*  documentation for noncommercial use and without fee is hereby granted,
  1601. X*  provided that the above copyright notice appear in all copies and that
  1602. X*  both that copyright notice and this permission notice appear in
  1603. X*  supporting documentation. It is not allowed to sell this software in 
  1604. X*  any way. This software is not public domain.
  1605. X*/
  1606. X
  1607. X#include "hpcdtoppm.h"
  1608. X
  1609. X
  1610. X
  1611. X
  1612. X#ifdef OWN_WRITE
  1613. X
  1614. X
  1615. Xstatic uBYTE BUF[own_BUsize];
  1616. X#define BUinit {BUcount=0;BUptr=BUF;}
  1617. X
  1618. X#define BUrgb_flush        {fwrite(BUF,BUcount*3,1,fout);BUinit; }
  1619. X#define BUrgb_write(r,g,b) {if(BUcount>=own_BUsize/3) BUrgb_flush; *BUptr++ = r ; *BUptr++ = g ; *BUptr++ = b ; BUcount++;}
  1620. X
  1621. X#define BUgreyflush        {fwrite(BUF,BUcount,1,fout);BUinit; }
  1622. X#define BUgreywrite(g)     {if(BUcount>=own_BUsize) BUgreyflush;  *BUptr++ = g ;  BUcount++;}
  1623. X
  1624. X
  1625. X
  1626. X
  1627. X
  1628. X
  1629. X
  1630. Xvoid write_ppm(FILE *fout,dim w,dim h, 
  1631. X               uBYTE *rptr,sdim rzeil,sdim rpix,  
  1632. X               uBYTE *gptr,sdim gzeil,sdim gpix,  
  1633. X               uBYTE *bptr,sdim bzeil,sdim bpix) 
  1634. X {register uBYTE *pr,*pg,*pb;
  1635. X  dim x,y;
  1636. X  static uBYTE *BUptr;
  1637. X  sINT   BUcount;
  1638. X
  1639. X  fprintf(fout,PPM_Header,w,h);
  1640. X  BUinit;
  1641. X  for(y=0;y<h;y++)
  1642. X   {
  1643. X     pr= rptr; rptr+=rzeil;
  1644. X     pg= gptr; gptr+=gzeil;
  1645. X     pb= bptr; bptr+=bzeil;
  1646. X     for(x=0;x<w;x++) 
  1647. X      {BUrgb_write(*pr,*pg,*pb);
  1648. X       pr+=rpix;  pg+=gpix;  pb+=bpix;
  1649. X      }
  1650. X   }
  1651. X  BUrgb_flush;
  1652. X
  1653. X }
  1654. X
  1655. X
  1656. X
  1657. X
  1658. X
  1659. X
  1660. Xvoid write_pgm(FILE *fout,dim w,dim h, uBYTE *ptr,sdim zeil,sdim pix) 
  1661. X {register uBYTE *p;
  1662. X  dim x,y;
  1663. X  static uBYTE *BUptr;
  1664. X  sINT   BUcount;
  1665. X
  1666. X
  1667. X  fprintf(fout,PGM_Header,w,h);
  1668. X  BUinit;
  1669. X  for(y=0;y<h;y++)
  1670. X   {
  1671. X    p= ptr; ptr+=zeil;
  1672. X
  1673. X    for(x=0;x<w;x++) 
  1674. X     {BUgreywrite(*p);
  1675. X      p+=pix;
  1676. X     }
  1677. X   }
  1678. X  BUgreyflush;
  1679. X }
  1680. X
  1681. X
  1682. X#else
  1683. X#include "ppm.h"
  1684. X
  1685. Xvoid write_ppm(FILE *fout,dim w,dim h, 
  1686. X               uBYTE *rptr,sdim rzeil,sdim rpix,  
  1687. X               uBYTE *gptr,sdim gzeil,sdim gpix,  
  1688. X               uBYTE *bptr,sdim bzeil,sdim bpix) 
  1689. X {register uBYTE *pr,*pg,*pb;
  1690. X  dim x,y;
  1691. X  pixel *pixrow;
  1692. X  register pixel* pP;
  1693. X
  1694. X
  1695. X  ppm_writeppminit(fout,w,h,(pixval) 255, 0);
  1696. X  pixrow = ppm_allocrow( w );
  1697. X  for(y=0;y<h;y++)
  1698. X   {
  1699. X    pr= rptr; rptr+=rzeil;
  1700. X    pg= gptr; gptr+=gzeil;
  1701. X    pb= bptr; bptr+=bzeil;
  1702. X
  1703. X    for(pP= pixrow,x=0;x<w;x++)
  1704. X     {
  1705. X      PPM_ASSIGN(*pP,((sINT)*pr),((sINT)*pg),((sINT)*pb));
  1706. X      pP++;  pr+=rpix;  pg+=gpix;  pb+=bpix;
  1707. X     }
  1708. X    ppm_writeppmrow( fout, pixrow, w, (pixval) 255, 0 );
  1709. X        
  1710. X   }
  1711. X  pm_close(fout);
  1712. X
  1713. X }
  1714. X
  1715. Xvoid write_pgm(FILE *fout,dim w,dim h, uBYTE *ptr,sdim zeil,sdim pix) 
  1716. X {register uBYTE *p;
  1717. X  dim x,y;
  1718. X  gray *grayrow;
  1719. X  register gray* pP;
  1720. X
  1721. X
  1722. X  pgm_writepgminit(fout,w,h,(pixval) 255, 0);
  1723. X  grayrow = pgm_allocrow( w );
  1724. X  for(y=0;y<h;y++)
  1725. X   {
  1726. X    p= ptr; ptr+=zeil;
  1727. X
  1728. X    for(pP= grayrow,x=0;x<w;x++)
  1729. X     {
  1730. X      *pP= ((gray)*p);
  1731. X      pP++;  p+=pix;
  1732. X     }
  1733. X    pgm_writepgmrow( fout, grayrow, w, (pixval) 255, 0 );
  1734. X        
  1735. X   }
  1736. X  pm_close(fout);
  1737. X
  1738. X }
  1739. X
  1740. X
  1741. X
  1742. X
  1743. X#endif
  1744. X
  1745. X
  1746. X
  1747. END_OF_FILE
  1748.   if test 3053 -ne `wc -c <'hpcdtoppm.0.6/ppm.c'`; then
  1749.     echo shar: \"'hpcdtoppm.0.6/ppm.c'\" unpacked with wrong size!
  1750.   fi
  1751.   # end of 'hpcdtoppm.0.6/ppm.c'
  1752. fi
  1753. echo shar: End of archive 2 \(of 3\).
  1754. cp /dev/null ark2isdone
  1755. MISSING=""
  1756. for I in 1 2 3 ; do
  1757.     if test ! -f ark${I}isdone ; then
  1758.     MISSING="${MISSING} ${I}"
  1759.     fi
  1760. done
  1761. if test "${MISSING}" = "" ; then
  1762.     echo You have unpacked all 3 archives.
  1763.     rm -f ark[1-9]isdone
  1764. else
  1765.     echo You still must unpack the following archives:
  1766.     echo "        " ${MISSING}
  1767. fi
  1768. exit 0
  1769. exit 0 # Just in case...
  1770.