home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 mARCH / PCWK3A99.iso / Linux / DDD331 / DDD-3_1_.000 / DDD-3_1_ / ddd-3.1.1 / ddd / header.ps < prev    next >
Text File  |  1998-10-05  |  8KB  |  364 lines

  1. % $Id: header.ps,v 1.11 1998/10/05 12:21:09 zeller Exp $
  2. % Header for DDD PostScript Box output
  3.  
  4. % Copyright (C) 1995-1998 Technische Universitaet Braunschweig, Germany.
  5. % Written by Christian Lindig <lindig@ips.cs.tu-bs.de>.
  6. % This file is part of DDD.
  7. % DDD is free software; you can redistribute it and/or
  8. % modify it under the terms of the GNU General Public
  9. % License as published by the Free Software Foundation; either
  10. % version 2 of the License, or (at your option) any later version.
  11. % DDD is distributed in the hope that it will be useful,
  12. % but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  14. % See the GNU General Public License for more details.
  15. % You should have received a copy of the GNU General Public
  16. % License along with DDD -- see the file COPYING.
  17. % If not, write to the Free Software Foundation, Inc.,
  18. % 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  19. % DDD is the data display debugger.
  20. % For details, see the DDD World-Wide-Web page, 
  21. % `http://www.cs.tu-bs.de/softech/ddd/',
  22. % or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
  23.  
  24. % Make all definitions local to the ddddict dictionary
  25. /ddddict 25 dict def 
  26.  
  27. ddddict begin        % make dict active 
  28.  
  29.  
  30. % Global variables
  31. /fontSize+ 12 def
  32. /font+ /Courier def  
  33.  
  34.  
  35. % Some small utilities
  36. /cm { 28.34646 mul } bind def
  37.  
  38.  
  39. % ISOLATIN1* - reencode a font to ISO Latin 1 encoding
  40. %
  41. % newfont table oldfont isolatin1*
  42.  
  43. /isolatin1* {
  44.     findfont
  45.     dup maxlength dict begin
  46.     {
  47.         1 index /FID ne { def } { pop pop } ifelse
  48.     } forall
  49.     /Encoding exch def
  50.     dup /FontName exch def
  51.     currentdict end definefont pop
  52. } bind def
  53.  
  54.  
  55. % Define the ISO Latin 1 encoding of a font
  56.  
  57. /isotable[
  58. /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
  59. /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
  60. /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
  61. /.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl/numbersign
  62. /dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma
  63. /hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon
  64. /semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S
  65. /T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore
  66. /quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar
  67. /braceright/asciitilde/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
  68. /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
  69. /.notdef/dotlessi/grave/acute/circumflex/tilde/macron/breve/dotaccent/dieresis
  70. /.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron/.notdef/exclamdown/cent
  71. /sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine
  72. /guilsinglleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior
  73. /threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior
  74. /ordmasculine/guilsinglright/onequarter/onehalf/threequarters/questiondown
  75. /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute
  76. /Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve
  77. /Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex
  78. /Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis
  79. /aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute
  80. /icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis
  81. /divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis
  82. ] def
  83.  
  84.  
  85. % YCORRECT*
  86. % The reference point of a string ist NOT its lower left corner but 
  87. % its baseline.  Therefore, the y coordinate must be corrected.  
  88. % Returns the correction for the current font.
  89. %
  90. % ycorrect* y
  91.  
  92. /ycorrect* {
  93.     currentfont /FontBBox get
  94.     aload pop pop pop
  95.     currentfont /FontMatrix get dtransform
  96.     exch pop
  97. } def 
  98.  
  99.  
  100. % TEXT*
  101. % print out a string and make sure not to require more space than
  102. % specified.
  103. % font xsize ysize xorigin yorigin (string) text*
  104.  
  105. /text* {
  106.  
  107.     /string+ exch def        % set up some variables ..
  108.     moveto                % move to (xorigin,yorigin)
  109.     /ysize+ exch def
  110.     /xsize+ exch def
  111.     /thefont+ exch def
  112.  
  113.     % is the right font already selected ?
  114.  
  115.     thefont+ font+ ne 
  116.     ysize+ fontSize+ ne
  117.     or {    
  118.         % set up the right font - reencode it    
  119.         
  120.         /Symbol thefont+ eq 
  121.         {
  122.             thefont+ findfont
  123.         }{
  124.  
  125.             /isofont+ isotable thefont+ isolatin1*    
  126.             /isofont+ findfont
  127.         }ifelse
  128.  
  129.         [ysize+ 0 0 ysize+ neg 0 0] makefont
  130.         setfont
  131.         
  132.         /font+ thefont+ def
  133.         /fontSize+ ysize+ def
  134.     } if
  135.  
  136.     % correct current point 
  137.  
  138.     0 ycorrect* neg rmoveto
  139.  
  140.     % string too long?  Scale it down ...
  141.     % The actual font is scaled. There is a good chance,
  142.     % that this will not happen too often when the font is not
  143.     % changed during the calls of text*
  144.  
  145.     xsize+ string+ stringwidth pop div dup dup
  146.     1 lt {
  147.         0 0 1 0 0 6 array astore currentfont exch 
  148.         makefont setfont
  149.         pop
  150.     }{ 
  151.         % string is too short ... scale it up
  152.  
  153.         1.05 gt {
  154.             0 0 1 0 0 6 array astore currentfont exch 
  155.             makefont setfont    
  156.         }{
  157.             pop
  158.  
  159.         } ifelse
  160.     } ifelse
  161.     
  162.     string+ show
  163.  
  164. } bind def
  165.  
  166.     
  167. % ARROWLINE*
  168. % Draw a line of given width with an arrow at its end
  169. % len gives the height of the triangle forming the head of the arrow
  170. % and angle the angle at its top
  171. %    
  172. % angle len  x1 y1 x2 y2 linewidth arrowline*
  173.  
  174. /arrowline* {
  175.     setlinewidth            % angle len x1 y1 x2 y2
  176.     /y2 exch def
  177.     /x2 exch def
  178.     /y1 exch def
  179.     /x1 exch def
  180.     /len+ exch def            % height of triangle
  181.  
  182.     /alpha+ 
  183.         y2 y1 sub        % define alpha+
  184.         x2 x1 sub
  185.         atan
  186.     def
  187.  
  188.     /base+                % define half of baseline
  189.         exch 
  190.         2 div dup        % angle angle
  191.         sin exch cos          % sin(angle) cos(angle)
  192.         div            % tan(angle)
  193.         len+
  194.         mul            % half of baseline
  195.     def  
  196.     
  197.     newpath                % draw the line
  198.     x1 y1 moveto 
  199.     x2 len+ alpha+ cos mul sub     % shorten the line to the end  
  200.     y2 len+ alpha+ sin mul sub     % of the triangle
  201.     lineto
  202.     stroke        
  203.  
  204.     gsave                % set the origin to the head of
  205.     0 setlinewidth            % the arrow and rotate the system
  206.     x2 y2 
  207.     translate            % origin now at x2 y2
  208.  
  209.     alpha+ 90 sub rotate         % rotate the system
  210.  
  211.     newpath                % draw a triangle
  212.     0 0 moveto
  213.     base+ len+ neg rlineto
  214.     base+ 2 mul neg 0 rlineto
  215.     closepath
  216.     fill
  217.     
  218.     grestore
  219. } bind def
  220.  
  221. % ARROWHEAD*
  222. % draw an arrow head inclined by alpha at (x,y)
  223. %
  224. % angle len alpha x y
  225.  
  226. /arrowhead* {
  227.     /y exch def
  228.     /x exch def
  229.     /alpha+ exch def
  230.     /len+ exch def            % height of triangle
  231.  
  232.     /base+                % define half of baseline
  233.         exch 
  234.         2 div dup        % angle angle
  235.         sin exch cos          % sin(angle) cos(angle)
  236.         div            % tan(angle)
  237.         len+
  238.         mul            % half of baseline
  239.     def
  240.  
  241.     gsave                % set the origin to the head of
  242.     0 setlinewidth            % the arrow and rotate the system
  243.     x y 
  244.     translate            % origin now at x y
  245.  
  246.     alpha+ 90 sub rotate         % rotate the system
  247.  
  248.     newpath                % draw a triangle
  249.     0 0 moveto
  250.     base+ len+ neg rlineto
  251.     base+ 2 mul neg 0 rlineto
  252.     closepath
  253.     fill
  254.     
  255.     grestore
  256. } bind def
  257.  
  258.  
  259. % LINE*
  260. % draw a line of given width from (x1,y1) to (x2,y2)
  261. %
  262. % x1 y1 x2 y2 width line*
  263.  
  264. /line* {
  265.     setlinewidth    % x1 y1 x2 y2
  266.     newpath
  267.     4 2 roll     % x2 y2 x1 y1
  268.     moveto        % x2 y2
  269.     lineto        
  270.     stroke
  271. } bind def
  272.  
  273.  
  274. % CLEAN*
  275. %
  276. % fill a box given by four points with white colour ..
  277. % x1 y1 x2 y2 x3 y3 x4 y4 clean*
  278.  
  279. /clean* {
  280.     gsave
  281.     1 setgray
  282.     0 setlinewidth
  283.     newpath
  284.     moveto  lineto  lineto lineto
  285.     closepath
  286.     fill
  287.     grestore
  288. } bind def
  289.  
  290.  
  291. % BOX*
  292. % fill a box given by four points
  293. %
  294. % x1 y1 x2 y2 x3 y3 x4 y4 box*
  295.  
  296. /box* {
  297.     0 setlinewidth
  298.     newpath
  299.     moveto     lineto     lineto lineto
  300.     closepath
  301.     fill
  302. } bind def
  303.  
  304.  
  305. % ARC*
  306. % draw an ellipse with center (cx,cy), radius dx dy, starting at start
  307. % and ending at end.
  308. %
  309. % start end dx dy cx cy width arc*
  310.  
  311. /arc* {
  312.     gsave
  313.     setlinewidth
  314.     translate
  315.     newpath
  316.     dup 3 1 roll        % start end dy dx dy
  317.     div 1 scale        % dy dx/dy 1 scale => start end dy
  318.     
  319.     0 exch  0 exch        % start end 0 0 dy 
  320.     5 -2 roll         % 0 0 dy start end
  321.  
  322.     dup
  323.     0 eq {            % replace 0 by 360
  324.         pop 
  325.         360
  326.     } if
  327.     arc
  328.     stroke
  329.     grestore
  330. } bind def
  331.  
  332.  
  333. % BEGINCOLOR* / ENDCOLOR*
  334. % Draw something using a specific foreground color
  335. %
  336. % red green blue begincolor* SOMETHING endcolor*
  337.  
  338. /begincolor* {
  339.         currentrgbcolor         % red green blue red' green' blue'
  340.         6 3 roll                % red' green' blue' red green blue
  341.     setrgbcolor             % red' green' blue'
  342. } bind def
  343.  
  344. /endcolor* {
  345.     setrgbcolor
  346. } bind def
  347.  
  348.  
  349. % Set up the right font to the right size
  350.  
  351. /isofont+ isotable font+ isolatin1*     % reencode font+
  352.                     % and make it the current font
  353. /isofont+ findfont
  354. [fontSize+ 0 0 fontSize+ neg 0 0] makefont
  355. setfont
  356.  
  357.  
  358. %%EndProlog
  359.