Hex Artifact Content
Not logged in

Artifact d12412e3855269c391c299bfae140322541ca854:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  ###############.
0050: 23 0a 23 20 70 64 66 34 74 63 6c 5f 67 72 61 70  #.# pdf4tcl_grap
0060: 68 2e 74 63 6c 0a 23 0a 23 20 20 43 6f 70 79 72  h.tcl.#.#  Copyr
0070: 69 67 68 74 20 28 43 29 20 32 30 31 37 20 4a 6f  ight (C) 2017 Jo
0080: 65 72 67 20 4d 65 68 72 69 6e 67 2c 20 42 6f 63  erg Mehring, Boc
0090: 68 75 6d 2c 20 44 45 2c 20 3c 6a 2e 6d 65 68 72  hum, DE, <j.mehr
00a0: 69 6e 67 40 73 65 73 61 6d 2d 67 6d 62 68 2e 64  ing@sesam-gmbh.d
00b0: 65 3e 0a 23 20 20 41 6c 6c 20 72 69 67 68 74 73  e>.#  All rights
00c0: 20 72 65 73 65 72 76 65 64 2e 20 28 42 53 44 2d   reserved. (BSD-
00d0: 33 20 6c 69 63 65 6e 73 65 29 0a 23 0a 23 20 20  3 license).#.#  
00e0: 52 65 64 69 73 74 72 69 62 75 74 69 6f 6e 20 61  Redistribution a
00f0: 6e 64 20 75 73 65 20 69 6e 20 73 6f 75 72 63 65  nd use in source
0100: 20 61 6e 64 20 62 69 6e 61 72 79 20 66 6f 72 6d   and binary form
0110: 73 2c 20 77 69 74 68 20 6f 72 20 77 69 74 68 6f  s, with or witho
0120: 75 74 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 2c  ut modification,
0130: 0a 23 20 20 61 72 65 20 70 65 72 6d 69 74 74 65  .#  are permitte
0140: 64 20 70 72 6f 76 69 64 65 64 20 74 68 61 74 20  d provided that 
0150: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
0160: 6e 64 69 74 69 6f 6e 73 20 61 72 65 20 6d 65 74  nditions are met
0170: 3a 0a 23 0a 23 20 20 31 2e 20 52 65 64 69 73 74  :.#.#  1. Redist
0180: 72 69 62 75 74 69 6f 6e 73 20 6f 66 20 73 6f 75  ributions of sou
0190: 72 63 65 20 63 6f 64 65 20 6d 75 73 74 20 72 65  rce code must re
01a0: 74 61 69 6e 20 74 68 65 20 61 62 6f 76 65 20 63  tain the above c
01b0: 6f 70 79 72 69 67 68 74 20 6e 6f 74 69 63 65 2c  opyright notice,
01c0: 20 74 68 69 73 0a 23 20 20 20 20 20 6c 69 73 74   this.#     list
01d0: 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61   of conditions a
01e0: 6e 64 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  nd the following
01f0: 20 64 69 73 63 6c 61 69 6d 65 72 2e 0a 23 20 20   disclaimer..#  
0200: 32 2e 20 52 65 64 69 73 74 72 69 62 75 74 69 6f  2. Redistributio
0210: 6e 73 20 69 6e 20 62 69 6e 61 72 79 20 66 6f 72  ns in binary for
0220: 6d 20 6d 75 73 74 20 72 65 70 72 6f 64 75 63 65  m must reproduce
0230: 20 74 68 65 20 61 62 6f 76 65 20 63 6f 70 79 72   the above copyr
0240: 69 67 68 74 20 6e 6f 74 69 63 65 2c 0a 23 20 20  ight notice,.#  
0250: 20 20 20 74 68 69 73 20 6c 69 73 74 20 6f 66 20     this list of 
0260: 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74  conditions and t
0270: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 69 73  he following dis
0280: 63 6c 61 69 6d 65 72 20 69 6e 20 74 68 65 20 64  claimer in the d
0290: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 0a 23 20 20  ocumentation.#  
02a0: 20 20 20 61 6e 64 2f 6f 72 20 6f 74 68 65 72 20     and/or other 
02b0: 6d 61 74 65 72 69 61 6c 73 20 70 72 6f 76 69 64  materials provid
02c0: 65 64 20 77 69 74 68 20 74 68 65 20 64 69 73 74  ed with the dist
02d0: 72 69 62 75 74 69 6f 6e 2e 0a 23 20 20 33 2e 20  ribution..#  3. 
02e0: 4e 65 69 74 68 65 72 20 74 68 65 20 6e 61 6d 65  Neither the name
02f0: 20 6f 66 20 74 68 65 20 70 72 6f 6a 65 63 74 20   of the project 
0300: 6e 6f 72 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  nor the names of
0310: 20 69 74 73 20 63 6f 6e 74 72 69 62 75 74 6f 72   its contributor
0320: 73 20 6d 61 79 20 62 65 20 75 73 65 64 0a 23 20  s may be used.# 
0330: 20 20 20 20 74 6f 20 65 6e 64 6f 72 73 65 20 6f      to endorse o
0340: 72 20 70 72 6f 6d 6f 74 65 20 70 72 6f 64 75 63  r promote produc
0350: 74 73 20 64 65 72 69 76 65 64 20 66 72 6f 6d 20  ts derived from 
0360: 74 68 69 73 20 73 6f 66 74 77 61 72 65 20 77 69  this software wi
0370: 74 68 6f 75 74 20 73 70 65 63 69 66 69 63 0a 23  thout specific.#
0380: 20 20 20 20 20 70 72 69 6f 72 20 77 72 69 74 74       prior writt
0390: 65 6e 20 70 65 72 6d 69 73 73 69 6f 6e 2e 0a 23  en permission..#
03a0: 0a 23 20 20 54 48 49 53 20 53 4f 46 54 57 41 52  .#  THIS SOFTWAR
03b0: 45 20 49 53 20 50 52 4f 56 49 44 45 44 20 42 59  E IS PROVIDED BY
03c0: 20 54 48 45 20 43 4f 50 59 52 49 47 48 54 20 48   THE COPYRIGHT H
03d0: 4f 4c 44 45 52 53 20 41 4e 44 20 43 4f 4e 54 52  OLDERS AND CONTR
03e0: 49 42 55 54 4f 52 53 20 22 41 53 20 49 53 22 20  IBUTORS "AS IS" 
03f0: 41 4e 44 20 41 4e 59 0a 23 20 20 45 58 50 52 45  AND ANY.#  EXPRE
0400: 53 53 20 4f 52 20 49 4d 50 4c 49 45 44 20 57 41  SS OR IMPLIED WA
0410: 52 52 41 4e 54 49 45 53 2c 20 49 4e 43 4c 55 44  RRANTIES, INCLUD
0420: 49 4e 47 2c 20 42 55 54 20 4e 4f 54 20 4c 49 4d  ING, BUT NOT LIM
0430: 49 54 45 44 20 54 4f 2c 20 54 48 45 20 49 4d 50  ITED TO, THE IMP
0440: 4c 49 45 44 20 57 41 52 52 41 4e 54 49 45 53 0a  LIED WARRANTIES.
0450: 23 20 20 4f 46 20 4d 45 52 43 48 41 4e 54 41 42  #  OF MERCHANTAB
0460: 49 4c 49 54 59 20 41 4e 44 20 46 49 54 4e 45 53  ILITY AND FITNES
0470: 53 20 46 4f 52 20 41 20 50 41 52 54 49 43 55 4c  S FOR A PARTICUL
0480: 41 52 20 50 55 52 50 4f 53 45 20 41 52 45 20 44  AR PURPOSE ARE D
0490: 49 53 43 4c 41 49 4d 45 44 2e 20 20 49 4e 20 4e  ISCLAIMED.  IN N
04a0: 4f 20 45 56 45 4e 54 0a 23 20 20 53 48 41 4c 4c  O EVENT.#  SHALL
04b0: 20 54 48 45 20 43 4f 50 59 52 49 47 48 54 20 4f   THE COPYRIGHT O
04c0: 57 4e 45 52 20 4f 52 20 43 4f 4e 54 52 49 42 55  WNER OR CONTRIBU
04d0: 54 4f 52 53 20 42 45 20 4c 49 41 42 4c 45 20 46  TORS BE LIABLE F
04e0: 4f 52 20 41 4e 59 20 44 49 52 45 43 54 2c 20 49  OR ANY DIRECT, I
04f0: 4e 44 49 52 45 43 54 2c 0a 23 20 20 49 4e 43 49  NDIRECT,.#  INCI
0500: 44 45 4e 54 41 4c 2c 20 53 50 45 43 49 41 4c 2c  DENTAL, SPECIAL,
0510: 20 45 58 45 4d 50 4c 41 52 59 2c 20 4f 52 20 43   EXEMPLARY, OR C
0520: 4f 4e 53 45 51 55 45 4e 54 49 41 4c 20 44 41 4d  ONSEQUENTIAL DAM
0530: 41 47 45 53 20 28 49 4e 43 4c 55 44 49 4e 47 2c  AGES (INCLUDING,
0540: 20 42 55 54 20 4e 4f 54 20 4c 49 4d 49 54 45 44   BUT NOT LIMITED
0550: 0a 23 20 20 54 4f 2c 20 50 52 4f 43 55 52 45 4d  .#  TO, PROCUREM
0560: 45 4e 54 20 4f 46 20 53 55 42 53 54 49 54 55 54  ENT OF SUBSTITUT
0570: 45 20 47 4f 4f 44 53 20 4f 52 20 53 45 52 56 49  E GOODS OR SERVI
0580: 43 45 53 3b 20 4c 4f 53 53 20 4f 46 20 55 53 45  CES; LOSS OF USE
0590: 2c 20 44 41 54 41 2c 20 4f 52 20 50 52 4f 46 49  , DATA, OR PROFI
05a0: 54 53 3b 20 4f 52 0a 23 20 20 42 55 53 49 4e 45  TS; OR.#  BUSINE
05b0: 53 53 20 49 4e 54 45 52 52 55 50 54 49 4f 4e 29  SS INTERRUPTION)
05c0: 20 48 4f 57 45 56 45 52 20 43 41 55 53 45 44 20   HOWEVER CAUSED 
05d0: 41 4e 44 20 4f 4e 20 41 4e 59 20 54 48 45 4f 52  AND ON ANY THEOR
05e0: 59 20 4f 46 20 4c 49 41 42 49 4c 49 54 59 2c 20  Y OF LIABILITY, 
05f0: 57 48 45 54 48 45 52 20 49 4e 0a 23 20 20 43 4f  WHETHER IN.#  CO
0600: 4e 54 52 41 43 54 2c 20 53 54 52 49 43 54 20 4c  NTRACT, STRICT L
0610: 49 41 42 49 4c 49 54 59 2c 20 4f 52 20 54 4f 52  IABILITY, OR TOR
0620: 54 20 28 49 4e 43 4c 55 44 49 4e 47 20 4e 45 47  T (INCLUDING NEG
0630: 4c 49 47 45 4e 43 45 20 4f 52 20 4f 54 48 45 52  LIGENCE OR OTHER
0640: 57 49 53 45 29 20 41 52 49 53 49 4e 47 20 49 4e  WISE) ARISING IN
0650: 0a 23 20 20 41 4e 59 20 57 41 59 20 4f 55 54 20  .#  ANY WAY OUT 
0660: 4f 46 20 54 48 45 20 55 53 45 20 4f 46 20 54 48  OF THE USE OF TH
0670: 49 53 20 53 4f 46 54 57 41 52 45 2c 20 45 56 45  IS SOFTWARE, EVE
0680: 4e 20 49 46 20 41 44 56 49 53 45 44 20 4f 46 20  N IF ADVISED OF 
0690: 54 48 45 20 50 4f 53 53 49 42 49 4c 49 54 59 20  THE POSSIBILITY 
06a0: 4f 46 0a 23 20 20 53 55 43 48 20 44 41 4d 41 47  OF.#  SUCH DAMAG
06b0: 45 2e 0a 23 0a 23 0a 23 20 54 68 69 73 20 69 73  E..#.#.# This is
06c0: 20 61 6e 20 6f 75 74 70 75 74 20 65 6e 67 69 6e   an output engin
06d0: 65 20 66 6f 72 20 22 67 72 61 70 68 2e 74 63 6c  e for "graph.tcl
06e0: 22 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 42  " to implement B
06f0: 4c 54 20 28 6f 72 20 52 42 43 29 20 63 6f 6d 6d  LT (or RBC) comm
0700: 61 6e 64 73 20 66 6f 72 0a 23 20 67 65 6e 65 72  ands for.# gener
0710: 61 74 69 6e 67 20 50 44 46 20 6f 75 74 70 75 74  ating PDF output
0720: 20 75 73 69 6e 67 20 74 68 65 20 22 70 64 66 34   using the "pdf4
0730: 74 63 6c 22 20 50 61 63 6b 61 67 65 2e 0a 23 0a  tcl" Package..#.
0740: 23 20 4e 6f 69 63 65 3a 20 53 6f 20 66 61 72 2c  # Noice: So far,
0750: 20 22 70 64 66 34 74 63 6c 22 20 6d 75 73 74 20   "pdf4tcl" must 
0760: 62 65 20 70 61 74 63 68 65 64 20 74 6f 20 73 75  be patched to su
0770: 70 70 6f 72 74 20 66 75 6e 63 74 69 6f 6e 73 20  pport functions 
0780: 73 75 63 68 20 61 73 20 0a 23 20 20 20 20 20 20  such as .#      
0790: 20 20 6e 6f 6e 2d 63 6c 6f 73 65 64 20 70 6f 6c    non-closed pol
07a0: 79 67 6f 6e 73 20 61 6e 64 20 63 6c 69 70 70 69  ygons and clippi
07b0: 6e 67 2e 20 59 6f 75 20 63 61 6e 20 64 6f 77 6e  ng. You can down
07c0: 6c 6f 61 64 20 61 20 70 61 74 63 68 65 64 20 0a  load a patched .
07d0: 23 20 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e  #        version
07e0: 20 66 72 6f 6d 20 68 65 72 65 20 28 49 20 68 6f   from here (I ho
07f0: 70 65 20 74 68 65 20 61 75 74 68 6f 72 20 6f 66  pe the author of
0800: 20 22 70 64 66 34 74 63 6c 22 20 69 6e 63 6f 72   "pdf4tcl" incor
0810: 70 6f 72 61 74 65 73 0a 23 20 20 20 20 20 20 20  porates.#       
0820: 20 74 68 69 73 20 70 61 74 63 68 20 69 6e 74 6f   this patch into
0830: 20 68 69 73 20 73 6f 75 72 63 65 73 29 3a 0a 23   his sources):.#
0840: 0a 23 20 68 74 74 70 3a 2f 2f 73 65 73 61 6d 2d  .# http://sesam-
0850: 67 6d 62 68 2e 6f 72 67 2f 69 6d 61 67 65 73 2f  gmbh.org/images/
0860: 44 6f 77 6e 6c 6f 61 64 73 2f 70 75 62 6c 69 63  Downloads/public
0870: 2f 70 64 66 34 74 63 6c 30 39 31 70 31 2e 74 61  /pdf4tcl091p1.ta
0880: 72 2e 62 7a 32 0a 23 20 0a 23 20 55 73 61 67 65  r.bz2.# .# Usage
0890: 20 65 78 61 6d 70 6c 65 3a 0a 23 0a 23 20 20 20   example:.#.#   
08a0: 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
08b0: 70 64 66 34 74 63 6c 3a 3a 67 72 61 70 68 0a 23  pdf4tcl::graph.#
08c0: 20 0a 23 20 20 20 70 64 66 34 74 63 6c 3a 3a 6e   .#   pdf4tcl::n
08d0: 65 77 20 6d 79 70 64 66 20 2d 70 61 70 65 72 20  ew mypdf -paper 
08e0: 61 34 20 2d 75 6e 69 74 20 6d 6d 20 0a 23 20 20  a4 -unit mm .#  
08f0: 20 6d 79 70 64 66 20 73 74 61 72 74 50 61 67 65   mypdf startPage
0900: 0a 23 20 20 20 6d 79 70 64 66 20 73 65 74 46 6f  .#   mypdf setFo
0910: 6e 74 20 34 20 48 65 6c 76 65 74 69 63 61 0a 23  nt 4 Helvetica.#
0920: 20 20 20 6d 79 70 64 66 20 74 65 78 74 20 22 48     mypdf text "H
0930: 65 6c 6c 6f 20 57 6f 72 6c 64 22 20 2d 78 20 31  ello World" -x 1
0940: 30 20 2d 79 20 31 30 0a 23 20 0a 23 20 20 20 67  0 -y 10.# .#   g
0950: 72 61 70 68 3a 3a 73 65 74 75 70 20 70 64 66 34  raph::setup pdf4
0960: 74 63 6c 20 6d 79 70 64 66 0a 23 20 0a 23 20 20  tcl mypdf.# .#  
0970: 20 73 65 74 20 6d 79 64 61 74 61 20 7b 32 31 20   set mydata {21 
0980: 31 37 20 35 20 39 20 32 35 2e 34 7d 0a 23 20 0a  17 5 9 25.4}.# .
0990: 23 20 20 20 73 65 74 20 67 20 5b 67 72 61 70 68  #   set g [graph
09a0: 3a 3a 67 72 61 70 68 20 2d 74 69 74 6c 65 20 22  ::graph -title "
09b0: 45 78 61 6d 70 6c 65 22 5d 0a 23 20 20 20 24 67  Example"].#   $g
09c0: 20 61 78 69 73 20 63 72 65 61 74 65 20 79 33 20   axis create y3 
09d0: 2d 63 6f 6c 6f 72 20 62 6c 75 65 0a 23 20 20 20  -color blue.#   
09e0: 24 67 20 65 6c 65 6d 65 6e 74 20 63 72 65 61 74  $g element creat
09f0: 65 20 6c 69 6e 65 31 20 2d 6c 61 62 65 6c 20 22  e line1 -label "
0a00: 44 61 74 61 22 20 2d 79 64 61 74 61 20 6d 79 64  Data" -ydata myd
0a10: 61 74 61 20 2d 66 69 6c 6c 20 72 65 64 0a 23 20  ata -fill red.# 
0a20: 20 20 24 67 20 67 72 69 64 20 63 6f 6e 66 69 67    $g grid config
0a30: 75 72 65 20 2d 68 69 64 65 20 6e 6f 0a 23 20 20  ure -hide no.#  
0a40: 20 24 67 20 61 78 69 73 20 63 6f 6e 66 69 67 75   $g axis configu
0a50: 72 65 20 78 20 2d 6d 69 6e 20 30 20 2d 6d 61 78  re x -min 0 -max
0a60: 20 31 30 30 0a 23 20 20 20 24 67 20 61 78 69 73   100.#   $g axis
0a70: 20 63 6f 6e 66 69 67 75 72 65 20 79 20 2d 6c 6f   configure y -lo
0a80: 6f 73 65 20 6e 6f 20 2d 68 69 64 65 20 6e 6f 20  ose no -hide no 
0a90: 2d 6d 61 78 20 32 35 20 2d 74 69 74 6c 65 20 41  -max 25 -title A
0aa0: 6c 70 68 61 0a 23 20 20 20 24 67 20 64 72 61 77  lpha.#   $g draw
0ab0: 20 31 35 20 31 35 0a 23 20 20 20 24 67 20 64 65   15 15.#   $g de
0ac0: 73 74 72 6f 79 0a 23 0a 23 20 20 20 6d 79 70 64  stroy.#.#   mypd
0ad0: 66 20 77 72 69 74 65 20 2d 66 69 6c 65 20 67 72  f write -file gr
0ae0: 61 70 68 2e 70 64 66 0a 23 20 20 20 6d 79 70 64  aph.pdf.#   mypd
0af0: 66 20 64 65 73 74 72 6f 79 0a 23 20 0a 23 0a 23  f destroy.# .#.#
0b00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0b10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0b20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0b30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0b40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a  ##############..
0b50: 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
0b60: 70 64 66 34 74 63 6c 0a 70 61 63 6b 61 67 65 20  pdf4tcl.package 
0b70: 72 65 71 75 69 72 65 20 67 72 61 70 68 0a 70 61  require graph.pa
0b80: 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20 70 64  ckage provide pd
0b90: 66 34 74 63 6c 3a 3a 67 72 61 70 68 20 31 2e 30  f4tcl::graph 1.0
0ba0: 0a 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65 76 61  ...namespace eva
0bb0: 6c 20 70 64 66 34 74 63 6c 3a 3a 67 72 61 70 68  l pdf4tcl::graph
0bc0: 20 7b 0a 20 20 6e 61 6d 65 73 70 61 63 65 20 65   {.  namespace e
0bd0: 78 70 6f 72 74 20 5c 0a 20 20 20 20 47 65 74 4f  xport \.    GetO
0be0: 72 69 67 69 6e 20 5c 0a 20 20 20 20 43 61 6c 63  rigin \.    Calc
0bf0: 58 59 20 5c 0a 20 20 20 20 72 67 62 64 61 72 6b  XY \.    rgbdark
0c00: 65 6e 20 5c 0a 20 20 20 20 72 67 62 6c 69 67 68  en \.    rgbligh
0c10: 74 65 6e 20 5c 0a 20 20 20 20 47 65 74 52 47 42  ten \.    GetRGB
0c20: 20 5c 0a 20 20 20 20 53 65 74 46 6f 6e 74 20 5c   \.    SetFont \
0c30: 0a 20 20 20 20 53 65 74 43 6f 6c 6f 72 20 5c 0a  .    SetColor \.
0c40: 20 20 20 20 53 65 74 4c 69 6e 65 77 69 64 74 68      SetLinewidth
0c50: 20 5c 0a 20 20 20 20 4c 69 6e 65 48 65 69 67 68   \.    LineHeigh
0c60: 74 20 5c 0a 20 20 20 20 54 65 78 74 57 69 64 74  t \.    TextWidt
0c70: 68 20 5c 0a 20 20 20 20 4d 61 6b 65 53 70 6c 69  h \.    MakeSpli
0c80: 6e 65 44 61 74 61 20 5c 0a 20 20 20 20 53 65 74  neData \.    Set
0c90: 44 61 73 68 20 5c 0a 20 20 20 20 4c 69 6e 65 20  Dash \.    Line 
0ca0: 5c 0a 20 20 20 20 43 6c 69 70 52 65 63 74 20 5c  \.    ClipRect \
0cb0: 0a 20 20 20 20 55 6e 63 6c 69 70 52 65 63 74 20  .    UnclipRect 
0cc0: 5c 0a 20 20 20 20 52 65 63 74 20 5c 0a 20 20 20  \.    Rect \.   
0cd0: 20 41 72 63 20 5c 0a 20 20 20 20 50 6f 6c 79 4f   Arc \.    PolyO
0ce0: 62 6a 65 63 74 20 5c 0a 20 20 20 20 54 65 78 74  bject \.    Text
0cf0: 20 5c 0a 20 20 20 20 50 69 63 74 20 5c 0a 20 20   \.    Pict \.  
0d00: 20 20 4c 6f 61 64 50 69 63 74 20 5c 0a 20 20 20    LoadPict \.   
0d10: 20 50 69 63 74 53 69 7a 65 0a 20 20 20 20 0a 7d   PictSize.    .}
0d20: 0a 0a 70 72 6f 63 20 70 64 66 34 74 63 6c 3a 3a  ..proc pdf4tcl::
0d30: 67 72 61 70 68 3a 3a 47 65 74 4f 72 69 67 69 6e  graph::GetOrigin
0d40: 20 7b 20 67 20 7d 20 7b 0a 20 20 73 65 74 20 6f   { g } {.  set o
0d50: 72 69 65 6e 74 20 5b 67 72 61 70 68 3a 3a 65 78  rient [graph::ex
0d60: 65 63 75 74 65 20 63 67 65 74 20 2d 6f 72 69 65  ecute cget -orie
0d70: 6e 74 5d 0a 20 20 73 65 74 20 70 61 70 65 72 20  nt].  set paper 
0d80: 5b 67 72 61 70 68 3a 3a 65 78 65 63 75 74 65 20  [graph::execute 
0d90: 63 67 65 74 20 2d 70 61 70 65 72 5d 0a 20 20 6c  cget -paper].  l
0da0: 61 73 73 69 67 6e 20 5b 70 64 66 34 74 63 6c 3a  assign [pdf4tcl:
0db0: 3a 67 65 74 50 61 70 65 72 53 69 7a 65 20 24 70  :getPaperSize $p
0dc0: 61 70 65 72 5d 20 77 50 74 20 68 50 74 0a 20 20  aper] wPt hPt.  
0dd0: 73 65 74 20 77 69 64 74 68 20 20 5b 65 78 70 72  set width  [expr
0de0: 20 7b 32 35 2e 35 20 2a 20 24 77 50 74 20 2f 20   {25.5 * $wPt / 
0df0: 37 32 2e 30 7d 5d 0a 20 20 73 65 74 20 68 65 69  72.0}].  set hei
0e00: 67 68 74 20 5b 65 78 70 72 20 7b 32 35 2e 35 20  ght [expr {25.5 
0e10: 2a 20 24 68 50 74 20 2f 20 37 32 2e 30 7d 5d 0a  * $hPt / 72.0}].
0e20: 20 20 0a 20 20 67 72 61 70 68 3a 3a 73 65 74 5f    .  graph::set_
0e30: 6f 70 74 20 24 67 20 6f 72 69 65 6e 74 20 24 6f  opt $g orient $o
0e40: 72 69 65 6e 74 0a 20 20 67 72 61 70 68 3a 3a 73  rient.  graph::s
0e50: 65 74 5f 6f 70 74 20 24 67 20 70 61 70 65 72 20  et_opt $g paper 
0e60: 20 24 70 61 70 65 72 0a 20 20 67 72 61 70 68 3a   $paper.  graph:
0e70: 3a 73 65 74 5f 6f 70 74 20 24 67 20 77 69 64 74  :set_opt $g widt
0e80: 68 20 20 24 77 69 64 74 68 0a 20 20 67 72 61 70  h  $width.  grap
0e90: 68 3a 3a 73 65 74 5f 6f 70 74 20 24 67 20 68 65  h::set_opt $g he
0ea0: 69 67 68 74 20 24 68 65 69 67 68 74 0a 20 20 0a  ight $height.  .
0eb0: 20 20 72 65 74 75 72 6e 20 24 6f 72 69 65 6e 74    return $orient
0ec0: 20 20 3b 23 20 66 61 6c 73 65 20 3d 20 62 6f 74    ;# false = bot
0ed0: 74 6f 6d 2c 20 74 72 75 65 20 3d 20 74 6f 70 0a  tom, true = top.
0ee0: 7d 0a 0a 0a 70 72 6f 63 20 70 64 66 34 74 63 6c  }...proc pdf4tcl
0ef0: 3a 3a 67 72 61 70 68 3a 3a 43 61 6c 63 58 59 20  ::graph::CalcXY 
0f00: 7b 20 67 20 76 5f 78 20 76 5f 79 20 7d 20 7b 0a  { g v_x v_y } {.
0f10: 20 20 75 70 76 61 72 20 24 76 5f 78 20 78 0a 20    upvar $v_x x. 
0f20: 20 75 70 76 61 72 20 24 76 5f 79 20 79 0a 0a 20   upvar $v_y y.. 
0f30: 20 69 66 20 7b 5b 67 72 61 70 68 3a 3a 67 65 74   if {[graph::get
0f40: 5f 6f 70 74 20 24 67 20 6f 72 69 65 6e 74 5d 7d  _opt $g orient]}
0f50: 20 7b 0a 20 20 20 20 73 65 74 20 79 20 5b 65 78   {.    set y [ex
0f60: 70 72 20 7b 5b 67 72 61 70 68 3a 3a 67 65 74 5f  pr {[graph::get_
0f70: 6f 70 74 20 24 67 20 68 65 69 67 68 74 5d 20 2d  opt $g height] -
0f80: 20 24 79 7d 5d 0a 20 20 7d 0a 7d 0a 0a 0a 70 72   $y}].  }.}...pr
0f90: 6f 63 20 70 64 66 34 74 63 6c 3a 3a 67 72 61 70  oc pdf4tcl::grap
0fa0: 68 3a 3a 72 67 62 64 61 72 6b 65 6e 20 7b 20 72  h::rgbdarken { r
0fb0: 67 62 20 70 65 72 63 65 6e 74 20 7d 20 7b 09 23  gb percent } {.#
0fc0: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f 6e   internal use on
0fd0: 6c 79 0a 20 20 6c 61 73 73 69 67 6e 20 24 72 67  ly.  lassign $rg
0fe0: 62 20 72 20 67 20 62 0a 20 20 73 65 74 20 64 69  b r g b.  set di
0ff0: 66 66 20 5b 65 78 70 72 20 7b 32 35 36 2e 30 20  ff [expr {256.0 
1000: 2a 20 24 70 65 72 63 65 6e 74 20 2f 20 31 30 30  * $percent / 100
1010: 2e 30 7d 5d 0a 20 20 73 65 74 20 72 20 5b 65 78  .0}].  set r [ex
1020: 70 72 20 7b 24 72 20 2d 20 24 64 69 66 66 7d 5d  pr {$r - $diff}]
1030: 3b 20 69 66 20 7b 24 72 20 3c 20 30 7d 20 7b 20  ; if {$r < 0} { 
1040: 73 65 74 20 72 20 30 20 7d 0a 20 20 73 65 74 20  set r 0 }.  set 
1050: 67 20 5b 65 78 70 72 20 7b 24 67 20 2d 20 24 64  g [expr {$g - $d
1060: 69 66 66 7d 5d 3b 20 69 66 20 7b 24 67 20 3c 20  iff}]; if {$g < 
1070: 30 7d 20 7b 20 73 65 74 20 67 20 30 20 7d 0a 20  0} { set g 0 }. 
1080: 20 73 65 74 20 62 20 5b 65 78 70 72 20 7b 24 62   set b [expr {$b
1090: 20 2d 20 24 64 69 66 66 7d 5d 3b 20 69 66 20 7b   - $diff}]; if {
10a0: 24 62 20 3c 20 30 7d 20 7b 20 73 65 74 20 62 20  $b < 0} { set b 
10b0: 30 20 7d 0a 20 20 72 65 74 75 72 6e 20 5b 6c 69  0 }.  return [li
10c0: 73 74 20 24 72 20 24 67 20 24 62 5d 0a 7d 0a 0a  st $r $g $b].}..
10d0: 0a 70 72 6f 63 20 70 64 66 34 74 63 6c 3a 3a 67  .proc pdf4tcl::g
10e0: 72 61 70 68 3a 3a 72 67 62 6c 69 67 68 74 65 6e  raph::rgblighten
10f0: 20 7b 20 72 67 62 20 70 65 72 63 65 6e 74 20 7d   { rgb percent }
1100: 20 7b 09 23 20 69 6e 74 65 72 6e 61 6c 20 75 73   {.# internal us
1110: 65 20 6f 6e 6c 79 0a 20 20 6c 61 73 73 69 67 6e  e only.  lassign
1120: 20 24 72 67 62 20 72 20 67 20 62 0a 20 20 73 65   $rgb r g b.  se
1130: 74 20 64 69 66 66 20 5b 65 78 70 72 20 7b 32 35  t diff [expr {25
1140: 36 2e 30 20 2a 20 24 70 65 72 63 65 6e 74 20 2f  6.0 * $percent /
1150: 20 31 30 30 2e 30 7d 5d 0a 20 20 73 65 74 20 72   100.0}].  set r
1160: 20 5b 65 78 70 72 20 7b 24 72 20 2b 20 24 64 69   [expr {$r + $di
1170: 66 66 7d 5d 3b 20 69 66 20 7b 24 72 20 3e 20 32  ff}]; if {$r > 2
1180: 35 35 7d 20 7b 20 73 65 74 20 72 20 32 35 35 20  55} { set r 255 
1190: 7d 0a 20 20 73 65 74 20 67 20 5b 65 78 70 72 20  }.  set g [expr 
11a0: 7b 24 67 20 2b 20 24 64 69 66 66 7d 5d 3b 20 69  {$g + $diff}]; i
11b0: 66 20 7b 24 67 20 3e 20 32 35 35 7d 20 7b 20 73  f {$g > 255} { s
11c0: 65 74 20 67 20 32 35 35 20 7d 0a 20 20 73 65 74  et g 255 }.  set
11d0: 20 62 20 5b 65 78 70 72 20 7b 24 62 20 2b 20 24   b [expr {$b + $
11e0: 64 69 66 66 7d 5d 3b 20 69 66 20 7b 24 62 20 3e  diff}]; if {$b >
11f0: 20 32 35 35 7d 20 7b 20 73 65 74 20 62 20 32 35   255} { set b 25
1200: 35 20 7d 0a 20 20 72 65 74 75 72 6e 20 5b 6c 69  5 }.  return [li
1210: 73 74 20 24 72 20 24 67 20 24 62 5d 0a 7d 0a 0a  st $r $g $b].}..
1220: 0a 70 72 6f 63 20 70 64 66 34 74 63 6c 3a 3a 67  .proc pdf4tcl::g
1230: 72 61 70 68 3a 3a 47 65 74 52 47 42 20 7b 20 63  raph::GetRGB { c
1240: 6f 6c 6f 72 20 7d 20 7b 09 23 20 69 6e 74 65 72  olor } {.# inter
1250: 6e 61 6c 20 75 73 65 20 6f 6e 6c 79 0a 20 20 73  nal use only.  s
1260: 65 74 20 63 6f 6c 6f 72 20 5b 73 74 72 69 6e 67  et color [string
1270: 20 74 6f 6c 6f 77 65 72 20 5b 73 74 72 69 6e 67   tolower [string
1280: 20 74 72 69 6d 20 24 63 6f 6c 6f 72 5d 5d 0a 20   trim $color]]. 
1290: 20 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 5e 5c   if {[regexp {^\
12a0: 64 2b 5c 73 2b 5c 64 2b 5c 73 2b 5c 64 2b 24 7d  d+\s+\d+\s+\d+$}
12b0: 20 24 63 6f 6c 6f 72 20 61 6c 6c 5d 7d 20 7b 0a   $color all]} {.
12c0: 20 20 20 20 72 65 74 75 72 6e 20 5b 6a 6f 69 6e      return [join
12d0: 20 24 63 6f 6c 6f 72 5d 0a 20 20 7d 20 65 6c 73   $color].  } els
12e0: 65 20 7b 0a 20 20 20 20 73 65 74 20 72 67 62 20  e {.    set rgb 
12f0: 7b 30 20 30 20 30 7d 0a 20 20 20 20 69 66 20 7b  {0 0 0}.    if {
1300: 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 74  [info commands t
1310: 6b 5d 20 21 3d 20 7b 7d 7d 20 7b 0a 20 20 20 20  k] != {}} {.    
1320: 20 20 23 20 66 69 6e 65 2c 20 74 6b 20 63 61 6e    # fine, tk can
1330: 20 74 65 6c 6c 20 75 73 20 74 68 65 20 72 69 67   tell us the rig
1340: 68 74 20 72 67 62 20 76 61 6c 75 65 73 0a 20 20  ht rgb values.  
1350: 20 20 20 20 73 65 74 20 72 63 20 5b 63 61 74 63      set rc [catc
1360: 68 20 7b 20 73 65 74 20 72 67 62 31 36 20 5b 77  h { set rgb16 [w
1370: 69 6e 66 6f 20 72 67 62 20 2e 20 24 63 6f 6c 6f  info rgb . $colo
1380: 72 5d 20 7d 5d 0a 20 20 20 20 20 20 69 66 20 7b  r] }].      if {
1390: 24 72 63 20 3d 3d 20 30 7d 20 7b 0a 09 73 65 74  $rc == 0} {..set
13a0: 20 72 20 5b 65 78 70 72 20 7b 72 6f 75 6e 64 28   r [expr {round(
13b0: 5b 6c 69 6e 64 65 78 20 24 72 67 62 31 36 20 30  [lindex $rgb16 0
13c0: 5d 20 2f 20 32 35 36 2e 30 29 7d 5d 0a 09 73 65  ] / 256.0)}]..se
13d0: 74 20 67 20 5b 65 78 70 72 20 7b 72 6f 75 6e 64  t g [expr {round
13e0: 28 5b 6c 69 6e 64 65 78 20 24 72 67 62 31 36 20  ([lindex $rgb16 
13f0: 31 5d 20 2f 20 32 35 36 2e 30 29 7d 5d 0a 09 73  1] / 256.0)}]..s
1400: 65 74 20 62 20 5b 65 78 70 72 20 7b 72 6f 75 6e  et b [expr {roun
1410: 64 28 5b 6c 69 6e 64 65 78 20 24 72 67 62 31 36  d([lindex $rgb16
1420: 20 32 5d 20 2f 20 32 35 36 2e 30 29 7d 5d 0a 09   2] / 256.0)}]..
1430: 73 65 74 20 72 67 62 20 5b 6c 69 73 74 20 24 72  set rgb [list $r
1440: 20 24 67 20 24 62 5d 0a 20 20 20 20 20 20 7d 0a   $g $b].      }.
1450: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
1460: 20 20 20 23 20 6f 68 20 73 68 69 74 2c 20 6e 6f     # oh shit, no
1470: 20 63 6f 6c 6f 72 20 6e 61 6d 65 73 20 61 76 61   color names ava
1480: 69 6c 61 62 6c 65 2c 20 6c 65 74 27 73 20 67 69  ilable, let's gi
1490: 76 65 20 73 6f 6d 65 20 62 61 73 69 63 20 63 6f  ve some basic co
14a0: 6c 6f 72 73 0a 20 20 20 20 20 20 73 77 69 74 63  lors.      switc
14b0: 68 20 2d 67 6c 6f 62 20 2d 2d 20 24 63 6f 6c 6f  h -glob -- $colo
14c0: 72 20 7b 0a 09 7b 62 6c 61 63 6b 7d 20 20 20 20  r {..{black}    
14d0: 7b 20 73 65 74 20 72 67 62 20 7b 20 20 30 20 20  { set rgb {  0  
14e0: 20 30 20 20 20 30 7d 20 7d 0a 09 7b 77 68 69 74   0   0} }..{whit
14f0: 65 7d 20 20 20 20 7b 20 73 65 74 20 72 67 62 20  e}    { set rgb 
1500: 7b 32 35 35 20 32 35 35 20 32 35 35 7d 20 7d 0a  {255 255 255} }.
1510: 20 20 20 20 20 20 20 20 7b 72 65 64 7d 20 20 20          {red}   
1520: 20 20 20 7b 20 73 65 74 20 72 67 62 20 7b 32 35     { set rgb {25
1530: 35 20 20 20 30 20 20 20 30 7d 20 7d 0a 09 7b 67  5   0   0} }..{g
1540: 72 65 65 6e 7d 20 20 20 20 7b 20 73 65 74 20 72  reen}    { set r
1550: 67 62 20 7b 20 20 30 20 32 35 35 20 20 20 30 7d  gb {  0 255   0}
1560: 20 7d 0a 09 7b 62 6c 75 65 7d 20 20 20 20 20 7b   }..{blue}     {
1570: 20 73 65 74 20 72 67 62 20 7b 20 20 30 20 20 20   set rgb {  0   
1580: 30 20 32 35 35 7d 20 7d 0a 09 7b 63 79 61 6e 7d  0 255} }..{cyan}
1590: 20 20 20 20 20 7b 20 73 65 74 20 72 67 62 20 7b       { set rgb {
15a0: 20 20 30 20 32 35 35 20 32 35 35 7d 20 7d 0a 09    0 255 255} }..
15b0: 7b 6d 61 67 65 6e 74 61 7d 20 20 7b 20 73 65 74  {magenta}  { set
15c0: 20 72 67 62 20 7b 32 35 35 20 20 20 30 20 32 35   rgb {255   0 25
15d0: 35 7d 20 7d 0a 09 7b 79 65 6c 6c 6f 77 7d 20 20  5} }..{yellow}  
15e0: 20 7b 20 73 65 74 20 72 67 62 20 7b 32 35 35 20   { set rgb {255 
15f0: 32 35 35 20 20 20 30 7d 20 7d 0a 09 7b 6f 72 61  255   0} }..{ora
1600: 6e 67 65 7d 20 20 20 7b 20 73 65 74 20 72 67 62  nge}   { set rgb
1610: 20 7b 32 35 35 20 31 32 38 20 20 20 30 7d 20 7d   {255 128   0} }
1620: 0a 09 7b 70 69 6e 6b 7d 20 20 20 20 20 7b 20 73  ..{pink}     { s
1630: 65 74 20 72 67 62 20 7b 32 35 35 20 31 32 38 20  et rgb {255 128 
1640: 31 39 32 7d 20 7d 0a 09 7b 70 75 72 70 6c 65 7d  192} }..{purple}
1650: 20 20 20 7b 20 73 65 74 20 72 67 62 20 7b 31 36     { set rgb {16
1660: 30 20 20 20 30 20 31 32 38 7d 20 7d 0a 09 7b 62  0   0 128} }..{b
1670: 72 6f 77 6e 7d 20 20 20 20 7b 20 73 65 74 20 72  rown}    { set r
1680: 67 62 20 7b 31 32 38 20 20 20 30 20 20 20 30 7d  gb {128   0   0}
1690: 20 7d 0a 09 7b 67 6f 6c 64 7d 20 20 20 20 20 7b   }..{gold}     {
16a0: 20 73 65 74 20 72 67 62 20 7b 32 35 35 20 32 31   set rgb {255 21
16b0: 35 20 20 20 30 7d 20 7d 0a 09 7b 76 69 6f 6c 65  5   0} }..{viole
16c0: 74 7d 20 20 20 7b 20 73 65 74 20 72 67 62 20 7b  t}   { set rgb {
16d0: 31 32 38 20 20 20 30 20 31 32 38 7d 20 7d 0a 09  128   0 128} }..
16e0: 7b 67 72 5b 61 65 5d 79 7d 20 20 7b 20 73 65 74  {gr[ae]y}  { set
16f0: 20 72 67 62 20 7b 31 39 30 20 31 39 30 20 31 39   rgb {190 190 19
1700: 30 7d 20 7d 0a 09 7b 67 72 5b 61 65 5d 79 2a 7d  0} }..{gr[ae]y*}
1710: 20 7b 0a 09 20 20 73 65 74 20 78 20 5b 73 74 72   {..  set x [str
1720: 69 6e 67 20 72 61 6e 67 65 20 24 63 6f 6c 6f 72  ing range $color
1730: 20 34 20 65 6e 64 5d 0a 09 20 20 69 66 20 7b 5b   4 end]..  if {[
1740: 73 74 72 69 6e 67 20 69 73 20 69 6e 74 65 67 65  string is intege
1750: 72 20 24 78 5d 7d 20 7b 0a 09 20 20 20 20 73 65  r $x]} {..    se
1760: 74 20 78 20 5b 65 78 70 72 20 7b 72 6f 75 6e 64  t x [expr {round
1770: 28 28 24 78 20 2f 20 31 30 30 2e 30 29 20 2a 20  (($x / 100.0) * 
1780: 32 35 35 2e 30 29 7d 5d 0a 09 20 20 20 20 69 66  255.0)}]..    if
1790: 20 7b 24 78 20 3e 20 32 35 35 7d 20 7b 20 73 65   {$x > 255} { se
17a0: 74 20 78 20 32 35 35 20 7d 0a 09 20 20 20 20 69  t x 255 }..    i
17b0: 66 20 7b 24 78 20 3c 20 20 20 30 7d 20 7b 20 73  f {$x <   0} { s
17c0: 65 74 20 78 20 20 20 30 20 7d 0a 09 20 20 20 20  et x   0 }..    
17d0: 73 65 74 20 72 67 62 20 5b 6c 69 73 74 20 24 78  set rgb [list $x
17e0: 20 24 78 20 24 78 5d 0a 09 20 20 7d 0a 09 7d 0a   $x $x]..  }..}.
17f0: 09 7b 64 61 72 6b 2a 7d 20 7b 0a 09 20 20 73 65  .{dark*} {..  se
1800: 74 20 72 67 62 20 5b 47 65 74 52 47 42 20 5b 73  t rgb [GetRGB [s
1810: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 63 6f 6c  tring range $col
1820: 6f 72 20 34 20 65 6e 64 5d 5d 0a 09 20 20 73 65  or 4 end]]..  se
1830: 74 20 72 20 5b 65 78 70 72 20 7b 5b 6c 69 6e 64  t r [expr {[lind
1840: 65 78 20 24 72 67 62 20 30 5d 20 2f 20 32 7d 5d  ex $rgb 0] / 2}]
1850: 0a 09 20 20 73 65 74 20 67 20 5b 65 78 70 72 20  ..  set g [expr 
1860: 7b 5b 6c 69 6e 64 65 78 20 24 72 67 62 20 31 5d  {[lindex $rgb 1]
1870: 20 2f 20 32 7d 5d 0a 09 20 20 73 65 74 20 62 20   / 2}]..  set b 
1880: 5b 65 78 70 72 20 7b 5b 6c 69 6e 64 65 78 20 24  [expr {[lindex $
1890: 72 67 62 20 32 5d 20 2f 20 32 7d 5d 0a 09 20 20  rgb 2] / 2}]..  
18a0: 73 65 74 20 72 67 62 20 5b 6c 69 73 74 20 24 72  set rgb [list $r
18b0: 20 24 67 20 24 62 5d 0a 09 7d 0a 09 7b 6c 69 67   $g $b]..}..{lig
18c0: 68 74 2a 7d 20 7b 0a 09 20 20 73 65 74 20 72 67  ht*} {..  set rg
18d0: 62 20 5b 47 65 74 52 47 42 20 5b 73 74 72 69 6e  b [GetRGB [strin
18e0: 67 20 72 61 6e 67 65 20 24 63 6f 6c 6f 72 20 35  g range $color 5
18f0: 20 65 6e 64 5d 5d 0a 09 20 20 73 65 74 20 72 20   end]]..  set r 
1900: 5b 65 78 70 72 20 7b 32 35 35 20 2d 20 28 28 32  [expr {255 - ((2
1910: 35 35 20 2d 20 5b 6c 69 6e 64 65 78 20 24 72 67  55 - [lindex $rg
1920: 62 20 30 5d 29 20 2f 20 32 29 7d 5d 0a 09 20 20  b 0]) / 2)}]..  
1930: 73 65 74 20 67 20 5b 65 78 70 72 20 7b 32 35 35  set g [expr {255
1940: 20 2d 20 28 28 32 35 35 20 2d 20 5b 6c 69 6e 64   - ((255 - [lind
1950: 65 78 20 24 72 67 62 20 31 5d 29 20 2f 20 32 29  ex $rgb 1]) / 2)
1960: 7d 5d 0a 09 20 20 73 65 74 20 62 20 5b 65 78 70  }]..  set b [exp
1970: 72 20 7b 32 35 35 20 2d 20 28 28 32 35 35 20 2d  r {255 - ((255 -
1980: 20 5b 6c 69 6e 64 65 78 20 24 72 67 62 20 32 5d   [lindex $rgb 2]
1990: 29 20 2f 20 32 29 7d 5d 0a 09 20 20 73 65 74 20  ) / 2)}]..  set 
19a0: 72 67 62 20 5b 6c 69 73 74 20 24 72 20 24 67 20  rgb [list $r $g 
19b0: 24 62 5d 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20  $b]..}.      }. 
19c0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
19d0: 5b 6a 6f 69 6e 20 24 72 67 62 5d 0a 20 20 7d 0a  [join $rgb].  }.
19e0: 7d 0a 0a 0a 70 72 6f 63 20 70 64 66 34 74 63 6c  }...proc pdf4tcl
19f0: 3a 3a 67 72 61 70 68 3a 3a 53 65 74 46 6f 6e 74  ::graph::SetFont
1a00: 20 7b 20 67 20 6e 61 6d 65 20 73 69 7a 65 20 7b   { g name size {
1a10: 61 74 74 72 69 62 20 22 22 7d 20 7d 20 7b 0a 20  attrib ""} } {. 
1a20: 20 73 65 74 20 66 6f 6e 74 20 5b 6c 69 73 74 20   set font [list 
1a30: 24 6e 61 6d 65 20 24 73 69 7a 65 20 24 61 74 74  $name $size $att
1a40: 72 69 62 5d 0a 20 20 69 66 20 7b 5b 67 72 61 70  rib].  if {[grap
1a50: 68 3a 3a 67 65 74 5f 6f 70 74 20 24 67 20 66 6f  h::get_opt $g fo
1a60: 6e 74 5d 20 3d 3d 20 24 66 6f 6e 74 7d 20 72 65  nt] == $font} re
1a70: 74 75 72 6e 0a 0a 20 20 73 65 74 20 62 6f 6c 64  turn..  set bold
1a80: 20 5b 72 65 67 65 78 70 20 62 6f 6c 64 20 24 61   [regexp bold $a
1a90: 74 74 72 69 62 5d 0a 20 20 73 65 74 20 69 74 61  ttrib].  set ita
1aa0: 6c 69 63 20 5b 72 65 67 65 78 70 20 69 74 61 6c  lic [regexp ital
1ab0: 69 63 20 24 61 74 74 72 69 62 5d 0a 20 20 73 77  ic $attrib].  sw
1ac0: 69 74 63 68 20 24 6e 61 6d 65 20 7b 0a 20 20 20  itch $name {.   
1ad0: 20 48 65 6c 76 65 74 69 63 61 20 2d 20 41 72 69   Helvetica - Ari
1ae0: 61 6c 20 2d 20 43 6f 75 72 69 65 72 20 7b 0a 20  al - Courier {. 
1af0: 20 20 20 20 20 69 66 20 7b 24 62 6f 6c 64 20 26       if {$bold &
1b00: 26 20 24 69 74 61 6c 69 63 7d 20 7b 0a 20 20 20  & $italic} {.   
1b10: 20 20 20 20 20 61 70 70 65 6e 64 20 6e 61 6d 65       append name
1b20: 20 2d 42 6f 6c 64 4f 62 6c 69 71 75 65 0a 20 20   -BoldOblique.  
1b30: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 62      } elseif {$b
1b40: 6f 6c 64 7d 20 7b 0a 20 20 20 20 20 20 20 20 61  old} {.        a
1b50: 70 70 65 6e 64 20 6e 61 6d 65 20 2d 42 6f 6c 64  ppend name -Bold
1b60: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
1b70: 7b 24 69 74 61 6c 69 63 7d 20 7b 0a 20 20 20 20  {$italic} {.    
1b80: 20 20 20 20 61 70 70 65 6e 64 20 6e 61 6d 65 20      append name 
1b90: 2d 4f 62 6c 69 71 75 65 0a 20 20 20 20 20 20 7d  -Oblique.      }
1ba0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 69 6d 65 73  .    }.    Times
1bb0: 20 7b 0a 20 20 20 20 20 20 69 66 20 7b 24 62 6f   {.      if {$bo
1bc0: 6c 64 20 26 26 20 24 69 74 61 6c 69 63 7d 20 7b  ld && $italic} {
1bd0: 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20  .        append 
1be0: 6e 61 6d 65 20 2d 42 6f 6c 64 49 74 61 6c 69 63  name -BoldItalic
1bf0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
1c00: 7b 24 62 6f 6c 64 7d 20 7b 0a 20 20 20 20 20 20  {$bold} {.      
1c10: 20 20 61 70 70 65 6e 64 20 6e 61 6d 65 20 2d 42    append name -B
1c20: 6f 6c 64 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  old.      } else
1c30: 69 66 20 7b 24 69 74 61 6c 69 63 7d 20 7b 0a 20  if {$italic} {. 
1c40: 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 6e 61         append na
1c50: 6d 65 20 2d 49 74 61 6c 69 63 0a 20 20 20 20 20  me -Italic.     
1c60: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
1c70: 20 20 61 70 70 65 6e 64 20 6e 61 6d 65 20 2d 52    append name -R
1c80: 6f 6d 61 6e 0a 20 20 20 20 20 20 7d 0a 20 20 20  oman.      }.   
1c90: 20 7d 0a 20 20 7d 0a 20 20 67 72 61 70 68 3a 3a   }.  }.  graph::
1ca0: 65 78 65 63 75 74 65 20 73 65 74 46 6f 6e 74 20  execute setFont 
1cb0: 24 73 69 7a 65 20 24 6e 61 6d 65 0a 0a 20 20 67  $size $name..  g
1cc0: 72 61 70 68 3a 3a 73 65 74 5f 6f 70 74 20 24 67  raph::set_opt $g
1cd0: 20 66 6f 6e 74 20 24 66 6f 6e 74 0a 7d 0a 0a 0a   font $font.}...
1ce0: 70 72 6f 63 20 70 64 66 34 74 63 6c 3a 3a 67 72  proc pdf4tcl::gr
1cf0: 61 70 68 3a 3a 4c 69 6e 65 48 65 69 67 68 74 20  aph::LineHeight 
1d00: 7b 7d 20 7b 0a 20 20 72 65 74 75 72 6e 20 5b 67  {} {.  return [g
1d10: 72 61 70 68 3a 3a 65 78 65 63 75 74 65 20 67 65  raph::execute ge
1d20: 74 46 6f 6e 74 4d 65 74 72 69 63 20 68 65 69 67  tFontMetric heig
1d30: 68 74 5d 0a 7d 0a 0a 0a 70 72 6f 63 20 70 64 66  ht].}...proc pdf
1d40: 34 74 63 6c 3a 3a 67 72 61 70 68 3a 3a 54 65 78  4tcl::graph::Tex
1d50: 74 57 69 64 74 68 20 7b 20 73 74 72 20 7d 20 7b  tWidth { str } {
1d60: 0a 20 20 72 65 74 75 72 6e 20 5b 67 72 61 70 68  .  return [graph
1d70: 3a 3a 65 78 65 63 75 74 65 20 67 65 74 53 74 72  ::execute getStr
1d80: 69 6e 67 57 69 64 74 68 20 24 73 74 72 5d 0a 7d  ingWidth $str].}
1d90: 0a 0a 0a 70 72 6f 63 20 70 64 66 34 74 63 6c 3a  ...proc pdf4tcl:
1da0: 3a 67 72 61 70 68 3a 3a 53 65 74 43 6f 6c 6f 72  :graph::SetColor
1db0: 20 7b 20 67 20 63 6f 6c 6f 72 20 7d 20 7b 0a 20   { g color } {. 
1dc0: 20 67 72 61 70 68 3a 3a 73 65 74 5f 6f 70 74 20   graph::set_opt 
1dd0: 24 67 20 63 6f 6c 6f 72 20 24 63 6f 6c 6f 72 0a  $g color $color.
1de0: 20 20 73 65 74 20 72 67 62 20 5b 47 65 74 52 47    set rgb [GetRG
1df0: 42 20 24 63 6f 6c 6f 72 5d 0a 20 20 67 72 61 70  B $color].  grap
1e00: 68 3a 3a 73 65 74 5f 6f 70 74 20 24 67 20 72 67  h::set_opt $g rg
1e10: 62 63 6f 6c 6f 72 20 24 72 67 62 0a 0a 20 20 6c  bcolor $rgb..  l
1e20: 61 73 73 69 67 6e 20 24 72 67 62 20 72 20 67 20  assign $rgb r g 
1e30: 62 0a 20 20 67 72 61 70 68 3a 3a 65 78 65 63 75  b.  graph::execu
1e40: 74 65 20 73 65 74 53 74 72 6f 6b 65 43 6f 6c 6f  te setStrokeColo
1e50: 72 20 24 72 20 24 67 20 24 62 0a 20 20 67 72 61  r $r $g $b.  gra
1e60: 70 68 3a 3a 65 78 65 63 75 74 65 20 73 65 74 46  ph::execute setF
1e70: 69 6c 6c 43 6f 6c 6f 72 20 24 72 20 24 67 20 24  illColor $r $g $
1e80: 62 0a 7d 0a 0a 0a 70 72 6f 63 20 70 64 66 34 74  b.}...proc pdf4t
1e90: 63 6c 3a 3a 67 72 61 70 68 3a 3a 53 65 74 4c 69  cl::graph::SetLi
1ea0: 6e 65 77 69 64 74 68 20 7b 20 67 20 77 69 64 74  newidth { g widt
1eb0: 68 20 7d 20 7b 0a 20 20 69 66 20 7b 24 77 69 64  h } {.  if {$wid
1ec0: 74 68 20 21 3d 20 7b 7d 7d 20 7b 0a 20 20 20 20  th != {}} {.    
1ed0: 69 66 20 7b 24 77 69 64 74 68 20 3c 3d 20 30 7d  if {$width <= 0}
1ee0: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 77 69 64   {.      set wid
1ef0: 74 68 20 30 2e 30 31 0a 20 20 20 20 7d 0a 20 20  th 0.01.    }.  
1f00: 20 20 67 72 61 70 68 3a 3a 65 78 65 63 75 74 65    graph::execute
1f10: 20 73 65 74 4c 69 6e 65 57 69 64 74 68 20 5b 65   setLineWidth [e
1f20: 78 70 72 20 7b 37 32 20 2a 20 24 77 69 64 74 68  xpr {72 * $width
1f30: 20 2f 20 32 35 2e 34 7d 5d 0a 20 20 7d 0a 20 20   / 25.4}].  }.  
1f40: 67 72 61 70 68 3a 3a 73 65 74 5f 6f 70 74 20 24  graph::set_opt $
1f50: 67 20 6c 69 6e 65 77 69 64 74 68 20 24 77 69 64  g linewidth $wid
1f60: 74 68 0a 7d 0a 0a 0a 70 72 6f 63 20 70 64 66 34  th.}...proc pdf4
1f70: 74 63 6c 3a 3a 67 72 61 70 68 3a 3a 53 70 6c 69  tcl::graph::Spli
1f80: 6e 65 49 6e 74 65 72 70 6f 6c 61 74 65 20 7b 79  neInterpolate {y
1f90: 30 20 79 31 20 79 32 20 79 33 20 6d 75 20 7b 74  0 y1 y2 y3 mu {t
1fa0: 65 6e 73 69 6f 6e 20 30 2e 30 7d 20 7b 62 69 61  ension 0.0} {bia
1fb0: 73 20 30 2e 30 7d 7d 20 7b 0a 20 20 73 65 74 20  s 0.0}} {.  set 
1fc0: 6d 75 32 20 5b 65 78 70 72 20 7b 24 6d 75 20 2a  mu2 [expr {$mu *
1fd0: 20 24 6d 75 7d 5d 0a 20 20 73 65 74 20 6d 75 33   $mu}].  set mu3
1fe0: 20 5b 65 78 70 72 20 7b 24 6d 75 32 20 2a 20 24   [expr {$mu2 * $
1ff0: 6d 75 7d 5d 0a 0a 20 20 73 65 74 20 6d 30 20 20  mu}]..  set m0  
2000: 5b 65 78 70 72 20 7b 28 24 79 31 2d 24 79 30 29  [expr {($y1-$y0)
2010: 2a 28 31 2b 24 62 69 61 73 29 2a 28 31 2d 24 74  *(1+$bias)*(1-$t
2020: 65 6e 73 69 6f 6e 29 2f 32 20 2b 0a 20 20 20 20  ension)/2 +.    
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 24 79               ($y
2040: 32 2d 24 79 31 29 2a 28 31 2d 24 62 69 61 73 29  2-$y1)*(1-$bias)
2050: 2a 28 31 2d 24 74 65 6e 73 69 6f 6e 29 2f 32 7d  *(1-$tension)/2}
2060: 5d 0a 20 20 73 65 74 20 6d 31 20 20 5b 65 78 70  ].  set m1  [exp
2070: 72 20 7b 28 24 79 32 2d 24 79 31 29 2a 28 31 2b  r {($y2-$y1)*(1+
2080: 24 62 69 61 73 29 2a 28 31 2d 24 74 65 6e 73 69  $bias)*(1-$tensi
2090: 6f 6e 29 2f 32 20 2b 0a 20 20 20 20 20 20 20 20  on)/2 +.        
20a0: 20 20 20 20 20 20 20 20 20 28 24 79 33 2d 24 79           ($y3-$y
20b0: 32 29 2a 28 31 2d 24 62 69 61 73 29 2a 28 31 2d  2)*(1-$bias)*(1-
20c0: 24 74 65 6e 73 69 6f 6e 29 2f 32 7d 5d 0a 0a 20  $tension)/2}].. 
20d0: 20 73 65 74 20 61 30 20 20 5b 65 78 70 72 20 7b   set a0  [expr {
20e0: 20 32 2a 24 6d 75 33 20 2d 20 33 2a 24 6d 75 32   2*$mu3 - 3*$mu2
20f0: 20 2b 20 31 7d 5d 0a 20 20 73 65 74 20 61 31 20   + 1}].  set a1 
2100: 20 5b 65 78 70 72 20 7b 20 20 20 24 6d 75 33 20   [expr {   $mu3 
2110: 2d 20 32 2a 24 6d 75 32 20 2b 20 24 6d 75 7d 5d  - 2*$mu2 + $mu}]
2120: 0a 20 20 73 65 74 20 61 32 20 20 5b 65 78 70 72  .  set a2  [expr
2130: 20 7b 20 20 20 24 6d 75 33 20 2d 20 20 20 24 6d   {   $mu3 -   $m
2140: 75 32 7d 5d 0a 20 20 73 65 74 20 61 33 20 20 5b  u2}].  set a3  [
2150: 65 78 70 72 20 7b 2d 32 2a 24 6d 75 33 20 2b 20  expr {-2*$mu3 + 
2160: 33 2a 24 6d 75 32 7d 5d 0a 0a 20 20 72 65 74 75  3*$mu2}]..  retu
2170: 72 6e 20 5b 65 78 70 72 20 7b 24 61 30 2a 24 79  rn [expr {$a0*$y
2180: 31 2b 24 61 31 2a 24 6d 30 2b 24 61 32 2a 24 6d  1+$a1*$m0+$a2*$m
2190: 31 2b 24 61 33 2a 24 79 32 7d 5d 0a 7d 0a 0a 0a  1+$a3*$y2}].}...
21a0: 70 72 6f 63 20 70 64 66 34 74 63 6c 3a 3a 67 72  proc pdf4tcl::gr
21b0: 61 70 68 3a 3a 4d 61 6b 65 53 70 6c 69 6e 65 44  aph::MakeSplineD
21c0: 61 74 61 20 7b 20 76 5f 78 64 61 74 61 31 20 76  ata { v_xdata1 v
21d0: 5f 79 64 61 74 61 31 20 76 5f 78 64 61 74 61 32  _ydata1 v_xdata2
21e0: 20 76 5f 79 64 61 74 61 32 0a 20 20 20 20 20 20   v_ydata2.      
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 7b 73 74 65 70 73 20 30 7d 20 7b 74 65 6e 73 69  {steps 0} {tensi
2220: 6f 6e 20 30 2e 30 7d 20 7b 62 69 61 73 20 30 2e  on 0.0} {bias 0.
2230: 30 7d 20 7d 20 7b 0a 20 20 75 70 76 61 72 20 24  0} } {.  upvar $
2240: 76 5f 78 64 61 74 61 31 20 78 64 61 74 61 31 0a  v_xdata1 xdata1.
2250: 20 20 75 70 76 61 72 20 24 76 5f 79 64 61 74 61    upvar $v_ydata
2260: 31 20 79 64 61 74 61 31 0a 20 20 75 70 76 61 72  1 ydata1.  upvar
2270: 20 24 76 5f 78 64 61 74 61 32 20 78 64 61 74 61   $v_xdata2 xdata
2280: 32 0a 20 20 75 70 76 61 72 20 24 76 5f 79 64 61  2.  upvar $v_yda
2290: 74 61 32 20 79 64 61 74 61 32 0a 0a 20 20 73 65  ta2 ydata2..  se
22a0: 74 20 78 64 61 74 61 32 20 7b 7d 0a 20 20 73 65  t xdata2 {}.  se
22b0: 74 20 79 64 61 74 61 32 20 7b 7d 0a 0a 20 20 73  t ydata2 {}..  s
22c0: 65 74 20 78 63 6e 74 20 5b 6c 6c 65 6e 67 74 68  et xcnt [llength
22d0: 20 24 78 64 61 74 61 31 5d 0a 20 20 73 65 74 20   $xdata1].  set 
22e0: 79 63 6e 74 20 5b 6c 6c 65 6e 67 74 68 20 24 79  ycnt [llength $y
22f0: 64 61 74 61 31 5d 0a 0a 20 20 69 66 20 7b 24 78  data1]..  if {$x
2300: 63 6e 74 20 21 3d 20 24 79 63 6e 74 7d 20 7b 0a  cnt != $ycnt} {.
2310: 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65      return -code
2320: 20 65 72 72 6f 72 20 22 78 20 61 6e 64 20 79 20   error "x and y 
2330: 64 61 74 61 20 63 6f 75 6e 74 20 6d 69 73 6d 61  data count misma
2340: 74 63 68 22 0a 20 20 7d 0a 0a 20 20 69 66 20 7b  tch".  }..  if {
2350: 24 79 63 6e 74 20 3c 20 33 7d 20 7b 0a 20 20 20  $ycnt < 3} {.   
2360: 20 73 65 74 20 78 64 61 74 61 32 20 24 78 64 61   set xdata2 $xda
2370: 74 61 31 0a 20 20 20 20 73 65 74 20 79 64 61 74  ta1.    set ydat
2380: 61 32 20 24 79 64 61 74 61 31 0a 20 20 20 20 72  a2 $ydata1.    r
2390: 65 74 75 72 6e 0a 20 20 7d 0a 0a 20 20 69 66 20  eturn.  }..  if 
23a0: 7b 24 73 74 65 70 73 20 3d 3d 20 30 7d 20 7b 0a  {$steps == 0} {.
23b0: 20 20 20 20 73 65 74 20 73 74 65 70 73 20 5b 65      set steps [e
23c0: 78 70 72 20 7b 32 30 30 20 2f 20 24 78 63 6e 74  xpr {200 / $xcnt
23d0: 7d 5d 0a 20 20 20 20 69 66 20 7b 24 73 74 65 70  }].    if {$step
23e0: 73 20 3c 20 32 7d 20 7b 0a 20 20 20 20 20 20 73  s < 2} {.      s
23f0: 65 74 20 78 64 61 74 61 32 20 24 78 64 61 74 61  et xdata2 $xdata
2400: 31 0a 20 20 20 20 20 20 73 65 74 20 79 64 61 74  1.      set ydat
2410: 61 32 20 24 79 64 61 74 61 31 0a 20 20 20 20 20  a2 $ydata1.     
2420: 20 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 20 20   return.    }.  
2430: 7d 0a 0a 20 20 73 65 74 20 79 33 20 5b 6c 69 6e  }..  set y3 [lin
2440: 64 65 78 20 24 79 64 61 74 61 31 20 32 5d 0a 20  dex $ydata1 2]. 
2450: 20 73 65 74 20 79 32 20 5b 6c 69 6e 64 65 78 20   set y2 [lindex 
2460: 24 79 64 61 74 61 31 20 31 5d 0a 20 20 73 65 74  $ydata1 1].  set
2470: 20 79 31 20 5b 6c 69 6e 64 65 78 20 24 79 64 61   y1 [lindex $yda
2480: 74 61 31 20 30 5d 0a 20 20 73 65 74 20 64 79 20  ta1 0].  set dy 
2490: 5b 65 78 70 72 20 7b 24 79 32 20 2d 20 24 79 31  [expr {$y2 - $y1
24a0: 7d 5d 0a 20 20 73 65 74 20 79 30 20 5b 65 78 70  }].  set y0 [exp
24b0: 72 20 7b 24 79 31 20 2d 20 24 64 79 7d 5d 0a 20  r {$y1 - $dy}]. 
24c0: 20 69 66 20 7b 24 79 33 20 3d 3d 20 7b 7d 7d 20   if {$y3 == {}} 
24d0: 7b 0a 20 20 20 20 73 65 74 20 79 33 20 5b 65 78  {.    set y3 [ex
24e0: 70 72 20 7b 24 79 32 20 2b 20 24 64 79 7d 5d 0a  pr {$y2 + $dy}].
24f0: 20 20 7d 0a 20 20 73 65 74 20 78 30 20 5b 6c 69    }.  set x0 [li
2500: 6e 64 65 78 20 24 78 64 61 74 61 31 20 30 5d 0a  ndex $xdata1 0].
2510: 0a 20 20 73 65 74 20 64 6d 75 20 5b 65 78 70 72  .  set dmu [expr
2520: 20 7b 31 2e 30 20 2f 20 24 73 74 65 70 73 7d 5d   {1.0 / $steps}]
2530: 0a 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 64 78  ..  for {set idx
2540: 20 31 7d 20 7b 24 69 64 78 20 3c 3d 20 24 79 63   1} {$idx <= $yc
2550: 6e 74 7d 20 7b 69 6e 63 72 20 69 64 78 7d 20 7b  nt} {incr idx} {
2560: 0a 20 20 20 20 73 65 74 20 78 31 20 5b 6c 69 6e  .    set x1 [lin
2570: 64 65 78 20 24 78 64 61 74 61 31 20 24 69 64 78  dex $xdata1 $idx
2580: 5d 0a 20 20 20 20 69 66 20 7b 24 78 31 20 3d 3d  ].    if {$x1 ==
2590: 20 7b 7d 7d 20 7b 0a 20 20 20 20 20 20 73 65 74   {}} {.      set
25a0: 20 78 31 20 5b 65 78 70 72 20 7b 24 78 30 20 2b   x1 [expr {$x0 +
25b0: 20 24 64 78 7d 5d 0a 20 20 20 20 7d 20 65 6c 73   $dx}].    } els
25c0: 65 20 7b 0a 20 20 20 20 20 20 73 65 74 20 64 78  e {.      set dx
25d0: 20 5b 65 78 70 72 20 7b 24 78 31 20 2d 20 24 78   [expr {$x1 - $x
25e0: 30 7d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  0}].    }..    s
25f0: 65 74 20 6d 75 20 30 2e 30 0a 20 20 20 20 66 6f  et mu 0.0.    fo
2600: 72 20 7b 73 65 74 20 6a 20 30 7d 20 7b 24 6a 20  r {set j 0} {$j 
2610: 3c 20 24 73 74 65 70 73 7d 20 7b 69 6e 63 72 20  < $steps} {incr 
2620: 6a 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 78  j} {.      set x
2630: 20 5b 65 78 70 72 20 7b 24 78 30 20 2b 20 24 6d   [expr {$x0 + $m
2640: 75 20 2a 20 24 64 78 7d 5d 0a 20 20 20 20 20 20  u * $dx}].      
2650: 73 65 74 20 79 20 5b 53 70 6c 69 6e 65 49 6e 74  set y [SplineInt
2660: 65 72 70 6f 6c 61 74 65 20 24 79 30 20 24 79 31  erpolate $y0 $y1
2670: 20 24 79 32 20 24 79 33 20 24 6d 75 20 24 74 65   $y2 $y3 $mu $te
2680: 6e 73 69 6f 6e 20 24 62 69 61 73 5d 0a 20 20 20  nsion $bias].   
2690: 20 20 20 73 65 74 20 6d 75 20 5b 65 78 70 72 20     set mu [expr 
26a0: 7b 24 6d 75 20 2b 20 24 64 6d 75 7d 5d 0a 20 20  {$mu + $dmu}].  
26b0: 20 20 20 20 6c 61 70 70 65 6e 64 20 78 64 61 74      lappend xdat
26c0: 61 32 20 24 78 0a 20 20 20 20 20 20 6c 61 70 70  a2 $x.      lapp
26d0: 65 6e 64 20 79 64 61 74 61 32 20 24 79 0a 20 20  end ydata2 $y.  
26e0: 20 20 20 20 69 66 20 7b 24 69 64 78 20 3d 3d 20      if {$idx == 
26f0: 24 79 63 6e 74 7d 20 62 72 65 61 6b 0a 20 20 20  $ycnt} break.   
2700: 20 7d 0a 20 20 20 20 69 66 20 7b 24 69 64 78 20   }.    if {$idx 
2710: 3d 3d 20 24 79 63 6e 74 7d 20 62 72 65 61 6b 0a  == $ycnt} break.
2720: 0a 20 20 20 20 73 65 74 20 78 30 20 24 78 31 0a  .    set x0 $x1.
2730: 0a 20 20 20 20 73 65 74 20 79 30 20 24 79 31 0a  .    set y0 $y1.
2740: 20 20 20 20 73 65 74 20 79 31 20 24 79 32 0a 20      set y1 $y2. 
2750: 20 20 20 73 65 74 20 79 32 20 24 79 33 0a 20 20     set y2 $y3.  
2760: 20 20 73 65 74 20 79 20 5b 6c 69 6e 64 65 78 20    set y [lindex 
2770: 24 79 64 61 74 61 31 20 5b 65 78 70 72 20 7b 24  $ydata1 [expr {$
2780: 69 64 78 2b 32 7d 5d 5d 0a 20 20 20 20 69 66 20  idx+2}]].    if 
2790: 7b 24 79 20 3d 3d 20 7b 7d 7d 20 7b 0a 20 20 20  {$y == {}} {.   
27a0: 20 20 20 73 65 74 20 64 79 20 5b 65 78 70 72 20     set dy [expr 
27b0: 7b 24 79 32 20 2d 20 24 79 31 7d 5d 0a 20 20 20  {$y2 - $y1}].   
27c0: 20 20 20 73 65 74 20 79 33 20 5b 65 78 70 72 20     set y3 [expr 
27d0: 7b 24 79 32 20 2b 20 24 64 79 7d 5d 0a 20 20 20  {$y2 + $dy}].   
27e0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
27f0: 73 65 74 20 79 33 20 24 79 0a 20 20 20 20 7d 0a  set y3 $y.    }.
2800: 20 20 7d 0a 7d 0a 0a 0a 70 72 6f 63 20 70 64 66    }.}...proc pdf
2810: 34 74 63 6c 3a 3a 67 72 61 70 68 3a 3a 53 65 74  4tcl::graph::Set
2820: 44 61 73 68 20 7b 20 67 20 7b 70 61 74 74 65 72  Dash { g {patter
2830: 6e 20 7b 7d 7d 20 7d 20 7b 0a 20 20 69 66 20 7b  n {}} } {.  if {
2840: 5b 72 65 67 65 78 70 20 7b 5e 5b 5c 2e 5c 2d 2c  [regexp {^[\.\-,
2850: 5f 20 5d 2b 24 7d 20 24 70 61 74 74 65 72 6e 5d  _ ]+$} $pattern]
2860: 7d 20 7b 0a 20 20 20 20 73 65 74 20 70 61 74 6c  } {.    set patl
2870: 73 74 20 7b 7d 0a 20 20 20 20 66 6f 72 65 61 63  st {}.    foreac
2880: 68 20 69 74 65 6d 20 5b 73 70 6c 69 74 20 24 70  h item [split $p
2890: 61 74 74 65 72 6e 20 7b 7d 5d 20 7b 0a 20 20 20  attern {}] {.   
28a0: 20 20 20 73 77 69 74 63 68 20 2d 2d 20 24 69 74     switch -- $it
28b0: 65 6d 20 7b 0a 20 20 20 20 20 20 20 20 22 2e 22  em {.        "."
28c0: 20 7b 20 6c 61 70 70 65 6e 64 20 70 61 74 6c 73   { lappend patls
28d0: 74 20 32 20 34 20 7d 0a 09 22 2c 22 20 7b 20 6c  t 2 4 }.."," { l
28e0: 61 70 70 65 6e 64 20 70 61 74 6c 73 74 20 34 20  append patlst 4 
28f0: 34 20 7d 0a 09 22 2d 22 20 7b 20 6c 61 70 70 65  4 }.."-" { lappe
2900: 6e 64 20 70 61 74 6c 73 74 20 36 20 34 20 7d 0a  nd patlst 6 4 }.
2910: 09 22 5f 22 20 7b 20 6c 61 70 70 65 6e 64 20 70  ."_" { lappend p
2920: 61 74 6c 73 74 20 38 20 34 20 7d 0a 09 22 20 22  atlst 8 4 }.." "
2930: 20 7b 0a 09 20 20 69 66 20 7b 24 70 61 74 6c 73   {..  if {$patls
2940: 74 20 21 3d 20 7b 7d 7d 20 7b 0a 09 20 20 20 20  t != {}} {..    
2950: 73 65 74 20 6c 61 73 74 20 5b 6c 69 6e 64 65 78  set last [lindex
2960: 20 24 70 61 74 6c 73 74 20 65 6e 64 5d 0a 09 20   $patlst end].. 
2970: 20 20 20 73 65 74 20 70 61 74 6c 73 74 20 5b 6c     set patlst [l
2980: 72 65 70 6c 61 63 65 20 24 70 61 74 6c 73 74 20  replace $patlst 
2990: 65 6e 64 20 65 6e 64 20 5b 65 78 70 72 20 7b 24  end end [expr {$
29a0: 6c 61 73 74 20 2b 34 7d 5d 5d 0a 09 20 20 7d 0a  last +4}]]..  }.
29b0: 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .}.      }.    }
29c0: 0a 20 20 20 20 73 65 74 20 70 61 74 74 65 72 6e  .    set pattern
29d0: 20 24 70 61 74 6c 73 74 0a 20 20 7d 0a 20 20 67   $patlst.  }.  g
29e0: 72 61 70 68 3a 3a 73 65 74 5f 6f 70 74 20 24 67  raph::set_opt $g
29f0: 20 64 61 73 68 70 61 74 74 65 72 6e 20 24 70 61   dashpattern $pa
2a00: 74 74 65 72 6e 0a 0a 20 20 73 65 74 20 70 61 74  ttern..  set pat
2a10: 20 7b 7d 0a 20 20 66 6f 72 65 61 63 68 20 69 74   {}.  foreach it
2a20: 65 6d 20 24 70 61 74 74 65 72 6e 20 7b 0a 20 20  em $pattern {.  
2a30: 20 20 6c 61 70 70 65 6e 64 20 70 61 74 20 5b 65    lappend pat [e
2a40: 78 70 72 20 7b 24 69 74 65 6d 2f 33 2e 30 7d 5d  xpr {$item/3.0}]
2a50: 0a 20 20 7d 0a 20 20 67 72 61 70 68 3a 3a 65 78  .  }.  graph::ex
2a60: 65 63 75 74 65 20 73 65 74 4c 69 6e 65 44 61 73  ecute setLineDas
2a70: 68 20 7b 2a 7d 24 70 61 74 0a 0a 20 20 72 65 74  h {*}$pat..  ret
2a80: 75 72 6e 20 5b 67 72 61 70 68 3a 3a 67 65 74 5f  urn [graph::get_
2a90: 6f 70 74 20 24 67 20 64 61 73 68 70 61 74 74 65  opt $g dashpatte
2aa0: 72 6e 5d 0a 7d 0a 0a 0a 70 72 6f 63 20 70 64 66  rn].}...proc pdf
2ab0: 34 74 63 6c 3a 3a 67 72 61 70 68 3a 3a 4c 69 6e  4tcl::graph::Lin
2ac0: 65 20 7b 20 67 20 78 31 20 79 31 20 78 32 20 79  e { g x1 y1 x2 y
2ad0: 32 20 7d 20 7b 0a 20 20 43 61 6c 63 58 59 20 24  2 } {.  CalcXY $
2ae0: 67 20 78 31 20 79 31 0a 20 20 43 61 6c 63 58 59  g x1 y1.  CalcXY
2af0: 20 24 67 20 78 32 20 79 32 0a 0a 20 20 69 66 20   $g x2 y2..  if 
2b00: 7b 5b 67 72 61 70 68 3a 3a 67 65 74 5f 6f 70 74  {[graph::get_opt
2b10: 20 24 67 20 6c 69 6e 65 77 69 64 74 68 5d 20 3e   $g linewidth] >
2b20: 3d 20 30 7d 20 7b 0a 20 20 20 20 67 72 61 70 68  = 0} {.    graph
2b30: 3a 3a 65 78 65 63 75 74 65 20 6c 69 6e 65 20 24  ::execute line $
2b40: 78 31 20 24 79 31 20 24 78 32 20 24 79 32 0a 20  x1 $y1 $x2 $y2. 
2b50: 20 7d 0a 7d 0a 0a 0a 70 72 6f 63 20 70 64 66 34   }.}...proc pdf4
2b60: 74 63 6c 3a 3a 67 72 61 70 68 3a 3a 43 6c 69 70  tcl::graph::Clip
2b70: 52 65 63 74 20 7b 20 67 20 78 31 20 79 31 20 78  Rect { g x1 y1 x
2b80: 32 20 79 32 20 7d 20 7b 0a 20 20 43 61 6c 63 58  2 y2 } {.  CalcX
2b90: 59 20 24 67 20 78 31 20 79 31 0a 20 20 43 61 6c  Y $g x1 y1.  Cal
2ba0: 63 58 59 20 24 67 20 78 32 20 79 32 0a 0a 20 20  cXY $g x2 y2..  
2bb0: 67 72 61 70 68 3a 3a 65 78 65 63 75 74 65 20 67  graph::execute g
2bc0: 73 61 76 65 0a 20 20 73 65 74 20 77 20 5b 65 78  save.  set w [ex
2bd0: 70 72 20 7b 61 62 73 28 24 78 32 20 2d 20 24 78  pr {abs($x2 - $x
2be0: 31 29 7d 5d 0a 20 20 73 65 74 20 68 20 5b 65 78  1)}].  set h [ex
2bf0: 70 72 20 7b 61 62 73 28 24 79 32 20 2d 20 24 79  pr {abs($y2 - $y
2c00: 31 29 7d 5d 0a 20 20 73 65 74 20 78 6c 20 5b 65  1)}].  set xl [e
2c10: 78 70 72 20 7b 28 24 78 31 20 3c 20 24 78 32 29  xpr {($x1 < $x2)
2c20: 3f 20 24 78 31 20 3a 20 24 78 32 7d 5d 0a 20 20  ? $x1 : $x2}].  
2c30: 73 65 74 20 79 62 20 5b 65 78 70 72 20 7b 28 24  set yb [expr {($
2c40: 79 31 20 3c 20 24 79 32 29 3f 20 24 79 31 20 3a  y1 < $y2)? $y1 :
2c50: 20 24 79 32 7d 5d 0a 20 20 67 72 61 70 68 3a 3a   $y2}].  graph::
2c60: 65 78 65 63 75 74 65 20 63 6c 69 70 20 24 78 6c  execute clip $xl
2c70: 20 24 79 62 20 24 77 20 24 68 0a 7d 0a 0a 0a 70   $yb $w $h.}...p
2c80: 72 6f 63 20 70 64 66 34 74 63 6c 3a 3a 67 72 61  roc pdf4tcl::gra
2c90: 70 68 3a 3a 55 6e 63 6c 69 70 52 65 63 74 20 7b  ph::UnclipRect {
2ca0: 20 67 20 7d 20 7b 0a 20 20 67 72 61 70 68 3a 3a   g } {.  graph::
2cb0: 65 78 65 63 75 74 65 20 67 72 65 73 74 6f 72 65  execute grestore
2cc0: 0a 7d 0a 0a 0a 70 72 6f 63 20 70 64 66 34 74 63  .}...proc pdf4tc
2cd0: 6c 3a 3a 67 72 61 70 68 3a 3a 52 65 63 74 20 7b  l::graph::Rect {
2ce0: 20 67 20 78 31 20 79 31 20 78 32 20 79 32 20 7b   g x1 y1 x2 y2 {
2cf0: 20 66 69 6c 6c 63 6f 6c 6f 72 20 7b 7d 20 7d 20   fillcolor {} } 
2d00: 7d 20 7b 0a 20 20 43 61 6c 63 58 59 20 24 67 20  } {.  CalcXY $g 
2d10: 78 31 20 79 31 0a 20 20 43 61 6c 63 58 59 20 24  x1 y1.  CalcXY $
2d20: 67 20 78 32 20 79 32 0a 0a 20 20 69 66 20 7b 24  g x2 y2..  if {$
2d30: 66 69 6c 6c 63 6f 6c 6f 72 20 21 3d 20 22 22 7d  fillcolor != ""}
2d40: 20 7b 0a 20 20 20 20 73 65 74 20 72 67 62 6f 72   {.    set rgbor
2d50: 67 20 5b 67 72 61 70 68 3a 3a 67 65 74 5f 6f 70  g [graph::get_op
2d60: 74 20 24 67 20 72 67 62 63 6f 6c 6f 72 5d 0a 20  t $g rgbcolor]. 
2d70: 20 20 20 73 65 74 20 72 67 62 20 5b 47 65 74 52     set rgb [GetR
2d80: 47 42 20 24 66 69 6c 6c 63 6f 6c 6f 72 5d 0a 20  GB $fillcolor]. 
2d90: 20 7d 0a 20 20 73 65 74 20 77 20 5b 65 78 70 72   }.  set w [expr
2da0: 20 7b 61 62 73 28 24 78 32 20 2d 20 24 78 31 29   {abs($x2 - $x1)
2db0: 7d 5d 0a 20 20 73 65 74 20 68 20 5b 65 78 70 72  }].  set h [expr
2dc0: 20 7b 61 62 73 28 24 79 32 20 2d 20 24 79 31 29   {abs($y2 - $y1)
2dd0: 7d 5d 0a 20 20 73 65 74 20 79 62 20 5b 65 78 70  }].  set yb [exp
2de0: 72 20 7b 28 24 79 31 20 3c 20 24 79 32 29 3f 20  r {($y1 < $y2)? 
2df0: 24 79 31 20 3a 20 24 79 32 7d 5d 0a 20 20 73 65  $y1 : $y2}].  se
2e00: 74 20 73 74 72 6f 6b 65 20 5b 65 78 70 72 20 7b  t stroke [expr {
2e10: 5b 67 72 61 70 68 3a 3a 67 65 74 5f 6f 70 74 20  [graph::get_opt 
2e20: 24 67 20 6c 69 6e 65 77 69 64 74 68 5d 20 3e 3d  $g linewidth] >=
2e30: 20 30 7d 5d 0a 20 20 69 66 20 7b 24 66 69 6c 6c   0}].  if {$fill
2e40: 63 6f 6c 6f 72 20 21 3d 20 22 22 7d 20 7b 0a 20  color != ""} {. 
2e50: 20 20 20 6c 61 73 73 69 67 6e 20 24 72 67 62 20     lassign $rgb 
2e60: 72 20 67 20 62 0a 20 20 20 20 67 72 61 70 68 3a  r g b.    graph:
2e70: 3a 65 78 65 63 75 74 65 20 73 65 74 46 69 6c 6c  :execute setFill
2e80: 43 6f 6c 6f 72 20 24 72 20 24 67 20 24 62 0a 20  Color $r $g $b. 
2e90: 20 20 20 67 72 61 70 68 3a 3a 65 78 65 63 75 74     graph::execut
2ea0: 65 20 72 65 63 74 61 6e 67 6c 65 20 24 78 31 20  e rectangle $x1 
2eb0: 24 79 62 20 24 77 20 24 68 20 2d 73 74 72 6f 6b  $yb $w $h -strok
2ec0: 65 20 24 73 74 72 6f 6b 65 20 2d 66 69 6c 6c 65  e $stroke -fille
2ed0: 64 20 31 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  d 1.  } else {. 
2ee0: 20 20 20 67 72 61 70 68 3a 3a 65 78 65 63 75 74     graph::execut
2ef0: 65 20 72 65 63 74 61 6e 67 6c 65 20 24 78 31 20  e rectangle $x1 
2f00: 24 79 62 20 24 77 20 24 68 20 2d 73 74 72 6f 6b  $yb $w $h -strok
2f10: 65 20 24 73 74 72 6f 6b 65 20 2d 66 69 6c 6c 65  e $stroke -fille
2f20: 64 20 30 0a 20 20 7d 0a 20 20 69 66 20 7b 24 66  d 0.  }.  if {$f
2f30: 69 6c 6c 63 6f 6c 6f 72 20 21 3d 20 22 22 7d 20  illcolor != ""} 
2f40: 7b 0a 20 20 20 20 53 65 74 43 6f 6c 6f 72 20 24  {.    SetColor $
2f50: 67 20 24 72 67 62 6f 72 67 0a 20 20 7d 0a 7d 0a  g $rgborg.  }.}.
2f60: 0a 0a 70 72 6f 63 20 70 64 66 34 74 63 6c 3a 3a  ..proc pdf4tcl::
2f70: 67 72 61 70 68 3a 3a 41 72 63 20 7b 20 67 20 78  graph::Arc { g x
2f80: 20 79 20 72 20 61 6c 70 68 61 20 62 65 74 61 20   y r alpha beta 
2f90: 7b 66 69 6c 6c 63 6f 6c 6f 72 20 22 22 7d 20 7b  {fillcolor ""} {
2fa0: 73 6c 69 6e 65 73 20 6e 6f 7d 20 7d 20 7b 0a 20  slines no} } {. 
2fb0: 20 43 61 6c 63 58 59 20 24 67 20 78 20 79 0a 0a   CalcXY $g x y..
2fc0: 20 20 69 66 20 7b 24 66 69 6c 6c 63 6f 6c 6f 72    if {$fillcolor
2fd0: 20 21 3d 20 22 22 7d 20 7b 0a 20 20 20 20 73 65   != ""} {.    se
2fe0: 74 20 72 67 62 6f 72 67 20 5b 67 72 61 70 68 3a  t rgborg [graph:
2ff0: 3a 67 65 74 5f 6f 70 74 20 24 67 20 72 67 62 63  :get_opt $g rgbc
3000: 6f 6c 6f 72 5d 0a 20 20 20 20 73 65 74 20 72 67  olor].    set rg
3010: 62 20 5b 47 65 74 52 47 42 20 24 66 69 6c 6c 63  b [GetRGB $fillc
3020: 6f 6c 6f 72 5d 0a 20 20 7d 0a 20 20 73 65 74 20  olor].  }.  set 
3030: 64 65 6c 74 61 20 5b 65 78 70 72 20 7b 24 62 65  delta [expr {$be
3040: 74 61 20 2d 20 24 61 6c 70 68 61 7d 5d 0a 20 20  ta - $alpha}].  
3050: 69 66 20 7b 24 66 69 6c 6c 63 6f 6c 6f 72 20 21  if {$fillcolor !
3060: 3d 20 22 22 7d 20 7b 0a 20 20 20 20 6c 61 73 73  = ""} {.    lass
3070: 69 67 6e 20 24 72 67 62 20 72 64 20 67 6e 20 62  ign $rgb rd gn b
3080: 6c 0a 20 20 20 20 67 72 61 70 68 3a 3a 65 78 65  l.    graph::exe
3090: 63 75 74 65 20 73 65 74 46 69 6c 6c 43 6f 6c 6f  cute setFillColo
30a0: 72 20 24 72 64 20 24 67 6e 20 24 62 6c 0a 20 20  r $rd $gn $bl.  
30b0: 20 20 67 72 61 70 68 3a 3a 65 78 65 63 75 74 65    graph::execute
30c0: 20 61 72 63 20 24 78 20 24 79 20 24 72 20 24 72   arc $x $y $r $r
30d0: 20 24 61 6c 70 68 61 20 24 64 65 6c 74 61 20 2d   $alpha $delta -
30e0: 73 74 72 6f 6b 65 20 31 20 2d 66 69 6c 6c 65 64  stroke 1 -filled
30f0: 20 31 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20   1.  } else {.  
3100: 20 20 67 72 61 70 68 3a 3a 65 78 65 63 75 74 65    graph::execute
3110: 20 61 72 63 20 24 78 20 24 79 20 24 72 20 24 72   arc $x $y $r $r
3120: 20 24 61 6c 70 68 61 20 24 64 65 6c 74 61 20 2d   $alpha $delta -
3130: 73 74 72 6f 6b 65 20 31 20 2d 66 69 6c 6c 65 64  stroke 1 -filled
3140: 20 30 0a 20 20 7d 0a 20 20 69 66 20 7b 24 66 69   0.  }.  if {$fi
3150: 6c 6c 63 6f 6c 6f 72 20 21 3d 20 22 22 7d 20 7b  llcolor != ""} {
3160: 0a 20 20 20 20 53 65 74 43 6f 6c 6f 72 20 24 67  .    SetColor $g
3170: 20 24 72 67 62 6f 72 67 0a 20 20 7d 0a 7d 0a 0a   $rgborg.  }.}..
3180: 0a 70 72 6f 63 20 70 64 66 34 74 63 6c 3a 3a 67  .proc pdf4tcl::g
3190: 72 61 70 68 3a 3a 50 6f 6c 79 4f 62 6a 65 63 74  raph::PolyObject
31a0: 20 7b 20 67 20 61 72 67 76 20 7b 66 69 6c 6c 63   { g argv {fillc
31b0: 6f 6c 6f 72 20 7b 7d 7d 20 7d 20 7b 0a 20 20 69  olor {}} } {.  i
31c0: 66 20 7b 24 66 69 6c 6c 63 6f 6c 6f 72 20 21 3d  f {$fillcolor !=
31d0: 20 22 22 7d 20 7b 0a 20 20 20 20 73 65 74 20 72   ""} {.    set r
31e0: 67 62 6f 72 67 20 5b 67 72 61 70 68 3a 3a 67 65  gborg [graph::ge
31f0: 74 5f 6f 70 74 20 24 67 20 72 67 62 63 6f 6c 6f  t_opt $g rgbcolo
3200: 72 5d 0a 20 20 20 20 73 65 74 20 72 67 62 20 5b  r].    set rgb [
3210: 47 65 74 52 47 42 20 24 66 69 6c 6c 63 6f 6c 6f  GetRGB $fillcolo
3220: 72 5d 0a 20 20 7d 0a 20 20 73 65 74 20 61 72 67  r].  }.  set arg
3230: 63 20 5b 6c 6c 65 6e 67 74 68 20 24 61 72 67 76  c [llength $argv
3240: 5d 0a 20 20 69 66 20 7b 24 61 72 67 63 20 21 3d  ].  if {$argc !=
3250: 20 32 20 26 26 20 24 61 72 67 63 20 21 3d 20 33   2 && $argc != 3
3260: 7d 20 7b 0a 20 20 20 20 65 72 72 6f 72 20 22 73  } {.    error "s
3270: 79 6e 74 61 78 20 65 72 72 6f 72 20 69 6e 20 50  yntax error in P
3280: 6f 6c 79 4f 62 6a 65 63 74 20 24 61 72 67 76 22  olyObject $argv"
3290: 0a 20 20 7d 0a 20 20 69 66 20 7b 24 61 72 67 63  .  }.  if {$argc
32a0: 20 3d 3d 20 32 7d 20 7b 0a 20 20 20 20 73 65 74   == 2} {.    set
32b0: 20 78 4c 73 74 20 5b 6c 69 6e 64 65 78 20 24 61   xLst [lindex $a
32c0: 72 67 76 20 30 5d 0a 20 20 20 20 73 65 74 20 79  rgv 0].    set y
32d0: 4c 73 74 20 5b 6c 69 6e 64 65 78 20 24 61 72 67  Lst [lindex $arg
32e0: 76 20 31 5d 0a 20 20 20 20 73 65 74 20 63 6e 74  v 1].    set cnt
32f0: 20 20 5b 6c 6c 65 6e 67 74 68 20 24 78 4c 73 74    [llength $xLst
3300: 5d 0a 20 20 20 20 73 65 74 20 6d 6f 64 65 20 78  ].    set mode x
3310: 79 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  y.  } else {.   
3320: 20 73 65 74 20 78 4c 73 74 20 5b 6c 69 6e 64 65   set xLst [linde
3330: 78 20 24 61 72 67 76 20 30 5d 0a 20 20 20 20 69  x $argv 0].    i
3340: 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 78 4c 73  f {[llength $xLs
3350: 74 5d 20 3e 20 31 7d 20 7b 0a 20 20 20 20 20 20  t] > 1} {.      
3360: 73 65 74 20 79 4c 73 74 20 7b 7d 0a 20 20 20 20  set yLst {}.    
3370: 20 20 73 65 74 20 63 6e 74 20 20 5b 6c 6c 65 6e    set cnt  [llen
3380: 67 74 68 20 24 78 4c 73 74 5d 0a 20 20 20 20 20  gth $xLst].     
3390: 20 73 65 74 20 79 56 61 6c 20 5b 6c 69 6e 64 65   set yVal [linde
33a0: 78 20 24 61 72 67 76 20 31 5d 0a 20 20 20 20 20  x $argv 1].     
33b0: 20 73 65 74 20 79 41 64 64 20 5b 6c 69 6e 64 65   set yAdd [linde
33c0: 78 20 24 61 72 67 76 20 32 5d 0a 20 20 20 20 20  x $argv 2].     
33d0: 20 73 65 74 20 6d 6f 64 65 20 79 69 6e 63 72 0a   set mode yincr.
33e0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
33f0: 20 20 20 73 65 74 20 78 4c 73 74 20 7b 7d 0a 20     set xLst {}. 
3400: 20 20 20 20 20 73 65 74 20 78 56 61 6c 20 5b 6c       set xVal [l
3410: 69 6e 64 65 78 20 24 61 72 67 76 20 30 5d 0a 20  index $argv 0]. 
3420: 20 20 20 20 20 73 65 74 20 78 41 64 64 20 5b 6c       set xAdd [l
3430: 69 6e 64 65 78 20 24 61 72 67 76 20 31 5d 0a 20  index $argv 1]. 
3440: 20 20 20 20 20 73 65 74 20 79 4c 73 74 20 5b 6c       set yLst [l
3450: 69 6e 64 65 78 20 24 61 72 67 76 20 32 5d 0a 20  index $argv 2]. 
3460: 20 20 20 20 20 73 65 74 20 63 6e 74 20 20 5b 6c       set cnt  [l
3470: 6c 65 6e 67 74 68 20 24 79 4c 73 74 5d 0a 20 20  length $yLst].  
3480: 20 20 20 20 73 65 74 20 6d 6f 64 65 20 78 69 6e      set mode xin
3490: 63 72 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  cr.    }.  }.  i
34a0: 66 20 7b 24 63 6e 74 20 3d 3d 20 30 7d 20 72 65  f {$cnt == 0} re
34b0: 74 75 72 6e 0a 20 20 73 65 74 20 70 6f 6c 79 20  turn.  set poly 
34c0: 7b 7d 0a 20 20 73 77 69 74 63 68 20 24 6d 6f 64  {}.  switch $mod
34d0: 65 20 7b 0a 20 20 20 20 78 79 20 7b 0a 20 20 20  e {.    xy {.   
34e0: 20 20 20 73 65 74 20 69 64 78 20 30 0a 20 20 20     set idx 0.   
34f0: 20 20 20 66 6f 72 65 61 63 68 20 78 20 24 78 4c     foreach x $xL
3500: 73 74 20 79 20 24 79 4c 73 74 20 7b 0a 20 20 20  st y $yLst {.   
3510: 20 20 20 20 20 73 65 74 20 78 20 5b 66 6f 72 6d       set x [form
3520: 61 74 20 25 2e 32 66 20 5b 6c 69 6e 64 65 78 20  at %.2f [lindex 
3530: 24 78 4c 73 74 20 24 69 64 78 5d 5d 0a 20 20 20  $xLst $idx]].   
3540: 20 20 20 20 20 73 65 74 20 79 20 5b 66 6f 72 6d       set y [form
3550: 61 74 20 25 2e 32 66 20 5b 6c 69 6e 64 65 78 20  at %.2f [lindex 
3560: 24 79 4c 73 74 20 24 69 64 78 5d 5d 0a 20 20 20  $yLst $idx]].   
3570: 20 20 20 20 20 43 61 6c 63 58 59 20 24 67 20 78       CalcXY $g x
3580: 20 79 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65   y.        lappe
3590: 6e 64 20 70 6f 6c 79 20 24 78 20 24 79 0a 20 20  nd poly $x $y.  
35a0: 20 20 20 20 20 20 69 6e 63 72 20 69 64 78 0a 20        incr idx. 
35b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
35c0: 20 78 69 6e 63 72 20 7b 0a 20 20 20 20 20 20 66   xincr {.      f
35d0: 6f 72 20 7b 73 65 74 20 69 64 78 20 30 7d 20 7b  or {set idx 0} {
35e0: 24 69 64 78 20 3c 20 24 63 6e 74 7d 20 7b 69 6e  $idx < $cnt} {in
35f0: 63 72 20 69 64 78 7d 20 7b 0a 20 20 20 20 20 20  cr idx} {.      
3600: 20 20 73 65 74 20 79 20 5b 66 6f 72 6d 61 74 20    set y [format 
3610: 25 2e 32 66 20 5b 6c 69 6e 64 65 78 20 24 79 4c  %.2f [lindex $yL
3620: 73 74 20 24 69 64 78 5d 5d 0a 20 20 20 20 20 20  st $idx]].      
3630: 20 20 69 66 20 7b 24 69 64 78 20 3d 3d 20 30 7d    if {$idx == 0}
3640: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 74   {.          set
3650: 20 78 20 24 78 56 61 6c 0a 20 20 20 20 20 20 20   x $xVal.       
3660: 20 20 20 43 61 6c 63 58 59 20 24 67 20 78 20 79     CalcXY $g x y
3670: 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65  .          lappe
3680: 6e 64 20 70 6f 6c 79 20 24 78 20 24 79 0a 20 20  nd poly $x $y.  
3690: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
36a0: 20 20 20 20 20 20 20 20 20 73 65 74 20 78 20 5b           set x [
36b0: 66 6f 72 6d 61 74 20 25 2e 32 66 20 5b 65 78 70  format %.2f [exp
36c0: 72 20 7b 24 78 20 2b 20 24 78 41 64 64 7d 5d 5d  r {$x + $xAdd}]]
36d0: 0a 20 20 20 20 20 20 20 20 20 20 43 61 6c 63 58  .          CalcX
36e0: 59 20 24 67 20 78 20 79 0a 20 20 20 20 20 20 20  Y $g x y.       
36f0: 20 20 20 6c 61 70 70 65 6e 64 20 70 6f 6c 79 20     lappend poly 
3700: 24 78 20 24 79 0a 20 20 20 20 20 20 20 20 7d 0a  $x $y.        }.
3710: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3720: 20 20 79 69 6e 63 72 20 7b 0a 20 20 20 20 20 20    yincr {.      
3730: 66 6f 72 20 7b 73 65 74 20 69 64 78 20 30 7d 20  for {set idx 0} 
3740: 7b 24 69 64 78 20 3c 20 24 63 6e 74 7d 20 7b 69  {$idx < $cnt} {i
3750: 6e 63 72 20 69 64 78 7d 20 7b 0a 20 20 20 20 20  ncr idx} {.     
3760: 20 20 20 73 65 74 20 78 20 5b 66 6f 72 6d 61 74     set x [format
3770: 20 25 2e 32 66 20 5b 6c 69 6e 64 65 78 20 24 78   %.2f [lindex $x
3780: 4c 73 74 20 24 69 64 78 5d 5d 0a 20 20 20 20 20  Lst $idx]].     
3790: 20 20 20 69 66 20 7b 24 69 64 78 20 3d 3d 20 30     if {$idx == 0
37a0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65  } {.          se
37b0: 74 20 79 20 24 79 56 61 6c 0a 20 20 20 20 20 20  t y $yVal.      
37c0: 20 20 20 20 43 61 6c 63 58 59 20 24 67 20 78 20      CalcXY $g x 
37d0: 79 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70 70  y.          lapp
37e0: 65 6e 64 20 70 6f 6c 79 20 24 78 20 24 79 0a 20  end poly $x $y. 
37f0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
3800: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 79 20            set y 
3810: 5b 66 6f 72 6d 61 74 20 25 2e 32 66 20 5b 65 78  [format %.2f [ex
3820: 70 72 20 7b 24 79 20 2b 20 24 79 41 64 64 7d 5d  pr {$y + $yAdd}]
3830: 5d 0a 20 20 20 20 20 20 20 20 20 20 43 61 6c 63  ].          Calc
3840: 58 59 20 24 67 20 78 20 79 0a 20 20 20 20 20 20  XY $g x y.      
3850: 20 20 20 20 6c 61 70 70 65 6e 64 20 70 6f 6c 79      lappend poly
3860: 20 24 78 20 24 79 0a 20 20 20 20 20 20 20 20 7d   $x $y.        }
3870: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3880: 20 7d 0a 20 20 69 66 20 7b 24 66 69 6c 6c 63 6f   }.  if {$fillco
3890: 6c 6f 72 20 21 3d 20 7b 7d 7d 20 7b 0a 20 20 20  lor != {}} {.   
38a0: 20 6c 61 73 73 69 67 6e 20 24 66 69 6c 6c 63 6f   lassign $fillco
38b0: 6c 6f 72 20 72 20 67 20 62 0a 20 20 20 20 67 72  lor r g b.    gr
38c0: 61 70 68 3a 3a 65 78 65 63 75 74 65 20 73 65 74  aph::execute set
38d0: 46 69 6c 6c 43 6f 6c 6f 72 20 24 72 20 24 67 20  FillColor $r $g 
38e0: 24 62 0a 20 20 20 20 67 72 61 70 68 3a 3a 65 78  $b.    graph::ex
38f0: 65 63 75 74 65 20 70 6f 6c 79 67 6f 6e 20 7b 2a  ecute polygon {*
3900: 7d 24 70 6f 6c 79 20 2d 73 74 72 6f 6b 65 20 31  }$poly -stroke 1
3910: 20 2d 66 69 6c 6c 65 64 20 31 0a 20 20 7d 20 65   -filled 1.  } e
3920: 6c 73 65 20 7b 0a 20 20 20 20 67 72 61 70 68 3a  lse {.    graph:
3930: 3a 65 78 65 63 75 74 65 20 70 6f 6c 79 67 6f 6e  :execute polygon
3940: 20 7b 2a 7d 24 70 6f 6c 79 20 2d 73 74 72 6f 6b   {*}$poly -strok
3950: 65 20 31 20 2d 63 6c 6f 73 65 64 20 30 0a 20 20  e 1 -closed 0.  
3960: 7d 0a 20 20 69 66 20 7b 24 66 69 6c 6c 63 6f 6c  }.  if {$fillcol
3970: 6f 72 20 21 3d 20 22 22 7d 20 7b 0a 20 20 20 20  or != ""} {.    
3980: 53 65 74 43 6f 6c 6f 72 20 24 67 20 24 72 67 62  SetColor $g $rgb
3990: 6f 72 67 0a 20 20 7d 0a 7d 0a 0a 0a 70 72 6f 63  org.  }.}...proc
39a0: 20 70 64 66 34 74 63 6c 3a 3a 67 72 61 70 68 3a   pdf4tcl::graph:
39b0: 3a 54 65 78 74 20 7b 20 67 20 78 20 79 20 74 65  :Text { g x y te
39c0: 78 74 20 61 72 67 73 20 7d 20 7b 0a 20 20 69 66  xt args } {.  if
39d0: 20 7b 24 74 65 78 74 20 3d 3d 20 22 22 7d 20 72   {$text == ""} r
39e0: 65 74 75 72 6e 0a 0a 20 20 43 61 6c 63 58 59 20  eturn..  CalcXY 
39f0: 24 67 20 78 20 79 0a 0a 20 20 73 65 74 20 72 6f  $g x y..  set ro
3a00: 74 61 74 69 6f 6e 20 5b 67 72 61 70 68 3a 3a 67  tation [graph::g
3a10: 65 74 5f 6f 70 74 20 24 67 20 72 6f 74 61 74 69  et_opt $g rotati
3a20: 6f 6e 5d 0a 0a 20 20 69 66 20 7b 24 61 72 67 73  on]..  if {$args
3a30: 20 21 3d 20 7b 7d 7d 20 7b 0a 20 20 20 20 69 66   != {}} {.    if
3a40: 20 7b 5b 73 65 74 20 69 64 78 20 5b 6c 73 65 61   {[set idx [lsea
3a50: 72 63 68 20 24 61 72 67 73 20 22 72 69 67 68 74  rch $args "right
3a60: 22 5d 5d 20 21 3d 20 2d 31 7d 20 7b 0a 20 20 20  "]] != -1} {.   
3a70: 20 20 20 73 65 74 20 77 69 64 74 68 20 5b 6c 69     set width [li
3a80: 6e 64 65 78 20 24 61 72 67 73 20 5b 69 6e 63 72  ndex $args [incr
3a90: 20 69 64 78 5d 5d 0a 20 20 20 20 20 20 73 65 74   idx]].      set
3aa0: 20 74 77 20 5b 54 65 78 74 57 69 64 74 68 20 24   tw [TextWidth $
3ab0: 74 65 78 74 5d 0a 20 20 20 20 20 20 73 65 74 20  text].      set 
3ac0: 78 20 5b 65 78 70 72 20 7b 24 78 20 2b 20 24 77  x [expr {$x + $w
3ad0: 69 64 74 68 20 2d 20 24 74 77 7d 5d 0a 20 20 20  idth - $tw}].   
3ae0: 20 7d 0a 20 20 20 20 69 66 20 7b 5b 73 65 74 20   }.    if {[set 
3af0: 69 64 78 20 5b 6c 73 65 61 72 63 68 20 24 61 72  idx [lsearch $ar
3b00: 67 73 20 22 63 65 6e 74 65 72 22 5d 5d 20 21 3d  gs "center"]] !=
3b10: 20 2d 31 7d 20 7b 0a 20 20 20 20 20 20 73 65 74   -1} {.      set
3b20: 20 77 69 64 74 68 20 5b 6c 69 6e 64 65 78 20 24   width [lindex $
3b30: 61 72 67 73 20 5b 69 6e 63 72 20 69 64 78 5d 5d  args [incr idx]]
3b40: 0a 20 20 20 20 20 20 73 65 74 20 74 77 20 5b 54  .      set tw [T
3b50: 65 78 74 57 69 64 74 68 20 24 74 65 78 74 5d 0a  extWidth $text].
3b60: 20 20 20 20 20 20 73 65 74 20 78 20 5b 65 78 70        set x [exp
3b70: 72 20 7b 24 78 20 2b 20 28 24 77 69 64 74 68 20  r {$x + ($width 
3b80: 2d 20 24 74 77 29 20 2f 20 32 2e 30 7d 5d 0a 20  - $tw) / 2.0}]. 
3b90: 20 20 20 7d 0a 20 20 20 20 69 66 20 7b 5b 73 65     }.    if {[se
3ba0: 74 20 69 64 78 20 5b 6c 73 65 61 72 63 68 20 24  t idx [lsearch $
3bb0: 61 72 67 73 20 22 72 6f 74 61 74 65 22 5d 5d 20  args "rotate"]] 
3bc0: 21 3d 20 2d 31 7d 20 7b 0a 20 20 20 20 20 20 73  != -1} {.      s
3bd0: 65 74 20 61 6e 67 6c 65 20 5b 6c 69 6e 64 65 78  et angle [lindex
3be0: 20 24 61 72 67 73 20 5b 69 6e 63 72 20 69 64 78   $args [incr idx
3bf0: 5d 5d 0a 20 20 20 20 20 20 73 65 74 20 72 6f 74  ]].      set rot
3c00: 61 74 69 6f 6e 20 5b 65 78 70 72 20 7b 24 72 6f  ation [expr {$ro
3c10: 74 61 74 69 6f 6e 20 2b 20 24 61 6e 67 6c 65 7d  tation + $angle}
3c20: 5d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ].    }.  }..  i
3c30: 66 20 7b 24 72 6f 74 61 74 69 6f 6e 20 3d 3d 20  f {$rotation == 
3c40: 30 7d 20 7b 0a 20 20 20 20 67 72 61 70 68 3a 3a  0} {.    graph::
3c50: 65 78 65 63 75 74 65 20 74 65 78 74 20 24 74 65  execute text $te
3c60: 78 74 20 2d 78 20 24 78 20 2d 79 20 24 79 0a 20  xt -x $x -y $y. 
3c70: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 67 72   } else {.    gr
3c80: 61 70 68 3a 3a 65 78 65 63 75 74 65 20 74 65 78  aph::execute tex
3c90: 74 20 24 74 65 78 74 20 2d 78 20 24 78 20 2d 79  t $text -x $x -y
3ca0: 20 24 79 20 2d 61 6e 67 6c 65 20 24 72 6f 74 61   $y -angle $rota
3cb0: 74 69 6f 6e 0a 20 20 7d 0a 7d 0a 0a 0a 70 72 6f  tion.  }.}...pro
3cc0: 63 20 70 64 66 34 74 63 6c 3a 3a 67 72 61 70 68  c pdf4tcl::graph
3cd0: 3a 3a 50 69 63 74 20 7b 20 67 20 78 20 79 20 6e  ::Pict { g x y n
3ce0: 61 6d 65 20 7b 20 73 63 61 6c 65 20 31 2e 30 20  ame { scale 1.0 
3cf0: 7d 20 7d 20 7b 0a 20 20 43 61 6c 63 58 59 20 24  } } {.  CalcXY $
3d00: 67 20 78 20 79 0a 0a 20 20 69 66 20 7b 5b 6c 73  g x y..  if {[ls
3d10: 65 61 72 63 68 20 5b 67 72 61 70 68 3a 3a 67 65  earch [graph::ge
3d20: 74 5f 6f 70 74 20 24 67 20 70 69 63 74 73 5d 20  t_opt $g picts] 
3d30: 24 6e 61 6d 65 5d 20 3d 3d 20 2d 31 7d 20 7b 0a  $name] == -1} {.
3d40: 20 20 20 20 4c 6f 61 64 50 69 63 74 20 24 67 20      LoadPict $g 
3d50: 24 6e 61 6d 65 0a 20 20 7d 0a 0a 20 20 73 65 74  $name.  }..  set
3d60: 20 69 64 20 5b 66 69 6c 65 20 74 61 69 6c 20 24   id [file tail $
3d70: 6e 61 6d 65 5d 0a 20 20 69 66 20 7b 24 73 63 61  name].  if {$sca
3d80: 6c 65 20 21 3d 20 31 2e 30 7d 20 7b 0a 20 20 20  le != 1.0} {.   
3d90: 20 73 65 74 20 77 20 5b 65 78 70 72 20 7b 5b 67   set w [expr {[g
3da0: 72 61 70 68 3a 3a 67 65 74 5f 6f 70 74 20 24 67  raph::get_opt $g
3db0: 20 70 69 63 74 2c 24 6e 61 6d 65 2c 77 69 64 74   pict,$name,widt
3dc0: 68 5d 20 20 2a 20 24 73 63 61 6c 65 7d 5d 0a 20  h]  * $scale}]. 
3dd0: 20 20 20 73 65 74 20 68 20 5b 65 78 70 72 20 7b     set h [expr {
3de0: 5b 67 72 61 70 68 3a 3a 67 65 74 5f 6f 70 74 20  [graph::get_opt 
3df0: 24 67 20 70 69 63 74 2c 24 6e 61 6d 65 2c 68 65  $g pict,$name,he
3e00: 69 67 68 74 5d 20 2a 20 24 73 63 61 6c 65 7d 5d  ight] * $scale}]
3e10: 0a 20 20 20 20 67 72 61 70 68 3a 3a 65 78 65 63  .    graph::exec
3e20: 75 74 65 20 70 75 74 49 6d 61 67 65 20 24 69 64  ute putImage $id
3e30: 20 24 78 20 24 79 20 2d 77 69 64 74 68 20 24 77   $x $y -width $w
3e40: 20 2d 68 65 69 67 68 74 20 24 68 0a 20 20 7d 20   -height $h.  } 
3e50: 65 6c 73 65 20 7b 0a 20 20 20 20 67 72 61 70 68  else {.    graph
3e60: 3a 3a 65 78 65 63 75 74 65 20 70 75 74 49 6d 61  ::execute putIma
3e70: 67 65 20 24 69 64 20 24 78 20 24 79 0a 20 20 7d  ge $id $x $y.  }
3e80: 0a 7d 0a 0a 0a 70 72 6f 63 20 70 64 66 34 74 63  .}...proc pdf4tc
3e90: 6c 3a 3a 67 72 61 70 68 3a 3a 4c 6f 61 64 50 69  l::graph::LoadPi
3ea0: 63 74 20 7b 20 67 20 6e 61 6d 65 20 7d 20 7b 0a  ct { g name } {.
3eb0: 20 20 73 65 74 20 64 69 72 6e 61 6d 65 20 20 20    set dirname   
3ec0: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 6e  [file dirname $n
3ed0: 61 6d 65 5d 0a 20 20 73 65 74 20 66 69 6c 65 6e  ame].  set filen
3ee0: 61 6d 65 20 20 5b 66 69 6c 65 20 74 61 69 6c 20  ame  [file tail 
3ef0: 24 6e 61 6d 65 5d 0a 20 20 73 65 74 20 65 78 74  $name].  set ext
3f00: 65 6e 73 69 6f 6e 20 5b 66 69 6c 65 20 65 78 74  ension [file ext
3f10: 65 6e 73 69 6f 6e 20 24 66 69 6c 65 6e 61 6d 65  ension $filename
3f20: 5d 0a 20 20 73 65 74 20 66 69 6c 65 6e 61 6d 65  ].  set filename
3f30: 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65    [file rootname
3f40: 20 24 66 69 6c 65 6e 61 6d 65 5d 0a 0a 20 20 73   $filename]..  s
3f50: 65 74 20 65 78 74 65 78 70 65 63 74 20 7b 2e 6a  et extexpect {.j
3f60: 70 65 67 20 2e 6a 70 67 20 2e 70 6e 67 20 7b 7d  peg .jpg .png {}
3f70: 7d 0a 0a 20 20 73 65 74 20 69 64 20 5b 66 69 6c  }..  set id [fil
3f80: 65 20 74 61 69 6c 20 24 6e 61 6d 65 5d 0a 20 20  e tail $name].  
3f90: 73 65 74 20 72 63 20 30 0a 20 20 66 6f 72 65 61  set rc 0.  forea
3fa0: 63 68 20 65 78 74 20 24 65 78 74 65 78 70 65 63  ch ext $extexpec
3fb0: 74 20 7b 0a 20 20 20 20 73 65 74 20 66 69 6c 65  t {.    set file
3fc0: 70 61 74 68 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  path [file join 
3fd0: 24 64 69 72 6e 61 6d 65 20 24 66 69 6c 65 6e 61  $dirname $filena
3fe0: 6d 65 24 65 78 74 5d 0a 20 20 20 20 69 66 20 7b  me$ext].    if {
3ff0: 5b 66 69 6c 65 20 72 65 61 64 61 62 6c 65 20 24  [file readable $
4000: 66 69 6c 65 70 61 74 68 5d 7d 20 7b 0a 20 20 20  filepath]} {.   
4010: 20 20 20 67 72 61 70 68 3a 3a 65 78 65 63 75 74     graph::execut
4020: 65 20 61 64 64 49 6d 61 67 65 20 24 66 69 6c 65  e addImage $file
4030: 70 61 74 68 20 2d 69 64 20 24 69 64 20 2d 74 79  path -id $id -ty
4040: 70 65 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65  pe [string range
4050: 20 24 65 78 74 20 31 20 65 6e 64 5d 0a 20 20 20   $ext 1 end].   
4060: 20 20 20 73 65 74 20 72 63 20 31 0a 20 20 20 20     set rc 1.    
4070: 20 20 62 72 65 61 6b 0a 20 20 20 20 7d 0a 20 20    break.    }.  
4080: 7d 0a 20 20 69 66 20 7b 24 72 63 20 3d 3d 20 30  }.  if {$rc == 0
4090: 7d 20 7b 0a 20 20 20 20 65 72 72 6f 72 20 22 69  } {.    error "i
40a0: 6d 61 67 65 20 66 69 6c 65 20 5c 22 24 6e 61 6d  mage file \"$nam
40b0: 65 5c 5b 24 65 78 74 65 78 70 65 63 74 5c 5d 5c  e\[$extexpect\]\
40c0: 22 20 6e 6f 74 20 66 6f 75 6e 64 22 0a 20 20 7d  " not found".  }
40d0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 66 6f 72 65   else {.    fore
40e0: 61 63 68 20 7b 77 20 68 7d 20 5b 67 72 61 70 68  ach {w h} [graph
40f0: 3a 3a 65 78 65 63 75 74 65 20 67 65 74 49 6d 61  ::execute getIma
4100: 67 65 53 69 7a 65 20 24 69 64 5d 20 7b 7d 0a 20  geSize $id] {}. 
4110: 20 20 20 67 72 61 70 68 3a 3a 73 65 74 5f 6f 70     graph::set_op
4120: 74 20 24 67 20 70 69 63 74 2c 24 6e 61 6d 65 2c  t $g pict,$name,
4130: 64 61 74 61 20 20 20 7b 7d 0a 20 20 20 20 67 72  data   {}.    gr
4140: 61 70 68 3a 3a 73 65 74 5f 6f 70 74 20 24 67 20  aph::set_opt $g 
4150: 70 69 63 74 2c 24 6e 61 6d 65 2c 77 69 64 74 68  pict,$name,width
4160: 20 20 5b 65 78 70 72 20 7b 32 35 2e 34 20 2a 20    [expr {25.4 * 
4170: 24 77 20 2f 20 37 32 7d 5d 0a 20 20 20 20 67 72  $w / 72}].    gr
4180: 61 70 68 3a 3a 73 65 74 5f 6f 70 74 20 24 67 20  aph::set_opt $g 
4190: 70 69 63 74 2c 24 6e 61 6d 65 2c 68 65 69 67 68  pict,$name,heigh
41a0: 74 20 5b 65 78 70 72 20 7b 32 35 2e 34 20 2a 20  t [expr {25.4 * 
41b0: 24 68 20 2f 20 37 32 7d 5d 0a 20 20 20 20 67 72  $h / 72}].    gr
41c0: 61 70 68 3a 3a 61 70 70 65 6e 64 5f 6f 70 74 20  aph::append_opt 
41d0: 70 69 63 74 73 20 24 6e 61 6d 65 0a 20 20 7d 0a  picts $name.  }.
41e0: 7d 0a 0a 0a 70 72 6f 63 20 70 64 66 34 74 63 6c  }...proc pdf4tcl
41f0: 3a 3a 67 72 61 70 68 3a 3a 50 69 63 74 53 69 7a  ::graph::PictSiz
4200: 65 20 7b 20 67 20 6e 61 6d 65 20 7d 20 7b 0a 20  e { g name } {. 
4210: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
4220: 73 20 67 72 61 70 68 28 24 67 2c 6f 70 74 73 2c  s graph($g,opts,
4230: 70 69 63 74 2c 24 6e 61 6d 65 2c 64 61 74 61 29  pict,$name,data)
4240: 5d 7d 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ]} {.    return 
4250: 5b 6c 69 73 74 20 5b 67 72 61 70 68 3a 3a 67 65  [list [graph::ge
4260: 74 5f 6f 70 74 20 24 67 20 70 69 63 74 2c 24 6e  t_opt $g pict,$n
4270: 61 6d 65 2c 77 69 64 74 68 5d 20 5b 67 72 61 70  ame,width] [grap
4280: 68 3a 3a 67 65 74 5f 6f 70 74 20 24 67 20 70 69  h::get_opt $g pi
4290: 63 74 2c 24 6e 61 6d 65 2c 68 65 69 67 68 74 5d  ct,$name,height]
42a0: 5d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7b  ].  }.  return {
42b0: 7d 0a 7d 0a                                      }.}.