diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /graphics/tiff |
Initial commit
Diffstat (limited to 'graphics/tiff')
-rw-r--r-- | graphics/tiff/HOWTO | 72 | ||||
-rw-r--r-- | graphics/tiff/README | 31 | ||||
-rw-r--r-- | graphics/tiff/TIFF6.ps.gz | bin | 0 -> 177271 bytes | |||
-rw-r--r-- | graphics/tiff/TTN1.ps | 1089 | ||||
-rw-r--r-- | graphics/tiff/TTN2.draft.txt | 705 | ||||
-rw-r--r-- | graphics/tiff/TTN2.draft.txt.gz | bin | 0 -> 12373 bytes | |||
-rw-r--r-- | graphics/tiff/tiff-v3.4-tar.gz | bin | 0 -> 573908 bytes | |||
-rw-r--r-- | graphics/tiff/tiff-v3.4beta018-tar.gz | bin | 0 -> 498508 bytes | |||
-rw-r--r-- | graphics/tiff/tiff-v3.4beta024-tar.gz | bin | 0 -> 523842 bytes | |||
-rw-r--r-- | graphics/tiff/tiff-v3.4beta028-tar.gz | bin | 0 -> 545437 bytes | |||
-rw-r--r-- | graphics/tiff/tiff-v3.4beta029-tar.gz | bin | 0 -> 552051 bytes | |||
-rw-r--r-- | graphics/tiff/v3.4.0.patch-01 | 752 |
12 files changed, 2649 insertions, 0 deletions
diff --git a/graphics/tiff/HOWTO b/graphics/tiff/HOWTO new file mode 100644 index 0000000000..11f6c607cb --- /dev/null +++ b/graphics/tiff/HOWTO @@ -0,0 +1,72 @@ +$Header: /usr/people/sam/tiff/RCS/HOWTO,v 1.16 1996/04/29 19:42:29 sam Exp $ + +How To Obtain This Software (in case all you get is this file) + +The software is available for public ftp on + sgi.com graphics/tiff/tiff-v3.4-tar.Z + (192.48.153.1) + +For example, + % ftp -n sgi.com + .... + ftp> user anonymous + ... <type in password> + ftp> cd graphics/tiff + ftp> binary + ftp> get tiff-v3.4-tar.Z + +In general, the latest version of the 3.4 release of the software is +always available as "tiff-v3.4-tar.Z" in the ftp directory. This file +is a link to the appropriate released version (so don't waste your time +retrieving the linked file as well!) Any files of the form tiff-v3.4-patch* +are shell scripts that can be used to patch older versions of the +source code. For example, the file tiff-v3.4-patch01 would contain +patches to update tiff-v3.4-tar.Z. Patch files only work to go between +consecutive versions, so if you are multiple versions behind the latest +release, you will need to apply each patch file between your current +version and the latest. + + +Obtaining the Software by Electronic Mail +----------------------------------------- +Do not send me requests for the software; they will be ignored (without +response). If you cannot use FTP at all, there is a service called +"ftpmail" available from decwrl.dec.com: you can send e-mail to +this machine and it will use FTP to retrieve files for you and send you +the files back again via e-mail. To find out more about the ftpmail +service, send a message to "ftpmail@decwrl.dec.com" whose body +consists of the single line "help". + + +What to do Once You've Retrieved Stuff +-------------------------------------- +The software comes in a compressed tar file. To extract the +information: + + zcat tiff-v3.4-tar.Z | tar xf - + +(uncompress and extract individual files in current directory). + +There is also a companion compressed tar file, v3.0pics.tar.Z +that has sample TIFF image files. These are mostly useful in +testing the software if/when you port it to an unsupported system. + + +TIFF Mailing List +----------------- +A mailing list for users of this software is located on sgi.com. +If you want to join this mailing list or have a list-related request +such as getting your name removed from it, send a request to + + tiff-request@sgi.com + +For example, to subscribe, send the line "subscribe" in the body of +your message. The line "help" will return a list of the commands +understood by the mailing list management software. + +Submissions (including bug reports) should be directed to: + + tiff@sgi.com + +When corresponding about this software please always specify what +version you have and what system you're running on. diff --git a/graphics/tiff/README b/graphics/tiff/README new file mode 100644 index 0000000000..97703cdee4 --- /dev/null +++ b/graphics/tiff/README @@ -0,0 +1,31 @@ +Fri Jul 7 17:18:37 PDT 1995 + +There is free TIFF software here. Multiple versions are no longer provided. + + 2694 May 24 11:47 HOWTO basic info on what to get + 693 Mar 31 1992 README this file +1070958 Jun 18 1992 TIFF6.ps TIFF 6.0 spec in PostScript + 280700 Jun 18 1992 TIFF6.ps.Z compressed version of TIFF6.ps +1531799 Mar 31 1992 v3.0pics.tar.Z test images + 573147 Jul 7 1995 tiff-v3.4*-tar.gz latest distribution + +Signatures on the source code distribution: + +Standard checksum (sum tiff-v3.4-tar.gz): 63113 1121 +Alternate checksum (sum -r tiff-v3.4-tar.gz): 38499 1121 +MD5 signature (md5 tiff-v3.4-tar.gz): 2a7fbbccdb805e39489176f8eb9a703b + +Look at HOWTO for info on the mailing list. + + Sam + +To appease the SGI public ftp mafia ... +------------------------------------------------------------------------------ +This software is provided without support and without any obligation on the +part of Silicon Graphics, Inc. to assist in its use, correction, modification +or enhancement. There is no guarantee that this software will be included +in future software releases. + +THIS SOFTWARE IS PROVIDED "AS IS" WITH NO WARRANTIES OF ANY KIND INCLUDING THE +WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR +PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. diff --git a/graphics/tiff/TIFF6.ps.gz b/graphics/tiff/TIFF6.ps.gz Binary files differnew file mode 100644 index 0000000000..ad3e547d6d --- /dev/null +++ b/graphics/tiff/TIFF6.ps.gz diff --git a/graphics/tiff/TTN1.ps b/graphics/tiff/TTN1.ps new file mode 100644 index 0000000000..dd946c5362 --- /dev/null +++ b/graphics/tiff/TTN1.ps @@ -0,0 +1,1089 @@ +%!PS-Adobe-3.0 +%%Title: TTN1.TiffTrees.930601 +%%Creator: PageMaker 5.0 +%%CreationDate: 7-27-1993, 12:08:48 +%%For: Steve Carlsen,Eng +%%Pages: (atend) +%%PageOrder: Ascend +%%BoundingBox: 0 0 612 792 +%%DocumentNeededResources: (atend) +%%DocumentSuppliedResources: (atend) +%%CMYKCustomColor: (atend) +%%DocumentCustomColors: (atend) +%%DocumentProcessColors: (atend) +%%DocumentPrinterRequired: () (Apple LaserWriter II NT) +%ALDOriginalFile: BIG:Documents:TIFF Tech Notes:TTN1.TiffTrees.930601 +%%EndComments +%%BeginProlog +%%BeginResource: procset ALPS_PS 1.0 1 +%%Copyright: (C) Copyright 1992 Aldus Corporation. All Rights Reserved. +%%Version: 1.0 1 +/setpacking where{pop currentpacking true setpacking}if userdict/ALPS 385 +dict +dup begin userdict/ALPS known{/$MetalHead ALPS def}{/$MetalHead currentdict +def}ifelse/ALPS currentdict def put/bdef{bind def}bind def/xdef{exch +def}bdef +/ldef{load def}bdef/ndef{1 index where{pop pop pop}{dup xcheck{bind}if def} +ifelse}bdef/T true def/F false def/q`[currenttransfer]cvx def/PSScreen[ +currentscreen]cvx def/PSsetgray systemdict/setgray get def/_PSdef matrix +def +/_WCmtx matrix def/_LPmtx matrix def/bse^{0 0 transform round exch round +exch +itransform translate}bdef/j`{_PSdef currentmatrix pop}bdef/ps${gsave scale +_WCmtx currentmatrix pop grestore scale}bdef/k`{_LPmtx currentmatrix +pop}bdef +/l`{_LPmtx setmatrix}bdef/m`{{90 rotate pop 0 exch neg translate}{-90 +rotate +neg 0 translate pop}ifelse}bdef/p`{dup length 2 add array cvx dup 3 -1 roll +2 +exch putinterval dup 0 4 -1 roll put dup 1/exec load +put}bdef/setcmykcolor{1 +sub 4 1 roll 3{3 index add neg dup 0 lt{pop 0}if 3 1 roll}repeat systemdict +/setrgbcolor get exec pop}ndef/setcustomcolor{exch aload pop pop 4{4 index +mul +4 1 roll}repeat setcmykcolor pop}ndef/setprocesscolor{exch aload pop pop +4{4 +index mul 4 1 roll}repeat setcmykcolor pop}ndef/findcmykcustomcolor{5 +/packedarray where{pop packedarray}{array astore readonly}ifelse}ndef +/findcmykprocesscolor{5/packedarray where{pop packedarray}{array astore +readonly}ifelse}ndef/newcmykcustomcolor{6/packedarray where{pop +packedarray}{ +array astore +readonly}ifelse}ndef/setoverprint{pop}ndef/currentoverprint{false +}ndef/setseparationgray{PSsetgray}ndef/separationimage{image}ndef/proc1 +null +def/proc2 null def/newproc null def/ic 0 def/im 0 def/iy 0 def/ik 0 +def/imtnt +0 def/imsptnt 0 def/magentabuf null def/yellowbuf null def/blackbuf null +def +/level2/languagelevel where{pop languagelevel 1 ne}{false}ifelse def +/colorexists level2{statusdict/processcolors known{statusdict/processcolors +get exec}{1}ifelse 4 eq def}{systemdict/setcmykcolor known +def}ifelse/colimbuf +{0 1 2 index length 1 sub{dup 2 index exch get 255 exch sub 2 index 3 1 +roll +put}for}bdef/imagecmyk{ALPS begin aload pop/ik xdef/iy xdef/im xdef/ic xdef +end}bdef/addprocs{ALPS begin/packedarray where{pop dup type/packedarraytype +eq +2 index type/packedarraytype eq or}{false}ifelse{/proc2 exch cvlit +def/proc1 +exch cvlit def proc1 aload pop proc2 aload pop proc1 length proc2 length +add +packedarray cvx}{/proc2 exch cvlit def/proc1 exch cvlit def/newproc proc1 +length proc2 length add array def newproc 0 proc1 putinterval newproc proc1 +length proc2 putinterval newproc cvx}ifelse end}bdef/currentcolortransfer{ +currenttransfer dup dup dup}ndef/setcolortransfer{systemdict begin +settransfer +end pop pop pop}ndef/customcolorimage{ALPS begin colorexists{aload pop pop +4 +array astore imagecmyk currentcolortransfer{ik mul ik sub 1 add}addprocs 4 +1 +roll{iy mul iy sub 1 add}addprocs 4 1 roll{im mul im sub 1 add}addprocs 4 1 +roll{ic mul ic sub 1 add}addprocs 4 1 roll setcolortransfer/magentabuf 0 +string def/yellowbuf 0 string def/blackbuf 0 string def{colimbuf dup length +magentabuf length ne{dup length dup dup/magentabuf exch string +def/yellowbuf +exch string def/blackbuf exch string def}if dup magentabuf copy yellowbuf +copy +blackbuf copy pop}addprocs{magentabuf}{yellowbuf}{blackbuf}true 4 +colorimage}{ +aload pop pop 4 array astore imagecmyk getimtnt currenttransfer{imtnt mul 1 +imtnt sub add}addprocs settransfer image}ifelse end}ndef/getimtnt{ic .3 mul +im +.59 mul iy .11 mul ik add add add dup 1 gt{pop 1}if/imtnt xdef}bdef/j2`{ +setcustomcolor}bdef/k2`{setprocesscolor}bdef/l2`{F setoverprint 1 exch sub +setseparationgray pop}bdef/m2`{pop pop}bdef/n2`{null eq{pop pop/m2` load +def +false def}{null eq{pop/l2` load def}{{/k2` load def}{/j2` load def}ifelse} +ifelse true def}ifelse}bdef/_ft null def/_fc null def/_f? false def/_fo +false +def/o2` null def/N` null def/_fpat null def/_fpatn null def/_st null +def/_sc +null def/_s? false def/_so false def/q2` null def/O` null def/Q` null +def/P` +null def/u2` null def/_LBOmtx matrix def/_LBOgsave matrix def/_x1 null +def/_y1 +null def/_x2 null def/_y2 null def/_rdp null def/_LLx null def/_LLy null +def +/_URx null def/_URy null def/_th null def/_hthk null def/_rd null def/_wp +null +def/_hp null def/_diam null def/_w null def/_h null def/_dshlen null +def/_rem +null def/_spclen null def/_undo? false def/_dch(X)def/xfont null def/_ch +null +def/_prcs? false def/b`{/_prcs? xdef/_ft xdef dup null ne{_prcs?{ +findcmykprocesscolor}{findcmykcustomcolor}ifelse}if/_fc xdef/_f?/o2` _prcs? +_fc _ft n2` atlanta^}bdef/atlanta^{_f?{/N`{_fo setoverprint _fc _ft o2` +_fpat +null eq{fill}{_fpat j1`}ifelse}def}{/N`{newpath}def}ifelse}bdef/c`{/_fpatn +xdef _fpatn null eq{/_fpat null def}{/_fpat _fpatn findfont +def}ifelse}bdef/e` +{/_fo xdef}bdef/a`{/_prcs? xdef/_st xdef dup null ne{_prcs?{ +findcmykprocesscolor}{findcmykcustomcolor}ifelse}if/_sc xdef/_s?/q2` _prcs? +_sc _st n2` seattle^}bdef/seattle^{_s?{/O`{_so setoverprint _sc _st q2` +stroke +}def/Q`{_so setoverprint _sc _st q2` fill}def/P`/Q` load def/u2`{_so +setoverprint _sc _st q2` +show}def}{/O`{newpath}def/Q`{newpath}def/P`{newpath} +def/u2`{pop}def}ifelse}bdef/f`{/_so xdef}bdef/arct{arcto pop pop pop +pop}ndef +/u`{_LBOgsave currentmatrix pop translate scale 1 0 moveto 0 0 1 360 0 arcn +closepath _LBOgsave setmatrix}bdef/v`{moveto 1 index 0 rlineto 0 exch +rlineto +neg 0 rlineto closepath}bdef/w`{/_y2 xdef/_x2 xdef/_y1 xdef/_x1 xdef/_rdp +xdef +_x1 _y1 _rdp add moveto _x1 _y2 _x2 _y2 _rdp arct _x2 _y2 _x2 _y1 _rdp arct +_x2 _y1 _x1 _y1 _rdp arct _x1 _y1 _x1 _y2 _rdp arct closepath}bdef/bell^{{ +_LBOmtx astore concat}if}bdef/south^{/_URy xdef/_URx xdef/_LLy xdef/_LLx +xdef} +bdef/lpd^{gsave translate rotate}bdef/jp^{grestore}bdef/bh^{gsave bell^ +south^ +/_th xdef _URx _LLx sub abs _th sub _URy _LLy sub abs _th sub _LLx _th 2 +div +add _LLy _th 2 div add v` gsave N` grestore _th setlinewidth O` +grestore}bdef +/y`{gsave bell^ 2{2 index sub 4 1 roll}repeat v`{N`}{P`}ifelse +grestore}bdef +/z`{gsave bell^ south^/_th xdef _th 2 div/_x1 _LLx 2 index add def/_y1 _LLy +2 +index add def/_x2 _URx 2 index sub def/_y2 _URy 2 index sub def pop 6 index +4 +copy 0 _LLx _y1 gsave samson^ _th setlinewidth O` grestore 0 _LLx _y2 gsave +samson^ _th setlinewidth O` grestore 4 index 4 copy 90 _x1 _LLy gsave +samson^ +_th setlinewidth O` grestore 90 _x2 _LLy gsave samson^ _th setlinewidth O` +grestore _th lt exch _th lt and{F _LLx _LLy _LLx _th add _LLy _th add F y` +F +_LLx _URy _th sub _LLx _th add _URy F y` F _URx _th sub _LLy _URx _LLy _th +add +F y` F _URx _th sub _URy _th sub _URx _URy F y`}if grestore}bdef/A`{gsave +bell^ south^/_th xdef/_ch xdef xfont _th scalefont setfont _th 2 div/_x1 +_LLx +2 index add def/_y1 _LLy 2 index add def/_x2 _URx 2 index sub def/_y2 _URy +2 +index sub def pop{4 copy _ch 0 _LLx _y1 F roswell^ _ch 0 _LLx _y2 F +roswell^}{ +4 copy 0 _LLx _y1 gsave samson^ _th setlinewidth O` grestore 0 _LLx _y2 +gsave +samson^ _th setlinewidth O` grestore}ifelse{4 copy _ch 90 _x1 _LLy F +roswell^ +_ch 90 _x2 _LLy F roswell^}{4 copy 90 _x1 _LLy gsave samson^ _th +setlinewidth +O` grestore 90 _x2 _LLy gsave samson^ _th setlinewidth O` grestore}ifelse +grestore}bdef/nba^{gsave bell^ south^/_rd xdef/_th xdef/_wp _URx _LLx sub +abs +_th sub def/_hp _URy _LLy sub abs _th sub def/_diam _rd 2 mul _th sub +def/_w +_wp _diam ge{_wp}{_diam}ifelse def/_h _hp _diam ge{_hp}{_diam}ifelse def +_LBOgsave currentmatrix pop _LLx _th 2 div add _LLy _th 2 div add translate +_diam _wp gt{_wp _diam div}{1}ifelse _diam _hp gt{_hp _diam div}{1}ifelse +scale _rd _th 2 div sub 0 0 _w _h w` _LBOgsave setmatrix gsave N` grestore +_th +setlinewidth O` grestore}bdef/C`{gsave bell^ south^/_rd xdef/_wp _URx _LLx +sub +abs def/_hp _URy _LLy sub abs def/_diam _rd 2 mul def/_w _wp _diam ge{_wp}{ +_diam}ifelse def/_h _hp _diam ge{_hp}{_diam}ifelse def _LBOgsave +currentmatrix +pop _LLx _LLy translate _diam _wp gt{_wp _diam div}{1}ifelse _diam _hp +gt{_hp +_diam div}{1}ifelse scale _rd 0 0 _w _h w` _LBOgsave +setmatrix{N`}{P`}ifelse +grestore}bdef/D`{gsave bell^ south^/_rd xdef/_th xdef/_hthk _th 2 div +def/_wp +_URx _LLx sub abs _th sub def/_hp _URy _LLy sub abs _th sub def _hthk _rd +ge{ +_wp _hp _LLx _hthk add _LLy _hthk add v` N`}{gsave _LLx _hthk add _LLy +_hthk +add translate _rd _hthk sub 0 0 _wp _hp w` N` grestore}ifelse/_w _URx _LLx +sub +abs def/_h _URy _LLy sub abs def _w 2 _th mul sub _h 2 _th mul sub _LLx _th +add _LLy _th add v` _rd _LLx _LLy _URx _URy w` Q` grestore}bdef/E`{gsave +bell^ +south^/_rd xdef/_th xdef/_wp _URx _LLx sub abs _th sub def/_hp _URy _LLy +sub +abs _th sub def/_diam _rd 2 mul _th sub def/_w _wp _diam +ge{_wp}{_diam}ifelse +def/_h _hp _diam ge{_hp}{_diam}ifelse def _LBOmtx currentmatrix pop _LLx +_th 2 +div add _LLy _th 2 div add translate _diam _wp gt{_wp _diam div}{1}ifelse +_diam _hp gt{_hp _diam div}{1}ifelse scale _LBOgsave currentmatrix pop _th +_rd +gt dup{_rd 2 div}{_rd _th 2 div sub}ifelse 0 0 _w _h auburn^ _LBOmtx +setmatrix +{_rd}{_th}ifelse setlinewidth O` _LBOgsave setmatrix{/_x1 _rd 4 index _th 2 +div sub add def 4 copy 0 _x1 0 gsave samson^ _LBOmtx setmatrix _th +setlinewidth O` grestore 0 _x1 _h gsave samson^ _LBOmtx setmatrix _th +setlinewidth O` grestore}if{/_y1 _rd 4 index _th 2 div sub add def 4 copy +90 0 +_y1 gsave samson^ _LBOmtx setmatrix _th setlinewidth O` grestore 90 _w _y1 +gsave samson^ _LBOmtx setmatrix _th setlinewidth O` grestore}if +grestore}bdef +/F`{gsave bell^ south^/_rd xdef/_th xdef/_ch xdef xfont _th scalefont +setfont +/_wp _URx _LLx sub abs _th sub def/_hp _URy _LLy sub abs _th sub def/_diam +_rd +2 mul _th sub def/_w _wp _diam ge{_wp}{_diam}ifelse def/_h _hp _diam +ge{_hp}{ +_diam}ifelse def _LBOmtx currentmatrix pop _LLx _th 2 div add _LLy _th 2 +div +add translate _diam _wp gt{_wp _diam div}{1}ifelse _diam _hp gt{_hp _diam +div} +{1}ifelse scale _LBOgsave currentmatrix pop _th _rd gt dup{_rd 2 div}{_rd +_th +2 div sub}ifelse 0 0 _w _h auburn^ _LBOmtx setmatrix{_rd}{_th}ifelse +setlinewidth O` _LBOgsave setmatrix{/_x1 _rd 4 index _th 2 div sub add def +4 +copy _ch 0 _x1 0 T roswell^ _ch 0 _x1 _h T roswell^}if{/_y1 _rd 4 index _th +2 +div sub add def 4 copy _ch 90 0 _y1 T roswell^ _ch 90 _w _y1 T roswell^}if +grestore}bdef/auburn^{/_y2 xdef/_x2 xdef/_y1 xdef/_x1 xdef/_rdp xdef _x1 +_y1 +_rdp add moveto _x1 _y1 _x2 _y1 _rdp arct _x2 _rdp sub _y1 moveto _x2 _y1 +_x2 +_y2 _rdp arct _x2 _y2 _rdp sub moveto _x2 _y2 _x1 _y2 _rdp arct _x1 _rdp +add +_y2 moveto _x1 _y2 _x1 _y1 _rdp arct}bdef/jmk${gsave bell^ south^/_th +xdef/_w +_URx _LLx sub abs 2 div def/_h _URy _LLy sub abs 2 div def _w _th 2 div sub +_h +_th 2 div sub _LLx _w add _LLy _h add u` gsave N` grestore _th setlinewidth +O` +grestore}bdef/H`{gsave bell^ south^ _URx _LLx sub abs 2 div _URy _LLy sub +abs +2 div _LLx 2 index add _LLy 2 index add u`{N`}{P`}ifelse grestore}bdef/I`{ +gsave bell^ south^/_th xdef/_w _URx _LLx sub abs 2 div def/_h _URy _LLy sub +abs 2 div def _w _th 2 div sub _h _th 2 div sub _LLx _w add _LLy _h add +_LBOmtx currentmatrix pop translate scale _LBOgsave currentmatrix pop 1 0 +moveto 0 exch 360{0 0 1 4 -1 roll dup 5 index add arc _LBOmtx setmatrix _th +setlinewidth O` _LBOgsave setmatrix}for pop grestore}bdef/J`{gsave bell^ +south^/_th xdef _dch 0 3 -1 roll put xfont _th scalefont setfont/_w _URx +_LLx +sub abs 2 div def/_h _URy _LLy sub abs 2 div def _w _th 2 div sub _h _th 2 +div +sub _LLx _w add _LLy _h add _LBOmtx currentmatrix pop translate scale +_LBOgsave currentmatrix pop 1 0 moveto 0 exch 360{0 0 1 4 -1 roll dup arc +_LBOmtx setmatrix _dch u2` newpath _LBOgsave setmatrix}for +grestore}bdef/jbd^{ +gsave bell^ moveto lineto setlinewidth O` grestore}bdef/ald^{gsave bell^ +samson^ setlinewidth O` grestore}bdef/ws^{gsave bell^ xfont exch scalefont +setfont F roswell^ grestore}bdef/samson^{translate rotate 0 0 +moveto/_dshlen +xdef/_rem xdef/_spclen xdef 1 1 3 -1 roll{pop _dshlen 0 rlineto _spclen +_rem 0 +gt{1 add/_rem _rem 1 sub def}if 0 rmoveto}for _dshlen 0 +rlineto}bdef/roswell^{ +gsave/_undo? xdef translate rotate _dch 0 3 -1 roll put 0 moveto/_rem xdef +/_spclen xdef 1 1 3 -1 roll{pop gsave _undo?{_LBOmtx setmatrix}if _dch u2` +grestore _spclen _rem 0 gt{1 add/_rem _rem 1 sub def}if 0 rmoveto}for +_undo?{ +_LBOmtx setmatrix}if _dch u2` grestore}bdef 8 dict begin/FontType 3 def +/FontMatrix[.001 0 0 .001 0 0]def/FontBBox[-500 -500 500 500]def/Encoding +256 +array def 0 1 255{Encoding exch/.nodef put}for Encoding 97/circle put +/CharProcs 2 dict def CharProcs begin/.nodef{}def/circle{0 0 500 0 360 arc +closepath fill}bind def end/BuildGlyph{1000 0 -500 -500 500 500 +setcachedevice +exch/CharProcs get exch 2 copy known not{pop/.nodef}if get exec}bind def +/BuildChar{1 index/Encoding get exch get 1 index/BuildGlyph get exec}bind +def +currentdict end/_xfont exch definefont/xfont exch def/_thumbStr 10 string +def +/_irad null def/_orad null def/_dx null def/_dy null def/_ld2 null def/_sz +null def/_th null def/_lblsave null def/LFont null def/T`{gsave 0.05 0.05 +scale translate 2 copy 2 copy 8 -2 roll dup 3 -1 roll{neg}if exch v` .5 +setseparationgray fill 0 0 v` gsave 1 setseparationgray fill grestore 0 +setseparationgray 20 setlinewidth stroke/Helvetica findfont 180 scalefont +setfont 100 add 100 exch moveto pop _thumbStr cvs show +grestore}bdef/q3`{_th +_orad sub dup _dx _dy u` stroke _dx _ld2 sub _dy moveto _dx _ld2 add _dy +lineto stroke _dx _dy _ld2 sub moveto _dx _dy _ld2 add lineto +stroke}bdef/V`{ +/_irad xdef/_orad xdef/_dy xdef/_dx xdef/_th xdef/_ld2 xdef/_hthk 2.5 wcu^ +round dup 2 le{pop 2}if def gsave 0 setlinecap 1 setseparationgray _th +_hthk 2 +mul add setlinewidth q3` _hthk _irad add dup _dx _dy u` fill 0 +setseparationgray _th setlinewidth q3` _irad dup _dx _dy u` fill 1 +setseparationgray _dx _irad sub _dy moveto _dx _irad add _dy lineto stroke +_dx +_dy _irad sub moveto _dx _dy _irad add lineto stroke grestore}bdef/f1a`{1 +exch +sub 0 0 0 setcmykcolor}bdef/f1b`{1 exch sub 0 exch 0 0 +setcmykcolor}bdef/f1c`{ +1 exch sub 0 0 3 -1 roll 0 setcmykcolor}bdef/f1d`{1 exch sub 0 0 0 4 -1 +roll +setcmykcolor}bdef/f1e`{setseparationgray}bdef/W`{gsave F setoverprint/_dy +xdef +/_dx xdef/_sz xdef/_th xdef _dx _dy translate{-90 rotate}if/XPaint exch +ldef +0.35 XPaint 11 _sz mul _sz 0 0 v` fill/_dx _th def/_sz _sz 2 _th mul sub +def 0 +1 10{10 div XPaint _sz dup _dx _th v` fill/_dx _dx _sz 2 _th mul add add +def} +for grestore}bdef/calBarArray[0 0 1 0 0 1 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 1 1 +0 +0 0 0 1 0 0 .5 0 0 .5 0 0 .5 0 0 0 0 0 0 .5]def/X`{gsave/_dy xdef/_dx +xdef/_sz +xdef/_th xdef _dx _dy translate{-90 rotate}if 0.35 setseparationgray 11 _sz +mul _sz 0 0 v` fill/_dx _th def/_sz _sz 2 _th mul sub def currentoverprint +false setoverprint 0 1 10{calBarArray exch 4 mul 4 getinterval aload pop +setcmykcolor _sz dup _dx _th v` fill/_dx _dx _sz 2 _th mul add add def}for +setoverprint grestore}bdef/pw${gsave/_hthk 2.5 wcu^ round dup 2 le{pop 2}if +def 5 copy 1 setseparationgray 0 setlinecap moveto rlineto _hthk 2 mul add +setlinewidth stroke 0 setseparationgray moveto rlineto setlinewidth stroke +grestore}bdef/Y`{/_lblsave save def[exch 0 0 2 index neg 0 0]LFont exch +makefont setfont}bdef/a1`{0 setseparationgray moveto show}bdef/Z`{_lblsave +restore}bdef/f1`{/LFont/|_______Helvetica T/Helvetica aldus^ def}bdef/_xbft +null def/_xbfc null def/_xbx? F def/XPaint null def/XFill null def/XStroke +null def/b1`{gsave bell^ south^/_th xdef currentoverprint T +setoverprint}bdef +/d1`{setoverprint grestore}bdef/c1`{beams^ bapco^}bdef/bapco^{_URx _LLx sub +abs _th sub _URy _LLy sub abs _th sub _LLx _th 2 div add _LLy _th 2 div add +4 +copy v` gsave XFill grestore _th setlinewidth XStroke 4 copy moveto rlineto +exch 3 index add exch moveto exch neg exch rlineto +XStroke}bdef/beams^{/_prcs? +xdef/_xbft xdef dup null +ne{_prcs?{findcmykprocesscolor}{findcmykcustomcolor} +ifelse}if/_xbfc xdef/_xbx?/XPaint _prcs? _xbfc _xbft n2` psquare^}bdef +/psquare^{_xbx?{/XFill{_xbfc 0 XPaint fill}def/XStroke{_xbfc 1 XPaint +stroke} +def}{/XFill{newpath}def/XStroke{newpath}def}ifelse}bdef/e1`{/__$jk +where{pop +/junk save def bell^ south^/_th xdef _URx _LLx sub abs _th sub _URy _LLy +sub +abs _th sub _LLx _th 2 div add _LLy _th 2 div add v` gsave .9 +setseparationgray fill grestore 0 setseparationgray _th setlinewidth stroke +_LLx _LLy _URy add 2 div moveto/Helvetica findfont[180 180 J2` neg 0 0 3 -1 +roll 0 0]makefont setfont show junk restore}{{6{pop}repeat}if 6{pop}repeat} +ifelse}bdef/s`{gsave clippath 1 setseparationgray fill grestore}bdef/r`{ +PSScreen exch pop exch pop dup type/dicttype eq{dup/HalftoneType get 1 eq{ +begin/Angle exch def/Frequency exch def 60 0 currentdict +end}if}if}bdef/t`{{1 +exch sub}}bdef/PPDSetup{countdictstack mark}bdef/PPDCleanup{stopped +cleartomark countdictstack exch sub dup 0 gt{{end}repeat}{pop}ifelse}bdef +/_PATgsave matrix def/_PATmtx matrix def/gl^{7 dict begin/FontDict 9 dict +def +FontDict begin/cache exch def/key exch def/proc exch cvx def/mtx exch +matrix +invertmatrix def/height exch def/width exch def/ctm matrix currentmatrix +def +/ptm matrix identmatrix def/str(12345678901234567890123456789012)def end +/FontBBox[0 0 FontDict/width get FontDict/height get]def/FontMatrix +FontDict +/mtx get def/Encoding StandardEncoding def/FontType 3 def/BuildChar{pop +begin +FontDict begin width 0 cache{0 0 width height setcachedevice}{setcharwidth} +ifelse 0 0 moveto width 0 lineto width height lineto 0 height lineto +closepath +clip newpath gsave proc grestore end end}def FontDict/key get currentdict +definefont end}bdef/hj^{dup type/dicttype eq{begin FontDict/ctm get +setmatrix} +{exch begin FontDict/ctm get setmatrix concat}ifelse currentdict setfont +FontDict begin FontMatrix concat width 0 dtransform round width div exch +round +width div exch 0 height dtransform round height div exch round height div +exch +0 0 transform round exch round exch ptm astore setmatrix pathbbox height +div +ceiling height mul 4 1 roll width div ceiling width mul 4 1 roll height div +floor height mul 4 1 roll width div floor width mul 4 1 roll 2 index sub +height div ceiling cvi exch 3 index sub width div ceiling cvi exch 4 2 roll +moveto FontMatrix ptm invertmatrix pop{gsave ptm concat dup str length +idiv{ +str show}repeat dup str length mod str exch 0 exch getinterval show +grestore 0 +height rmoveto}repeat pop end end}bdef/i1`{gsave clip hj^ grestore newpath} +bdef/j1`{gsave 0 0 0 0 setcmykcolor fill grestore i1`}bdef/k1`{_PATgsave +currentmatrix pop _PATmtx defaultmatrix setmatrix rotate 3.36 3.36[1 0 0 -1 +0 +0]{2 setlinecap 0 1.68 moveto 1.68 0 lineto 1.68 3.36 moveto 3.36 1.68 +lineto +0.675 setlinewidth stroke}/l1` true gl^ pop 5.28 5.28[1 0 0 -1 0 0]{2 +setlinecap 0 2.64 moveto 2.64 0 lineto 2.64 5.28 moveto 5.28 2.64 lineto +0.675 +setlinewidth stroke}/m1` true gl^ pop 3.84 3.84[1 0 0 -1 0 0]{2 setlinecap +0 +1.92 moveto 3.84 1.92 lineto 0.675 setlinewidth stroke}/n1` true gl^ pop +7.68 +7.68[1 0 0 -1 0 0]{2 setlinecap 0 3.84 moveto 7.68 3.84 lineto 0.675 +setlinewidth stroke}/o1` true gl^ pop 3.84 3.84[1 0 0 -1 0 0]{2 setlinecap +1.92 0 moveto 1.92 3.84 lineto 0.675 setlinewidth stroke}/p1` true gl^ pop +7.68 7.68[1 0 0 -1 0 0]{2 setlinecap 3.84 0 moveto 3.84 7.68 lineto 0.675 +setlinewidth stroke}/q1` true gl^ pop 3.84 3.84[1 0 0 -1 0 0]{2 setlinecap +1.92 0 moveto 1.92 3.84 lineto 0 1.92 moveto 3.84 1.92 lineto 0.675 +setlinewidth stroke}/r1` true gl^ pop 7.68 7.68[1 0 0 -1 0 0]{2 setlinecap +3.84 0 moveto 3.84 7.68 lineto 0 3.84 moveto 7.68 3.84 lineto 0.675 +setlinewidth stroke}/s1` true gl^ pop _PATgsave setmatrix}bdef +/_OutlineSmearFrac 10 def/_OutlineWeight 0.012 def/_OutlineFillColor 0 0 0 +1(\ +)findcmykprocesscolor def/_ShadowReverseColor 0 0 0 1()findcmykprocesscolor +def/_BoldFactorX 0.015 def/_BoldFactorY 0.015 def/_ShadowFactorX 0.06 def +/_ShadowFactorY 0.06 def/_ObliqueFactor -0.21 def/_ShadowTintFactor 0.2 def +/_BFontUOThick 1 0/Helvetica findfont/FontMatrix get dtransform dup mul +exch +dup mul add sqrt _OutlineWeight mul def/_TXmtx matrix def/_TXctmx matrix +def +/_txgsave matrix def/_BaseMatrix[1 0 0 -1 0 0]def/_ItalicMatrix[1 0 +_ObliqueFactor 1 0 0]def/tempDict null def userdict/FCDict userdict put +/isWinPS false def/_xSize 12 def/_ySize 12 def/_dots 1440 def/_fDict null +def +/_uScale null def/_uPosition null def/_uThickness null def/_uOThickness +null +def/_dUPosition -100 def/_dUThickness 50 def/_dFontScale -0.001 def/_runLen +null def/_txc null def/_txt null def/_txo F def/_tx? F def/_ctc null +def/_ctt +null def/_cto F def/_cPaint null def/_outxc null def/_outxt null def/_outxo +T +def/_shdc null def/_shdt null def/_shdo T def/K2` null def/k3` null def/m3` +null def/j3` null def/l3` null def/FTextPaint null def/STextPaint null def +/_gMTX matrix def/macvec 256 array def macvec dup dup 0/Times-Roman +findfont +/Encoding get 0 128 getinterval putinterval 39/quotesingle put 96/grave +put +/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis/Udieresis/aacute/agrave +/acircumflex/adieresis/atilde/aring/ccedilla/eacute/egrave/ecircumflex +/edieresis/iacute/igrave/icircumflex/idieresis/ntilde/oacute/ograve +/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex/udieresis/dagger +/degree/cent/sterling/section/bullet/paragraph/germandbls/registered/copyright +/trademark/acute/dieresis/notequal/AE/Oslash/infinity/plusminus/lessequal +/greaterequal/yen/mu/partialdiff/summation/product/pi/integral/ordfeminine +/ordmasculine/Omega/ae/oslash/questiondown/exclamdown/logicalnot/radical +/florin/approxequal/Delta/guillemotleft/guillemotright/ellipsis/blank/Agrave +/Atilde/Otilde/OE/oe/endash/emdash/quotedblleft/quotedblright/quoteleft +/quoteright/divide/lozenge/ydieresis/Ydieresis/fraction/currency/guilsinglleft +/guilsinglright/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase +/perthousand/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute +/Icircumflex/Idieresis/Igrave/Oacute/Ocircumflex/apple/Ograve/Uacute +/Ucircumflex/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring +/cedilla/hungarumlaut/ogonek/caron macvec 128 128 getinterval astore pop +/winvec 256 array def winvec dup dup 0/Times-Roman findfont/Encoding get 0 +128 +getinterval putinterval 39/quotesingle put 96/grave +put/grave/acute/circumflex +/tilde/macron/breve/dotaccent/dieresis/ring/cedilla/hungarumlaut/ogonek/caron +/dotlessi winvec 0 14 getinterval astore +pop/bullet/bullet/bullet +/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex +/perthousand/Scaron/guilsinglleft/OE/bullet/bullet/bullet/bullet/quoteleft +/quoteright/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark +/scaron/guilsinglright/oe/bullet/bullet/Ydieresis/space/exclamdown/cent +/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine +/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus +/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla +/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters +/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla +/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth +/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave +/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute +/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex +/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute +/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex +/udieresis/yacute/thorn/ydieresis winvec 127 129 getinterval astore +pop/M1`{{ +_TXmtx astore concat}if _TXctmx currentmatrix pop}bdef/N1`{_txgsave +currentmatrix pop}bdef/O1`{_txgsave setmatrix}bdef/P1`{O1`}bdef/Q1`{_TXctmx +setmatrix}bdef/v1`{userdict begin dict/FCDict exch def +end}bdef/fontdef{FCDict +3 1 roll put}bdef/fontget{FCDict exch get}bdef/x1`{aldus^ _BaseMatrix +makefont +fontdef}bdef/p3`{dup length 1 add dict/tempDict exch def{1 index/FID ne 2 +index/UniqueID ne and{tempDict 3 1 roll put}{pop pop}ifelse}forall tempDict} +bdef/aldus^{findfont exch isWinPS{pop dup/Encoding get dup 161 get exch 162 +get/cent eq exch/exclamdown eq and}if{p3` dup/Encoding +isWinPS{winvec}{macvec} +ifelse put definefont}{exch pop}ifelse}bdef/I1`{findfont p3` dup/Encoding +get +256 array copy dup dup 3 index/Encoding 3 2 roll put}bdef/J1`{put +dup}bdef/K1` +{pop pop definefont _BaseMatrix makefont fontdef}bdef/y1`{gsi^ fontdef}bdef +/z1`{fontget _ItalicMatrix makefont fontdef}bdef/gsi^{fontget dup maxlength +2 +add dict/tempDict exch def{1 index/FID ne 2 index/UniqueID ne and{tempDict +3 1 +roll put}{pop pop}ifelse}forall tempDict begin/PaintType 2 def/StrokeWidth +1 0 +FontMatrix dtransform dup mul exch dup mul add sqrt _OutlineWeight exch div +def end tempDict definefont}bdef/auckland^{/_ySize xdef/_xSize xdef +fontget[ +_xSize 0 0 _ySize 0 0]makefont setfont}bdef/wcu^{_dots mul}bdef/n`{1440 div +/_dots xdef}bdef/J2`{wcu^ exch wcu^ exch}bdef/w1`{J2` +auckland^}bdef/K2`{}bdef +/A1`{isWinPS{O2`}{pop pop pop}ifelse 5 3 roll K2`}bdef/L2`{/_x1 _xSize +_BoldFactorX mul def/_y1 _ySize _BoldFactorY mul def 5 copy _y1 add exch +_x1 +add exch K2` 5 copy _y1 add exch _x1 sub exch K2` 5 copy _y1 sub exch _x1 +add +exch K2` 5 copy _y1 sub exch _x1 sub exch K2` K2`}bdef/B1`{O2` 5 3 roll +L2`} +bdef/C1`{O2` 6 3 roll 6 copy U2` 3 1 roll _ySize _ShadowFactorY mul add +exch +_xSize _ShadowFactorX mul add exch 3 -1 roll{L2`}{K2`}ifelse V2`{L2`}{K2`} +ifelse}bdef/D1`{O2` 5 3 roll gsave 6 index not{7 index _xSize _ySize +auckland^ +}if 5 copy _ySize _ShadowFactorY mul add exch _xSize _ShadowFactorX mul add +exch 11 -1 roll{L2`}{K2`}ifelse grestore 6 -1 roll{M2`}{6 -1 roll +N2`}ifelse} +bdef/M2`{/_x1 _OutlineSmearFrac wcu^ def/_y1 _OutlineSmearFrac wcu^ def 5 +copy +_y1 neg add exch _x1 neg add exch K2` 5 copy _y1 neg add exch _x1 add exch +K2` +5 copy _y1 add exch _x1 neg add exch K2` 5 copy _y1 add exch _x1 add exch +K2` +m3`}bdef/E1`{O2` 5 3 roll M2`}bdef/N2`{gsave _xSize _ySize auckland^ 5 copy +m3` grestore K2`}bdef/F1`{O2` 6 3 roll N2`}bdef version cvr 47.0 +ge{/strwth{ +stringwidth pop}bdef}{/strwth{gsave newpath 0 0 moveto 0 0 lineto closepath +clip stringwidth grestore pop}bdef}ifelse/O2`{dup 0 gt{dup 4 1 roll 4 index +mul exch 5 index mul add 5 index strwth add sub exch div add}{pop pop pop} +ifelse}bdef/G1`{fontget/_fDict xdef wcu^ _fDict/FontInfo known{_fDict +/FontMatrix get 3 get mul/_uScale xdef _fDict/FontInfo get dup +/UnderlinePosition known{dup/UnderlinePosition get _uScale mul/_uPosition +xdef +}{/_uPosition _dUPosition _uScale mul def}ifelse dup/UnderlineThickness +known{ +dup/UnderlineThickness get _uScale mul/_uThickness xdef}{/_uThickness +_dUThickness _uScale mul def}ifelse pop}{_dFontScale mul/_uScale xdef +/_uPosition _dUPosition _uScale mul def/_uThickness _dUThickness _uScale +mul +def}ifelse/_uOThickness _BFontUOThick _uScale mul def _fDict/PaintType +known{ +_fDict/PaintType get 2 eq{_fDict/StrokeWidth known{/_uOThickness _fDict +/StrokeWidth get _uScale mul def}{1 0 _fDict/FontMatrix get dtransform dup +mul +exch dup mul add sqrt _OutlineWeight mul _uScale mul/_uOThickness +xdef}ifelse} +if}if}bdef/H1`{gsave/_runLen xdef/_y1 xdef/_x1 xdef/_y1 _y1 _uPosition add +def +{dup not{U2`}if/_y2 _ySize _ShadowFactorY mul _y1 add def/_x2 _xSize +_ShadowFactorX mul _x1 add def _uThickness _x2 _y2 _x2 _runLen add _y2 P2` +dup +not{V2`}if}if{_uOThickness _x1 _y1 _uThickness 2 div add _x1 _runLen add +_y1 +_uThickness 2 div sub Q2`}{_uThickness _x1 _y1 _x1 _runLen add _y1 +P2`}ifelse +grestore}bdef/mm${gsave _ySize 3 div sub/_y1 xdef _y1 _y1 3 1 roll _ySize +16 +div 5 1 roll P2` grestore}bdef/P2`{gsave moveto lineto setlinewidth k3` +grestore}bdef/Q2`{gsave south^/_th xdef _URx _LLx sub abs _th sub _URy _LLy +sub abs _th sub _LLx _th 2 div add _LLy _th 2 div add v` gsave j3` grestore +_th setlinewidth k3` grestore}bdef/d`{/_prcs? xdef/_txt xdef dup null ne{ +_prcs?{findcmykprocesscolor}{findcmykcustomcolor}ifelse}if/_txc xdef +SetOutColor SetShadColor/_tx?/l3` _prcs? _txc _txt n2` +S2`}bdef/SetOutColor{ +_txt null eq{/_outxc null def/_outxt null def}{_txc null eq{_txt 0 +eq{/_outxt +1 def _prcs?{/_outxc _OutlineFillColor def}{/_outxc null +def}ifelse}{/_outxt 0 +def/_outxc null def}ifelse}{_txc aload pop pop add add add 0 eq{/_outxt 1 +def +/_outxc _OutlineFillColor def}{/_outxt 0 def/_outxc null def}ifelse}ifelse} +ifelse/_cjc?/FTextPaint _prcs? _outxc _outxt n2`}bdef/SetShadColor{_txt +null +eq{/_shdc null def/_shdt null def}{/_shdo _txo def _txc null eq{_txt 0 eq{ +/_shdt 1 def}{/_shdt T2` def}ifelse _prcs?{/_shdc _ShadowReverseColor def +/_shdo T def}{/_shdc null def}ifelse}{_txc aload pop pop add add add 0 eq{ +/_shdt 1 def/_shdc _ShadowReverseColor def/_shdo T def}{/_shdt T2` +def/_shdc +_txc def}ifelse}ifelse}ifelse/_cjc?/STextPaint _prcs? _shdc _shdt +n2`}bdef/S2` +{_tx?{/K2`{_txo setoverprint _txc _txt l3` moveto 0 4 2 roll 0 32 6 3 roll +awidthshow}def/k3`{_txo setoverprint _txc _txt l3` stroke}def/m3`{_outxo +setoverprint _outxc _outxt FTextPaint moveto 0 4 2 roll 0 32 6 3 roll +awidthshow}def/j3`{_outxo setoverprint _outxc _outxt FTextPaint +fill}def}{/K2` +{5{pop}repeat}def/k3`{newpath}def/m3`{5{pop}repeat}def/j3`{newpath}def}ifelse} +bdef/T2`{_txt _ShadowTintFactor mul}bdef/U2`{/_ctc _txc def/_ctt _txt +def/_cto +_txo def/_cPaint/l3` ldef/_txc _shdc def/_txt _shdt def/_txo _shdo def/l3` +/STextPaint ldef}bdef/V2`{/_txc _ctc def/_txt _ctt def/_txo _cto def/l3` +/_cPaint ldef}bdef/g`{/_txo xdef}bdef/SaveHook{}ndef/RestoreHook{}ndef/W2`{ +SaveHook _dots _LPmtx aload _PSdef aload _WCmtx aload _txgsave aload +_TXctmx +aload _gMTX currentmatrix aload}bdef/X2`{astore setmatrix astore pop astore +pop astore pop astore pop astore pop/_dots xdef RestoreHook}bdef/bmt^{save +def +}bdef/tsi^{mark W2` counttomark 2 add -2 roll pop restore X2` +o`}bdef/seni^{ +restore}bdef/o`{/_fo F def/_so F def/_txo F def}bdef/_GRPHmtx matrix def +/_imagesave null def/_imc null def/_imt null def/ImPaint null def/cjc^{ +/_imagesave save def _WCmtx setmatrix}bdef/tvs^{_PSdef setmatrix}bdef/dsd^{ +_imagesave restore}bdef/espresso 4 dict def espresso +begin/setgray{setgray}def +/setcmykcolor{setcmykcolor}def/setrgbcolor{setrgbcolor}def/sethsbcolor{ +sethsbcolor}def end/o3`{espresso begin userdict begin}bdef/vm${/OSdict xdef +end end end}bdef/b2a`{/_imagesave save def{_GRPHmtx astore concat}if +translate +dup scale newpath 0 0 v` clip newpath userdict begin/showpage{}def 0 +setgray 0 +setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit[]0 setdash newpath +F +setoverprint}bdef/a2`{OSdict begin}bdef/b2`{end V1`}bdef/kHu${/_imagesave +save +def{_GRPHmtx astore concat}if translate scale translate newpath v` clip +newpath userdict begin/showpage{}def 0 setgray 0 setlinecap 1 setlinewidth +0 +setlinejoin 10 setmiterlimit[]0 setdash newpath F setoverprint}bdef/V1`{end +_imagesave restore}bdef/_ortnt null def/_orclr null def/_gop false +def/_cjc? +false def/*setcmyk null def/*setrgb null def/*sethsb null def/*setgry null +def +/*setsepgray null def/*setcustomclr null def/*setprocessclr null def/*setop +null def/*zimage null def/$gate_1 T def/$clrOverride F def/Y2`{ALPS begin +/*setcmyk/setcmykcolor ldef/*setrgb/setrgbcolor ldef/*sethsb/sethsbcolor +ldef +/*setgry/setgray ldef/*setcustomclr/setcustomcolor ldef/*setprocessclr +/setprocesscolor ldef/*setop/setoverprint +ldef/*setsepgray/setseparationgray +ldef/*zimage/image ldef end}bdef/X1`{ALPS begin/setcmykcolor/*setcmyk ldef +/setrgbcolor/*setrgb ldef/sethsbcolor/*sethsb ldef/setgray/*setgry ldef +/setcustomcolor/*setcustomclr ldef/setprocesscolor/*setprocessclr ldef +/setoverprint/*setop ldef/setseparationgray/*setsepgray ldef/image/*zimage +ldef end}bdef/$curgry systemdict/currentgray get def/$setrgb systemdict +/setrgbcolor get def/$sethsb systemdict/sethsbcolor get def/$setcmyk +systemdict/setcmykcolor known{systemdict/setcmykcolor get}{{1 sub 4 1 roll +3{3 +index add neg dup 0 lt{pop 0}if 3 1 roll}repeat systemdict/setrgbcolor get +exec pop}}ifelse def/a3`{ALPS begin/setcmykcolor{gsave $setcmyk 1 $curgry +sub +grestore c3`}def/setrgbcolor{gsave $setrgb 1 $curgry sub grestore c3`}def +/sethsbcolor{gsave $sethsb 1 $curgry sub grestore c3`}def/setgray{1 exch +sub +c3`}def/setseparationgray{1 exch sub c3`}def _spotOR?{/setcustomcolor/i3` +ldef +}{/setcustomcolor/b3` ldef}ifelse/setprocesscolor{gsave exch aload pop pop +4{4 +index mul 4 1 roll}repeat $setcmyk pop 1 $curgry sub grestore c3`}def +/setoverprint{d3`}def/image{ORimage}def end}bdef/b3`{gsave exch aload pop +pop +4{4 index mul 4 1 roll}repeat $setcmyk pop 1 $curgry sub grestore +c3`}bdef/c3` +{$gate_1 $clrOverride and{ALPS begin/$gate_1 F def _ortnt null ne{_ortnt +mul}{ +null}ifelse _orclr exch X1` SetORColorProc a3`/$gate_1 T def end}{ALPS +begin +$MetalHead begin c3` end end}ifelse}bdef/d3`{$gate_1 $clrOverride and{ALPS +begin/$gate_1 F def pop _gop X1` setoverprint a3`/$gate_1 T def end}{ALPS +begin $MetalHead begin setoverprint end end}ifelse}bdef/ORimage{$gate_1 +$clrOverride and{ALPS begin/$gate_1 F def X1` _orclr null ne{_orclr +customcolorimage}{separationimage}ifelse a3`/$gate_1 T def end}{ALPS begin +$MetalHead begin image end end}ifelse}bdef/W1`{ALPS begin _prcs? +xdef/_ortnt +xdef dup null ne{_prcs?{findcmykprocesscolor}{findcmykcustomcolor}ifelse}if +/_orclr xdef/_cjc?/SetORColorProc _prcs? _orclr _ortnt n2` false +setoverprint +/_gop false def/_spotOR? F def Y2` a3`/$clrOverride T def end}bdef/Y1`{ALPS +begin/_gop xdef end}bdef/*findcmykcustomclr null def/*newcmykcustomclr null +def/epsdict null def/typedict null def/*$setcustomclr null def/_spotOR? F +def +/$spotOverride F def/$gate_2 T def/clrAdjust? F def/_fhbool F def/f2`{ALPS +begin dup dict/epsdict xdef dict/typedict xdef/clrAdjust? T def +end}bdef/g2`{ +cvn 8 1 roll exch 2 array astore 1 index cvn exch typedict 3 1 roll put 5 +array astore epsdict 3 1 roll put}bdef/h2`{null exch 2 array astore exch +cvn +exch typedict 3 1 roll put}bdef/i2`{ALPS begin clrAdjust?{/_spotOR? T def +e3` +g3`/$spotOverride T def}if end}bdef/e3`{ALPS begin/*findcmykcustomclr +/findcmykcustomcolor ldef/*newcmykcustomclr/newcmykcustomcolor ldef +/*$setcustomclr/setcustomcolor ldef end}bdef/f3`{ALPS begin +/findcmykcustomcolor/*findcmykcustomclr ldef/newcmykcustomcolor +/*newcmykcustomclr ldef/setcustomcolor/*$setcustomclr ldef end}bdef/g3`{ALPS +begin/findcmykcustomcolor/h3` ldef/newcmykcustomcolor/n3` +ldef/setcustomcolor +/i3` ldef end}bdef/h3`{$gate_2 $spotOverride and{ALPS begin/$gate_2 F def +dup +cvn epsdict exch known{5 1 roll 4{pop}repeat cvn epsdict exch get aload +pop}if +f3` findcmykcustomcolor g3`/$gate_2 T def end}{ALPS begin $MetalHead begin +findcmykcustomcolor end end}ifelse}bdef/n3`{$gate_2 $spotOverride and{ALPS +begin/$gate_2 F def/_fhbool xdef dup cvn epsdict exch known{5 1 roll 4{pop} +repeat cvn epsdict exch get aload pop}if _fhbool f3` newcmykcustomcolor g3` +/$gate_2 T def end}{ALPS begin $MetalHead begin newcmykcustomcolor end end} +ifelse}bdef/i3`{$gate_2 $spotOverride and{ALPS begin/$gate_2 F def 1 index +4 +get cvn dup typedict exch known{typedict exch get aload pop 1 index null +eq{ +exch pop mul 1 exch sub exch pop f3` setseparationgray g3`}{exch{f3` mul +setprocesscolor g3`}{f3` mul setcustomcolor g3`}ifelse}ifelse}{pop f3` +setcustomcolor g3`}ifelse/$gate_2 T def end}{ALPS begin $MetalHead begin +setcustomcolor end end}ifelse}bdef/BMT 2 dict def BMT begin/*def/def load +def +/def{1 index/fcheckload eq{pop{pop pop}}if *def}bdef end/t1`{BMT begin}bdef +/u1`{end}bdef/u1a`{findfont pop}bdef end/setpacking where{pop setpacking}if +%%EndResource +ALPS begin +%%BeginResource: procset IMAGE_PS 1.0 1 +%%Copyright: (C) Copyright 1993 Aldus Corporation. All Rights Reserved. +%%Version:1.0 1 +/IMdict 100 dict def IMdict begin/bdef{bind def}bind def/xdef{exch def}bdef +/ldef{load def}bdef/ndef{1 index where{pop pop pop}{dup xcheck{bind}if def} +ifelse}bdef/setoverprint{pop}ndef/findcmykcustomcolor{5/packedarray +where{pop +packedarray}{array astore readonly}ifelse}ndef/findcmykprocesscolor{5 +/packedarray where{pop packedarray}{array astore readonly}ifelse}ndef +/setcmykcolor{1 sub 4 1 roll 3{3 index add neg dup 0 lt{pop 0}if 3 1 roll} +repeat systemdict/setrgbcolor get exec pop}ndef/setcustomcolor{exch aload +pop +pop 4{4 index mul 4 1 roll}repeat setcmykcolor +pop}ndef/setprocesscolor{exch +aload pop pop 4{4 index mul 4 1 roll}repeat setcmykcolor pop}ndef +/separationimage{image}ndef/iB^{/_imprcs? xdef/_imt xdef dup null +ne{_imprcs?{ +findcmykprocesscolor}{findcmykcustomcolor}ifelse}if/_imc xdef _imc null +eq{1 +_imt sub setseparationgray}{_imprcs?{_imc _imt setprocesscolor}{_imc +_imt +setcustomcolor}ifelse}ifelse}bdef/iA^{setoverprint}bdef/level2/languagelevel +where{pop languagelevel 1 ne}{false}ifelse def/_colorexists? +level2{statusdict +/processcolors known{statusdict/processcolors get exec}{1}ifelse 4 eq def}{ +systemdict/setcmykcolor known def}ifelse/IMcolorbuf{0 1 2 index length 1 +sub{ +dup 2 index exch get 255 exch sub 2 index 3 1 roll put}for}bdef/IMsetcmyk{ +aload pop/_ik xdef/_iy xdef/_im xdef/_ic xdef}bdef/iC^{/packedarray +where{pop +dup type/packedarraytype eq 2 index type/packedarraytype eq +or}{false}ifelse{ +/proc2 exch cvlit def/proc1 exch cvlit def proc1 aload pop proc2 aload pop +proc1 length proc2 length add packedarray cvx}{/proc2 exch cvlit def/proc1 +exch cvlit def/newproc proc1 length proc2 length add array def newproc 0 +proc1 +putinterval newproc proc1 length proc2 putinterval newproc cvx}ifelse}bdef +/currentcolortransfer{currenttransfer dup dup dup}ndef/setcolortransfer{ +systemdict begin settransfer end pop pop pop}ndef/customcolorimage{ +_colorexists?{aload pop pop 4 array astore IMsetcmyk +currentcolortransfer{_ik +mul _ik sub 1 add}iC^ 4 1 roll{_iy mul _iy sub 1 add}iC^ 4 1 roll{_im mul +_im +sub 1 add}iC^ 4 1 roll{_ic mul _ic sub 1 add}iC^ 4 1 roll setcolortransfer +/_mbuf 0 string def/_ybuf 0 string def/_kbuf 0 string def{IMcolorbuf dup +length _mbuf length ne{dup length dup dup/_mbuf exch string def/_ybuf exch +string def/_kbuf exch string def}if dup _mbuf copy _ybuf copy _kbuf copy +pop} +iC^{_mbuf}{_ybuf}{_kbuf}true 4 colorimage}{aload pop pop 4 array astore +IMsetcmyk iE^ currenttransfer{_imtint mul 1 _imtint sub add}iC^ settransfer +image}ifelse}ndef/iE^{_ic .3 mul _im .59 mul _iy .11 mul _ik add add add +dup 1 +gt{pop 1}if/_imtint xdef}bdef/iF^{/_imprcs? xdef/_imspotint xdef +_colorexists? +{currentcolortransfer{_imspotint mul 1 _imspotint sub add}iC^ 4 1 roll{ +_imspotint mul 1 _imspotint sub add}iC^ 4 1 roll{_imspotint mul 1 +_imspotint +sub add}iC^ 4 1 roll{_imspotint mul 1 _imspotint sub add}iC^ 4 1 roll +setcolortransfer}{currenttransfer{_imspotint mul 1 _imspotint sub add}iC^ +settransfer}ifelse findcmykcustomcolor customcolorimage}ndef/iG^{/inv +xdef/h +xdef/w xdef/AsBin xdef/imbuf w 7 add 8 idiv string def w h inv[1 0 0 1 0 +0]{ +currentfile imbuf AsBin{readstring}{readhexstring}ifelse pop}imagemask}bdef +/isCL^{/AsProcess xdef/TintPercent xdef/ColorName xdef/_k xdef/_y xdef/_m +xdef +/_c xdef/OverPrint xdef/bits xdef/h xdef/w xdef/AsBin xdef/imbuf w bits mul +7 +add 8 idiv string def w h bits[1 0 0 1 0 0]{currentfile imbuf +AsBin{readstring +}{readhexstring}ifelse pop}OverPrint iA^ _c _m _y _k ColorName TintPercent +AsProcess iF^}bdef/iI^{/OverPrint xdef/bits xdef/h xdef/w xdef/AsBin xdef +/imbuf w bits mul 7 add 8 idiv string def w h bits[1 0 0 1 0 0]{currentfile +imbuf AsBin{readstring}{readhexstring}ifelse pop}OverPrint iA^ +separationimage +}bdef/iJ^{/bits xdef/h xdef/w xdef/AsBin xdef/imbuf w bits mul 3 mul 7 add +8 +idiv string def w h bits[1 0 0 1 0 0]{currentfile imbuf AsBin{readstring}{ +readhexstring}ifelse pop}false 3 colorimage}bdef/iK^{/bits xdef/h xdef/w +xdef +/AsBin xdef/imbuf w bits mul 4 mul 7 add 8 idiv string def w h bits[1 0 0 1 +0 +0]{currentfile imbuf AsBin{readstring}{readhexstring}ifelse pop}false 4 +colorimage}bdef end +%%EndResource +end +%%EndProlog +%%BeginSetup +ALPS begin +/isWinPS false def +0 k1` +f1` +40 v1` +%%EndSetup +%%Page: 1 1 +%%PageProcessColors: (atend) +%%PageCustomColors: (atend) +%%BeginPageSetup +j` +%%EndPageSetup +/$0 bmt^ +0.05 -0.05 scale +6120 -7920 translate +0 0 translate +bse^ +4.8 4.8 1 1 ps$ +300 n` +/$1 bmt^ +o` +N1` +F M1` +$1 tsi^ +/$1 bmt^ +%%IncludeResource: font Times-Italic +/AA /|______Times-Italic T /Times-Italic x1` +/$2 bmt^ +/AA 200 200 w1` +T g` +0 0 0 1 (Black) 1 T d` +450 -1414 (TIFF Tech Note 1 - TIFF Trees) -0.015121 0 525 6 28 A1` +O1` +N1` +F M1` +/AA 200 200 w1` +-915 1411 (An Aldus TIFF Technical Note: 1 June 1993) -0.005341 0 752 8 41 +A1` +840 1411 (TTN1-1) 0 -0.001465 130 0 5 A1` +O1` +0 0 0 1 (Black) 0 T b` +null null F a` +0 337 -1472 984 -1397 F bh^ +N1` +F M1` +$2 tsi^ +/$2 bmt^ +%%IncludeResource: font Helvetica-Bold +/AB /|______Helvetica-Bold T /Helvetica-Bold x1` +/$3 bmt^ +/AB 320 320 w1` +T g` +0 0 0 1 (Black) 1 T d` +-915 -1284 (TIFF T) -0.063797 0 200 1 5 A1` +-720 -1284 (echnical Note 1: TIFF T) -0.063797 0 729 4 22 A1` +6 -1284 (rees) -0.063797 0 137 0 3 A1` +$3 tsi^ +/$3 bmt^ +%%IncludeResource: font Times-Bold +/AC /|______Times-Bold T /Times-Bold x1` +/$4 bmt^ +/AC 200 200 w1` +T g` +0 0 0 1 (Black) 1 T d` +-68 -1126 (Motivation) 0 -0.004379 197 0 9 A1` +$4 tsi^ +/$4 bmt^ +%%IncludeResource: font Times-Roman +/AD /|______Times-Roman T /Times-Roman x1` +/$5 bmt^ +/AD 200 200 w1` +T g` +0 0 0 1 (Black) 1 T d` +-915 -1071 (TIFF has always supported what amounts to a singly linked list +of IFD\325s in a single TIFF file, via the \322next IFD) -0.000885 0 1863 +21 111 A1` +-915 -1017 (pointer,\323 though most applications currently ignore any IFD +beyond the first one.) 0.009171 0 1355 11 80 A1` +-915 -942 (Probably the best use for a linked list of IFD\325s is when you +want to store multiple different but related images in) -0.003189 0 1871 21 +114 A1` +-915 -888 (the same file. The classic example is multiple pages of a fax +transmission.) 0.001358 0 1233 12 74 A1` +-915 -813 (But suppose we want to define an image mask for an image. \(This +is defined within the TIFF spec, but currently) 0.002548 0 1870 20 109 A1` +-915 -759 (rarely used.\) That would mean two IFD\325s in the file, one for +the main image and one for the image mask.) -0.00206 0 1750 20 102 A1` +-915 -705 (Perhaps the image is really large, so that we would like to +include a lower resolution version \(or \322subimage\323\) of) 0.000519 0 +1865 19 112 A1` +-915 -651 (the image; if so, we must include a lower resolution version of +the image mask, too. Now we have four IFD\325s in) 0.004227 0 1867 21 109 +A1` +-915 -596 (our TIFF file. The order of the files in the linked list is +nowhere defined in the TIFF spec, so the TIFF reader has) -0.002548 0 1878 +23 115 A1` +-915 -542 (to be careful that it doesn\325t try to use the wrong subimage +for the wrong purpose. The situation is still workable,) 0.003418 0 1867 20 +114 A1` +-915 -488 (but is starting to get complicated.) 0.001389 0 555 5 34 A1` +-915 -413 (Let\325s complicate the scenario further by saying that we want +to include subimages and masks for each of the) -0.000839 0 1807 18 106 A1` +-915 -359 (pages in a multiple-page fax transmission. Now things are really +messy. Which subimage goes with which main) 0.003006 0 1867 16 106 A1` +-915 -305 (image? We could make a list of rules, but they would be quite +arbitrary and difficult to use.) 0.002655 0 1521 17 92 A1` +/AC 200 200 w1` +-44 -192 (Solution) 0 -0.006851 148 0 7 A1` +/AD 200 200 w1` +-915 -92 (If only we had the concept of a tree within a TIFF file, we would +have a natural way to associate a main or) 0.00415 0 1777 23 106 A1` +-915 -38 (\322parent\323 image with a subordinate or \322child\323 image +such as a reduced resolution version or an image mask.) -0.001907 0 1788 17 +104 A1` +-915 37 (One way to create a tree structure within a TIFF file is to define +a new ) 0.001297 0 1182 16 72 A1` +/AC 200 200 w1` +267 37 (SubIFDs) 0 0 157 0 6 A1` +/AD 200 200 w1` +425 37 ( tag, of type LONG. Each) 0.001297 0 429 5 23 A1` +-915 91 (LONG value points to a \322child\323 IFD structure.) 0.005936 0 +775 7 44 A1` +-915 166 (This method is safe because old TIFF readers will not recognize +the new tag, and will simply ignore it. It is) 0.001526 0 1786 20 108 A1` +-915 220 (versatile because there is no built-in restriction concerning +what you store in a child IFD\321a feature that may) 0.001343 0 1815 17 109 +A1` +-915 274 (come in handy for future private and public enhancements.) +0.009155 0 982 8 56 A1` +-915 349 (So when should you use the NextIFD pointer at the end of an IFD +and when should you use the ) 0.003143 0 1601 20 91 A1` +/AC 200 200 w1` +686 349 (SubIFDs) 0 0 157 0 6 A1` +/AD 200 200 w1` +844 349 ( tag?) 0.003143 0 80 1 4 A1` +-915 404 (Use the NextIFD pointer if your application requires that +multiple visually unrelated images be stored in the) -0.004654 0 1800 16 +108 A1` +-915 458 (same TIFF file\321a multi-page fax transmission, for example. Use +the ) 0.008286 0 1162 10 66 A1` +/AC 200 200 w1` +247 458 (SubIFDs) 0 0 157 0 6 A1` +/AD 200 200 w1` +404 458 ( tag for pointing to images that) 0.008286 0 514 6 31 A1` +-915 512 (modify or add information to or otherwise \322help\323 the Parent +image\321transparency masks and subsampled) 0.002777 0 1760 13 98 A1` +-915 566 (versions, for example.) -0.000198 0 370 2 21 A1` +-915 641 (No particular order or precedence is defined for child images. +For example, if we have two child images, such as) 0.000336 0 1879 19 111 +A1` +-915 695 (a transparency mask and a subsampled version, they can appear in +either order.) -0.004745 0 1319 12 77 A1` +/AC 200 200 w1` +-49 804 (New Tag) 0.013016 0 159 1 6 A1` +-915 912 (SubIFDs) 0 0.011658 157 0 6 A1` +/AD 200 200 w1` +-915 966 (Tag) 0 0.006516 65 0 2 A1` +-802 966 (= 330 \(14A\)) -0.029495 0 206 2 10 A1` +-915 1020 (Type) 0 0.004333 86 0 3 A1` +-802 1020 (= LONG) -0.024002 0 150 1 5 A1` +-915 1074 (N) 0 0 30 0 0 A1` +-802 1074 (= number of child IFDs) -0.002029 0 394 4 21 A1` +-915 1183 (Each LONG value is an offset \(from the beginning of the TIFF +file, as always\) to a child IFD. Child images) -0.000946 0 1796 20 105 A1` +-915 1237 (provide extra information for the parent image\321such as a +transparency mask or subsampled version of the) -0.004684 0 1780 15 102 A1` +-915 1291 (parent image.) -0.068771 0 227 1 12 A1` +O1` +$5 tsi^ +showpage +$0 seni^ +%%PageTrailer +%%PageProcessColors: Black +%%PageCustomColors: +%%Page: 2 2 +%%PageProcessColors: (atend) +%%PageCustomColors: (atend) +%%BeginPageSetup +j` +%%EndPageSetup +/$0 bmt^ +0.05 -0.05 scale +6120 -7920 translate +0 0 translate +bse^ +4.8 4.8 1 1 ps$ +300 n` +/$1 bmt^ +o` +N1` +F M1` +$1 tsi^ +/$1 bmt^ +%%IncludeResource: font Times-Italic +/AA /|______Times-Italic T /Times-Italic x1` +/$2 bmt^ +/AA 200 200 w1` +T g` +0 0 0 1 (Black) 1 T d` +450 -1414 (TIFF Tech Note 1 - TIFF Trees) -0.015121 0 525 6 28 A1` +O1` +N1` +F M1` +/AA 200 200 w1` +-915 1411 (An Aldus TIFF Technical Note: 1 June 1993) -0.005341 0 752 8 41 +A1` +840 1411 (TTN1-2) 0 -0.001465 130 0 5 A1` +O1` +N1` +F M1` +$2 tsi^ +/$2 bmt^ +%%IncludeResource: font Times-Bold +/AB /|______Times-Bold T /Times-Bold x1` +/$3 bmt^ +/AB 200 200 w1` +T g` +0 0 0 1 (Black) 1 T d` +-57 -1155 (Examples) 0 -0.007492 174 0 7 A1` +$3 tsi^ +/$3 bmt^ +%%IncludeResource: font Times-Roman +/AC /|______Times-Roman T /Times-Roman x1` +/$4 bmt^ +/AC 200 200 w1` +T g` +0 0 0 1 (Black) 1 T d` +-915 -1080 (Let\325s revisit our first example. We have a main image, a +mask for the main image, a low res subimage, and a) 0.001923 0 1813 21 106 +A1` +-915 -1026 (mask for the low res subimage. The IFDs in our file would look +like this:) -0.005783 0 1218 14 72 A1` +-116 -896 (Main Image) 0.046387 0 202 1 9 A1` +-19 -842 (|) 0 0 8 0 0 A1` +-165 -788 (\321\321\321\321\321\321\321\321\321\321\321\321) 0 0 500 0 11 +A1` +-169 -734 (|) 0 0 8 0 0 A1` +131 -734 (|) 0 0 8 0 0 A1` +-286 -680 (LowRes Child) -0.007324 0 242 1 11 A1` +37 -680 (Mask Child) 0.027664 0 196 1 9 A1` +-169 -626 (|) 0 0 8 0 0 A1` +-315 -571 (LowRes Mask Child) -0.038651 0 345 2 16 A1` +-915 -421 (The ) 0.008774 0 75 1 3 A1` +/AB 200 200 w1` +-840 -421 (SubIFDs) 0 0 157 0 6 A1` +/AC 200 200 w1` +-682 -421 ( tag is used in both the main image and the LowRes Child image. +In the main image, the ) 0.008774 0 1482 19 86 A1` +/AB 200 200 w1` +800 -421 (SubIFDs) 0 0 157 0 6 A1` +/AC 200 200 w1` +-915 -367 (tag has two values, which point to the beginning of the IFD +structures for a LowRes Child and Mask Child) -0.003128 0 1780 19 103 A1` +-915 -313 (images. In the LowRes Child image, the ) -0.003555 0 681 7 38 +A1` +/AB 200 200 w1` +-234 -313 (SubIFDs) 0 0 157 0 6 A1` +/AC 200 200 w1` +-76 -313 ( tag has only one value, the location of the IFD for a LowRes) +-0.003555 0 1020 13 60 A1` +-915 -259 (mask image.) 0.043533 0 211 1 10 A1` +-915 -184 (If there is more than 1 child image for a given parent image, +the NextIFD value of Child #1 must point to Child) 0.000336 0 1857 22 110 +A1` +-915 -130 (#2, and so on. The last Child\325s NextIFD value must be zero.) +0.00444 0 1002 11 58 A1` +-915 -1 (This completes the TIFF Tree tech note.) -0.014923 0 670 6 38 A1` +O1` +$4 tsi^ +showpage +$0 seni^ +%%PageTrailer +%%PageProcessColors: Black +%%PageCustomColors: +%%Trailer +end +%%Pages: 2 +%%DocumentSuppliedResources: +%%DocumentNeededResources: font Times-Roman +%%+ font Helvetica +%%+ font Times-Italic +%%+ font Helvetica-Bold +%%+ font Times-Bold +%%DocumentProcessColors: Black +%%DocumentCustomColors: +%%CMYKCustomColor: +%%EOF diff --git a/graphics/tiff/TTN2.draft.txt b/graphics/tiff/TTN2.draft.txt new file mode 100644 index 0000000000..dee801ee24 --- /dev/null +++ b/graphics/tiff/TTN2.draft.txt @@ -0,0 +1,705 @@ +DRAFT TIFF Technical Note #2 17-Mar-95 +============================ + +This Technical Note describes serious problems that have been found in +TIFF 6.0's design for embedding JPEG-compressed data in TIFF (Section 22 +of the TIFF 6.0 spec of 3 June 1992). A replacement TIFF/JPEG +specification is given. Some corrections to Section 21 are also given. + +To permit TIFF implementations to continue to read existing files, the 6.0 +JPEG fields and tag values will remain reserved indefinitely. However, +TIFF writers are strongly discouraged from using the 6.0 JPEG design. It +is expected that the next full release of the TIFF specification will not +describe the old design at all, except to note that certain tag numbers +are reserved. The existing Section 22 will be replaced by the +specification text given in the second part of this Tech Note. + + +Problems in TIFF 6.0 JPEG +========================= + +Abandoning a published spec is not a step to be taken lightly. This +section summarizes the reasons that have forced this decision. +TIFF 6.0's JPEG design suffers from design errors and limitations, +ambiguities, and unnecessary complexity. + + +Design errors and limitations +----------------------------- + +The fundamental design error in the existing Section 22 is that JPEG's +various tables and parameters are broken out as separate fields which the +TIFF control logic must manage. This is bad software engineering: that +information should be treated as private to the JPEG codec +(compressor/decompressor). Worse, the fields themselves are specified +without sufficient thought for future extension and without regard to +well-established TIFF conventions. Here are some of the significant +problems: + +* The JPEGxxTable fields do not store the table data directly in the +IFD/field structure; rather, the fields hold pointers to information +elsewhere in the file. This requires special-purpose code to be added to +*every* TIFF-manipulating application, whether it needs to decode JPEG +image data or not. Even a trivial TIFF editor, for example a program to +add an ImageDescription field to a TIFF file, must be explicitly aware of +the internal structure of the JPEG-related tables, or else it will probably +break the file. Every other auxiliary field in the TIFF spec contains +data, not pointers, and can be copied or relocated by standard code that +doesn't know anything about the particular field. This is a crucial +property of the TIFF format that must not be given up. + +* To manipulate these fields, the TIFF control logic is required to know a +great deal about JPEG details, for example such arcana as how to compute +the length of a Huffman code table --- the length is not supplied in the +field structure and can only be found by inspecting the table contents. +This is again a violation of good software practice. Moreover, it will +prevent easy adoption of future JPEG extensions that might change these +low-level details. + +* The design neglects the fact that baseline JPEG codecs support only two +sets of Huffman tables: it specifies a separate table for each color +component. This implies that encoders must waste space (by storing +duplicate Huffman tables) or else violate the well-founded TIFF convention +that prohibits duplicate pointers. Furthermore, baseline decoders must +test to find out which tables are identical, a waste of time and code +space. + +* The JPEGInterchangeFormat field also violates TIFF's proscription against +duplicate pointers: the normal strip/tile pointers are expected to point +into the larger data area pointed to by JPEGInterchangeFormat. All TIFF +editing applications must be specifically aware of this relationship, since +they must maintain it or else delete the JPEGInterchangeFormat field. The +JPEGxxTables fields are also likely to point into the JPEGInterchangeFormat +area, creating additional pointer relationships that must be maintained. + +* The JPEGQTables field is fixed at a byte per table entry; there is no +way to support 16-bit quantization values. This is a serious impediment +to extending TIFF to use 12-bit JPEG. + +* The 6.0 design cannot support using different quantization tables in +different strips/tiles of an image (so as to encode some areas at higher +quality than others). Furthermore, since quantization tables are tied +one-for-one to color components, the design cannot support table switching +options that are likely to be added in future JPEG revisions. + + +Ambiguities +----------- + +Several incompatible interpretations are possible for 6.0's treatment of +JPEG restart markers: + + * It is unclear whether restart markers must be omitted at TIFF segment + (strip/tile) boundaries, or whether they are optional. + + * It is unclear whether the segment size is required to be chosen as + a multiple of the specified restart interval (if any); perhaps the + JPEG codec is supposed to be reset at each segment boundary as if + there were a restart marker there, even if the boundary does not fall + at a multiple of the nominal restart interval. + + * The spec fails to address the question of restart marker numbering: + do the numbers begin again within each segment, or not? + +That last point is particularly nasty. If we make numbering begin again +within each segment, we give up the ability to impose a TIFF strip/tile +structure on an existing JPEG datastream with restarts (which was clearly a +goal of Section 22's authors). But the other choice interferes with random +access to the image segments: a reader must compute the first restart +number to be expected within a segment, and must have a way to reset its +JPEG decoder to expect a nonzero restart number first. This may not even +be possible with some JPEG chips. + +The tile height restriction found on page 104 contradicts Section 15's +general description of tiles. For an image that is not vertically +downsampled, page 104 specifies a tile height of one MCU or 8 pixels; but +Section 15 requires tiles to be a multiple of 16 pixels high. + +This Tech Note does not attempt to resolve these ambiguities, so +implementations that follow the 6.0 design should be aware that +inter-application compatibility problems are likely to arise. + + +Unnecessary complexity +---------------------- + +The 6.0 design creates problems for implementations that need to keep the +JPEG codec separate from the TIFF control logic --- for example, consider +using a JPEG chip that was not designed specifically for TIFF. JPEG codecs +generally want to produce or consume a standard ISO JPEG datastream, not +just raw compressed data. (If they were to handle raw data, a separate +out-of-band mechanism would be needed to load tables into the codec.) +With such a codec, the TIFF control logic must parse JPEG markers emitted +by the codec to create the TIFF table fields (when writing) or synthesize +JPEG markers from the TIFF fields to feed the codec (when reading). This +means that the control logic must know a great deal more about JPEG details +than we would like. The parsing and reconstruction of the markers also +represents a fair amount of unnecessary work. + +Quite a few implementors have proposed writing "TIFF/JPEG" files in which +a standard JPEG datastream is simply dumped into the file and pointed to +by JPEGInterchangeFormat. To avoid parsing the JPEG datastream, they +suggest not writing the JPEG auxiliary fields (JPEGxxTables etc) nor even +the basic TIFF strip/tile data pointers. This approach is incompatible +with implementations that handle the full TIFF 6.0 JPEG design, since they +will expect to find strip/tile pointers and auxiliary fields. Indeed this +is arguably not TIFF at all, since *all* TIFF-reading applications expect +to find strip or tile pointers. A subset implementation that is not +upward-compatible with the full spec is clearly unacceptable. However, +the frequency with which this idea has come up makes it clear that +implementors find the existing Section 22 too complex. + + +Overview of the solution +======================== + +To solve these problems, we adopt a new design for embedding +JPEG-compressed data in TIFF files. The new design uses only complete, +uninterpreted ISO JPEG datastreams, so it should be much more forgiving of +extensions to the ISO standard. It should also be far easier to implement +using unmodified JPEG codecs. + +To reduce overhead in multi-segment TIFF files, we allow JPEG overhead +tables to be stored just once in a JPEGTables auxiliary field. This +feature does not violate the integrity of the JPEG datastreams, because it +uses the notions of "tables-only datastreams" and "abbreviated image +datastreams" as defined by the ISO standard. + +To prevent confusion with the old design, the new design is given a new +Compression tag value, Compression=7. Readers that need to handle +existing 6.0 JPEG files may read both old and new files, using whatever +interpretation of the 6.0 spec they did before. Compression tag value 6 +and the field tag numbers defined by 6.0 section 22 will remain reserved +indefinitely, even though detailed descriptions of them will be dropped +from future editions of the TIFF specification. + + +Replacement TIFF/JPEG specification +=================================== + +[This section of the Tech Note is expected to replace Section 22 in the +next release of the TIFF specification.] + +This section describes TIFF compression scheme 7, a high-performance +compression method for continuous-tone images. + +Introduction +------------ + +This TIFF compression method uses the international standard for image +compression ISO/IEC 10918-1, usually known as "JPEG" (after the original +name of the standards committee, Joint Photographic Experts Group). JPEG +is a joint ISO/CCITT standard for compression of continuous-tone images. + +The JPEG committee decided that because of the broad scope of the standard, +no one algorithmic procedure was able to satisfy the requirements of all +applications. Instead, the JPEG standard became a "toolkit" of multiple +algorithms and optional capabilities. Individual applications may select +a subset of the JPEG standard that meets their requirements. + +The most important distinction among the JPEG processes is between lossy +and lossless compression. Lossy compression methods provide high +compression but allow only approximate reconstruction of the original +image. JPEG's lossy processes allow the encoder to trade off compressed +file size against reconstruction fidelity over a wide range. Typically, +10:1 or more compression of full-color data can be obtained while keeping +the reconstructed image visually indistinguishable from the original. Much +higher compression ratios are possible if a low-quality reconstructed image +is acceptable. Lossless compression provides exact reconstruction of the +source data, but the achievable compression ratio is much lower than for +the lossy processes; JPEG's rather simple lossless process typically +achieves around 2:1 compression of full-color data. + +The most widely implemented JPEG subset is the "baseline" JPEG process. +This provides lossy compression of 8-bit-per-channel data. Optional +extensions include 12-bit-per-channel data, arithmetic entropy coding for +better compression, and progressive/hierarchical representations. The +lossless process is an independent algorithm that has little in +common with the lossy processes. + +It should be noted that the optional arithmetic-coding extension is subject +to several US and Japanese patents. To avoid patent problems, use of +arithmetic coding processes in TIFF files intended for inter-application +interchange is discouraged. + +All of the JPEG processes are useful only for "continuous tone" data, +in which the difference between adjacent pixel values is usually small. +Low-bit-depth source data is not appropriate for JPEG compression, nor +are palette-color images good candidates. The JPEG processes work well +on grayscale and full-color data. + +Describing the JPEG compression algorithms in sufficient detail to permit +implementation would require more space than we have here. Instead, we +refer the reader to the References section. + + +What data is being compressed? +------------------------------ + +In lossy JPEG compression, it is customary to convert color source data +to YCbCr and then downsample it before JPEG compression. This gives +2:1 data compression with hardly any visible image degradation, and it +permits additional space savings within the JPEG compression step proper. +However, these steps are not considered part of the ISO JPEG standard. +The ISO standard is "color blind": it accepts data in any color space. + +For TIFF purposes, the JPEG compression tag is considered to represent the +ISO JPEG compression standard only. The ISO standard is applied to the +same data that would be stored in the TIFF file if no compression were +used. Therefore, if color conversion or downsampling are used, they must +be reflected in the regular TIFF fields; these steps are not considered to +be implicit in the JPEG compression tag value. PhotometricInterpretation +and related fields shall describe the color space actually stored in the +file. With the TIFF 6.0 field definitions, downsampling is permissible +only for YCbCr data, and it must correspond to the YCbCrSubSampling field. +(Note that the default value for this field is not 1,1; so the default for +YCbCr is to apply downsampling!) It is likely that future versions of TIFF +will provide additional PhotometricInterpretation values and a more general +way of defining subsampling, so as to allow more flexibility in +JPEG-compressed files. But that issue is not addressed in this Tech Note. + +Implementors should note that many popular JPEG codecs +(compressor/decompressors) provide automatic color conversion and +downsampling, so that the application may supply full-size RGB data which +is nonetheless converted to downsampled YCbCr. This is an implementation +convenience which does not excuse the TIFF control layer from its +responsibility to know what is really going on. The +PhotometricInterpretation and subsampling fields written to the file must +describe what is actually in the file. + +A JPEG-compressed TIFF file will typically have PhotometricInterpretation = +YCbCr and YCbCrSubSampling = [2,1] or [2,2], unless the source data was +grayscale or CMYK. + + +Basic representation of JPEG-compressed images +---------------------------------------------- + +JPEG compression works in either strip-based or tile-based TIFF files. +Rather than repeating "strip or tile" constantly, we will use the term +"segment" to mean either a strip or a tile. + +When the Compression field has the value 7, each image segment contains +a complete JPEG datastream which is valid according to the ISO JPEG +standard (ISO/IEC 10918-1). Any sequential JPEG process can be used, +including lossless JPEG, but progressive and hierarchical processes are not +supported. Since JPEG is useful only for continuous-tone images, the +PhotometricInterpretation of the image shall not be 3 (palette color) nor +4 (transparency mask). The bit depth of the data is also restricted as +specified below. + +Each image segment in a JPEG-compressed TIFF file shall contain a valid +JPEG datastream according to the ISO JPEG standard's rules for +interchange-format or abbreviated-image-format data. The datastream shall +contain a single JPEG frame storing that segment of the image. The +required JPEG markers within a segment are: + SOI (must appear at very beginning of segment) + SOFn + SOS (one for each scan, if there is more than one scan) + EOI (must appear at very end of segment) +The actual compressed data follows SOS; it may contain RSTn markers if DRI +is used. + +Additional JPEG "tables and miscellaneous" markers may appear between SOI +and SOFn, between SOFn and SOS, and before each subsequent SOS if there is +more than one scan. These markers include: + DQT + DHT + DAC (not to appear unless arithmetic coding is used) + DRI + APPn (shall be ignored by TIFF readers) + COM (shall be ignored by TIFF readers) +DNL markers shall not be used in TIFF files. Readers should abort if any +other marker type is found, especially the JPEG reserved markers; +occurrence of such a marker is likely to indicate a JPEG extension. + +The tables/miscellaneous markers may appear in any order. Readers are +cautioned that although the SOFn marker refers to DQT tables, JPEG does not +require those tables to precede the SOFn, only the SOS. Missing-table +checks should be made when SOS is reached. + +If no JPEGTables field is used, then each image segment shall be a complete +JPEG interchange datastream. Each segment must define all the tables it +references. To allow readers to decode segments in any order, no segment +may rely on tables being carried over from a previous segment. + +When a JPEGTables field is used, image segments may omit tables that have +been specified in the JPEGTables field. Further details appear below. + +The SOFn marker shall be of type SOF0 for strict baseline JPEG data, of +type SOF1 for non-baseline lossy JPEG data, or of type SOF3 for lossless +JPEG data. (SOF9 or SOF11 would be used for arithmetic coding.) All +segments of a JPEG-compressed TIFF image shall use the same JPEG +compression process, in particular the same SOFn type. + +The data precision field of the SOFn marker shall agree with the TIFF +BitsPerSample field. (Note that when PlanarConfiguration=1, this implies +that all components must have the same BitsPerSample value; when +PlanarConfiguration=2, different components could have different bit +depths.) For SOF0 only precision 8 is permitted; for SOF1, precision 8 or +12 is permitted; for SOF3, precisions 2 to 16 are permitted. + +The image dimensions given in the SOFn marker shall agree with the logical +dimensions of that particular strip or tile. For strip images, the SOFn +image width shall equal ImageWidth and the height shall equal RowsPerStrip, +except in the last strip; its SOFn height shall equal the number of rows +remaining in the ImageLength. (In other words, no padding data is counted +in the SOFn dimensions.) For tile images, each SOFn shall have width +TileWidth and height TileHeight; adding and removing any padding needed in +the edge tiles is the concern of some higher level of the TIFF software. +(The dimensional rules are slightly different when PlanarConfiguration=2, +as described below.) + +The ISO JPEG standard only permits images up to 65535 pixels in width or +height, due to 2-byte fields in the SOFn markers. In TIFF, this limits +the size of an individual JPEG-compressed strip or tile, but the total +image size can be greater. + +The number of components in the JPEG datastream shall equal SamplesPerPixel +for PlanarConfiguration=1, and shall be 1 for PlanarConfiguration=2. The +components shall be stored in the same order as they are described at the +TIFF field level. (This applies both to their order in the SOFn marker, +and to the order in which they are scanned if multiple JPEG scans are +used.) The component ID bytes are arbitrary so long as each component +within an image segment is given a distinct ID. To avoid any possible +confusion, we require that all segments of a TIFF image use the same ID +code for a given component. + +In PlanarConfiguration 1, the sampling factors given in SOFn markers shall +agree with the sampling factors defined by the related TIFF fields (or with +the default values that are specified in the absence of those fields). + +When DCT-based JPEG is used in a strip TIFF file, RowsPerStrip is required +to be a multiple of 8 times the largest vertical sampling factor, i.e., a +multiple of the height of an interleaved MCU. (For simplicity of +specification, we require this even if the data is not actually +interleaved.) For example, if YCbCrSubSampling = [2,2] then RowsPerStrip +must be a multiple of 16. An exception to this rule is made for +single-strip images (RowsPerStrip >= ImageLength): the exact value of +RowsPerStrip is unimportant in that case. This rule ensures that no data +padding is needed at the bottom of a strip, except perhaps the last strip. +Any padding required at the right edge of the image, or at the bottom of +the last strip, is expected to occur internally to the JPEG codec. + +When DCT-based JPEG is used in a tiled TIFF file, TileLength is required +to be a multiple of 8 times the largest vertical sampling factor, i.e., +a multiple of the height of an interleaved MCU; and TileWidth is required +to be a multiple of 8 times the largest horizontal sampling factor, i.e., +a multiple of the width of an interleaved MCU. (For simplicity of +specification, we require this even if the data is not actually +interleaved.) All edge padding required will therefore occur in the course +of normal TIFF tile padding; it is not special to JPEG. + +Lossless JPEG does not impose these constraints on strip and tile sizes, +since it is not DCT-based. + +Note that within JPEG datastreams, multibyte values appear in the MSB-first +order specified by the JPEG standard, regardless of the byte ordering of +the surrounding TIFF file. + + +JPEGTables field +---------------- + +The only auxiliary TIFF field added for Compression=7 is the optional +JPEGTables field. The purpose of JPEGTables is to predefine JPEG +quantization and/or Huffman tables for subsequent use by JPEG image +segments. When this is done, these rather bulky tables need not be +duplicated in each segment, thus saving space and processing time. +JPEGTables may be used even in a single-segment file, although there is no +space savings in that case. + +JPEGTables: + Tag = 347 (15B.H) + Type = UNDEFINED + N = number of bytes in tables datastream, typically a few hundred +JPEGTables provides default JPEG quantization and/or Huffman tables which +are used whenever a segment datastream does not contain its own tables, as +specified below. + +Notice that the JPEGTables field is required to have type code UNDEFINED, +not type code BYTE. This is to cue readers that expanding individual bytes +to short or long integers is not appropriate. A TIFF reader will generally +need to store the field value as an uninterpreted byte sequence until it is +fed to the JPEG decoder. + +Multibyte quantities within the tables follow the ISO JPEG convention of +MSB-first storage, regardless of the byte ordering of the surrounding TIFF +file. + +When the JPEGTables field is present, it shall contain a valid JPEG +"abbreviated table specification" datastream. This datastream shall begin +with SOI and end with EOI. It may contain zero or more JPEG "tables and +miscellaneous" markers, namely: + DQT + DHT + DAC (not to appear unless arithmetic coding is used) + DRI + APPn (shall be ignored by TIFF readers) + COM (shall be ignored by TIFF readers) +Since JPEG defines the SOI marker to reset the DAC and DRI state, these two +markers' values cannot be carried over into any image datastream, and thus +they are effectively no-ops in the JPEGTables field. To avoid confusion, +it is recommended that writers not place DAC or DRI markers in JPEGTables. +However readers must properly skip over them if they appear. + +When JPEGTables is present, readers shall load the table specifications +contained in JPEGTables before processing image segment datastreams. +Image segments may simply refer to these preloaded tables without defining +them. An image segment can still define and use its own tables, subject to +the restrictions below. + +An image segment may not redefine any table defined in JPEGTables. (This +restriction is imposed to allow readers to process image segments in random +order without having to reload JPEGTables between segments.) Therefore, use +of JPEGTables divides the available table slots into two groups: "global" +slots are defined in JPEGTables and may be used but not redefined by +segments; "local" slots are available for local definition and use in each +segment. To permit random access, a segment may not reference any local +tables that it does not itself define. + + +Special considerations for PlanarConfiguration 2 +------------------------------------------------ + +In PlanarConfiguration 2, each image segment contains data for only one +color component. To avoid confusing the JPEG codec, we wish the segments +to look like valid single-channel (i.e., grayscale) JPEG datastreams. This +means that different rules must be used for the SOFn parameters. + +In PlanarConfiguration 2, the dimensions given in the SOFn of a subsampled +component shall be scaled down by the sampling factors compared to the SOFn +dimensions that would be used in PlanarConfiguration 1. This is necessary +to match the actual number of samples stored in that segment, so that the +JPEG codec doesn't complain about too much or too little data. In strip +TIFF files the computed dimensions may need to be rounded up to the next +integer; in tiled files, the restrictions on tile size make this case +impossible. + +Furthermore, all SOFn sampling factors shall be given as 1. (This is +merely to avoid confusion, since the sampling factors in a single-channel +JPEG datastream have no real effect.) + +Any downsampling will need to happen externally to the JPEG codec, since +JPEG sampling factors are defined with reference to the full-precision +component. In PlanarConfiguration 2, the JPEG codec will be working on +only one component at a time and thus will have no reference component to +downsample against. + + +Minimum requirements for TIFF/JPEG +---------------------------------- + +ISO JPEG is a large and complex standard; most implementations support only +a subset of it. Here we define a "core" subset of TIFF/JPEG which readers +must support to claim TIFF/JPEG compatibility. For maximum +cross-application compatibility, we recommend that writers confine +themselves to this subset unless there is very good reason to do otherwise. + +Use the ISO baseline JPEG process: 8-bit data precision, Huffman coding, +with no more than 2 DC and 2 AC Huffman tables. Note that this implies +BitsPerSample = 8 for each component. We recommend deviating from baseline +JPEG only if 12-bit data precision or lossless coding is required. + +Use no subsampling (all JPEG sampling factors = 1) for color spaces other +than YCbCr. (This is, in fact, required with the TIFF 6.0 field +definitions, but may not be so in future revisions.) For YCbCr, use one of +the following choices: + YCbCrSubSampling field JPEG sampling factors + 1,1 1h1v, 1h1v, 1h1v + 2,1 2h1v, 1h1v, 1h1v + 2,2 (default value) 2h2v, 1h1v, 1h1v +We recommend that RGB source data be converted to YCbCr for best compression +results. Other source data colorspaces should probably be left alone. +Minimal readers need not support JPEG images with colorspaces other than +YCbCr and grayscale (PhotometricInterpretation = 6 or 1). + +A minimal reader also need not support JPEG YCbCr images with nondefault +values of YCbCrCoefficients or YCbCrPositioning, nor with values of +ReferenceBlackWhite other than [0,255,128,255,128,255]. (These values +correspond to the RGB<=>YCbCr conversion specified by JFIF, which is widely +implemented in JPEG codecs.) + +Writers are reminded that a ReferenceBlackWhite field *must* be included +when PhotometricInterpretation is YCbCr, because the default +ReferenceBlackWhite values are inappropriate for YCbCr. + +If any subsampling is used, PlanarConfiguration=1 is preferred to avoid the +possibly-confusing requirements of PlanarConfiguration=2. In any case, +readers are not required to support PlanarConfiguration=2. + +If possible, use a single interleaved scan in each image segment. This is +not legal JPEG if there are more than 4 SamplesPerPixel or if the sampling +factors are such that more than 10 blocks would be needed per MCU; in that +case, use a separate scan for each component. (The recommended color +spaces and sampling factors will not run into that restriction, so a +minimal reader need not support more than one scan per segment.) + +To claim TIFF/JPEG compatibility, readers shall support multiple-strip TIFF +files and the optional JPEGTables field; it is not acceptable to read only +single-datastream files. Support for tiled TIFF files is strongly +recommended but not required. + + +Other recommendations for implementors +-------------------------------------- + +The TIFF tag Compression=7 guarantees only that the compressed data is +represented as ISO JPEG datastreams. Since JPEG is a large and evolving +standard, readers should apply careful error checking to the JPEG markers +to ensure that the compression process is within their capabilities. In +particular, to avoid being confused by future extensions to the JPEG +standard, it is important to abort if unknown marker codes are seen. + +The point of requiring that all image segments use the same JPEG process is +to ensure that a reader need check only one segment to determine whether it +can handle the image. For example, consider a TIFF reader that has access +to fast but restricted JPEG hardware, as well as a slower, more general +software implementation. It is desirable to check only one image segment +to find out whether the fast hardware can be used. Thus, writers should +try to ensure that all segments of an image look as much "alike" as +possible: there should be no variation in scan layout, use of options such +as DRI, etc. Ideally, segments will be processed identically except +perhaps for using different local quantization or entropy-coding tables. + +Writers should avoid including "noise" JPEG markers (COM and APPn markers). +Standard TIFF fields provide a better way to transport any non-image data. +Some JPEG codecs may change behavior if they see an APPn marker they +think they understand; since the TIFF spec requires these markers to be +ignored, this behavior is undesirable. + +It is possible to convert an interchange-JPEG file (e.g., a JFIF file) to +TIFF simply by dropping the interchange datastream into a single strip. +(However, designers are reminded that the TIFF spec discourages huge +strips; splitting the image is somewhat more work but may give better +results.) Conversion from TIFF to interchange JPEG is more complex. A +strip-based TIFF/JPEG file can be converted fairly easily if all strips use +identical JPEG tables and no RSTn markers: just delete the overhead markers +and insert RSTn markers between strips. Converting tiled images is harder, +since the data will usually not be in the right order (unless the tiles are +only one MCU high). This can still be done losslessly, but it will require +undoing and redoing the entropy coding so that the DC coefficient +differences can be updated. + +There is no default value for JPEGTables: standard TIFF files must define all +tables that they reference. For some closed systems in which many files will +have identical tables, it might make sense to define a default JPEGTables +value to avoid actually storing the tables. Or even better, invent a +private field selecting one of N default JPEGTables settings, so as to allow +for future expansion. Either of these must be regarded as a private +extension that will render the files unreadable by other applications. + + +References +---------- + +[1] Wallace, Gregory K. "The JPEG Still Picture Compression Standard", +Communications of the ACM, April 1991 (vol. 34 no. 4), pp. 30-44. + +This is the best short technical introduction to the JPEG algorithms. +It is a good overview but does not provide sufficiently detailed +information to write an implementation. + +[2] Pennebaker, William B. and Mitchell, Joan L. "JPEG Still Image Data +Compression Standard", Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1. +638pp. + +This textbook is by far the most complete exposition of JPEG in existence. +It includes the full text of the ISO JPEG standards (DIS 10918-1 and draft +DIS 10918-2). No would-be JPEG implementor should be without it. + +[3] ISO/IEC IS 10918-1, "Digital Compression and Coding of Continuous-tone +Still Images, Part 1: Requirements and guidelines", February 1994. +ISO/IEC DIS 10918-2, "Digital Compression and Coding of Continuous-tone +Still Images, Part 2: Compliance testing", final approval expected 1994. + +These are the official standards documents. Note that the Pennebaker and +Mitchell textbook is likely to be cheaper and more useful than the official +standards. + + +Changes to Section 21: YCbCr Images +=================================== + +[This section of the Tech Note clarifies section 21 to make clear the +interpretation of image dimensions in a subsampled image. Furthermore, +the section is changed to allow the original image dimensions not to be +multiples of the sampling factors. This change is necessary to support use +of JPEG compression on odd-size images.] + +Add the following paragraphs to the Section 21 introduction (p. 89), +just after the paragraph beginning "When a Class Y image is subsampled": + + In a subsampled image, it is understood that all TIFF image + dimensions are measured in terms of the highest-resolution + (luminance) component. In particular, ImageWidth, ImageLength, + RowsPerStrip, TileWidth, TileLength, XResolution, and YResolution + are measured in luminance samples. + + RowsPerStrip, TileWidth, and TileLength are constrained so that + there are an integral number of samples of each component in a + complete strip or tile. However, ImageWidth/ImageLength are not + constrained. If an odd-size image is to be converted to subsampled + format, the writer should pad the source data to a multiple of the + sampling factors by replication of the last column and/or row, then + downsample. The number of luminance samples actually stored in the + file will be a multiple of the sampling factors. Conversely, + readers must ignore any extra data (outside the specified image + dimensions) after upsampling. + + When PlanarConfiguration=2, each strip or tile covers the same + image area despite subsampling; that is, the total number of strips + or tiles in the image is the same for each component. Therefore + strips or tiles of the subsampled components contain fewer samples + than strips or tiles of the luminance component. + + If there are extra samples per pixel (see field ExtraSamples), + these data channels have the same number of samples as the + luminance component. + +Rewrite the YCbCrSubSampling field description (pp 91-92) as follows +(largely to eliminate possibly-misleading references to +ImageWidth/ImageLength of the subsampled components): + + (first paragraph unchanged) + + The two elements of this field are defined as follows: + + Short 0: ChromaSubsampleHoriz: + + 1 = there are equal numbers of luma and chroma samples horizontally. + + 2 = there are twice as many luma samples as chroma samples + horizontally. + + 4 = there are four times as many luma samples as chroma samples + horizontally. + + Short 1: ChromaSubsampleVert: + + 1 = there are equal numbers of luma and chroma samples vertically. + + 2 = there are twice as many luma samples as chroma samples + vertically. + + 4 = there are four times as many luma samples as chroma samples + vertically. + + ChromaSubsampleVert shall always be less than or equal to + ChromaSubsampleHoriz. Note that Cb and Cr have the same sampling + ratios. + + In a strip TIFF file, RowsPerStrip is required to be an integer + multiple of ChromaSubSampleVert (unless RowsPerStrip >= + ImageLength, in which case its exact value is unimportant). + If ImageWidth and ImageLength are not multiples of + ChromaSubsampleHoriz and ChromaSubsampleVert respectively, then the + source data shall be padded to the next integer multiple of these + values before downsampling. + + In a tiled TIFF file, TileWidth must be an integer multiple of + ChromaSubsampleHoriz and TileLength must be an integer multiple of + ChromaSubsampleVert. Padding will occur to tile boundaries. + + The default values of this field are [ 2,2 ]. Thus, YCbCr data is + downsampled by default! diff --git a/graphics/tiff/TTN2.draft.txt.gz b/graphics/tiff/TTN2.draft.txt.gz Binary files differnew file mode 100644 index 0000000000..acb9b36b29 --- /dev/null +++ b/graphics/tiff/TTN2.draft.txt.gz diff --git a/graphics/tiff/tiff-v3.4-tar.gz b/graphics/tiff/tiff-v3.4-tar.gz Binary files differnew file mode 100644 index 0000000000..d69a24777a --- /dev/null +++ b/graphics/tiff/tiff-v3.4-tar.gz diff --git a/graphics/tiff/tiff-v3.4beta018-tar.gz b/graphics/tiff/tiff-v3.4beta018-tar.gz Binary files differnew file mode 100644 index 0000000000..97b7a24851 --- /dev/null +++ b/graphics/tiff/tiff-v3.4beta018-tar.gz diff --git a/graphics/tiff/tiff-v3.4beta024-tar.gz b/graphics/tiff/tiff-v3.4beta024-tar.gz Binary files differnew file mode 100644 index 0000000000..7e658796da --- /dev/null +++ b/graphics/tiff/tiff-v3.4beta024-tar.gz diff --git a/graphics/tiff/tiff-v3.4beta028-tar.gz b/graphics/tiff/tiff-v3.4beta028-tar.gz Binary files differnew file mode 100644 index 0000000000..65375cfa42 --- /dev/null +++ b/graphics/tiff/tiff-v3.4beta028-tar.gz diff --git a/graphics/tiff/tiff-v3.4beta029-tar.gz b/graphics/tiff/tiff-v3.4beta029-tar.gz Binary files differnew file mode 100644 index 0000000000..33360ef299 --- /dev/null +++ b/graphics/tiff/tiff-v3.4beta029-tar.gz diff --git a/graphics/tiff/v3.4.0.patch-01 b/graphics/tiff/v3.4.0.patch-01 new file mode 100644 index 0000000000..353949674f --- /dev/null +++ b/graphics/tiff/v3.4.0.patch-01 @@ -0,0 +1,752 @@ +#! /bin/sh +# +# This is a shell script that converts tiff-v3.4beta016 to tiff-v3.4beta018 +# +TOP=. + +findBinary() +{ + IFS=: + for i in $PATH; do + test -x $i/$1 && return + done + echo "Fatal error: this shell script requires $2." + exit 1 +} +findBinary patch "Larry Wall's patch program" + +Patch() +{ + echo "Patch $1:" + patch -s $TOP/$1 +} + +NewFile() +{ + echo "New file $1" + cat >$TOP/$1 +} + +NewDir() +{ + echo "New directory $1" + mkdir "$TOP/$1" +} + +RmDir() +{ + echo "Remove directory $1" + rm -rf $TOP/$1.orig + mv $TOP/$1 $TOP/$1.orig +} + +RmFile() +{ + echo "Remove $1" + rm -f $TOP/$1.orig + mv $TOP/$1 $TOP/$1.orig +} + +Patch Makefile.in<<'EOF-EOF-EOF' +2c2 +< # $Header: /usr/people/sam/tiff/RCS/Makefile.in,v 1.24 1995/07/08 00:01:56 sam Exp $ +--- +> # $Header: /usr/people/sam/tiff/RCS/Makefile.in,v 1.25 1995/07/19 01:53:48 sam Exp $ +257a258 +> html/v3.4beta018.html \ +EOF-EOF-EOF +Patch config.guess<<'EOF-EOF-EOF' +127c127 +< *:IRIX:*:*) +--- +> *:IRIX*:*:*) +EOF-EOF-EOF +Patch config.site<<'EOF-EOF-EOF' +1c1 +< # $Header: /usr/people/sam/tiff/RCS/config.site,v 1.3 1995/06/30 04:43:04 sam Exp $ +--- +> # $Header: /usr/people/sam/tiff/RCS/config.site,v 1.5 1995/07/17 14:53:35 sam Exp $ +60a61,63 +> # NB: JPEG support requires release 5 or later of the IJG code, +> # which you can find on the Internet at ftp.uu.net:/graphics/jpeg/. +> # +66a70,73 +> # NB: Deflate support requires version 0.92 or later of the libgz +> # library written by Jean-loup Gailly and Mark Adler. The library +> # was last found at ftp://ftp.uu.net/graphics/png/code/zlib-0.93.tar.gz. +> # +68c75 +< #LIBGZ="-L \${ZIPDIR} -llibgz" # libgz library to load +--- +> #LIBGZ="-L \${ZIPDIR} -lgz" # libgz library to load +EOF-EOF-EOF +Patch configure<<'EOF-EOF-EOF' +2c2 +< # $Header: /usr/people/sam/tiff/RCS/configure,v 1.12 1995/07/03 16:05:40 sam Exp $ +--- +> # $Header: /usr/people/sam/tiff/RCS/configure,v 1.15 1995/07/17 14:57:08 sam Exp $ +144c144 +< echo "This is TIFF configure $Revision: 1.12 $" +--- +> echo "This is TIFF configure $Revision: 1.15 $" +381,382c381,404 +< ISGCC=no; CCOMPILER= +< for i in $CC gcc cc ncc dcc xlc gcc2; do +--- +> CCOMPILER= +> for i in $CC gcc cc ncc dcc xlc c89 gcc2; do +> if isGNU $i; then +> ISGCC=yes +> else +> ISGCC=no +> fi +> # +> # Guess special options needed to get an +> # ANSI C compiler and/or similar. Should +> # probably be combined with above checks +> # so we only select an ANSI C compiler. +> # +> if [ -z "$ENVOPTS" ]; then +> case $ISGCC-$TARGET in +> no-*-irix*) C_ANSI=-ansi;; +> no-*-hp*) C_ANSI="-Aa -D_HPUX_SOURCE -Dhpux";; +> no-*-apollo-*) C_ANSI="-A nansi";; +> *-sco*) C_ANSI="-Dsco";; +> *-aix*) C_ANSI="-Dunix -qlanglvl=ansi -qsrcmsg" ;; +> esac +> else +> C_ANSI="$ENVOPTS" +> fi +384,387c406 +< ($i -o dummy $ENVOPTS dummy.c) >/dev/null 2>&5 && { +< if isGNU $i; then +< ISGCC=yes +< fi +--- +> ($i -o dummy $C_ANSI dummy.c) >/dev/null 2>&5 && { +389a409,411 +> if [ -z "$ENVOPTS" ]; then +> ENVOPTS="$C_ANSI" +> fi +413,426d434 +< # +< # Guess special options needed to get an +< # ANSI C compiler and/or similar. Should +< # probably be combined with above checks +< # so we only select an ANSI C compiler. +< # +< if [ -z "$ENVOPTS" ]; then +< case $ISGCC-$TARGET in +< no-*-irix*) ENVOPTS=-ansi;; +< no-*-hp*) ENVOPTS="-Aa -D_HPUX_SOURCE -Dhpux";; +< no-*-apollo-*) ENVOPTS="-A nansi";; +< *-sco*) ENVOPTS="-Dsco";; +< esac +< fi +724c732 +< #ifdef __osf__ +--- +> #if defined(__osf__) || defined(_AIX) +942c950 +< *-irix5*) +--- +> *-irix*) +EOF-EOF-EOF +Patch dist/tiff.alpha<<'EOF-EOF-EOF' +1c1 +< define ALPHA 016 +--- +> define ALPHA 018 +EOF-EOF-EOF +Patch html/Makefile.in<<'EOF-EOF-EOF' +1c1 +< # $Header: /usr/people/sam/tiff/html/RCS/Makefile.in,v 1.3 1995/06/30 23:28:32 sam Exp $ +--- +> # $Header: /usr/people/sam/tiff/html/RCS/Makefile.in,v 1.4 1995/07/19 01:54:06 sam Exp $ +64a65,66 +> v3.4beta016.html \ +> v3.4beta018.html \ +EOF-EOF-EOF +Patch html/index.html<<'EOF-EOF-EOF' +15c15 +< <B>Latest Software</B>: <A HREF="v3.4beta016.html">v3.4beta016</A><BR> +--- +> <B>Latest Software</B>: <A HREF="v3.4beta018.html">v3.4beta018</A><BR> +84c84 +< Last updated: $Date: 1995/07/07 02:34:32 $ +--- +> Last updated: $Date: 1995/07/19 01:54:06 $ +EOF-EOF-EOF +Patch libtiff/Makefile.in<<'EOF-EOF-EOF' +1c1 +< # $Header: /usr/people/sam/tiff/libtiff/RCS/Makefile.in,v 1.19 1995/07/05 21:09:18 sam Exp $ +--- +> # $Header: /usr/people/sam/tiff/libtiff/RCS/Makefile.in,v 1.20 1995/07/17 19:26:25 sam Exp $ +70d69 +< INCS = tiff.h tiffio.h +261a261,262 +> INCS = ${SRCDIR}/tiff.h ${SRCDIR}/tiffio.h +> +264a266 +> f=`basename $$i`; \ +266c268 +< -src ${SRCDIR}/$$i -O $$i; \ +--- +> -src $$i -O $$f; \ +EOF-EOF-EOF +Patch libtiff/mkg3states.c<<'EOF-EOF-EOF' +1c1 +< /* "$Header: /usr/people/sam/tiff/libtiff/RCS/mkg3states.c,v 1.30 1995/06/07 17:19:51 sam Exp $ */ +--- +> /* "$Header: /usr/people/sam/tiff/libtiff/RCS/mkg3states.c,v 1.31 1995/07/17 01:27:30 sam Exp $ */ +28,45c28,31 +< Copyright (C) 1990, 1995 Frank D. Cringle. +< +< This file is part of viewfax - g3/g4 fax processing software. +< +< viewfax is free software; you can redistribute it and/or modify it +< under the terms of the GNU General Public License as published by the +< Free Software Foundation; either version 2 of the License, or (at your +< option) any later version. +< +< This program is distributed in the hope that it will be useful, but +< WITHOUT ANY WARRANTY; without even the implied warranty of +< MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +< General Public License for more details. +< +< You should have received a copy of the GNU General Public License +< along with this program; if not, write to the Free Software +< Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +< +--- +> * Decoder support is derived, with permission, from the code +> * in Frank Cringle's viewfax program; +> * Copyright (C) 1990, 1995 Frank D. Cringle. +> */ +EOF-EOF-EOF +Patch libtiff/tif_aux.c<<'EOF-EOF-EOF' +1c1 +< /* $Header: /usr/people/sam/tiff/libtiff/RCS/tif_aux.c,v 1.30 1995/06/06 23:49:31 sam Exp $ */ +--- +> /* $Header: /usr/people/sam/tiff/libtiff/RCS/tif_aux.c,v 1.31 1995/07/18 23:13:19 sam Exp $ */ +77a78 +> int +188a190 +> int +EOF-EOF-EOF +Patch libtiff/tif_dir.c<<'EOF-EOF-EOF' +1c1 +< /* $Header: /usr/people/sam/tiff/libtiff/RCS/tif_dir.c,v 1.150 1995/06/30 14:32:37 sam Exp $ */ +--- +> /* $Header: /usr/people/sam/tiff/libtiff/RCS/tif_dir.c,v 1.151 1995/07/19 00:39:31 sam Exp $ */ +72c72 +< if (*v > td->td_samplesperpixel) +--- +> if ((uint16) *v > td->td_samplesperpixel) +80c80 +< td->td_extrasamples = *v; +--- +> td->td_extrasamples = (uint16) *v; +EOF-EOF-EOF +Patch libtiff/tif_fax3.c<<'EOF-EOF-EOF' +1c1 +< /* $Header: /usr/people/sam/tiff/libtiff/RCS/tif_fax3.c,v 1.127 1995/06/30 15:29:02 sam Exp $ */ +--- +> /* $Header: /usr/people/sam/tiff/libtiff/RCS/tif_fax3.c,v 1.128 1995/07/17 01:27:30 sam Exp $ */ +200c200 +< Fax3PrematureEOL(const char* module, TIFF* tif, uint32 a0) +--- +> Fax3BadLength(const char* module, TIFF* tif, uint32 a0, uint32 lastx) +202,203c202,205 +< TIFFWarning(module, "%s: Premature EOL at scanline %d (x %lu)", +< tif->tif_name, tif->tif_row, (u_long) a0); +--- +> TIFFWarning(module, "%s: %s at scanline %d (got %lu, expected %lu)", +> tif->tif_name, +> a0 < lastx ? "Premature EOL" : "Line length mismatch", +> tif->tif_row, (u_long) a0, (u_long) lastx); +205c207 +< #define prematureEOL(a0) Fax3PrematureEOL(module, tif, a0) +--- +> #define badlength(a0,lastx) Fax3BadLength(module, tif, a0, lastx) +1206c1208,1209 +< fprintf(fd, " Consecutive Bad Fax Lines: %u\n", sp->badfaxrun); +--- +> fprintf(fd, " Consecutive Bad Fax Lines: %lu\n", +> (u_long) sp->badfaxrun); +EOF-EOF-EOF +Patch libtiff/tif_fax3.h<<'EOF-EOF-EOF' +1c1 +< /* $Header: /usr/people/sam/tiff/libtiff/RCS/tif_fax3.h,v 1.25 1995/07/06 18:03:52 sam Exp $ */ +--- +> /* $Header: /usr/people/sam/tiff/libtiff/RCS/tif_fax3.h,v 1.26 1995/07/17 01:27:30 sam Exp $ */ +264a265 +> badlength(a0, lastx); \ +298d298 +< prematureEOL(a0); \ +321d320 +< prematureEOL(a0); \ +468,469d466 +< else \ +< prematureEOL(a0); \ +EOF-EOF-EOF +Patch libtiff/tif_getimage.c<<'EOF-EOF-EOF' +1c1 +< /* $Header: /usr/people/sam/tiff/libtiff/RCS/tif_getimage.c,v 1.37 1995/06/20 23:40:24 sam Exp $ */ +--- +> /* $Header: /usr/people/sam/tiff/libtiff/RCS/tif_getimage.c,v 1.38 1995/07/17 01:27:18 sam Exp $ */ +1496a1497 +> TIFFRGBValue c; +1499d1499 +< TIFFRGBValue c; +1625a1626 +> TIFFRGBValue c; +1629d1629 +< TIFFRGBValue c; +EOF-EOF-EOF +Patch libtiff/tif_lzw.c<<'EOF-EOF-EOF' +1c1 +< /* $Header: /usr/people/sam/tiff/libtiff/RCS/tif_lzw.c,v 1.68 1995/06/30 15:29:02 sam Exp $ */ +--- +> /* $Header: /usr/people/sam/tiff/libtiff/RCS/tif_lzw.c,v 1.69 1995/07/19 00:39:31 sam Exp $ */ +175,177c175,177 +< #define NextCode(tif, sp, bp, code, get) { \ +< if ((sp)->dec_bitsleft < nbits) { \ +< TIFFWarning(tif->tif_name, \ +--- +> #define NextCode(_tif, _sp, _bp, _code, _get) { \ +> if ((_sp)->dec_bitsleft < nbits) { \ +> TIFFWarning(_tif->tif_name, \ +179,180c179,180 +< tif->tif_curstrip); \ +< code = CODE_EOI; \ +--- +> _tif->tif_curstrip); \ +> _code = CODE_EOI; \ +182,183c182,183 +< get(sp, bp, code); \ +< (sp)->dec_bitsleft -= nbits; \ +--- +> _get(_sp,_bp,_code); \ +> (_sp)->dec_bitsleft -= nbits; \ +EOF-EOF-EOF +Patch libtiff/tif_open.c<<'EOF-EOF-EOF' +1c1 +< /* $Header: /usr/people/sam/tiff/libtiff/RCS/tif_open.c,v 1.57 1995/06/06 23:49:31 sam Exp $ */ +--- +> /* $Header: /usr/people/sam/tiff/libtiff/RCS/tif_open.c,v 1.58 1995/07/17 01:27:01 sam Exp $ */ +178c178 +< { int one = 1; char* cp = (char*)&one; bigendian = (*cp == 0); } +--- +> { union { int i; char c[4]; } u; u.i = 1; bigendian = u.c[0] == 0; } +EOF-EOF-EOF +Patch libtiff/tif_print.c<<'EOF-EOF-EOF' +1c1 +< /* $Header: /usr/people/sam/tiff/libtiff/RCS/tif_print.c,v 1.62 1995/06/30 05:46:47 sam Exp $ */ +--- +> /* $Header: /usr/people/sam/tiff/libtiff/RCS/tif_print.c,v 1.64 1995/07/19 00:39:31 sam Exp $ */ +72c72 +< int i, j; +--- +> uint16 i; +224c224 +< fprintf(fd, "assoc-alpha", sep); +--- +> fprintf(fd, "%sassoc-alpha", sep); +227c227 +< fprintf(fd, "unassoc-alpha", sep); +--- +> fprintf(fd, "%sunassoc-alpha", sep); +252c252 +< char *cp; +--- +> char* cp; +398,399c398,399 +< fprintf(fd, " %5d: %5u %5u %5u\n", +< i, +--- +> fprintf(fd, " %5lu: %5u %5u %5u\n", +> l, +429,431c429,431 +< fprintf(fd, " %2d: %5u", +< i, td->td_transferfunction[0][l]); +< for (j = 1; j < td->td_samplesperpixel; j++) +--- +> fprintf(fd, " %2lu: %5u", +> l, td->td_transferfunction[0][l]); +> for (i = 1; i < td->td_samplesperpixel; i++) +433c433 +< td->td_transferfunction[j][l]); +--- +> td->td_transferfunction[i][l]); +458,459c458,459 +< fprintf(fd, " %3d: [%8lu, %8lu]\n", +< i, +--- +> fprintf(fd, " %3lu: [%8lu, %8lu]\n", +> (u_long) s, +EOF-EOF-EOF +Patch libtiff/tif_write.c<<'EOF-EOF-EOF' +1c1 +< /* $Header: /usr/people/sam/tiff/libtiff/RCS/tif_write.c,v 1.69 1995/06/27 00:54:41 sam Exp $ */ +--- +> /* $Header: /usr/people/sam/tiff/libtiff/RCS/tif_write.c,v 1.70 1995/07/18 17:55:31 sam Exp $ */ +363a364,366 +> #define isUnspecified(td, v) \ +> (td->v == (uint32) -1 || (td)->td_imagelength == 0) +> +367c370 +< register TIFFDirectory *td = &tif->tif_dir; +--- +> TIFFDirectory* td = &tif->tif_dir; +369,370c372,378 +< td->td_stripsperimage = td->td_nstrips = +< (isTiled(tif) ? TIFFNumberOfTiles(tif) : TIFFNumberOfStrips(tif)); +--- +> if (isTiled(tif)) +> td->td_stripsperimage = isUnspecified(td, td_tilelength) ? +> td->td_samplesperpixel : TIFFNumberOfTiles(tif); +> else +> td->td_stripsperimage = isUnspecified(td, td_rowsperstrip) ? +> td->td_samplesperpixel : TIFFNumberOfStrips(tif); +> td->td_nstrips = td->td_stripsperimage; +388a397 +> #undef isUnspecified +EOF-EOF-EOF +Patch libtiff/tif_zip.c<<'EOF-EOF-EOF' +1c1 +< /* $Header: /usr/people/sam/tiff/libtiff/RCS/tif_zip.c,v 1.3 1995/06/30 15:29:02 sam Exp $ */ +--- +> /* $Header: /usr/people/sam/tiff/libtiff/RCS/tif_zip.c,v 1.4 1995/07/17 14:38:12 sam Exp $ */ +39c39 +< * is best found using archie (e.g. look for zlib-0.92.tar.gz). +--- +> * was last found at ftp://ftp.uu.net/graphics/png/code/zlib-0.93.tar.gz. +EOF-EOF-EOF +Patch tools/fax2tiff.c<<'EOF-EOF-EOF' +1c1 +< /* $Header: /usr/people/sam/tiff/tools/RCS/fax2tiff.c,v 1.36 1995/06/06 23:45:26 sam Exp $ */ +--- +> /* $Header: /usr/people/sam/tiff/tools/RCS/fax2tiff.c,v 1.37 1995/07/17 01:36:52 sam Exp $ */ +42c42,49 +< TIFF faxTIFF; +--- +> #ifndef EXIT_SUCCESS +> #define EXIT_SUCCESS 0 +> #endif +> #ifndef EXIT_FAILURE +> #define EXIT_FAILURE 1 +> #endif +> +> TIFF *faxTIFF; +54a62,75 +> static tsize_t +> DummyReadProc(thandle_t fd, tdata_t buf, tsize_t size) +> { +> (void) fd; (void) buf; (void) size; +> return (0); +> } +> +> static tsize_t +> DummyWriteProc(thandle_t fd, tdata_t buf, tsize_t size) +> { +> (void) fd; (void) buf; (void) size; +> return (size); +> } +> +59a81 +> TIFFErrorHandler whandler; +71,79c93,108 +< _TIFFmemset(&faxTIFF, 0, sizeof (faxTIFF)); +< TIFFSetField(&faxTIFF, TIFFTAG_IMAGEWIDTH, XSIZE); +< TIFFSetField(&faxTIFF, TIFFTAG_SAMPLESPERPIXEL, 1); +< TIFFSetField(&faxTIFF, TIFFTAG_BITSPERSAMPLE, 1); +< TIFFSetField(&faxTIFF, TIFFTAG_FILLORDER, FILLORDER_LSB2MSB); +< TIFFSetField(&faxTIFF, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); +< TIFFSetField(&faxTIFF, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISWHITE); +< TIFFSetField(&faxTIFF, TIFFTAG_YRESOLUTION, 196.); +< TIFFSetField(&faxTIFF, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH); +--- +> /* smuggle a descriptor out of the library */ +> faxTIFF = TIFFClientOpen("(FakeInput)", "w", (thandle_t) -1, +> DummyReadProc, DummyWriteProc, +> NULL, NULL, NULL, NULL, NULL); +> if (faxTIFF == NULL) +> return (EXIT_FAILURE); +> faxTIFF->tif_mode = O_RDONLY; +> +> TIFFSetField(faxTIFF, TIFFTAG_IMAGEWIDTH, XSIZE); +> TIFFSetField(faxTIFF, TIFFTAG_SAMPLESPERPIXEL, 1); +> TIFFSetField(faxTIFF, TIFFTAG_BITSPERSAMPLE, 1); +> TIFFSetField(faxTIFF, TIFFTAG_FILLORDER, FILLORDER_LSB2MSB); +> TIFFSetField(faxTIFF, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); +> TIFFSetField(faxTIFF, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISWHITE); +> TIFFSetField(faxTIFF, TIFFTAG_YRESOLUTION, 196.); +> TIFFSetField(faxTIFF, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH); +81c110 +< faxTIFF.tif_scanlinesize = TIFFScanlineSize(&faxTIFF); +--- +> faxTIFF->tif_scanlinesize = TIFFScanlineSize(faxTIFF); +87c116 +< TIFFSetField(&faxTIFF, +--- +> TIFFSetField(faxTIFF, +91c120 +< TIFFSetField(&faxTIFF, +--- +> TIFFSetField(faxTIFF, +95c124 +< TIFFSetField(&faxTIFF, +--- +> TIFFSetField(faxTIFF, +99c128 +< TIFFSetField(&faxTIFF, +--- +> TIFFSetField(faxTIFF, +103c132 +< TIFFSetField(&faxTIFF, +--- +> TIFFSetField(faxTIFF, +107c136 +< TIFFSetField(&faxTIFF, +--- +> TIFFSetField(faxTIFF, +130c159 +< return (-2); +--- +> return EXIT_FAILURE; +156c185 +< return (-2); +--- +> return (EXIT_FAILURE); +158,164c187,193 +< faxTIFF.tif_readproc = out->tif_readproc; /* XXX */ +< faxTIFF.tif_writeproc = out->tif_writeproc; /* XXX */ +< faxTIFF.tif_seekproc = out->tif_seekproc; /* XXX */ +< faxTIFF.tif_closeproc = out->tif_closeproc; /* XXX */ +< faxTIFF.tif_sizeproc = out->tif_sizeproc; /* XXX */ +< faxTIFF.tif_mapproc = out->tif_mapproc; /* XXX */ +< faxTIFF.tif_unmapproc = out->tif_unmapproc; /* XXX */ +--- +> faxTIFF->tif_readproc = out->tif_readproc; /* XXX */ +> faxTIFF->tif_writeproc = out->tif_writeproc; /* XXX */ +> faxTIFF->tif_seekproc = out->tif_seekproc; /* XXX */ +> faxTIFF->tif_closeproc = out->tif_closeproc; /* XXX */ +> faxTIFF->tif_sizeproc = out->tif_sizeproc; /* XXX */ +> faxTIFF->tif_mapproc = out->tif_mapproc; /* XXX */ +> faxTIFF->tif_unmapproc = out->tif_unmapproc; /* XXX */ +171c200 +< TIFFSetField(&faxTIFF, TIFFTAG_COMPRESSION, COMPRESSION_CCITTFAX3); +--- +> TIFFSetField(faxTIFF, TIFFTAG_COMPRESSION, COMPRESSION_CCITTFAX3); +179,181c208,210 +< faxTIFF.tif_fd = fileno(in); +< faxTIFF.tif_clientdata = (thandle_t) faxTIFF.tif_fd; +< faxTIFF.tif_name = argv[optind]; +--- +> faxTIFF->tif_fd = fileno(in); +> faxTIFF->tif_clientdata = (thandle_t) faxTIFF->tif_fd; +> faxTIFF->tif_name = argv[optind]; +204c233 +< TIFFGetField(&faxTIFF, TIFFTAG_YRESOLUTION, &yres); +--- +> TIFFGetField(faxTIFF, TIFFTAG_YRESOLUTION, &yres); +211c240,242 +< rows = copyFaxFile(&faxTIFF, out); +--- +> if (!verbose) +> whandler = TIFFSetWarningHandler(NULL); +> rows = copyFaxFile(faxTIFF, out); +212a244,245 +> if (!verbose) +> (void) TIFFSetWarningHandler(whandler); +232c265 +< return (0); +--- +> return (EXIT_SUCCESS); +250a284 +> (*tifin->tif_setupdecode)(tifin); +326c360 +< exit(-1); +--- +> exit(EXIT_FAILURE); +EOF-EOF-EOF +Patch tools/tiff2bw.c<<'EOF-EOF-EOF' +1c1 +< /* $Header: /usr/people/sam/tiff/tools/RCS/tiff2bw.c,v 1.18 1995/07/01 01:16:55 sam Exp $ */ +--- +> /* $Header: /usr/people/sam/tiff/tools/RCS/tiff2bw.c,v 1.19 1995/07/19 00:39:51 sam Exp $ */ +34c34 +< +--- +> #include <ctype.h> +66c66 +< register int red = RED, green = GREEN, blue = BLUE; +--- +> register uint32 red = RED, green = GREEN, blue = BLUE; +EOF-EOF-EOF +Patch tools/tiffcmp.c<<'EOF-EOF-EOF' +1c1 +< /* $Header: /usr/people/sam/tiff/tools/RCS/tiffcmp.c,v 1.26 1995/06/06 23:45:26 sam Exp $ */ +--- +> /* $Header: /usr/people/sam/tiff/tools/RCS/tiffcmp.c,v 1.27 1995/07/19 00:39:51 sam Exp $ */ +122,123c122,123 +< int s, size1; +< uint32 row; +--- +> tsize_t size1; +> uint32 s, row; +432c432 +< int i; +--- +> uint16 i; +EOF-EOF-EOF +Patch tools/tiffdump.c<<'EOF-EOF-EOF' +1c1 +< /* $Header: /usr/people/sam/tiff/tools/RCS/tiffdump.c,v 1.43 1995/07/03 15:09:29 sam Exp $ */ +--- +> /* $Header: /usr/people/sam/tiff/tools/RCS/tiffdump.c,v 1.44 1995/07/19 00:39:51 sam Exp $ */ +62c62 +< #include "tiff.h" +--- +> #include "tiffio.h" +173,176d172 +< static void TIFFSwabShort(uint16 *); +< static void TIFFSwabLong(uint32 *); +< static void TIFFSwabArrayOfShort(uint16 *, unsigned long); +< static void TIFFSwabArrayOfLong(uint32 *, unsigned long); +656,703d651 +< } +< } +< +< static void +< TIFFSwabShort(uint16* wp) +< { +< register unsigned char *cp = (unsigned char *)wp; +< int t; +< +< t = cp[1]; cp[1] = cp[0]; cp[0] = t; +< } +< +< static void +< TIFFSwabLong(uint32* lp) +< { +< register unsigned char *cp = (unsigned char *)lp; +< int t; +< +< t = cp[3]; cp[3] = cp[0]; cp[0] = t; +< t = cp[2]; cp[2] = cp[1]; cp[1] = t; +< } +< +< static void +< TIFFSwabArrayOfShort(uint16* wp, unsigned long n) +< { +< register unsigned char *cp; +< register int t; +< +< /* XXX unroll loop some */ +< while (n-- > 0) { +< cp = (unsigned char *)wp; +< t = cp[1]; cp[1] = cp[0]; cp[0] = t; +< wp++; +< } +< } +< +< static void +< TIFFSwabArrayOfLong(uint32* lp, unsigned long n) +< { +< register unsigned char *cp; +< register int t; +< +< /* XXX unroll loop some */ +< while (n-- > 0) { +< cp = (unsigned char *)lp; +< t = cp[3]; cp[3] = cp[0]; cp[0] = t; +< t = cp[2]; cp[2] = cp[1]; cp[1] = t; +< lp++; +EOF-EOF-EOF +NewFile html/v3.4beta018.html<<'EOF-EOF-EOF' +<HTML> +<HEAD> +<TITLE> +Changes in TIFF v3.4beta018 +</TITLE> +</HEAD> + +<BODY> + +<BASEFONT SIZE=4> +<B><FONT SIZE=+3>T</FONT>IFF <FONT SIZE=+2>C</FONT>HANGE <FONT SIZE=+2>I</FONT>NFORMATION</B> +<BASEFONT SIZE=3> + +<UL> +<HR SIZE=4 WIDTH=65% ALIGN=left> +<B>Current Version</B>: v3.4beta018<BR> +<B>Previous Version</B>: <A HREF=v3.4beta016.html>v3.4beta016</A><BR> +<B>Master FTP Site</B>: <A HREF="ftp://ftp.sgi.com/graphics/tiff">ftp.sgi.com (192.48.153.1), directory graphics/tiff</A><BR> +<HR SIZE=4 WIDTH=65% ALIGN=left> +</UL> + +<P> +This document describes the changes made to the software between the +<I>previous</I> and <I>current</I> versions (see above). +If you don't find something listed here, then it was not done in this +timeframe, or it was not considered important enough to be mentioned. +The following information is located here: +<UL> +<LI><A HREF="#configure">Changes in the software configuration</A> +<LI><A HREF="#libtiff">Changes in libtiff</A> +<LI><A HREF="#tools">Changes in the tools</A> +</UL> + +<P><HR WIDTH=65% ALIGN=right> + +<A NAME="configure"><B><FONT SIZE=+3>C</FONT>HANGES IN THE SOFTWARE CONFIGURATION:</B></A> + +<UL> +<LI>configure now recognizes IRIX 6.x systems +<LI>configure now uses <TT>ENVOPTS</TT> when searching for an ANSI + C compiler; this fixes a problem configuring the software under + HP/UX with the native C compiler +<LI>configure now correctly recognizes memory-mapped files are supported + under AIX +</UL> + +<P><HR WIDTH=65% ALIGN=right> + +<A NAME="libtiff"><B><FONT SIZE=+3>C</FONT>HANGES IN LIBTIFF:</B></A> + +<UL> +<LI><TT>make install</TT> now properly installs the include files +<LI>some portability fixes from Bjorn Brox +<LI>the G3/G4 codec now warns about decoded rows that are longer than + the image/tile width +<LI>changes from Frank Cringle to make the library work with the + gcc-specific bounds checking software +<LI>miscellaneous fixes to <TT>TIFFPrintDirectory</TT> +<LI>bug fix to correct a problem where <TT>TIFFWriteRawStrip</TT> + could not be used to automatically grow an image's length +</UL> + +<P><HR WIDTH=65% ALIGN=right> + +<A NAME="tools"><B><FONT SIZE=+3>C</FONT>HANGES IN THE TOOLS:</B></A> + +<UL> +<LI>fixes from Frank Cringle to update <TT>fax2tiff</TT> +<LI>portability fixes to <TT>tiff2bw</TT> and <TT>tiffcmp</TT> +<LI><TT>tiffdump</TT> now uses the byte swapping routines in the library +</UL> + +<A HREF="index.html"><IMG SRC="images/back.gif"></A> TIFF home page.<BR> + +<HR> + +<ADDRESS> +<A HREF="sam.html">Sam Leffler</A> / <A HREF="mailto:sam@engr.sgi.com">sam@engr.sgi.com</A> +Last updated $Date: 1995/07/19 01:54:02 $. +</ADDRESS> + +</BODY> +</HTML> +EOF-EOF-EOF |