home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
misc
/
volume38
/
lic
/
part06
< prev
next >
Wrap
Text File
|
1993-08-11
|
66KB
|
1,581 lines
Newsgroups: comp.sources.misc
From: casey@gauss.llnl.gov (Casey Leedom)
Subject: v38i109: lic - LLNL Line Integral Convolution, v1.2, Part06/10
Message-ID: <1993Aug12.013908.14233@sparky.sterling.com>
X-Md4-Signature: 64cf321283b575bf139fd82cad4b7ae6
Sender: kent@sparky.sterling.com (Kent Landfield)
Organization: Sterling Software
Date: Thu, 12 Aug 1993 01:39:08 GMT
Approved: kent@sparky.sterling.com
Submitted-by: casey@gauss.llnl.gov (Casey Leedom)
Posting-number: Volume 38, Issue 109
Archive-name: lic/part06
Environment: UNIX
#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".
# Contents: lic.1.2/doc/siggraph93/p.frame.UU.C
# lic.1.2/liblic/Filters.c lic.1.2/lic/lic.c
# Wrapped by kent@sparky on Wed Aug 11 19:38:05 1993
PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:
echo ' "shar: End of archive 6 (of 10)."'
if test -f 'lic.1.2/doc/siggraph93/p.frame.UU.C' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lic.1.2/doc/siggraph93/p.frame.UU.C'\"
else
echo shar: Extracting \"'lic.1.2/doc/siggraph93/p.frame.UU.C'\" \(32376 characters\)
sed "s/^X//" >'lic.1.2/doc/siggraph93/p.frame.UU.C' <<'END_OF_FILE'
XM $+', !554 555 "JJH * ')#Z@ W' CZ'%1H92!U<'!E<B!L969T
XM(&AA;F0@<75A<G1E<B!O9B!T:&4@8VER8W5L87(@=F5C=&]R(!P+<@ .55(
XM!554 *JJ@ <D/J [9 $!F:65L9"!I<R!C;VYV;VQV960@=7-I;F<@3$E#
XM(&]V97(@0G5T=&5R=V]R=&@@;&]W+7!A<W,@9FEL=&5R960@ %U50 55
XM5 "JJH ')#ZA=+ !!=VAI=&4@;F]I<V4@=VET:"!C=71O9F8@9G)E<75E
XM;F-I97,@;V8@,3(X+" X-BP@-C0L(&%N9" S,B H;&5F="!H "!53@ %550
XM JJJ $ !R0^H#N( &G1O(')I9VAT+"!T;W @=&\@8F]T=&]M*2X+ #8 V
XM [_G; (N)-P[$#ML.F0[+#I< . '!O .U0[R
XM '); !YO4 !EFCP 9_.N K+RP[%#N(.P [1#K8 0 ');
XM !YO4 !KO_@ %A<@"597%U86Q;8VAA<EML72QL97%;:6YD97AE<ULP
XM+#$L=&EM97-;8VAA<EMI72QS=')I;F=;(A%S=6-H$71H8701(ETL8VAA<EMS
XM75TL8VAA<EMI75TL;&5S<W1H86Y;8VAA<EM,72QI;F1E>&5S6S L,2QC:&%R
XM6W-=+'!L=7-;8VAA<EMI72QN=6U;,2PB,2)=75U=75TL #8 V [_G;
XM 0_S@0[N$.E@ #I0 . &%R .U@[N
XM &UA #8#$@%9"H( [_G; #&M3@['#MH [/#IH . &%R /_^
XM'_\.R0[3 .FPBS U0 &%R !W5P !-0XL J?'Q !4X' [(#MD.T@ #K8
XM / "QC#K\.P ? %8 !+"Z )YXS@ 5.$P.R0[B .V@['
XM$ !N*@!N/+T $<67 (!9ET PF5Q=6%L6W1I;65S6V-H87);:UTL:61;
XM8VAA<EMW75U=+&-R;W-S6V]V97);<&QU<UMN=6U;,2PB,2)=+&-O<UMI9%MT
XM:6UE<ULH*FXJ*6-H87);8UTL8VAA<EMW75U=75TL;G5M6S(L(C(B75TL;W9E
XM<EMP;'5S6VYU;5LQ+"(Q(ETL8V]S6VED6W!L=7-;=&EM97-;8VAA<EMD72QC
XM:&%R6W==72QC:&%R6V)E=&%=75U=72QN=6U;,BPB,B)=75U= !Z", E2%
XMQI/" &16P@[*#N(.S0[4#L\ 0 (',$0!99*D @%55 ,]
XM97%U86Q;<')O;7!T6UTL=&EM97-;;W9E<EMN=6U;,2PB,2)=+&YU;5LT+"(T
XM(EU=+&ED6V%T;W!;<&QU<UMC:&%R6V)=+&UI;G5S6W!L=7-;*"IN*BEC:&%R
XM6V%=+&]V97);<VEN6W!L=7-;*"IN*BEI9%MT:6UE<UMC:&%R6V)=+&-H87);
XM8UU=72QM:6YU<UMS:6Y;:61;=&EM97-;8VAA<EMA72QC:&%R6V-=75U=75U=
XM+&-H87);8UU=75U=+'!L=7-;<W1R:6YG6R(1(ETL;W9E<EMS:6Y;<&QU<ULH
XM*FXJ*6ED6W!L=7-;=&EM97-;8VAA<EMB72QC:&%R6V1=72QC:&%R6V)E=&%=
XM75TL;6EN=7-;<VEN6VED6W!L=7-;=&EM97-;8VAA<EMA72QC:&%R6V1=72QC
XM:&%R6V)E=&%=75U=75U=+&-H87);9%U=72QP;'5S6W-T<FEN9ULB$2)=+&]V
XM97);<VEN6W!L=7-;*"IN*BEI9%MP;'5S6W1I;65S6V-H87);8ETL:61;<&QU
XM<ULH*FXJ*6-H87);8UTL;6EN=7-;8VAA<EMD75U=75TL;6EN=7-;8VAA<EMB
XM971A75U=72QM:6YU<UMS:6Y;:61;<&QU<UMT:6UE<UMC:&%R6V%=+&ED6W!L
XM=7-;*"IN*BEC:&%R6V-=+&UI;G5S6V-H87);9%U=75U=+&UI;G5S6V-H87);
XM8F5T85U=75U=75U=+'1I;65S6VYU;5LR+"(R(ETL:61;<&QU<UMC:&%R6V-=
XM+&UI;G5S6V-H87);9%U=75U=75TL<&QU<UMS=')I;F=;(A$B72QO=F5R6W-I
XM;EMP;'5S6R@J;BHI:61;<&QU<UMT:6UE<UMC:&%R6V)=+&ED6W!L=7-;8VAA
XM<EMC72QC:&%R6V1=75U=+&-H87);8F5T85U=72QM:6YU<UMS:6Y;:61;<&QU
XM<UMT:6UE<UMC:&%R6V%=+&ED6W!L=7-;8VAA<EMC72QC:&%R6V1=75U=+&-H
XM87);8F5T85U=75U=75TL=&EM97-;;G5M6S(L(C(B72QI9%MP;'5S6V-H87);
XM8UTL8VAA<EMD75U=75U=75U=73$ -@ ;=\[0#O^=L!!H,2#LL.VP[$#K4.
XMEP X 87( [9#O$ 97( P=D &5G+P!M
XM!W, 1019#LP.X@[!#M<.J@ #M<.ZQ 6V, .8L= (G:4P " 5TL B]E
XM<75A;%MI;F1E>&5S6S L,2QC:&%R6W-=+&-H87);95U=+&QP87)E;ELH*FDR
XM:2HI871O<%MT:6UE<UMC:&%R6VEN9G1Y72QS=')I;F=;(A%I9A$B72QC:&%R
XM6U9=+'-T<FEN9ULB$7P2?!$B72QC:&%R6R@J;BHI95TL<W1R:6YG6R(1$1$1
XM$1$1$1$1$1$1$1$1$2)=72QT:6UE<UMN=6U;,"PB,")=+'-T<FEN9ULB$6EF
XM$2)=+&QE<W-T:&%N6R@J;BHI;W9E<ELH*FXJ*7!L=7-;*"IN*BEF;&]O<ELH
XM*FXJ*6EN9&5X97-;*"IN*BDP+#$L8VAA<ELH*FXJ*5!=+&-H87);*"IN*BEC
XM75U=+&UI;G5S6R@J;BHI:6YD97AE<ULH*FXJ*3 L,2QC:&%R6R@J;BHI4%TL
XM8VAA<ELH*FXJ*6-=75U=+&EN9&5X97-;*"IN*BDP+#$L8VAA<ELH*FXJ*59=
XM+&-H87);*"IN*BEC75U=+'1I;65S6VYU;5LH*FXJ*3 L(C B72QS=')I;F=;
XM(A$1$2)=75U=+'1I;65S6V]V97);<&QU<UMF;&]O<EMI;F1E>&5S6S L,2QC
XM:&%R6U!=+&-H87);8UU=72QM:6YU<UMI;F1E>&5S6S L,2QC:&%R6U!=+&-H
XM87);8UU=75TL:6YD97AE<ULP+#$L8VAA<EM672QC:&%R6V-=75TL<W1R:6YG
XM6R(1;W1H97)W:7-E(EU=75U=97-; !Z?Z0 %EJP )2JS "! \P[-#N( [*
XM#L\ 0 %MC #$U0@ 7:!T @%U<P _:6YT6W1I;65S6V-H87);
XM:UTL:61;8VAA<EMW75TL8VAA<EMD72QC:&%R6W==72QC:&%R6V%=+&-H87);
XM8EU=75U= #8 (@=L@ [_G; *^)-P[.#ML.W@[;#IT . %LH
XM .WP[B %MB #0CV &S"H( \[A1 (_K!P[/#MH.QP
XM#IH . &)E /_LA L.S0[4 .FPBT U0 '-; -M@# 0$;8
XM%B28 JVW@[0#ML.J0 #JL , %MD -M@# 0$;8 %B28 JVW@
XM !_P <&P %R6P & !@ ,
XM !H :0/HETQ 4<",H<"^T VVGD !\MH0 6))@ "'WZ#M$.VP[%#M(.M@
XM P VVGD !\MH0 6))@ "'WZ (!
XM 5MC 8 & P &@!IP^B97$ !1P(UQP+90#;
XM48$ 9K_Y !8DF '[\ .T@[;#M$.R ZV # #;48$ 9K_Y !8D
XMF '[\ @( &AA !='( !@
XM 8 # : &[#Z(H*@ %' C8' MT -N . )6VP %B28 JVW@[3#ML.
XMV@ #L< , '5M -N . )6VP %B28 JVW@
XM " P *"H %S6P & !@ , !H :L/HF1E 4<
XM"+X<"RH W X !!9K0 6))@ "K;>#M0.VP[* .SP P :6X W X
XM !!9K0 6))@ "K;> ($ !;*
XM 5U= 8 & P &@!K@^B+&, !1P(W1P+*@ >8DW ._YVP 2
XM .U0[; .\@[$ # P+ >8DW ._YVP 2
XM @@ '); "<UL !554 555 "JJH * &W
XM#ZA=70 X' B\'$-I<F-U;&%R(&%N9"!T=7)B=6QE;G0@9FQU:60@9'EN86UI
XM8W,@=F5C=&]R(&9I96QD<R L8P .55( !554 *JJ@! ;</J&]T "-I;6%G
XM960@=7-I;F<@3$E#(&]V97(@=VAI=&4@;F]I<V4N"P .R@ ](,2 ._"
XMCP ; .U@[; .[@[& # !T:0 ](,2 ._"CP ;
XM @D &AA #:&$ !554 555 "JJH
XM* &Y#ZCYVP U' C '$$@='=O+61I;65N<VEO;F%L('9E8W1O<B!F:65L9"!S
XM:&]W:6YG('1H92!L;V-A;""" Y54@ %550 JJJ !N0^H 4W-T<F5A
XM;2!L:6YE('-T87)T:6YG(&EN(&-E;&P@*!L/JAMX&P^H&RP@&P^J&WD;#Z@;
XM*2X@5&AE('9E8W1O<B!F:65L9"!I<R!T:&4@=7!P97(@ !=54 %550
XM JJJ $@!N0^H 3&QE9G0@8V]R;F5R(&]F('1H92!F;'5I9"!D>6YA;6EC
XM<R!F:65L9"!I;B!F:6=U<F5S(!P)$APR' D6'"!A;F0@' DO'#0<"3 <+@MI
XMY !M,RT ;[3U &CSOP R#Y0.UP[B#LP.Z ZJ#LP [K$ "AK0P BJVW
XM (! !C&EN6R@J;BHI=&EM97-;<W1R:6YG6R)F;W(B72QI9%MC;VUM
XM85LH*FXJ*6-H87);*"IN*BEE72QC:&%R6R@J;BHI8UU=75TL:61;*"II,FDJ
XM*6%T;W!;:61;=&EM97-;8VAA<EMT72QC:&%R6V]=+&-O;6UA6R@J;BHI8VAA
XM<ELH*FXJ*7!=+&-H87);*"IN*BEY75U=72QI9%MT:6UE<UMC:&%R6V)=+&-H
XM87);;UTL8VAA<EMT72QC:&%R6W1=+&-H87);;UTL8V]M;6%;*"IN*BEC:&%R
XM6R@J;BHI;5TL8VAA<ELH*FXJ*7E=75U=+&ED6W1I;65S6V-H87);;%TL8VAA
XM<EME72QC:&%R6V9=+&-O;6UA6R@J;BHI8VAA<ELH*FXJ*71=+&-H87);*"IN
XM*BEX75U=72QI9%MT:6UE<UMC:&%R6W)=+&-H87);:5TL8VAA<EMG72QC:&%R
XM6VA=+&-O;6UA6R@J;BHI8VAA<ELH*FXJ*71=+&-H87);*"IN*BEX75U=75U=
XM70 "X40 N%$ [HDW .Z)-P[8#N<.PP #K4 &
XM ](,2 ._YVP 2 .V0[; .\0[+ # !MP ](,2 ._Y
XMVP 2 @H &%M "8W0 !554
XM 555 "JJH * '!#ZA55 ]' CS'%!H;W1O9W)A<&@@;V8@9FQO=V5R<R!P
XM<F]C97-S960@=7-I;F<@3$E#('=I=&@@&P^J&TP;#Z@;((\ #E52 555 "
XMJJH 0 '!#Z@ Y97%U86P@=&\@,"P@-2P@,3 @86YD(#(P("AL969T('1O
XM(')I9VAT+"!T;W @=&\@8F]T=&]M*2X+5 +51X '#JB .'4@P 4*,X.V@[B
XM#LD.TP[' $ !I;P!\/U\ *$ ! (!;&0!671I;65S6W-T<FEN
XM9ULB$3TB72QO=F5R6VYU;5LQ+"(Q(ETL;G5M6S0L(C0B75TL:61;<&QU<ULH
XM*FXJ*6YU;5LQ+"(Q(ETL8V]S6W!L=7-;*"IN*BEI9%MT:6UE<ULH*FXJ*6-H
XM87);8UTL8VAA<EMW75U=+&-O<UMT:6UE<UMI9%MP;'5S6W1I;65S6V-H87);
XM9%TL8VAA<EMW75TL8VAA<EMB971A75U=+'1I;65S6R@J;BHI<W1R:6YG6R@J
XM;BHI(A$K(ETL8V]S6R@J;BHI=&EM97-;*"IN*BEI9%MT:6UE<UMC:&%R6R@J
XM;BHI8UTL8VAA<ELH*FXJ*7==75TL8V]S6R@J;BHI:61;<&QU<ULH*FXJ*71I
XM;65S6R@J;BHI8VAA<ELH*FXJ*61=+&-H87);*"IN*BEW75TL8VAA<ELH*FXJ
XM*6)E=&%=75U=75U=75U=75U=76,!/4W2 B!VR #O^=L KXDW#ML.VP[. .
XMG0 X =%T [D#N4 87( -@ #8 #O
XM^=L!1!)N#MP.VPZ?#MX.G0 X 8V@ [@#O,
XM 8V@ -SWS@#O^=L &P #MT.VP #OL.P@ P *6T
XM -SWS@#O^=L &P (, L8P
XM RQC 555 %550 JJJ "@!P@^H*BD -QP(^!Q0:&%S92!S:&EF=&5D($AA
XM;FYI;F<@<FEP<&QE(&9U;F-T:6]N<RAT;W I+"!A($AA;@9H72P #E52 55
XM5 "JJH '"#ZAN*@ Y;FEN9R!W:6YD;W=I;F<@9G5N8W1I;VXH;6ED9&QE
XM*2P@86YD($AA;FYI;F<@<FEP<&QE(&9U;F,& 755 !554 *JJ@! <(/
XMJ #ET:6]N<R!M=6QT:7!L:65D(&)Y('1H92!(86YN:6YG('=I;F1O=R!F
XM=6YC=&EO;BAB;W1T;VTI+@L 3U-T@ V [_G; )V)-P[>#ML.W [.#IT
XM . !P( .X0\ ',@ "4B3< [_G;
XM !L [?#ML [B#LX , ""/ "4B3< [_G; !L
XM "#P 9" -F= %550 !554 *JJ@ H
XM = /J&)O #D<")D<02!W:6YD('9E;&]C:71Y('9I<W5A;&EZ871I;VX@:7,@
XM8W)E871E9"!B>2!C;VUP;W-I= 9D Y54@ %550 JJJ !T ^H(ET .FEN
XM9R!A;B!I;6%G92!O9B!.;W)T:"!!;65R:6-A('5N9&5R(&%N(&EM86=E(&]F
XM('1H92!V96QO8P8 %U50 555 "JJH 0 '0#ZAN*@!%:71Y(&9I96QD(')E
XM;F1E<F5D('5S:6YG('9A<FEA8FQE(&QE;F=T:"!,24,@;W9E<B Q+QL/JAMF
XM&P^H&R!N;VES92X+70 !*1)N ._YVP ; .X [; .\P[<
XM# H*@ !*1)N ._YVP ; @T
XM "IN #+&, !554 555 "JJH * ',#ZAN*@ U' D '%=H:71E(&YO
XM:7-E(&-O;G9O;'9E9"!W:71H(&9L=6ED(&1Y;F%M:6-S('9E8W1O<B!= Y5
XM4@ %550 JJJ !S ^H=L@ 0&9I96QD('5S:6YG('9A<FEA8FQE(&YO<FUA
XM;&EZ871I;VX@*'1O<"D@=F5R<W5S(&9I>&5D(&YO<FUA;&EZ8082;@ 755
XM!554 *JJ@! <P/J&-H ]T:6]N("AB;W1T;VTI+@L 'F)-P#O
XM^=L ) #N$.VP #P .W@ P 'F)-P#O^=L )
XM (. ! 555 %550 JJJ
XM "@!S@^H <( ,QP(EAQ7:&ET92!N;VES92!C;VYV;VQV960@=VET:"!C:&5C
XM:V5R8F]A<F0@=F5C=&]R("P@80 .55( !554 *JJ@ <X/J*JJ $%F:65L
XM9"!U<VEN9R!F:7AE9"!N;W)M86QI>F%T:6]N("AL969T*2P@86YD('1H96X@
XM9W)A9&EE;G0@<VAA9&5D( %U50 555 "JJH '.#Z@ \*')I9VAT
XM*2!T;R!G:79E('1H92!A<'!E87)A;F-E(&]F(&$@<F]U9V@@=V]V96X@<W5R
XM9F%C92!T97@&3=( (%5. 555 "JJH 0 '.#Z@.S@ &='5R92X+ "X40
XMN%$ [HDW (Z/7 [B#N<.WP #LX & (DW ._YVP V -@ ._Y
XMVP%$$FX.XP[;#J(.Y@Z@ #@#YVP #NP/ 0
XM E(DW ._YVP ; .Y [; .Y0[; # !B;P
XME(DW ._YVP ; A &%T #
XM8V\ !554 555 "JJH * '1#ZBJJ@ X' D)'%1H92!F:7AE9"!N;W)M86QI
XM>F%T:6]N(&9L=6ED(&1Y;F%M:6-S(&9I96QD(&EM86=E9"!T: .55( !554
XM *JJ@ ( =$/J*JJ $=I;B!F:6=U<F4@' C@'#@<".(<(&ES(&UU;'1I<&QI
XM960@8GD@82!C;VQO<B!I;6%G92!O9B!T:&4@;6%G;FET=61E(&]F(&]I<P 7
XM55 !554 *JJ@! =$/J !)T:&4@=F5C=&]R(&9I96QD+@L +A1 "X
XM40#NB3< CH]<#N4.YP[D .VP 8 #8 ([=L@ [_G;
XM )2)-P[F#ML.XP[G#J . !P) .Z0\#
XM &0@ 3U-T@' ?.T [_G; 0^#$@[G#ML.Y@ #J . %54
XM .Z@\" &EN -NWZ "#%-0 %B28 D,,P[H#ML.UP[K#JH
XM , '-U -NWZ "#%-0 %B28 D,,P "!@
XM =&D %T= & !@ , !H =(/HOG; 4<"-,<"]L
XM 'F)-P#O^=L &P #ND.VP #P,.Y@ P 'F)-P#O
XM^=L &P (1 "JJ@ ! '" 55
XM5 %550 JJJ "@!TP^H8V\ .!P)'AQ4:&4@;W)I9VEN86P@<&AO=&\@;VX@
XM=&AE(&QE9G0@<VAO=W,@;F\@;6]T:6]N(&)L=7(&9FD #E52 555 "JJH
XM '3#ZAR;0 _<FEN9R!4:&4@<&AO=&\@;VX@=&AE(')I9VAT('5S97,@=F%R
XM:6%B;&4@;&5N9W1H($Q)0R!T;R!M;W1I;VX@/"AR !=54 %550 JJJ !
XMTP^H87 /6)L=7(@0F]R:7,@665L='-I;M5S('=A=FEN9R!A<FTL('-I;75L
XM871I;F<@82!S;&]W97(@<VAU='1E<B!U "6JJ %550 JJJ $ !TP^HCUP
XM!W-P965D+@O. /2#$@#O^=L &P #NH.VP #P(.YP P
XM#N8 /2#$@#O^=L &P (2 ")
XM-P P 555 %550 JJJ "@!U0^H8F\ /!P)(1Q!('1H<F5E+61I
XM;65N<VEO;F%L(#4Q,AL/K1LS&P^H&R!E;&5C=')O<W1A=&EC(&9I96QD(&ES
XM(*JJ Y54@ %550 JJJ !U0^H9FD /6EM86=E9"!B>2!V;VQU;65T<FEC
XM86QL>2!R87D@=')A8VEN9R!A('1H<F5E+61I;65N<VEO;F%L('-C80;1 !=5
XM4 %550 JJJ $ !U0^HX!P +VQA<B!F:65L9"!P<F]D=6-E9"!U<VEN9R!,
XM24,@;W9E<B!W:&ET92!N;VES92X+='5D ,'9 !E9R\ TQ^( $4$60[K#MD.
XMZ #JH / '9E#LP.UP !*1)N ._YVP ; .[ [; / 0[C
XM # !*1)N ._YVP ; A,
XM # !554 555 "JJH ( ';#ZA1@0 R02!P:&]T
XM;V=R87!H("AT;W I(&]F('1H92!&;&%V:6%N($%M<&AI=&AE871E<B!I<R
XM#E52 555 "JJH ';#Z@DF !!=7-E9"!T;R!C<F5A=&4@82!V96-T;W(@
XM9FEE;&0N(%1H92!F:65L9"!I<R!T:&5N('5S960@=&\@:6UA9V4@82!I !=5
XM4 %550 JJJ $@!VP^H .])P86EN=&5DTR!V97)S:6]N(&]F('1H92!S
XM86UE('!H;W1O9W)A<&@@*&)O='1O;2D<"+\<&P^N&RX+[_G; !NEP
XM[QUB -AR"0[M#MD/#0 #L( / #OL/#0 ._YVP#O
XM^=L.[@[:#M8 [& #0!I;@ ( 8SQU/CQU
XM/CQC/F%V<SQC/F1A=&$\8SYF:6YA;"YP87!E<CQC/F9I9W5R93,N97!S/%4^
XM+VAO;64O=3 V+V-A8G)A;"]A=G,O9&%T82]F:6YA;"YP87!E<B]F:6=U<F4S
XM+F5P<T,@= ._YVP#O^=L.[P[:#O0 ZR #0!B;
XM ; 8SQU/CQU/CQC/F%V<SQC/F1A=&$\8SYF:6YA;"YP
XM87!E<CQC/F9I9W5R93$N97!S/%4^+VAO;64O=3 V+V-A8G)A;"]A=G,O9&%T
XM82]F:6YA;"YP87!E<B]F:6=U<F4Q+F5P<^< $]3=( -@ ._YVP"+B3<.
XM\ [A#I,.L@Z/ #@ #O4/#@
XMN%$ +A1 .Z)-P#NB3<.\0[G#MD [+ !@!D:0!E;G, +A1 "X
XM40#NB3< <X]<#O(.YP[5 .Q 8 :64 9"!I "X40 N%$ [HDW
XM 2,8DP[S#N<.X #MP & 'D@ &]L=0 ](,2 ._YVP 2 .
XM] [; .[PZR # !E;@ ](,2 ._YVP 2
XM @4 &0@ "960 !554 555 "JJH * &P#ZAI
XM= V' C/'%1H92!M87!P:6YG(&]F(&$@=F5C=&]R(&]N=&\@82!$1$$@;&EN
XM92!A;F0@:6YP=70@ Y54@ %550 JJJ $ !L ^H#P$ +G!I>&5L(&9I96QD
XM(&=E;F5R871I;F<@82!S:6YG;&4@;W5T<'5T('!I>&5L+@L 'F)-P#O
XM^=L $@ #O4.VP #PX.\ P 48$ 'F)-P#O^=L $@
XM (' !H90 G,@ 555 %550 JJJ
XM "@!M0^H))@ .!P(XQQ#:7)C=6QA<B!A;F0@='5R8G5L96YT(&9L=6ED(&1Y
XM;F%M:6-S('9E8W1O<B!F:65L9',@(&D #E52 555 "JJH 0 &U#ZBJJ@ O
XM:6UA9V5D('5S:6YG($1$02!C;VYV;VQU=&EO;B!O=F5R('=H:71E(&YO:7-E
XM+@MH("@ &Z7 0 O__\ 2 #OL.V@[=#P0.P@ #P0.[0T <@D
XM !#@ %D\=3X\=3X\8SYA=G,\8SYD871A/&,^9FEN86PN<&%P
XM97(\8SYH,#$N<',\53XO:&]M92]U,#8O8V%B<F%L+V%V<R]D871A+V9I;F%L
XM+G!A<&5R+V@P,2YP<V$ +A1 "X40#NB3< <X]<#P .YP[A .W@
XM 8 86P 879S "X40 N%$ [HDW 2,8DP\!#N<.[ #N, &
XM N%$ +A1 .Z)-P#NB3</ @[G#NH [G !@ &P
XM +A1 "X40#NB3< <X]<#P,.YP[I .Y@ 8 <&$ 97(\ "^H*P
XM +_[% $@ \$#MH.^P\%#L(.^P\%#NT- '9S 0X N
XM !9/'4^/'4^/&,^879S/&,^9&%T83QC/F9I;F%L+G!A<&5R/&,^:# R+G!S
XM/%4^+VAO;64O=3 V+V-A8G)A;"]A=G,O9&%T82]F:6YA;"YP87!E<B]H,#(N
XM<',W %[@B0 ( +__@ $@ \%#MH/! \L(/! \NT- (DW
XM 0X !9/'4^/'4^/&,^879S/&,^9&%T83QC/F9I;F%L+G!A<&5R
XM/&,^:# S+G!S/%4^+VAO;64O=3 V+V-A8G)A;"]A=G,O9&%T82]F:6YA;"YP
XM87!E<B]H,#,N<', (\V 0 ( +__\ $@ \MH/!0\'#L(/!0\'#NT-
XM 0X !D !9/'4^/'4^/&,^879S/&,^9&%T83QC/F9I
XM;F%L+G!A<&5R/&,^:# T+G!S/%4^+VAO;64O=3 V+V-A8G)A;"]A=G,O9&%T
XM82]F:6YA;"YP87!E<B]H,#0N<',! +^+^@ $ +___ $@ \'#MH/!@\(
XM#L(/!@\(#NT- &]U 0X + !9/'4^/'4^/&,^879S/&,^
XM9&%T83QC/F9I;F%L+G!A<&5R/&,^:# U+G!S/%4^+VAO;64O=3 V+V-A8G)A
XM;"]A=G,O9&%T82]F:6YA;"YP87!E<B]H,#4N<'-4 %[@B0!'JLL +___ $@
XM \(#MH/!P\)#L(/!P\)#NT- &)U 0X !D !A/'4^/'4^
XM/&,^879S/&,^9&%T83QC/F9I;F%L+G!A<&5R/&,^:&%N;FEN9RYP<SQ5/B]H
XM;VUE+W4P-B]C86)R86PO879S+V1A=&$O9FEN86PN<&%P97(O:&%N;FEN9RYP
XM<P$ &Z7 )!R"0 O__P 2 #PD.V@\(#PH.P@\(#PH.[0T 0X !
XM#@ '4 %D\=3X\=3X\8SYA=G,\8SYD871A/&,^9FEN86PN<&%P97(\
XM8SYH,3$N<',\53XO:&]M92]U,#8O8V%B<F%L+V%V<R]D871A+V9I;F%L+G!A
XM<&5R+V@Q,2YP<U$ +Z@K )!R"0 O_^ 2 #PH.V@\)#PL.P@\)#PL.[0T
XMN%$ !#@ ), %D\=3X\=3X\8SYA=G,\8SYD871A/&,^9FEN
XM86PN<&%P97(\8SYH,3(N<',\53XO:&]M92]U,#8O8V%B<F%L+V%V<R]D871A
XM+V9I;F%L+G!A<&5R+V@Q,BYP<P 7N") )!R"0 O__P 2 #PL.V@\*#PP.
XMP@\*#PP.[0T #OL !#@ %D\=3X\=3X\8SYA=G,\8SYD
XM871A/&,^9FEN86PN<&%P97(\8SYH,3,N<',\53XO:&]M92]U,#8O8V%B<F%L
XM+V%V<R]D871A+V9I;F%L+G!A<&5R+V@Q,RYP<W( CS8! )!R"0 O_^ 2
XM#PP.V@\+#PT.P@\+#PT.[0T #P0 !#@ %D\=3X\=3X\
XM8SYA=G,\8SYD871A/&,^9FEN86PN<&%P97(\8SYH,30N<',\53XO:&]M92]U
XM,#8O8V%B<F%L+V%V<R]D871A+V9I;F%L+G!A<&5R+V@Q-"YP<W( OXOZ )!R
XM" O_L4 2 #PT.V@\,#NT.P@\, .[0T #P4 !#@
XM %D\=3X\=3X\8SYA=G,\8SYD871A/&,^9FEN86PN<&%P97(\8SYH,34N<',\
XM53XO:&]M92]U,#8O8V%B<F%L+V%V<R]D871A+V9I;F%L+G!A<&5R+V@Q-2YP
XM<W( +A1 "X40#NB3< <X]<#PX.YP[U .\ 8 #P8 " X1#B$.
XM% + "9 Q@ X1 YU $ /F$ !$QE9G0 )D #&
XM#A( #G8 0#OP %4FEG:'1E P-@)D #& #A, #H
XM @ N< )4F5F97)E;F-E5 X(D"9 Q@ X5 .%@Y]
XM#P< F0 ,8 .%@X5#A<.CP ! #QU )D #& #A<.
XM%@X8#I0 @ !P80 "9 Q@ X8#A<.&0Z7 , ,#8
XM F0 ,8 .&0X8#AH.F@ $ &5R )D #& #AH.&0X;#IT
XM!0 "9 Q@ X;#AH.' Z@ 8 0X F0 ,8
XM .' X; .HP ' &%T \]#XT/10 V
XM $ 0 #F9@ ! 1F9 \]#Z$ 0#
XM% (# P4! #@ P " 0 &
XM!0$ "$%B<W1R86-T
XM ( YF8 0 $9F0 //@ %
XM 00 " P,% 0 B0 , @$
XM!@4! 0X A#96QL0F]D>0
XM " .9F $ !&9D ( @ #S\
XM!0, @,#!0$ 3, # (!
XM 8% 0 \$ +0V5L;$AE861I;F=9 "0
XM $ YF8 0 $9F0 /
XM0 ^B $! 0 " P,% @ <@ )
XM @$ !@4! #NT 1";V1Y
XM . !0 ( YF8 0 $9F0 /00
XM % 50 " P,% 0 80 .
XM @$ !@D! .#N< =(96%D:6YG 1";V1Y !( 2
XM $@ @ #F9@ ! 1F9
XM ]" 4!! (# P4! H
XM " 0 &!0$ &0 #51A8FQE1F]O=&YO=&4'
XM @ #F9@ ! 1F9
XM ]# 5 4# 0 (# P4! V P
XM " 0 &"0$ !@ "E1A8FQE5&ET;&4
XM #E0Z5&%B;&4@/&XK/CH@ 0 !
XM .9F $ !&9D #T0 !0,4 @,#!0$
XM &8 $@ ,! 8) 0 P,%
XM %5&ET;&4 @
XM #F9@ ! 1F9 " ( ]Z$ 0# (# P4!
XM %F P " 0 &!0$ ,#!0
XM "T-E;&Q(96%D:6YG
XM " .9F $ !&9D #T</H0 ! $$
XM @,#!0$ # (! 8% 0
XM $S (0V5L;$)O9'D
XM @ #F9@ ! 1F9 ](#Z0 5 0# 0
XM (# P4! !F P " 0 &"0$
XM ,#!0 "E1A8FQE5&ET;&4 #E0Z5&%B;&4@/&XK/CH@
XM 0 ! .9F $ !&9D
XM #TD/K ! ,4 @,#!0$ #
XM (! 8%!0 (06)S=')A8W0
XM , # 0 #F9@ ! 1F9
XM ]*#Z( 00$%0 (# P4! D
XM " 0 &!0$ "$5Q=6%T:6]N <H
XM/&X].#XI ) 0 #F9@ ! 1F9
XM ], 4$! (# P4" D
XM " 0 &!0$ !$)O9'D
XM < 0 #F9@ ! 1F9
XM ]- 4P4$%0 (# P4! D
XM # 0 &"0$ "%-E8W1I;VXS
XM !!3.CQN/BX\;CXN/&XK/B @ !P !
XM .9F $ !&9D #TX/JP ! $4 @,#
XM!0$ "0 ,! 8) 0
XM &2&5A9&5R $
XM 0 #F9@ ! 1F9 ]/#[D 0$5 (#
XM P4! "9 @ " 0 &!0$ P
XM "$9O;W1N;W1E '
XM $ YF8 0 $9F0 /4 % 10 "
XM P,% 0 F0 ) P$ !@D! ,
XM 9(96%D97( !P
XM ! .9F $ !&9D #U$ !3!0$5
XM @,#!0$ "0 ,! 8) 0
XM 0# (4V5C=&EO;C( #%,Z/&X^+CQN*SX@(
XM , # 0 #F9@ ! 1F9
XM ]2#Z( 00$%0 (# P4! D
XM " 0 &!0$ "$5Q=6%T:6]N <H/&X],3XI
XM @ 0 #F9@ ! 1F9
XM ]4#Z@ 1@0!%0 (# P4! @
XM % 0 &!@$ #D9I9W5R92U#87!T:6]N
XM Y&.D9I9W5R92 \-SXZ(
XM 0 #F9@ ! 1F9 ]5 4$5 (#
XM P4! @ " 0 &!0$
XM "$9O;W1N;W1E # P
XM $ YF8 0 $9F0 /5@ $%!!4 "
XM P,% 0 ) @$ !@4!
XM A%<75A=&EO;@ '*#QN/3$^*0
XM $ YF8 0 $9F0 /5P^H
XM $8$ 14 " P,% 0 (
XM!0$ !@8! Y&:6=U<F4M0V%P=&EO;@ .1CI&:6=U
XM<F4@/#@^.B $ YF8 0 $9
XMF0 /60^H $8$ 14 " P,% 0 !0 (
XM !0$ !@8! ) 0 Y&:6=U<F4M
XM0V%P=&EO;@ .1CI&:6=U<F4@/#$^.B #
XM P $ YF8 0 $9F0 /6@^B $$
XM!!4 " P,% 0 ) @$
XM!@4! R A%<75A=&EO;@ '*#QN/3(^*0
XM ' $ YF8 0 $9F0
XM /6P^K %,$ 14 " P,% 0 )
XM P$ !@D! !" A396-T:6]N,0 )4SH\;BL^
XM+B @ P , ! .9F $ !&9D
XM #UP/H@ !! 05 @,#!0$ "0
XM (! 8% 0 0V%P (17%U871I;VX
XM !R@\;CTW/BD P , ! .9F
XM $ !&9D #UT/H@ !! 05 @,#!0$
XM"0 (! 8% 0 (
XM17%U871I;VX !R@\;CTV/BD P ,
XM ! .9F $ !&9D #UX/H@ !! 05
XM @,#!0$ "0 (! 8% 0
XM871I (17%U871I;VX !R@\;CTT/BD
XM P , ! .9F $ !&9D #U\/
XMH@ !! 05 @,#!0$ "0
XM (! 8% 0 =7)E (17%U871I;VX !R@\;CTU/BD@
XM P , ! .9F $ !&9D
XM #V /H@ !! 05 @,#!0$ 4 "0
XM (! 8% 0 "0$ (17%U871I;VX !R@\
XM;CTS/BDZ $@ ( ! .9F $ !&9D
XM #V(/H@!2! 0% @,#!0, 0 "0
XM (! 8% 0 0 2 !
XM"5)E9F5R96YC96X "%(Z/&XK/BX(
XM ! .9F $ !&9D #V, !&!0$5
XM @,#!0$ " 4! 8&
XM 0 0@ .1FEG=7)E+4-A<'1I;VX #D8Z1FEG=7)E(#PS
XM/CH@ !P ! .9F $ !&9D
XM #V0 !3!0$5 @,#!0$ "0
XM ,! 8) 0 "$5Q (4V5C=&EO;C$
XM "5,Z/&XK/BX@( $ 0 #
XM ! 4 ]E#Z( 0#% (" @4!
XM D " 0 &!0$ &%T:0 (
XMZ@ @ H/ !(#X!U P !( "$%B<W1R86-T
XM ! $ YF8 0 $9F0
XM /9@^B $ Q0 " P,% 0 )
XM @$ !@4! ]-#X A!8G-T<F%C=
XM !P ! .9F $ !&9D
XM #V</JP!3! $5 @,#!0$ "0
XM ,! 8) 0 (4V5C=&EO;C( #%,Z
XM/&X^+CQN*SX@( < 0 #F9@ !
XM 1F9 ]I#ZL 4P0$%0 (# P4! D
XM # 0 &"0$ <H/ "%-E8W1I
XM;VXS !!3.CQN/BX\;CXN/&XK/B @ !@
XM ! .9F $ !&9D #VH/N0 ! %0
XM @,#!0$ " (! 8%
XM 0 (1F]O=&YO=&4 "$9O;W1N;W1E
XM 0 ! .9F $ !&9D
XM#VP/IP ! ,4 @,#!0$ $@
XM (! 8% 0 (06)S=')A8W0
XM 0 #F9@ ! 1F9
XM ]N#Z@ 1@0!%0 (# P4! @
XM % 0 &!@$ A%<0 #D9I9W5R92U#87!T:6]N !!&
XM.D9I9W5R92 \;CTR/CH@ ! $
XMYF8 0 $9F0 /< _! $ Q0 " P,% 0
XM 2 P$ !@D! *#P
XM 54:71L90 <F$ $@ ( !
XM .9F $ !&9D #W, !2!00% @,#!0,
XM , "0 (! 8% 0
XM 0 2 ! #0^ "5)E9F5R96YC970 "%(Z/&XK/BX(
XM ! .9F $ !&9D
XM #W0/J !&! $5 @,#!0$ "
XM 4! 8& 0 "%-E .1FEG=7)E+4-A<'1I;VX
XM$$8Z1FEG=7)E(#QN/3,^.B 0
XM #F9@ ! 1F9 ]U#Z@ 1@0!%0 (# P4!
XM @ % 0 &!@$
XM #D9I9W5R92U#87!T:6]N !!&.D9I9W5R92 \;CTT/CH@ #F
XM9@ $ YF8 0 $9F0
XM /=@^H $8$ 14 " P,% 0 (
XM !0$ !@8! Y&:6=U<F4M0V%P=&EO;@
XM 01CI&:6=U<F4@/&X]-3XZ(
XM ! .9F $ !&9D #W</J !&! $5
XM @,#!0$ " 4! 8& 0
XM .1FEG=7)E+4-A<'1I;VX $$8Z1FEG=7)E(#QN/38^
XM.B ,% 0 #F9@ ! 1F9
XM ]X#Z@ 1@0!%0 (# P4! 0 @
XM % 0 &!@$ 0 #D9I9W5R92U#87!T
XM:6]N !!&.D9I9W5R92 \;CTY/CH@ #!0
XM $ YF8 0 $9F0 />0^H $8$
XM 14 " P,% 0 ( !0$
XM!@8! Y&:6=U<F4M0V%P=&EO;@ 11CI&:6=U<F4@
XM/&X],3$^.B ! .9F $ !
XM&9D #WH/J !&! $5 @,#!0$ "
XM 4! 8& 0 .1FEG=7)E
XM+4-A<'1I;VX $48Z1FEG=7)E(#QN/3$P/CH@
XM 0 #F9@ ! 1F9 ][
XM#Z@ 1@0!%0 (# P4! @
XM % 0 &!@$ #D9I9W5R92U#87!T:6]N !%&.D9I
XM9W5R92 \;CTQ,CXZ( $ YF8
XM 0 $9F0 /? ^H $8$ 14 " P,% 0 (
XM !0$ !@8! Y&
XM:6=U<F4M0V%P=&EO;@ 11CI&:6=U<F4@/&X],30^.B
XM ! .9F $ !&9D
XM #WT/J !&! $5 @,#!0$ "
XM 4! 8& 0 .1FEG=7)E+4-A<'1I;VX
XM$48Z1FEG=7)E(#QN/3$S/CH@ #Z$/T0^R !P #
XM 'K95M,/H0 (! 8% 0 $.D9I !R90 )
XM >ME6TP^B @$ !@4! 0 YF8 D /_,
XMX #Z, " 0 &!0$ !0 $ (16UP:&%S:7, ,
XM %>[C^ ^D @$ !@D! 1U<F4 &%P D
XM /_,X #Z4 " 0 &!0$ !0 )4W5B<V-R:7!T )
XM #_S. ^F @$ !@4! 5&! $ "U-U<&5R<V-R
XM:7!T" !( !ZV5;3#Z< " 0 &!0$ !
XM 1FD " 'NM/HH/J 4! 8& 0 $
XM ) %>[C^ ^I @$ !@D! 0
XM @ $K;.B#ZH % 0 &!@0 !
XM "0 >I%:T/JP ,! 8) 0 $:6]N
XM , :+"$L@^L @$ !@4% 0
XM @ ![K3Z*#ZT % 0@&!@$ !$8$ 0
XM" /(3>3P/K@ 4! 8(! $!0$ ! )
XM :+"$L@^O @$ !@4% 1U<F4 !DET86QI
XM8P ) %>[C^ ^P @$ !@D! 0!&9D !$)O
XM;&0 ) %>[C^ ^Q @$(!@D! 0
XM!$)O;&0 ) 6@1L60^X @$ !@D% 1I
XM;VX @ !ZV5;3#[D " 0 &!0$ !
XM "0 &BPA+(/N@ (! 8%!0 $1@0!
XM ) !$8I>P^[ ! $ !@4! 0% 0
XM $ D !HL(2R#[T " 1 &!04 !'5R90 &
XM271A;&EC D $1BE[#[\ $ 0 &!0$ !*$
XM &271A;&EC @ !HL(2R#\ " 0 &!04
XM! (! &271A;&EC !( 'J16M#\$ # 0 &
XM"0$ ! 4! ! "0 &BPA+(/QP (!$ 8%
XM!0 $I ! ) >ME6TP_( @$ !@4!
XM 2E !DET86QI8P ) >ME6TP_) @$(
XM!@4! 0 !DET86QI8P[9#OD.X + $ [9 #P
XM 0 #MH #P / @ .VP / <, $ @( $%H'___8.P[<
XM #P 0 #MT / (" @ .W@ \
XM @( $ [? \ !PP 0" @ 06@< 0 #N$ #P ' ("
XM .X@ $ [C \ #P " @
XM !F9#N< #@ '# ! (" !!:!P!E '4 :@ % " 90 ! $
XM5&AI;@ ( 9@ ! &365D:75M " " 9P "
XM &1&]U8FQE , : ! %5&AI8VL ! :0
XM ! )5F5R>2!4:&EN ,D V0#) ( # P
XM 8 & !@ 8 $ % ,H @ / \ #P!E &4 90!E
XM &4 90!E &4 90!G#T@% ! @($ 0@ $!!0
XM !( /1@]'#T8 $ !( /1@]'#T8 ;P (
XM !( /1@]'#T8 , !( /1@]'#T8 0
XM !( /1@]'#T8 TP (1F]R;6%T($$! , #
XM !@ 8 & !@ 0 4 RP " \ #P / 90 &8
XM90!E &4 90!E &8/2 4 0$ " @0 !" 0$%
XM $@ ]T</1@ 0 $@ ]T</1@!T @
XM $@ ]T</1@ P $@ ]T</1@!T !
XM $@ ]T</1@ A&;W)M870@0@ !
XM+0$] 2T 0 0$N $" 0 =#;VUM96YT P !$ ! "
XM 54:6UE<P P )2&5L=F5T:6-AL $ 93>6UB;VP !0 *079A;G1'87)D
XM90 ) $ !@ '4F5G=6QA<@ # $ 4 !U)E9W5L87(% 8 !$)O;VL " (
XM1&5M:4)O;&0 "0 $0F]L9 % , 0 '4F5G=6QA<@( ! '3V)L:7%U908
XM!0 &271A;&EC
XM
XM
XM
XM
XM
XM
XM
XM
XM
XM
XM
XM
XM
XM
XM
XM
XM
XM
XM
XM
XM
XM
XM
XM
XM
XM
XM
XM ! @,$
XMM5%@52EG987Y'1P$1Y_3-=H)S0OA6I*(&46.IKGCJ/"[7]7BT-P9%V_=M%P<
XMV+F[")JOI/F?(<'IC$1ZL*0K7J).L>L%#K6<#.-GMBY@L-PL/C#A]W@P_<&_
XM9$^9;M967O-,+M3",!7+D)5P>%6?'(4DVZG175>EK,ZRW O_KHTQ\#PUF!BP
XM6?!@7K$:8^+I'UGDT01[H2:Z%#<E+5TG.X:5R,&-*7C63A_AM;+D#=VA DJ)
XMD]:[-J8D:#!<L*[V:OP?)D;0Z__TBI2YJQ&M7HM$.NX#D8%/"5X+K?Q0CFD8
XM/X=RO2"^IM&&1]/F);6]9$(1\,U<4HJE*R=]7(S*13GWT2YC;6RN9ZU"K*9J
XMG4:N[T+G\Q'8-C*JKIB0S?S TMAR^Y7]"C#GM5LN]J%B9"EP?[2R(#OVK3W_
XM=0+5$T:[MW4[8%^% 1(2[*>L#Z&B.K^4#"#Q8=Q*#D170MC6ZDB7>UWVLF8
XMLF0SA(^P **1GN)D1_D>N3FQ^/I4E"2\=2?:7XO'#/E%LU_ON*&>$CI_-N<
X#
X
Xend
END_OF_FILE
if test 32376 -ne `wc -c <'lic.1.2/doc/siggraph93/p.frame.UU.C'`; then
echo shar: \"'lic.1.2/doc/siggraph93/p.frame.UU.C'\" unpacked with wrong size!
elif test -f 'lic.1.2/doc/siggraph93/p.frame.UU.A' && test -f 'lic.1.2/doc/siggraph93/p.frame.UU.B' ; then
echo shar: Combining \"'paper.frame.UU'\" \(143959 characters\)
cat 'lic.1.2/doc/siggraph93/p.frame.UU.A' 'lic.1.2/doc/siggraph93/p.frame.UU.B' 'lic.1.2/doc/siggraph93/p.frame.UU.C' > 'paper.frame.UU'
if test 143959 -ne `wc -c <'paper.frame.UU'`; then
echo shar: \"'paper.frame.UU'\" combined with wrong size!
else
rm lic.1.2/doc/siggraph93/p.frame.UU.A lic.1.2/doc/siggraph93/p.frame.UU.B lic.1.2/doc/siggraph93/p.frame.UU.C
echo shar: Uudecoding \"'lic.1.2/doc/siggraph93/paper.frame'\" \(104448 characters\)
cat paper.frame.UU | uudecode
if test 104448 -ne `wc -c <'lic.1.2/doc/siggraph93/paper.frame'`; then
echo shar: \"'lic.1.2/doc/siggraph93/paper.frame'\" uudecoded with wrong size!
else
rm paper.frame.UU
fi
# end of 'paper.frame.UU'
fi
fi
# end of 'lic.1.2/doc/siggraph93/p.frame.UU.B'
fi
if test -f 'lic.1.2/liblic/Filters.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lic.1.2/liblic/Filters.c'\"
else
echo shar: Extracting \"'lic.1.2/liblic/Filters.c'\" \(6103 characters\)
sed "s/^X//" >'lic.1.2/liblic/Filters.c' <<'END_OF_FILE'
X/*
X * $Header: /d/sisal/a/casey/tmp/lic/liblic/RCS/Filters.c,v 1.12 1993/08/10 23:35:32 casey Exp $
X */
X
X/*
X * Copyright (c) 1993 The Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms, with or without
X * modification, are permitted provided that the following conditions
X * are met:
X * 1. Redistributions of source code must retain the above copyright
X * notice, this list of conditions and the following disclaimer.
X * 2. Redistributions in binary form must reproduce the above copyright
X * notice, this list of conditions and the following disclaimer in the
X * documentation and/or other materials provided with the distribution.
X * 3. All advertising materials mentioning features or use of this software
X * must display the following acknowledgement:
X * This product includes software developed by the University of
X * California, Lawrence Livermore National Laboratory and its
X * contributors.
X * 4. Neither the name of the University nor the names of its contributors
X * may be used to endorse or promote products derived from this software
X * without specific prior written permission.
X *
X * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
X * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
X * SUCH DAMAGE.
X */
X
X#ifndef lint
X static char rcsid[] = "$Header: /d/sisal/a/casey/tmp/lic/liblic/RCS/Filters.c,v 1.12 1993/08/10 23:35:32 casey Exp $";
X static char copyright[] =
X "Copyright (c) 1993 The Regents of the University of California.\n"
X "All rights reserved.\n";
X#endif
X
X
X#include "liblic.h"
X
X
X/*
X * Build integral tables from filter integrator.
X * =============================================
X */
X
Xvoid
XLIC_BuildIntegralTables(LIC *This)
X /*
X * Build integral tables for LIC instance if needed.
X */
X{
X int speed, length;
X
X if (!This->NeedIntegration)
X return;
X This->NeedIntegration = FALSE;
X
X /*
X * Build the convolution integral tables. Build LIC_INTEGRAL_SPEEDS
X * different versions of them with speed varying between 0 and
X * LIC_INTEGRAL_SPEEDS.
X */
X for (speed = 0; speed < LIC_INTEGRAL_SPEEDS; speed++)
X {
X double s;
X
X for (length = 0; length < LIC_INTEGRAL_LEN; length++)
X {
X s = LIC_Length(This) * length / (double)LIC_INTEGRAL_LEN;
X This->NegIntegralTable[speed][length] = This->Filter(This, -s, 0.0, speed);
X This->PosIntegralTable[speed][length] = This->Filter(This, 0.0, s, speed);
X }
X }
X}
X
X
Xdouble
XLIC_Box(LIC *This, double a, double b, int speed)
X /*
X * Compute the integral bewteen points a and b, a <= b, of a box
X * filter:
X *
X * k(s) = 1
X */
X{
X return(b - a);
X}
X
X
Xdouble
XLIC_Ripple(LIC *This, double a, double b, int speed)
X /*
X * Compute the integral bewteen points a and b, a <= b, of a phase shifted
X * Hanning low pass filter multiplied by a Hanning window function:
X *
X * k(s) = (cos(d*s + phase) + 1)/2 * (cos(c*s) + 1)/2
X *
X * We need to scale the filter to the length of the filter support. This
X * requires scaling each occurance of s by Pi/L. Things fall out in the
X * integral which allow us to slip the scaling factors into c and d.
X */
X{
X REGISTER double m; /* speed multiple */
X REGISTER double p; /* phase of the Hanning ripple function */
X REGISTER double f; /* frequency of the Hanning ripple function */
X REGISTER double c; /* Hanning window function dilation constant */
X REGISTER double d; /* Hanning ripple filter dilation constant */
X REGISTER double w; /* integral value */
X
X if (LIC_Length(This) == 0 || a == b)
X return(0.0);
X
X /*
X * Implement ``speed'' variations by scaling the frequency inversely
X * to speed. This causes low magnitude vectors to be convolved using
X * a higher frequency filter which will yield less distinct output
X * features. As the frequency increases the filter begins to approximate
X * the Hanning window filter.
X */
X
X p = LIC_Phase(This);
X f = LIC_Frequency(This) * (6.0 - 5.0*(double)speed/(LIC_INTEGRAL_SPEEDS - 1));
X c = 1.0/LIC_Length(This) * M_PI;
X d = 1.0/LIC_Length(This) * M_PI * f;
X
X w = b - a
X + sin(b*c)/c - sin(a*c)/c
X + sin(b*d + p)/d - sin(a*d + p)/d
X + sin(b*(c+d) + p)/(2*(c+d)) - sin(a*(c+d) + p)/(2*(c+d));
X if (c != d)
X w += sin(b*(c-d) - p)/(2*(c-d))
X - sin(a*(c-d) - p)/(2*(c-d));
X w /= 4;
X return(w);
X}
X
X
Xdouble
XLIC_Ramp(LIC *This, double a, double b, int speed)
X /*
X * Compute the integral bewteen points a and b, a <= b, of a biased
X * triangle filter:
X *
X * k(s) = (s + L) / (2 * L)
X */
X{
X if (LIC_Length(This) == 0)
X return(0.0);
X else
X return((a*a - b*b)/(4*LIC_Length(This)) + (a - b)/2);
X}
X
X
Xdouble
XLIC_Select(LIC *This, double a, double b, int speed)
X /*
X * Compute the integral bewteen points a and b, a <= b, of a
X * narrow Gaussian filter which sits at L-2 along the local
X * streamline. This filter's delta function like shape and
X * it's location near the end of the local streamline means that
X * the filter acts as a pixel selection filter. Hence it's name.
X *
X * k(s) = 1/2*pi * e^(x - L + 2)^2
X */
X{
X if (LIC_Length(This) == 0)
X return(0.0);
X else
X return( erf((b - LIC_Length(This) + 2) / sqrt(2.0))
X - erf((a - LIC_Length(This) + 2) / sqrt(2.0)));
X}
END_OF_FILE
if test 6103 -ne `wc -c <'lic.1.2/liblic/Filters.c'`; then
echo shar: \"'lic.1.2/liblic/Filters.c'\" unpacked with wrong size!
fi
# end of 'lic.1.2/liblic/Filters.c'
fi
if test -f 'lic.1.2/lic/lic.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lic.1.2/lic/lic.c'\"
else
echo shar: Extracting \"'lic.1.2/lic/lic.c'\" \(22645 characters\)
sed "s/^X//" >'lic.1.2/lic/lic.c' <<'END_OF_FILE'
X/*
X * $Header: /d/sisal/a/casey/tmp/lic/lic/RCS/lic.c,v 1.24 1993/08/11 17:25:35 casey Exp $
X */
X
X/*
X * Copyright (c) 1993 The Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms, with or without
X * modification, are permitted provided that the following conditions
X * are met:
X * 1. Redistributions of source code must retain the above copyright
X * notice, this list of conditions and the following disclaimer.
X * 2. Redistributions in binary form must reproduce the above copyright
X * notice, this list of conditions and the following disclaimer in the
X * documentation and/or other materials provided with the distribution.
X * 3. All advertising materials mentioning features or use of this software
X * must display the following acknowledgement:
X * This product includes software developed by the University of
X * California, Lawrence Livermore National Laboratory and its
X * contributors.
X * 4. Neither the name of the University nor the names of its contributors
X * may be used to endorse or promote products derived from this software
X * without specific prior written permission.
X *
X * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
X * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
X * SUCH DAMAGE.
X */
X
X#ifndef lint
X static char rcsid[] = "$Header: /d/sisal/a/casey/tmp/lic/lic/RCS/lic.c,v 1.24 1993/08/11 17:25:35 casey Exp $";
X static char copyright[] =
X "Copyright (c) 1993 The Regents of the University of California.\n"
X "All rights reserved.\n";
X#endif
X
X
X/*
X * UNIX command line interface to the Line Integral Convolution library.
X */
X
X
X#include <stdlib.h>
X#include <unistd.h>
X#include <errno.h>
X#include <string.h>
X#include <stdio.h>
X#include <time.h>
X#include <sys/times.h>
X#include <sys/types.h>
X
X#include <fcntl.h>
X#include <math.h>
X#include <sys/stat.h>
X
X#if defined(HAS_MMAP)
X# include <sys/mman.h>
X#endif
X
X#include <lic.h>
X
X
X#ifdef NEED_EXIT_CODES
X /*
X * EXIT_SUCCESS and EXIT_FAILURE are supposed to be defined in <stdlib.h>
X * according to the ANSI C X3.159-1989 specification, but Sun OS 4.1.1
X * fails to define them ...
X */
X# define EXIT_SUCCESS 0
X# define EXIT_FAILURE 1
X#endif
X
X
X#ifdef NEED_STRERROR
X /*
X * strerror is supposed to be defined in <string.h> and supplied in the
X * standard C library according to the ANSI C X3.159-1989 specification,
X * but Sun OS 4.1.1 fails to define or supply it ... Unfortunately the
X * only way we can control this is with an externally supplied define.
X */
X extern int errno; /* system error number */
X extern char *sys_errlist[]; /* system error messages */
X extern int sys_nerr; /* number of entries in sys_errlist */
X
X static char *
X strerror(int err)
X {
X if (err < 0 || err >= sys_nerr) {
X static char msg[100];
X
X sprintf(msg, "system error number %d", err);
X return(msg);
X }
X return(sys_errlist[err]);
X }
X#endif
X
X
X/*
X * Arguments
X * =========
X */
Xstatic char *usage =
X"usage: %s options in-image in-vector-field out-image\n"
X" -x x-extent - *required* (no default)\n"
X" -y y-extent - *required* (no default)\n"
X" -z z-extent - (default 1)\n"
X" -i i-extent - in-image X extent (default x-extent)\n"
X" -j j-extent - in-image Y extent (default y-extent)\n"
X" -k k-extent - in-image Z extent (default z-extent)\n"
X" -f filter - 'box', 'ripple', 'ramp' or (default 'box')\n"
X" 'select'\n"
X" -n normalization - 'fixed' or 'variable' (default 'variable')\n"
X" -N - input vector field already normalized\n"
X" -l filter-length - (default 10.0)\n"
X" -d filter-frequency - (default 3.0)\n"
X" -p filter-phase - (default 0.0)\n"
X" -L - vary filter-length based on vector magnitude\n"
X" -S - vary filter-phase based on vector magnitude\n"
X" -r default-red - for zero vectors (default -1)\n"
X" -g default-green - for zero vectors (default -1)\n"
X" -b default-blue - for zero vectors (default -1)\n"
X" -a default-alpha - for zero vectors (default -1)\n"
X" -v - verbose progress and timing information\n"
X" -V - version information\n"
X ;
X
Xstatic char *myname; /* argv[0]: name we were invoked by */
Xstatic int size_x = -1; /* -x: X extent */
Xstatic int size_y = -1; /* -y: Y extent */
Xstatic int size_z = 1; /* -z: Z extent (default 1) */
Xstatic int size_i = -1; /* -i: input image X extent */
Xstatic int size_j = -1; /* -j: input image Y extent */
Xstatic int size_k = -1; /* -k: input image Z extent */
Xstatic LIC_Filter
X filter = LIC_Box; /* -f: filter */
Xstatic int normalization = LIC_VARIABLE;
X /* -n: normalization */
Xstatic int normalized = FALSE; /* -N: input vectors prenormalized */
Xstatic double filter_length = 10.0; /* -l: filter length */
Xstatic double filter_frequency = 3.0; /* -d: filter frequency */
Xstatic double filter_phase = 0.0; /* -p: filter phase */
Xstatic int vary_length = FALSE; /* -L: vary length by vector mag. */
Xstatic int vary_speed = FALSE; /* -S: vary phase by vector mag. */
Xstatic int default_red = -1; /* -r: default red ... */
Xstatic int default_green = -1; /* -g: default green ... */
Xstatic int default_blue = -1; /* -b: default blue ... */
Xstatic int default_alpha = -1; /* -a: default alpha for zero vector */
Xstatic int verbose = FALSE; /* -v: display progress information */
Xstatic int version = FALSE; /* -V: display version information */
X
Xstatic char *in_img; /* input image filename */
Xstatic char *in_vec; /* input vector field filename */
Xstatic char *out_img; /* output image filename */
X
X
X/*
X * Local variables
X * ===============
X */
Xstatic time_t t0; /* time we started/ended the LIC */
Xstatic clock_t t0_clk, tN_clk; /* calculation */
Xstatic struct tms t0_tms, tN_tms;
X
Xstatic void *in_img_addr, /* virtual addresses of memory */
X *in_vec_addr, /* mapped input image, input */
X *out_img_addr; /* vector field and output image */
Xstatic off_t in_img_size, /* sizes of image and vector files */
X in_vec_size,
X out_img_size;
X#if !defined(HAS_MMAP)
X static int out_img_fd; /* output image file descriptor */
X#endif
X
X
X/*
X * Local routines
X * ==============
X */
Xint main(int argc, char *argv[]);
Xstatic void ParseArguments(int argc, char *argv[]);
Xstatic void LoadFiles(void);
Xstatic void UnloadFiles(void);
Xstatic void LicFiles(void);
Xstatic void PrintLicStatus(double PercentDone);
Xstatic void PrintLicError(const char *message);
X
X
Xint
Xmain(int argc, char *argv[])
X{
X ParseArguments(argc, argv);
X LoadFiles();
X LicFiles();
X UnloadFiles();
X exit(EXIT_SUCCESS);
X /*NOTREACHED*/
X}
X
X
Xstatic void
XParseArguments(int argc, char *argv[])
X{
X int ch;
X#if defined(HAS_HP_GETOPT)
X extern int getopt(int, char * const [], const char *);
X#else
X extern int getopt(int, char **, char *);
X#endif
X extern char *optarg;
X extern int optind;
X
X myname = strrchr(argv[0], '/');
X if (myname != NULL)
X myname++;
X else
X myname = argv[0];
X while ((ch = getopt(argc, argv, "x:y:z:i:j:k:f:n:Nl:d:p:LSr:g:b:a:vV")) != EOF)
X switch ((char)ch)
X {
X default:
X case '?':
X (void)fprintf(stderr, "%s: unknown option -%c\n",
X myname, ch);
X (void)fprintf(stderr, usage, myname);
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X case 'x':
X size_x = atoi(optarg);
X break;
X case 'y':
X size_y = atoi(optarg);
X break;
X case 'z':
X size_z = atoi(optarg);
X break;
X case 'i':
X size_i = atoi(optarg);
X break;
X case 'j':
X size_j = atoi(optarg);
X break;
X case 'k':
X size_k = atoi(optarg);
X break;
X case 'f':
X if (strcasecmp(optarg, "box") == 0)
X filter = LIC_Box;
X else if (strcasecmp(optarg, "ripple") == 0)
X filter = LIC_Ripple;
X else if (strcasecmp(optarg, "ramp") == 0)
X filter = LIC_Ramp;
X else if (strcasecmp(optarg, "select") == 0)
X filter = LIC_Select;
X else
X {
X (void)fprintf(stderr, "%: invalid filter type %s:"
X " use 'box', 'ripple' or 'ramp'\n",
X myname, optarg);
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X break;
X case 'n':
X if (strcasecmp(optarg, "fixed") == 0)
X normalization = LIC_FIXED;
X else if (strcasecmp(optarg, "variable") == 0)
X normalization = LIC_VARIABLE;
X else
X {
X (void)fprintf(stderr, "%: invalid normalization type %s:"
X " use 'fixed' or 'variable'\n",
X myname, optarg);
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X break;
X case 'N':
X normalized = TRUE;
X break;
X case 'l':
X filter_length = atof(optarg);
X break;
X case 'd':
X filter_frequency = atof(optarg);
X break;
X case 'p':
X filter_phase = atof(optarg);
X break;
X case 'L':
X vary_length = TRUE;
X break;
X case 'S':
X vary_speed = TRUE;
X break;
X case 'r':
X default_red = (*optarg == '-')
X ? -atoi(optarg+1)
X : atoi(optarg);
X break;
X case 'g':
X default_green = (*optarg == '-')
X ? -atoi(optarg+1)
X : atoi(optarg);
X break;
X case 'b':
X default_blue = (*optarg == '-')
X ? -atoi(optarg+1)
X : atoi(optarg);
X break;
X case 'a':
X default_alpha = (*optarg == '-')
X ? -atoi(optarg+1)
X : atoi(optarg);
X break;
X case 'v':
X verbose = TRUE;
X break;
X case 'V':
X version = TRUE;
X break;
X }
X
X if (version)
X (void)printf("%s: compiled with LIC library using %d byte %s pixels\n",
X myname, LIC_ConfiguredPixelSize(),
X LIC_ConfiguredPixelType());
X
X if (argc != optind + 3)
X {
X (void)fprintf(stderr, "%s: need three file options\n", myname);
X (void)fprintf(stderr, usage, myname);
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X in_img = argv[optind + 0];
X in_vec = argv[optind + 1];
X out_img = argv[optind + 2];
X if (size_x == -1 || size_y == -1)
X {
X (void)fprintf(stderr, "%s: must specify both -x and -y options ...\n",
X myname);
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X if (size_i == -1)
X size_i = size_x;
X if (size_j == -1)
X size_j = size_y;
X if (size_k == -1)
X size_k = size_z;
X}
X
X
X#if defined(HAS_MMAP)
X
X/*
X * Versions of LoadFiles and UnloadFiles for systems that support mmap(2).
X */
X
Xstatic void
XLoadFiles(void)
X /*
X * Map input and output files into virtual memory. Make sure that the
X * input files match the user specified sizes and pre-extend the
X * output file to its final length.
X */
X{
X char c;
X int fd;
X struct stat stbuf;
X
X /*
X * Map input vector field into virtual memory. (We always map the
X * input vector field first because it will always be larger than
X * either of the other two files. This should, hopefully, give the
X * operating system the best possible chance to find virtual address
X * space for the three files.)
X */
X fd = open(in_vec, O_RDONLY);
X if (fd < 0)
X {
X (void)fprintf(stderr, "%s: unable to open %s: %s\n",
X myname, in_vec, strerror(errno));
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X if (fstat(fd, &stbuf) < 0)
X {
X (void)fprintf(stderr, "%s: unable to stat %s: %s\n",
X myname, in_vec, strerror(errno));
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X in_vec_size = stbuf.st_size;
X if (size_x * size_y * size_z * sizeof(float) * (size_z == 1 ? 2 : 3)
X != in_vec_size)
X {
X (void)fprintf(stderr, "%s: input vector field size doesn't"
X " match %d * x=%d * y=%d * z=%d\n",
X myname, sizeof(float) * (size_z == 1 ? 2 : 3),
X size_x, size_y, size_z);
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X in_vec_addr = mmap((void *)0, (int)in_vec_size, PROT_READ,
X MAP_SHARED, fd, (off_t)0);
X if ((int)in_vec_addr == -1)
X {
X (void)fprintf(stderr, "%s: unable to map %s: %s\n",
X myname, in_vec, strerror(errno));
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X (void)close(fd);
X
X /*
X * Map input image into virtual memory.
X */
X fd = open(in_img, O_RDONLY);
X if (fd < 0)
X {
X (void)fprintf(stderr, "%s: unable to open %s: %s\n",
X myname, in_img, strerror(errno));
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X if (fstat(fd, &stbuf) < 0)
X {
X (void)fprintf(stderr, "%s: unable to stat %s: %s\n",
X myname, in_img, strerror(errno));
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X in_img_size = stbuf.st_size;
X if (size_i * size_j * size_k * LIC_ConfiguredPixelSize() != in_img_size)
X {
X (void)fprintf(stderr, "%s: input image size doesn't"
X " match %d * x=%d * y=%d * z=%d\n",
X myname, LIC_ConfiguredPixelSize(),
X size_i, size_j, size_k);
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X in_img_addr = mmap((void *)0, (int)in_img_size, PROT_READ,
X MAP_SHARED, fd, (off_t)0);
X if ((int)in_img_addr == -1)
X {
X (void)fprintf(stderr, "%s: unable to map %s: %s\n",
X myname, in_img, strerror(errno));
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X (void)close(fd);
X
X /*
X * Map output image into virtual memory.
X */
X fd = open(out_img, O_CREAT|O_RDWR|O_EXCL, 0666);
X if (fd < 0)
X {
X (void)fprintf(stderr, "%s: unable to open %s: %s\n",
X myname, out_img, strerror(errno));
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X out_img_size = size_x * size_y * size_z * LIC_ConfiguredPixelSize();
X (void)lseek(fd, out_img_size - 1, SEEK_SET);
X c = '\0';
X if (write(fd, &c, 1) != 1)
X {
X (void)fprintf(stderr, "%s: unable to preextend %s to %ld bytes: %s\n",
X myname, out_img, strerror(errno));
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X out_img_addr = mmap((void *)0, (int)out_img_size, PROT_WRITE,
X MAP_SHARED, fd, (off_t)0);
X if ((int)out_img_addr == -1)
X {
X (void)fprintf(stderr, "%s: unable to map %s: %s\n",
X myname, out_img, strerror(errno));
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X (void)close(fd);
X}
X
X
Xstatic void
XUnloadFiles(void)
X /*
X * Unmap input and output files from virtual memory.
X */
X{
X (void)munmap(in_img_addr, (int)in_img_size);
X (void)munmap(in_vec_addr, (int)in_vec_size);
X (void)munmap(out_img_addr, (int)out_img_size);
X}
X
X#else /* HAS_MMAP */
X
X/*
X * Versions of LoadFiles and UnloadFiles for systems that *don't* support
X * mmap(2).
X */
X
Xstatic void
XLoadFiles(void)
X /*
X * Load input files into malloc'ed memory and malloc memory for
X * output image. Make sure that the input files match the user
X * specified sizes. Preallocate output image on disk in order to
X * make sure we have the space to output the image later in
X * UnloadFiles.
X */
X{
X int fd;
X struct stat stbuf;
X
X /*
X * Load input image into malloc'ed memory.
X */
X fd = open(in_img, O_RDONLY);
X if (fd < 0)
X {
X (void)fprintf(stderr, "%s: unable to open %s: %s\n",
X myname, in_img, strerror(errno));
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X if (fstat(fd, &stbuf) < 0)
X {
X (void)fprintf(stderr, "%s: unable to stat %s: %s\n",
X myname, in_img, strerror(errno));
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X in_img_size = stbuf.st_size;
X if (size_i * size_j * size_k * LIC_ConfiguredPixelSize()
X != in_img_size)
X {
X (void)fprintf(stderr, "%s: input image size doesn't"
X " match %d * x=%d * y=%d * z=%d\n",
X myname, LIC_ConfiguredPixelSize(),
X size_i, size_j, size_k);
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X in_img_addr = malloc(in_img_size);
X if (in_img_addr == NULL)
X {
X (void)fprintf(stderr, "%s: unable to allocate %u bytes for"
X " input image\n", myname, in_img_size);
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X if (read(fd, in_img_addr, in_img_size) != in_img_size)
X {
X (void)fprintf(stderr, "%s: unable to read %u bytes from %s\n",
X myname, in_img_size, in_img);
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X (void)close(fd);
X
X /*
X * Load input vector field into malloc'ed memory.
X */
X fd = open(in_vec, O_RDONLY);
X if (fd < 0)
X {
X (void)fprintf(stderr, "%s: unable to open %s: %s\n",
X myname, in_vec, strerror(errno));
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X if (fstat(fd, &stbuf) < 0)
X {
X (void)fprintf(stderr, "%s: unable to stat %s: %s\n",
X myname, in_vec, strerror(errno));
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X in_vec_size = stbuf.st_size;
X if (size_x * size_y * size_z * sizeof(float) * (size_z == 1 ? 2 : 3)
X != in_vec_size)
X {
X (void)fprintf(stderr, "%s: input vector field size doesn't"
X " match %d * x=%d * y=%d * z=%d\n",
X myname, (size_z == 1 ? 2 : 3),
X size_x, size_y, size_z);
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X in_vec_addr = malloc(in_vec_size);
X if (in_vec_addr == NULL)
X {
X (void)fprintf(stderr, "%s: unable to allocate %u bytes for"
X " input vector field\n", myname, in_vec_size);
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X if (read(fd, in_vec_addr, in_vec_size) != in_vec_size)
X {
X (void)fprintf(stderr, "%s: unable to read %u bytes from %s\n",
X myname, in_vec_size, in_vec);
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X (void)close(fd);
X
X /*
X * Open output file and allocate space for output image (both in
X * memory and on disk).
X */
X out_img_fd = open(out_img, O_CREAT|O_WRONLY|O_EXCL, 0666);
X if (out_img_fd < 0)
X {
X (void)fprintf(stderr, "%s: unable to open %s: %s\n",
X myname, out_img, strerror(errno));
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X out_img_size = size_x * size_y * size_z * LIC_ConfiguredPixelSize();
X out_img_addr = malloc(out_img_size);
X if (out_img_addr == NULL)
X {
X (void)fprintf(stderr, "%s: unable to allocate %u bytes for"
X " output image\n", myname, out_img_size);
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X if (write(out_img_fd, out_img_addr, out_img_size) != out_img_size)
X {
X (void)fprintf(stderr, "%s: unable to extend %s to %u bytes\n",
X myname, out_img, out_img_size);
X exit(EXIT_FAILURE);
X /*NOTREACHED*/
X }
X (void)lseek(out_img_fd, (off_t)0, SEEK_SET);
X}
X
X
Xstatic void
XUnloadFiles(void)
X /*
X * Free malloc'ed space used by input files, write output image and
X * free up it's malloc'ed memory.
X */
X{
X if (write(out_img_fd, out_img_addr, out_img_size) != out_img_size)
X (void)fprintf(stderr, "%s: unable to write %u bytes to %s!\n",
X myname, out_img_size, out_img);
X close(out_img_fd);
X free(in_img_addr);
X free(in_vec_addr);
X free(out_img_addr);
X}
X
X#endif /* HAS_MMAP */
X
X
Xstatic void
XLicFiles()
X /*
X * Execute LIC algorithm on arguments.
X */
X{
X LIC *lic;
X
X lic = LIC_Create((unsigned char *)in_img_addr, size_i, size_j, size_k,
X (float *) in_vec_addr, size_x, size_y, size_z,
X (unsigned char *)out_img_addr,
X filter, normalization, normalized,
X filter_length,
X filter_frequency,
X vary_length,
X vary_speed && (filter == LIC_Ripple),
X default_red, default_green, default_blue, default_alpha,
X verbose ? PrintLicStatus : (void (*)(double))NULL,
X PrintLicError);
X if (lic == (LIC *)NULL)
X {
X (void)fprintf(stderr, "%s: LIC_Create returned NULL!\n", myname);
X return;
X }
X LIC_ChangePhase(lic, filter_phase);
X
X /*
X * Build integral tables here so the build isn't computed as part of
X * time to compute the image.
X */
X LIC_BuildIntegralTables(lic);
X
X t0 = time(NULL);
X t0_clk = times(&t0_tms);
X LIC_ComputeImage(lic);
X tN_clk = times(&tN_tms);
X
X LIC_Destroy(lic);
X
X if (verbose)
X {
X long clk_tck = sysconf(_SC_CLK_TCK);
X#if defined(HAS_OLD_TIMES)
X double wall = (double)(time(NULL) - t0);
X#else
X double wall = (double)(tN_clk - t0_clk )/clk_tck;
X#endif
X double cpu = (double)(tN_tms.tms_utime - t0_tms.tms_utime)/clk_tck;
X double ncells = (double)(size_x * size_y * size_z);
X
X if (wall == 0.0)
X wall = 1.0e-6;
X if (cpu == 0.0)
X cpu = 1.0e-6;
X (void)printf("\n"
X "Performance statistics\n"
X "--------------------------------\n"
X "CPU utilization = %d%%\n"
X "CPU time (seconds) = %.2f\n"
X "Cells processed per second = %.2f\n"
X "Ave loop count = %.2f\n"
X "Ave length = %.2f\n",
X (int)(cpu/wall*100),
X cpu,
X ncells/cpu,
X lic->TotalLoopCount/ncells/2,
X lic->TotalLength/ncells/2);
X }
X}
X
X
Xstatic void
XPrintLicStatus(double PercentDone)
X /*
X * Output the current LIC progress statistics. (Only called if verbose
X * is TRUE.)
X */
X{
X if (PercentDone == 0.0)
X (void)printf("%s: %6.2f%% done ...\r", myname, PercentDone);
X else
X {
X /*
X * Should really use a smoothed exponentially decaying sample series
X * of CPU utilization to predict future CPU utilization to get better
X * estimates of completion times. But, I mean, get real. This is
X * really just a convenience! :-) So, we cheat and just use CPU
X * utilization since the start of the computation to predict future
X * CPU ultilization.
X */
X time_t t = time(NULL);
X time_t tN = t0 + (unsigned int)((double)(t-t0) * 100/PercentDone);
X char *cp = ctime(&tN);
X char cbuf[26];
X
X (void)strcpy(cbuf, cp);
X cbuf[24] = '\0';
X (void)printf("%s: %6.2f%% done, estimated completion: %s\r",
X myname, PercentDone, cbuf);
X }
X fflush(stdout);
X}
X
X
Xstatic void
XPrintLicError(const char *message)
X /*
X * Print an error reported by the LIC subroutine library.
X */
X{
X (void)fprintf(stderr, "%s: LIC library error: %s\n", myname);
X}
END_OF_FILE
if test 22645 -ne `wc -c <'lic.1.2/lic/lic.c'`; then
echo shar: \"'lic.1.2/lic/lic.c'\" unpacked with wrong size!
fi
# end of 'lic.1.2/lic/lic.c'
fi
echo shar: End of archive 6 \(of 10\).
cp /dev/null ark6isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 10 archives.
rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
echo You still must unpack the following archives:
echo " " ${MISSING}
fi
exit 0
exit 0 # Just in case...