home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume34 / imagemagick / part26 < prev    next >
Text File  |  1992-12-14  |  40KB  |  1,107 lines

  1. Newsgroups: comp.sources.misc
  2. From: cristy@eplrx7.es.duPont.com (John Cristy)
  3. Subject:  v34i054:  imagemagick - X11 image processing and display v2.2, Part26/26
  4. Message-ID: <1992Dec15.040009.23278@sparky.imd.sterling.com>
  5. X-Md4-Signature: 1b023be89139236e1f4c92935e0a9ee1
  6. Date: Tue, 15 Dec 1992 04:00:09 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: cristy@eplrx7.es.duPont.com (John Cristy)
  10. Posting-number: Volume 34, Issue 54
  11. Archive-name: imagemagick/part26
  12. Environment: UNIX, VMS, X11, SGI, DEC, Cray, Sun, Vax
  13.  
  14. #!/bin/sh
  15. # this is Part.26 (part 26 of a multipart archive)
  16. # do not concatenate these parts, unpack them in order with /bin/sh
  17. # file ImageMagick/utilities/convert.man continued
  18. #
  19. if test ! -r _shar_seq_.tmp; then
  20.     echo 'Please unpack part 1 first!'
  21.     exit 1
  22. fi
  23. (read Scheck
  24.  if test "$Scheck" != 26; then
  25.     echo Please unpack part "$Scheck" next!
  26.     exit 1
  27.  else
  28.     exit 0
  29.  fi
  30. ) < _shar_seq_.tmp || exit 1
  31. if test ! -f _shar_wnt_.tmp; then
  32.     echo 'x - still skipping ImageMagick/utilities/convert.man'
  33. else
  34. echo 'x - continuing file ImageMagick/utilities/convert.man'
  35. sed 's/^X//' << 'SHAR_EOF' >> 'ImageMagick/utilities/convert.man' &&
  36. Copyright 1992 E. I. du Pont de Nemours & Company
  37. .PP
  38. Permission to use, copy, modify, distribute, and sell this software and
  39. its documentation for any purpose is hereby granted without fee,
  40. provided that the above copyright notice appear in all copies and that
  41. both that copyright notice and this permission notice appear in
  42. supporting documentation, and that the name of E. I. du Pont de Nemours
  43. & Company not be used in advertising or publicity pertaining to
  44. distribution of the software without specific, written prior
  45. permission.  E. I. du Pont de Nemours & Company makes no representations
  46. about the suitability of this software for any purpose.  It is provided
  47. "as is" without express or implied warranty.
  48. .PP
  49. E. I. du Pont de Nemours & Company disclaims all warranties with regard
  50. to this software, including all implied warranties of merchantability
  51. and fitness, in no event shall E. I. du Pont de Nemours & Company be
  52. liable for any special, indirect or consequential damages or any
  53. damages whatsoever resulting from loss of use, data or profits, whether
  54. in an action of contract, negligence or other tortious action, arising
  55. out of or in connection with the use or performance of this software.
  56. .SH AUTHORS
  57. John Cristy, E.I. du Pont De Nemours & Company Incorporated
  58. SHAR_EOF
  59. echo 'File ImageMagick/utilities/convert.man is complete' &&
  60. chmod 0644 ImageMagick/utilities/convert.man ||
  61. echo 'restore of ImageMagick/utilities/convert.man failed'
  62. Wc_c="`wc -c < 'ImageMagick/utilities/convert.man'`"
  63. test 7988 -eq "$Wc_c" ||
  64.     echo 'ImageMagick/utilities/convert.man: original size 7988, current size' "$Wc_c"
  65. rm -f _shar_wnt_.tmp
  66. fi
  67. # ============= ImageMagick/utilities/MIFFtoSTEREO.c ==============
  68. if test -f 'ImageMagick/utilities/MIFFtoSTEREO.c' -a X"$1" != X"-c"; then
  69.     echo 'x - skipping ImageMagick/utilities/MIFFtoSTEREO.c (File already exists)'
  70.     rm -f _shar_wnt_.tmp
  71. else
  72. > _shar_wnt_.tmp
  73. echo 'x - extracting ImageMagick/utilities/MIFFtoSTEREO.c (Text)'
  74. sed 's/^X//' << 'SHAR_EOF' > 'ImageMagick/utilities/MIFFtoSTEREO.c' &&
  75. /*
  76. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  77. %                                                                             %
  78. %                                                                             %
  79. %                                                                             %
  80. %                 EEEEE  X   X  PPPP    OOO   RRRR    TTTTT                   %
  81. %                 E       X X   P   P  O   O  R   R     T                     %
  82. %                 EEE      X    PPPP   O   O  RRRR      T                     %
  83. %                 E       X X   P      O   O  R R       T                     %
  84. %                 EEEEE  X   X  P       OOO   R  R      T                     %
  85. %                                                                             %
  86. %                                                                             %
  87. %                 Export MIFF image to a stereo MIFF format.                  %
  88. %                                                                             %
  89. %                                                                             %
  90. %                                                                             %
  91. %                           Software Design                                   %
  92. %                             John Cristy                                     %
  93. %                              July 1992                                      %
  94. %                                                                             %
  95. %                                                                             %
  96. %  Copyright 1992 E. I. Dupont de Nemours & Company                           %
  97. %                                                                             %
  98. %  Permission to use, copy, modify, distribute, and sell this software and    %
  99. %  its documentation for any purpose is hereby granted without fee,           %
  100. %  provided that the above Copyright notice appear in all copies and that     %
  101. %  both that Copyright notice and this permission notice appear in            %
  102. %  supporting documentation, and that the name of E. I. Dupont de Nemours     %
  103. %  & Company not be used in advertising or publicity pertaining to            %
  104. %  distribution of the software without specific, written prior               %
  105. %  permission.  E. I. Dupont de Nemours & Company makes no representations    %
  106. %  about the suitability of this software for any purpose.  It is provided    %
  107. %  "as is" without express or implied warranty.                               %
  108. %                                                                             %
  109. %  E. I. Dupont de Nemours & Company disclaims all warranties with regard     %
  110. %  to this software, including all implied warranties of merchantability      %
  111. %  and fitness, in no event shall E. I. Dupont de Nemours & Company be        %
  112. %  liable for any special, indirect or consequential damages or any           %
  113. %  damages whatsoever resulting from loss of use, data or profits, whether    %
  114. %  in an action of contract, negligence or other tortious action, arising     %
  115. %  out of or in connection with the use or performance of this software.      %
  116. %                                                                             %
  117. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  118. %
  119. %  MIFFtoSTEREO combines two images and produces a single image that is the
  120. %  composite of a left and right image of a stereo pair.  The left image is
  121. %  converted to grayscale and written to the red channel of the stereo image.
  122. %  The right image is converted to grayscale and written to the blue channel
  123. %  of the stereo image.  View the composite image with red-blue glasses to
  124. %  create a stereo effect.
  125. %
  126. %  Command syntax:
  127. %
  128. %  export left_image.miff right_image.miff stereo_image.miff
  129. %
  130. %  Specify 'left_image.miff' or 'right_image.miff' as '-' for standard input.
  131. %  Specify 'stereo_image.miff' as '-' for standard output.
  132. %
  133. %
  134. */
  135. X
  136. #include "display.h"
  137. #include "image.h"
  138. #include "alien.h"
  139. #include "X.h"
  140. X
  141. /*
  142. X  Global declarations.
  143. */
  144. char
  145. X  *application_name;
  146. X
  147. /*
  148. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  149. %                                                                             %
  150. %                                                                             %
  151. %                                                                             %
  152. %   E r r o r                                                                 %
  153. %                                                                             %
  154. %                                                                             %
  155. %                                                                             %
  156. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  157. %
  158. %  Function Error displays an error message and then terminates the program.
  159. %
  160. %  The format of the Error routine is:
  161. %
  162. %      Error(message,qualifier)
  163. %
  164. %  A description of each parameter follows:
  165. %
  166. %    o message: Specifies the message to display before terminating the
  167. %      program.
  168. %
  169. %    o qualifier: Specifies any qualifier to the message.
  170. %
  171. %
  172. */
  173. void Error(message,qualifier)
  174. char
  175. X  *message,
  176. X  *qualifier;
  177. {
  178. X  (void) fprintf(stderr,"%s: %s",application_name,message);
  179. X  if (qualifier != (char *) NULL)
  180. X    (void) fprintf(stderr," (%s)",qualifier);
  181. X  (void) fprintf(stderr,".\n");
  182. X  exit(1);
  183. }
  184. X
  185. /*
  186. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  187. %                                                                             %
  188. %                                                                             %
  189. %                                                                             %
  190. %   U s a g e                                                                 %
  191. %                                                                             %
  192. %                                                                             %
  193. %                                                                             %
  194. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  195. %
  196. %  Procedure Usage displays the program usage;
  197. %
  198. %  The format of the Usage routine is:
  199. %
  200. %      Usage(message)
  201. %
  202. %  A description of each parameter follows:
  203. %
  204. %    message:  Specifies a specific message to display to the user.
  205. %
  206. */
  207. static void Usage(message)
  208. char
  209. X  *message;
  210. {
  211. X  if (message != (char *) NULL)
  212. X    (void) fprintf(stderr,"Can't continue, %s\n\n",message);
  213. X  (void) fprintf(stderr,
  214. X    "Usage: %s left_image.miff right_image.miff stereo_image.miff\n\n",
  215. X    application_name);
  216. X  (void) fprintf(stderr,"Specify 'left_image.miff' or 'right_image.miff' ");
  217. X  (void) fprintf(stderr,"as '-' for standard input.\n");
  218. X  (void) fprintf(stderr,
  219. X    "Specify 'stereo_image.miff' as '-' for standard output.\n");
  220. X  exit(1);
  221. }
  222. X
  223. /*
  224. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  225. %                                                                             %
  226. %                                                                             %
  227. %                                                                             %
  228. %    M a i n                                                                  %
  229. %                                                                             %
  230. %                                                                             %
  231. %                                                                             %
  232. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  233. %
  234. %
  235. */
  236. int main(argc,argv)
  237. int
  238. X  argc;
  239. X
  240. char
  241. X  *argv[];
  242. {
  243. X  Image
  244. X    *left_image,
  245. X    *right_image,
  246. X    *stereo_image;
  247. X
  248. X  int
  249. X    status;
  250. X
  251. X  time_t
  252. X    start_time;
  253. X
  254. X  application_name=argv[0];
  255. X  if (argc < 4)
  256. X    Usage((char *) NULL);
  257. X  start_time=time((time_t *) 0);
  258. X  left_image=ReadImage(argv[1]);
  259. X  if (left_image == (Image *) NULL)
  260. X    exit(1);
  261. X  right_image=ReadImage(argv[2]);
  262. X  if (right_image == (Image *) NULL)
  263. X    exit(1);
  264. X  stereo_image=StereoImage(left_image,right_image);
  265. X  (void) strcpy(stereo_image->filename,argv[3]);
  266. X  status=WriteAlienImage(stereo_image);
  267. X  /*
  268. X    Display detailed info about the image.
  269. X  */
  270. X  (void) fprintf(stderr,"[%d] %s %s=>%s %dx%d",stereo_image->scene,
  271. X    left_image->filename,right_image->filename,stereo_image->filename,
  272. X    stereo_image->columns,stereo_image->rows);
  273. X  if (stereo_image->class == DirectClass)
  274. X    (void) fprintf(stderr," DirectClass ");
  275. X  else
  276. X    (void) fprintf(stderr," PseudoClass ");
  277. X  (void) fprintf(stderr,"%dc %s %ds\n",stereo_image->colors,
  278. X    stereo_image->magick,time((time_t *) 0)-start_time+1);
  279. X  return(!status);
  280. }
  281. SHAR_EOF
  282. chmod 0644 ImageMagick/utilities/MIFFtoSTEREO.c ||
  283. echo 'restore of ImageMagick/utilities/MIFFtoSTEREO.c failed'
  284. Wc_c="`wc -c < 'ImageMagick/utilities/MIFFtoSTEREO.c'`"
  285. test 8742 -eq "$Wc_c" ||
  286.     echo 'ImageMagick/utilities/MIFFtoSTEREO.c: original size 8742, current size' "$Wc_c"
  287. rm -f _shar_wnt_.tmp
  288. fi
  289. # ============= ImageMagick/utilities/Make.com ==============
  290. if test -f 'ImageMagick/utilities/Make.com' -a X"$1" != X"-c"; then
  291.     echo 'x - skipping ImageMagick/utilities/Make.com (File already exists)'
  292.     rm -f _shar_wnt_.tmp
  293. else
  294. > _shar_wnt_.tmp
  295. echo 'x - extracting ImageMagick/utilities/Make.com (Text)'
  296. sed 's/^X//' << 'SHAR_EOF' > 'ImageMagick/utilities/Make.com' &&
  297. $!
  298. $! Make ImageMagick X image utilities for VMS.
  299. $!
  300. $
  301. $define/nolog X11 decw$include:
  302. $define/nolog sys sys$library:
  303. $link_options="/nodebug/notraceback"
  304. $define/nolog lnk$library sys$library:vaxcrtl
  305. $
  306. $if ((p1.nes."").and.(p1.nes."mogrify")) then goto SkipMogrify
  307. $write sys$output "Making Mogrify..."
  308. $call Make mogrify
  309. $
  310. $link'link_options' mogrify,[-]X,[-]image,[-]rotate,[-]quantize,[-]colors, -
  311. X  [-]signature,[-]compress,[-]alien,[-]PreRvIcccm,sys$input:/opt
  312. sys$share:decw$xlibshr.exe/share
  313. $
  314. $mogrify:==$'f$environment("default")'mogrify
  315. $write sys$output "..symbol MOGRIFY defined."
  316. $
  317. $SkipMogrify:
  318. $if ((p1.nes."").and.(p1.nes."convert")) then goto SkipConvert
  319. $write sys$output "Making Convert..."
  320. $call Make convert
  321. $
  322. $link'link_options' convert,[-]X,[-]image,[-]rotate,[-]quantize,[-]colors, -
  323. X  [-]signature,[-]compress,[-]alien,[-]PreRvIcccm,sys$input:/opt
  324. sys$share:decw$xlibshr.exe/share
  325. $
  326. $convert:==$'f$environment("default")'convert
  327. $write sys$output "..symbol CONVERT defined."
  328. $SkipConvert:
  329. $
  330. $if ((p1.nes."").and.(p1.nes."MIFFtoSTEREO")) then goto SkipMIFFtoSTEREO
  331. $write sys$output "Making MIFFtoSTEREO..."
  332. $call Make MIFFtoSTEREO
  333. $
  334. $link'link_options' MIFFtoSTEREO,[-]X,[-]image,[-]rotate,[-]quantize, -
  335. X  [-]colors,[-]signature,[-]compress,[-]alien,[-]PreRvIcccm,sys$input:/opt
  336. sys$share:decw$xlibshr.exe/share
  337. $
  338. $MIFFtoSTEREO:== $'f$environment("default")'MIFFtoSTEREO
  339. $write sys$output "..symbol MIFFTOSTEREO defined."
  340. $
  341. $SkipMIFFtoSTEREO:
  342. $type sys$input
  343. X
  344. Use this command to specify which X server to contact:
  345. X
  346. X  $set display/create/node=node_name::
  347. X
  348. This can be done automatically from your LOGIN.COM with the following 
  349. command:
  350. X
  351. X  $if (f$trnlmn("sys$rem_node").nes."") then -
  352. X  $  set display/create/node='f$trnlmn("sys$rem_node")'
  353. $exit
  354. $
  355. $Make: subroutine
  356. $!
  357. $! A very primitive "make" (or MMS) hack for DCL.
  358. $!
  359. $if (p1.eqs."") then exit
  360. $source_file=f$search(f$parse(p1,".c"))
  361. $if (source_file.nes."")
  362. $  then
  363. $    object_file=f$parse(source_file,,,"name")+".obj"
  364. $    object_file=f$search( object_file )
  365. $    if (object_file.nes."") 
  366. $      then
  367. $        object_time=f$file_attribute(object_file,"cdt")
  368. $        source_time=f$file_attribute(source_file,"cdt")
  369. $        if (f$cvtime(object_time).lts.f$cvtime(source_time)) then -
  370. $          object_file=""
  371. $      endif
  372. $    if (object_file.eqs."") 
  373. $      then
  374. $        write sys$output "Compiling ",p1
  375. $        cc/nodebug/optimize/include_directory=[-] 'source_file'
  376. $      endif
  377. $  endif
  378. $exit
  379. $endsubroutine
  380. SHAR_EOF
  381. chmod 0644 ImageMagick/utilities/Make.com ||
  382. echo 'restore of ImageMagick/utilities/Make.com failed'
  383. Wc_c="`wc -c < 'ImageMagick/utilities/Make.com'`"
  384. test 2499 -eq "$Wc_c" ||
  385.     echo 'ImageMagick/utilities/Make.com: original size 2499, current size' "$Wc_c"
  386. rm -f _shar_wnt_.tmp
  387. fi
  388. # ============= ImageMagick/signature.c ==============
  389. if test -f 'ImageMagick/signature.c' -a X"$1" != X"-c"; then
  390.     echo 'x - skipping ImageMagick/signature.c (File already exists)'
  391.     rm -f _shar_wnt_.tmp
  392. else
  393. > _shar_wnt_.tmp
  394. echo 'x - extracting ImageMagick/signature.c (Text)'
  395. sed 's/^X//' << 'SHAR_EOF' > 'ImageMagick/signature.c' &&
  396. /*
  397. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  398. %                                                                             %
  399. %                                                                             %
  400. %        SSSSS  IIIII   GGGG  N   N   AAA   TTTTT  U   U  RRRR   EEEEE        %
  401. %        SS       I    G      NN  N  A   A    T    U   U  R   R  E            %
  402. %         SSS     I    G  GG  N N N  AAAAA    T    U   U  RRRR   EEE          %
  403. %           SS    I    G   G  N  NN  A   A    T    U   U  R R    E            %
  404. %        SSSSS  IIIII   GGG   N   N  A   A    T     UUU   R  R   EEEEE        %
  405. %                                                                             %
  406. %                                                                             %
  407. %               Compute a Digital Signature for a Image Colormap              %
  408. %                                                                             %
  409. %                                                                             %
  410. %                                                                             %
  411. %                           Software Design                                   %
  412. %                             John Cristy                                     %
  413. %                            December 1992                                    %
  414. %                                                                             %
  415. %  Copyright 1992 E. I. du Pont de Nemours & Company                          %
  416. %                                                                             %
  417. %  Permission to use, copy, modify, distribute, and sell this software and    %
  418. %  its documentation for any purpose is hereby granted without fee,           %
  419. %  provided that the above Copyright notice appear in all copies and that     %
  420. %  both that Copyright notice and this permission notice appear in            %
  421. %  supporting documentation, and that the name of E. I. du Pont de Nemours    %
  422. %  & Company not be used in advertising or publicity pertaining to            %
  423. %  distribution of the software without specific, written prior               %
  424. %  permission.  E. I. du Pont de Nemours & Company makes no representations   %
  425. %  about the suitability of this software for any purpose.  It is provided    %
  426. %  "as is" without express or implied warranty.                               %
  427. %                                                                             %
  428. %  E. I. du Pont de Nemours & Company disclaims all warranties with regard    %
  429. %  to this software, including all implied warranties of merchantability      %
  430. %  and fitness, in no event shall E. I. du Pont de Nemours & Company be       %
  431. %  liable for any special, indirect or consequential damages or any           %
  432. %  damages whatsoever resulting from loss of use, data or profits, whether    %
  433. %  in an action of contract, negligence or other tortious action, arising     %
  434. %  out of or in connection with the use or performance of this software.      %
  435. %                                                                             %
  436. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  437. %
  438. %  Routine ColormapSignature computes a digital signature from the image
  439. %  colormap.  This signature uniquely identifies the colormap and is convenient
  440. %  for determining if the colormap of a sequence of images is identical when
  441. %  animating.  The digital signature is from RSA Data Security MD5 Digest
  442. %  Algorithm described in Internet draft [MD5], July 1992.
  443. %
  444. %
  445. */
  446. X
  447. /*
  448. X  Include declarations.
  449. */
  450. #include "display.h"
  451. #include "image.h"
  452. X
  453. /*
  454. X  Typedef declarations.
  455. */
  456. typedef struct _MessageDigest
  457. {
  458. X  unsigned long
  459. X    number_bits[2],
  460. X    accumulator[4];
  461. X
  462. X  unsigned char
  463. X    message[64],
  464. X    digest[16];
  465. } MessageDigest;
  466. X
  467. /*
  468. X  External declarations.
  469. */
  470. extern char
  471. X  *application_name;
  472. X
  473. /*
  474. X  Forward declarations.
  475. */
  476. static void
  477. X  TransformMessageDigest _Declare((MessageDigest *,unsigned long *)),
  478. X  UpdateMessageDigest _Declare((MessageDigest *,unsigned char *,unsigned long));
  479. X
  480. /*
  481. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  482. %                                                                             %
  483. %                                                                             %
  484. %                                                                             %
  485. %   C o m p u t e M e s s a g e D i g e s t                                   %
  486. %                                                                             %
  487. %                                                                             %
  488. %                                                                             %
  489. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  490. %
  491. %  Function ComputeMessageDigest computes the message digest.
  492. %
  493. %  The format of the ComputeMessageDigest routine is:
  494. %
  495. %      ComputeMessageDigest(message_digest,input_message,message_length)
  496. %
  497. %  A description of each parameter follows:
  498. %
  499. %    o message_digest: The address of a structure of type MessageDigest.
  500. %
  501. %
  502. */
  503. static void ComputeMessageDigest(message_digest)
  504. MessageDigest
  505. X  *message_digest;
  506. {
  507. X  int
  508. X    number_bytes;
  509. X
  510. X  register unsigned char
  511. X    *p;
  512. X
  513. X  register unsigned int
  514. X    i;
  515. X
  516. X  unsigned char
  517. X    padding[64];
  518. X
  519. X  unsigned long
  520. X    message[16],
  521. X    padding_length;
  522. X
  523. X  /*
  524. X    Save number of bits.
  525. X  */
  526. X  message[14]=message_digest->number_bits[0];
  527. X  message[15]=message_digest->number_bits[1];
  528. X  /*
  529. X    Compute number of bytes mod 64.
  530. X  */
  531. X  number_bytes=(int) ((message_digest->number_bits[0] >> 3) & 0x3F);
  532. X  /*
  533. X    Pad message to 56 mod 64.
  534. X  */
  535. X  padding_length=(number_bytes < 56) ? (56-number_bytes) : (120-number_bytes);
  536. X  padding[0]=0x80;
  537. X  for (i=1; i < padding_length; i++)
  538. X    padding[i]=(char) 0;
  539. X  UpdateMessageDigest(message_digest,padding,padding_length);
  540. X  /*
  541. X    Append length in bits and transform.
  542. X  */
  543. X  p=message_digest->message;
  544. X  for (i=0; i < 14; i++)
  545. X  {
  546. X    message[i]=(unsigned long) (*p++);
  547. X    message[i]|=((unsigned long) (*p++)) << 8;
  548. X    message[i]|=((unsigned long) (*p++)) << 16;
  549. X    message[i]|=((unsigned long) (*p++)) << 24;
  550. X  }
  551. X  TransformMessageDigest(message_digest,message);
  552. X  /*
  553. X    Store message in digest.
  554. X  */
  555. X  p=message_digest->digest;
  556. X  for (i=0; i < 4; i++)
  557. X  {
  558. X    *p++=(unsigned char) (message_digest->accumulator[i] & 0xff);
  559. X    *p++=(unsigned char) ((message_digest->accumulator[i] >> 8) & 0xff);
  560. X    *p++=(unsigned char) ((message_digest->accumulator[i] >> 16) & 0xff);
  561. X    *p++=(unsigned char) ((message_digest->accumulator[i] >> 24) & 0xff);
  562. X  }
  563. }
  564. X
  565. /*
  566. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  567. %                                                                             %
  568. %                                                                             %
  569. %                                                                             %
  570. %   I n i t i a l i z e M e s s a g e D i g e s t                             %
  571. %                                                                             %
  572. %                                                                             %
  573. %                                                                             %
  574. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  575. %
  576. %  Function InitializeMessageDigest initializes the message digest structure.
  577. %
  578. %  The format of the InitializeMessageDigest routine is:
  579. %
  580. %      InitializeMessageDigest(message_digest)
  581. %
  582. %  A description of each parameter follows:
  583. %
  584. %    o message_digest: The address of a structure of type MessageDigest.
  585. %
  586. %
  587. */
  588. static void InitializeMessageDigest(message_digest)
  589. MessageDigest
  590. X  *message_digest;
  591. {
  592. X  message_digest->number_bits[0]=(unsigned long) 0;
  593. X  message_digest->number_bits[1]=(unsigned long) 0;
  594. X  /*
  595. X    Load magic initialization constants.
  596. X  */
  597. X  message_digest->accumulator[0]=(unsigned long) 0x67452301;
  598. X  message_digest->accumulator[1]=(unsigned long) 0xefcdab89;
  599. X  message_digest->accumulator[2]=(unsigned long) 0x98badcfe;
  600. X  message_digest->accumulator[3]=(unsigned long) 0x10325476;
  601. }
  602. X
  603. /*
  604. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  605. %                                                                             %
  606. %                                                                             %
  607. %                                                                             %
  608. %   T r a n s f o r m M e s s a g e D i g e s t                               %
  609. %                                                                             %
  610. %                                                                             %
  611. %                                                                             %
  612. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  613. %
  614. %  Function TransformMessageDigest updates the message digest.
  615. %
  616. %  The format of the TransformMessageDigest routine is:
  617. %
  618. %      TransformMessageDigest(message_digest,message)
  619. %
  620. %  A description of each parameter follows:
  621. %
  622. %    o message_digest: The address of a structure of type MessageDigest.
  623. %
  624. %
  625. */
  626. static void TransformMessageDigest(message_digest,message)
  627. MessageDigest
  628. X  *message_digest;
  629. X
  630. unsigned long
  631. X  *message;
  632. {
  633. #define F(x,y,z)  (((x) & (y)) | ((~x) & (z)))
  634. #define G(x,y,z)  (((x) & (z)) | ((y) & (~z)))
  635. #define H(x,y,z)  ((x) ^ (y) ^ (z))
  636. #define I(x,y,z)  ((y) ^ ((x) | (~z)))
  637. #define RotateLeft(x,n)  (((x) << (n)) | (((x) & 0xffffffff) >> (32-(n))))
  638. X
  639. X  static unsigned long int
  640. X    additive_constant[64]=  /* 4294967296*abs(sin(i)), i in radians */
  641. X    {
  642. X      3614090360L, 3905402710L,  606105819L, 3250441966L,
  643. X      4118548399L, 1200080426L, 2821735955L, 4249261313L,
  644. X      1770035416L, 2336552879L, 4294925233L, 2304563134L,
  645. X      1804603682L, 4254626195L, 2792965006L, 1236535329L,
  646. X      4129170786L, 3225465664L,  643717713L, 3921069994L,
  647. X      3593408605L,   38016083L, 3634488961L, 3889429448L,
  648. X       568446438L, 3275163606L, 4107603335L, 1163531501L,
  649. X      2850285829L, 4243563512L, 1735328473L, 2368359562L,
  650. X      4294588738L, 2272392833L, 1839030562L, 4259657740L,
  651. X      2763975236L, 1272893353L, 4139469664L, 3200236656L,
  652. X       681279174L, 3936430074L, 3572445317L,   76029189L,
  653. X      3654602809L, 3873151461L,  530742520L, 3299628645L,
  654. X      4096336452L, 1126891415L, 2878612391L, 4237533241L,
  655. X      1700485571L, 2399980690L, 4293915773L, 2240044497L,
  656. X      1873313359L, 4264355552L, 2734768916L, 1309151649L,
  657. X      4149444226L, 3173756917L,  718787259L, 3951481745L
  658. X    };
  659. X
  660. X  register int
  661. X    i;
  662. X
  663. X  register unsigned int
  664. X    j;
  665. X
  666. X  register unsigned long int
  667. X    a,
  668. X    b,
  669. X    c,
  670. X    d,
  671. X    *p;
  672. X
  673. X  /*
  674. X    Save accumulator.
  675. X  */
  676. X  a=message_digest->accumulator[0];
  677. X  b=message_digest->accumulator[1];
  678. X  c=message_digest->accumulator[2];
  679. X  d=message_digest->accumulator[3];
  680. X  /*
  681. X    a=b+((a+F(b,c,d)+X[k]+t) <<< s).
  682. X  */
  683. X  p=additive_constant;
  684. X  j=0;
  685. X  for (i=0; i < 4; i++)
  686. X  {
  687. X    a+=F(b,c,d)+message[j & 0x0f]+(*p++);
  688. X    a=RotateLeft(a,7)+b;
  689. X    j++;
  690. X    d+=F(a,b,c)+message[j & 0x0f]+(*p++);
  691. X    d=RotateLeft(d,12)+a;
  692. X    j++;
  693. X    c+=F(d,a,b)+message[j & 0x0f]+(*p++);
  694. X    c=RotateLeft(c,17)+d;
  695. X    j++;
  696. X    b+=F(c,d,a)+message[j & 0x0f]+(*p++);
  697. X    b=RotateLeft(b,22)+c;
  698. X    j++;
  699. X  }
  700. X  /*
  701. X    a=b+((a+G(b,c,d)+X[k]+t) <<< s).
  702. X  */
  703. X  j=1;
  704. X  for (i=0; i < 4; i++)
  705. X  {
  706. X    a+=G(b,c,d)+message[j & 0x0f]+(*p++);
  707. X    a=RotateLeft(a,5)+b;
  708. X    j+=5;
  709. X    d+=G(a,b,c)+message[j & 0x0f]+(*p++);
  710. X    d=RotateLeft(d,9)+a;
  711. X    j+=5;
  712. X    c+=G(d,a,b)+message[j & 0x0f]+(*p++);
  713. X    c=RotateLeft(c,14)+d;
  714. X    j+=5;
  715. X    b+=G(c,d,a)+message[j & 0x0f]+(*p++);
  716. X    b=RotateLeft(b,20)+c;
  717. X    j+=5;
  718. X  }
  719. X  /*
  720. X    a=b+((a+H(b,c,d)+X[k]+t) <<< s).
  721. X  */
  722. X  j=5;
  723. X  for (i=0; i < 4; i++)
  724. X  {
  725. X    a+=H(b,c,d)+message[j & 0x0f]+(*p++);
  726. X    a=RotateLeft(a,4)+b;
  727. X    j+=3;
  728. X    d+=H(a,b,c)+message[j & 0x0f]+(*p++);
  729. X    d=RotateLeft(d,11)+a;
  730. X    j+=3;
  731. X    c+=H(d,a,b)+message[j & 0x0f]+(*p++);
  732. X    c=RotateLeft(c,16)+d;
  733. X    j+=3;
  734. X    b+=H(c,d,a)+message[j & 0x0f]+(*p++);
  735. X    b=RotateLeft(b,23)+c;
  736. X    j+=3;
  737. X  }
  738. X  /*
  739. X    a=b+((a+I(b,c,d)+X[k]+t) <<< s).
  740. X  */
  741. X  j=0;
  742. X  for (i=0; i < 4; i++)
  743. X  {
  744. X    a+=I(b,c,d)+message[j & 0x0f]+(*p++);
  745. X    a=RotateLeft(a,6)+b;
  746. X    j+=7;
  747. X    d+=I(a,b,c)+message[j & 0x0f]+(*p++);
  748. X    d=RotateLeft(d,10)+a;
  749. X    j+=7;
  750. X    c+=I(d,a,b)+message[j & 0x0f]+(*p++);
  751. X    c=RotateLeft(c,15)+d;
  752. X    j+=7;
  753. X    b+=I(c,d,a)+message[j & 0x0f]+(*p++);
  754. X    b=RotateLeft(b,21)+c;
  755. X    j+=7;
  756. X  }
  757. X  /*
  758. X    Increment accumulator.
  759. X  */
  760. X  message_digest->accumulator[0]+=a;
  761. X  message_digest->accumulator[1]+=b;
  762. X  message_digest->accumulator[2]+=c;
  763. X  message_digest->accumulator[3]+=d;
  764. }
  765. X
  766. /*
  767. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  768. %                                                                             %
  769. %                                                                             %
  770. %                                                                             %
  771. %   U p d a t e M e s s a g e D i g e s t                                     %
  772. %                                                                             %
  773. %                                                                             %
  774. %                                                                             %
  775. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  776. %
  777. %  Function UpdateMessageDigest updates the message digest.
  778. %
  779. %  The format of the UpdateMessageDigest routine is:
  780. %
  781. %      UpdateMessageDigest(message_digest,input_message,message_length)
  782. %
  783. %  A description of each parameter follows:
  784. %
  785. %    o message_digest: The address of a structure of type MessageDigest.
  786. %
  787. %
  788. */
  789. static void UpdateMessageDigest(message_digest,input_message,message_length)
  790. MessageDigest
  791. X  *message_digest;
  792. X
  793. unsigned char
  794. X  *input_message;
  795. X
  796. unsigned long
  797. X  message_length;
  798. {
  799. X  int
  800. X    number_bytes;
  801. X
  802. X  register unsigned char
  803. X    *p;
  804. X
  805. X  register unsigned int
  806. X    i;
  807. X
  808. X  unsigned long
  809. X    message[16];
  810. X
  811. X  /*
  812. X    Compute number of bytes mod 64.
  813. X  */
  814. X  number_bytes=(int) ((message_digest->number_bits[0] >> 3) & 0x3F);
  815. X  /*
  816. X    Update number of bits.
  817. X  */
  818. X  if (((message_digest->number_bits[0]+(message_length << 3)) & 0xffffffff) <
  819. X      message_digest->number_bits[0])
  820. X    message_digest->number_bits[1]++;
  821. X  message_digest->number_bits[0]+=message_length << 3;
  822. X  message_digest->number_bits[1]+=message_length >> 29;
  823. X  while (message_length--)
  824. X  {
  825. X    /*
  826. X      Add new character to message.
  827. X    */
  828. X    message_digest->message[number_bytes++]=(*input_message++);
  829. X    if (number_bytes == 0x40)
  830. X      {
  831. X        /*
  832. X          Transform message digest 64 bytes at a time.
  833. X        */
  834. X        p=message_digest->message;
  835. X        for (i=0; i < 16; i++)
  836. X        {
  837. X          message[i]=(unsigned long) (*p++);
  838. X          message[i]|=((unsigned long) (*p++)) << 8;
  839. X          message[i]|=((unsigned long) (*p++)) << 16;
  840. X          message[i]|=((unsigned long) (*p++)) << 24;
  841. X        }
  842. X        TransformMessageDigest(message_digest,message);
  843. X        number_bytes=0;
  844. X      }
  845. X  }
  846. }
  847. X
  848. /*
  849. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  850. %                                                                             %
  851. %                                                                             %
  852. %                                                                             %
  853. %   C o l o r m a p S i g n a t u r e                                         %
  854. %                                                                             %
  855. %                                                                             %
  856. %                                                                             %
  857. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  858. %
  859. %  Fucntion ColormapSignature computes a digital signature from the image
  860. %  colormap.  This signature uniquely identifies the colormap and is convenient
  861. %  for determining if the colormap of a sequence of images is identical when
  862. %  animating.  The digital signature is from RSA Data Security MD5 Digest
  863. %  Algorithm described in Internet draft [MD5], July 1992.
  864. %
  865. %  The format of the ColormapSignature routine is:
  866. %
  867. %      ColormapSignature(image)
  868. %
  869. %  A description of each parameter follows:
  870. %
  871. %    o image: The address of a structure of type Image.
  872. %
  873. %
  874. %
  875. */
  876. void ColormapSignature(image)
  877. Image
  878. X  *image;
  879. {
  880. X  char
  881. X    *hex;
  882. X
  883. X  MessageDigest
  884. X    message_digest;
  885. X
  886. X  register int
  887. X    i;
  888. X
  889. X  register unsigned char
  890. X    *p;
  891. X
  892. X  unsigned char
  893. X    *colormap;
  894. X
  895. X  if (image->class != PseudoClass)
  896. X    return;
  897. X  /*
  898. X    Allocate colormap.
  899. X  */
  900. X  colormap=(unsigned char *) malloc(3*image->colors*sizeof(unsigned char));
  901. X  if (colormap == (unsigned char *) NULL)
  902. X    {
  903. X      Warning("unable to compute colormap signature",
  904. X        "memory allocation failed");
  905. X      return;
  906. X    }
  907. X  p=colormap;
  908. X  for (i=0; i < image->colors; i++)
  909. X  {
  910. X    *p++=image->colormap[i].red;
  911. X    *p++=image->colormap[i].green;
  912. X    *p++=image->colormap[i].blue;
  913. X  }
  914. X  /*
  915. X    Compute program colormap signature.
  916. X  */
  917. X  InitializeMessageDigest(&message_digest);
  918. X  UpdateMessageDigest(&message_digest,colormap,
  919. X    (unsigned long) (image->colors*3));
  920. X  ComputeMessageDigest(&message_digest);
  921. X  (void) free((char *) colormap);
  922. X  /*
  923. X    Allocate memory for signature.
  924. X  */
  925. X  if (image->signature != (char *) NULL)
  926. X    (void) free((char *) image->signature);
  927. X  image->signature=(char *) malloc(33*sizeof(char));
  928. X  if (image->signature == (char *) NULL)
  929. X    {
  930. X      Warning("unable to compute colormap signature",
  931. X        "memory allocation failed");
  932. X      return;
  933. X    }
  934. X  /*
  935. X    Convert digital signature to a 32 character hex string.
  936. X  */
  937. X  p=(unsigned char *) image->signature;
  938. X  hex="0123456789abcdef";
  939. X  for (i=0; i < 16; i++)
  940. X  {
  941. X    *p++=hex[(message_digest.digest[i] >> 4) & 0xf];
  942. X    *p++=hex[message_digest.digest[i] & 0xf];
  943. X  }
  944. X  *p='\0';
  945. }
  946. SHAR_EOF
  947. chmod 0644 ImageMagick/signature.c ||
  948. echo 'restore of ImageMagick/signature.c failed'
  949. Wc_c="`wc -c < 'ImageMagick/signature.c'`"
  950. test 17946 -eq "$Wc_c" ||
  951.     echo 'ImageMagick/signature.c: original size 17946, current size' "$Wc_c"
  952. rm -f _shar_wnt_.tmp
  953. fi
  954. # ============= ImageMagick/ChangeLog ==============
  955. if test -f 'ImageMagick/ChangeLog' -a X"$1" != X"-c"; then
  956.     echo 'x - skipping ImageMagick/ChangeLog (File already exists)'
  957.     rm -f _shar_wnt_.tmp
  958. else
  959. > _shar_wnt_.tmp
  960. echo 'x - extracting ImageMagick/ChangeLog (Text)'
  961. sed 's/^X//' << 'SHAR_EOF' > 'ImageMagick/ChangeLog' &&
  962. ImageMagick 2.2
  963. X
  964. X  o When displaying a composite MIFF image created with `montage',
  965. X    button 3 no longer displays a magnify window.  Instead the
  966. X    tile at the mouse location is displayed.  When the tile image is
  967. X    exited, the composite image reappears.  This is effectively a
  968. X    visual image directory.
  969. X
  970. X  o `montage' has a new gravity option for placing an image within
  971. X    a tile of the composite, i.e. CenterGravity.
  972. X
  973. X  o `montage' has a new compose option for specifying which composite
  974. X     operation to use.
  975. X
  976. X  o `montage' creates composite images with the `montage' keyword.
  977. X
  978. X  o Updated MIFF manual page to reflect 'montage' image header
  979. X    keyword.
  980. X
  981. X  o Some compilers have read-only strings.   ImageMagick no longer
  982. X    writes on read-only strings.
  983. X
  984. X  o For colormapped X servers, the color reduction has been sped up by
  985. X    trading image quality for processing time.  See the README for
  986. X    details.
  987. X
  988. X  o Latin1Upper was declared wrong in X.h.
  989. X
  990. X  o Added unistd.h to display.h for strict ANSI compilers.
  991. X
  992. X  o Changed long to time_t for calls to C time routine.
  993. X
  994. X  o Multi-part GIF's can now be displayed or animated.
  995. X
  996. X  o Fixed segmentation fault when reading multi-part images with
  997. X    animate, montage, or mogrify.
  998. X
  999. X  o Multi-part MIFF images have the correct file name now.
  1000. X
  1001. X  o An expose event for the Magnify window may occur before it is
  1002. X    mapped.  This caused display to fail on Solburne and HP's.
  1003. X
  1004. X  o Using `-colorspace gray' with 'convert' correctly produces
  1005. X    grayscale images.
  1006. X
  1007. X  o Images are sorted by intensity for shared colormapped visuals.
  1008. X    Some intensity intervals are made "more popular".  This gives better
  1009. X    image results when sharing colors with other applications.
  1010. X
  1011. X  o All utilities correctly read multi-part TIFF images.
  1012. X
  1013. X  o Image pixmap was not being updated correctly when pan icon appears
  1014. X    (thanks to dws@ssec.wisc.edu).
  1015. X
  1016. X  o Fixed ANSI warning on image composite code.
  1017. X
  1018. X  o Panning uses a pixmap for faster panning speed.
  1019. X
  1020. X  o Rotate.c now uses a table to force range limits.
  1021. X
  1022. X  o Fixed strcasecmp to work under VMS.
  1023. X
  1024. X  o range table in quantize.c is allocated from the heap instead of
  1025. X    the stack.
  1026. X
  1027. X  o adjusted the sensitivity for automatic dithering.  Some JPEG images
  1028. X    were not being dithered.
  1029. SHAR_EOF
  1030. chmod 0644 ImageMagick/ChangeLog ||
  1031. echo 'restore of ImageMagick/ChangeLog failed'
  1032. Wc_c="`wc -c < 'ImageMagick/ChangeLog'`"
  1033. test 2264 -eq "$Wc_c" ||
  1034.     echo 'ImageMagick/ChangeLog: original size 2264, current size' "$Wc_c"
  1035. rm -f _shar_wnt_.tmp
  1036. fi
  1037. # ============= ImageMagick/Magick.tmpl ==============
  1038. if test -f 'ImageMagick/Magick.tmpl' -a X"$1" != X"-c"; then
  1039.     echo 'x - skipping ImageMagick/Magick.tmpl (File already exists)'
  1040.     rm -f _shar_wnt_.tmp
  1041. else
  1042. > _shar_wnt_.tmp
  1043. echo 'x - extracting ImageMagick/Magick.tmpl (Text)'
  1044. sed 's/^X//' << 'SHAR_EOF' > 'ImageMagick/Magick.tmpl' &&
  1045. /*
  1046. X  ImageMagick Imakefile info.  This contains any special redefinitions.
  1047. X
  1048. X  Copyright 1992 E. I. du Pont de Nemours & Company
  1049. X
  1050. X  Permission to use, copy, modify, distribute, and sell this software and
  1051. X  its documentation for any purpose is hereby granted without fee,
  1052. X  provided that the above Copyright notice appear in all copies and that
  1053. X  both that Copyright notice and this permission notice appear in
  1054. X  supporting documentation, and that the name of E. I. du Pont de Nemours
  1055. X  & Company not be used in advertising or publicity pertaining to
  1056. X  distribution of the software without specific, written prior
  1057. X  permission.  E. I. du Pont de Nemours & Company makes no representations
  1058. X  about the suitability of this software for any purpose.  It is provided
  1059. X  "as is" without express or implied warranty.
  1060. X
  1061. X  E. I. du Pont de Nemours & Company disclaims all warranties with regard
  1062. X  to this software, including all implied warranties of merchantability
  1063. X  and fitness, in no event shall E. I. du Pont de Nemours & Company be
  1064. X  liable for any special, indirect or consequential damages or any
  1065. X  damages whatsoever resulting from loss of use, data or profits, whether
  1066. X  in an action of contract, negligence or other tortious action, arising
  1067. X  out of or in connection with the use or performance of this software.
  1068. */
  1069. X
  1070. /*
  1071. X  Uncomment the following lines if you have the JPEG or TIFF libraries.
  1072. X  See README for more details.
  1073. X
  1074. JPEG= -DAlienJPEG
  1075. JPEG_INCLUDES= -Ijpeg -I../jpeg
  1076. JPEG_LIBRARIES= -Ljpeg -L../jpeg -ljpeg
  1077. TIFF= -DAlienTIFF
  1078. TIFF_INCLUDES= -Itiff/libtiff -I../tiff/libtiff
  1079. TIFF_LIBRARIES= -Ltiff/libtiff -L../tiff/libtiff -ltiff
  1080. */
  1081. X
  1082. /*
  1083. X  Might need one of these for xtp to link correctly.
  1084. X
  1085. EXTRA_LOAD_FLAGS= -lnsl
  1086. EXTRA_LOAD_FLAGS= -linet -lnsl_s -lrpc -lcposix
  1087. */
  1088. X
  1089. DEFINES= $(JPEG) $(JPEG_INCLUDES) $(TIFF) $(TIFF_INCLUDES)
  1090. LOCALDIR=/usr/local/bin
  1091. SYS_LIBRARIES= $(XLIB) $(JPEG_LIBRARIES) $(TIFF_LIBRARIES) -lm
  1092. X
  1093. #define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)' 'CC=$(CC)' \
  1094. X  'CCOPTIONS=$(CCOPTIONS)'
  1095. SHAR_EOF
  1096. chmod 0644 ImageMagick/Magick.tmpl ||
  1097. echo 'restore of ImageMagick/Magick.tmpl failed'
  1098. Wc_c="`wc -c < 'ImageMagick/Magick.tmpl'`"
  1099. test 2012 -eq "$Wc_c" ||
  1100.     echo 'ImageMagick/Magick.tmpl: original size 2012, current size' "$Wc_c"
  1101. rm -f _shar_wnt_.tmp
  1102. fi
  1103. rm -f _shar_seq_.tmp
  1104. echo You have unpacked the last part
  1105. exit 0
  1106. exit 0 # Just in case...
  1107.