summaryrefslogtreecommitdiff
path: root/Utilib/src/PSTEXT.f
blob: a780d9831bc2252e648179975ae6820914aa7f7e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
*DECK PSTEXT
      SUBROUTINE PSTEXT(ISPSP,NBCAR,TEXT,XYPOS,HEIGHT,JUST,ANGL)
C
C---------------------------  PSTEXT  ---------------------------------
C
C  1- PROGRAMME STATISTICS:
C      NAME     : PSTEXT
C      USE      : PRINT POSTSCRIPT TEXT
C                 ADAPTED FROM PSPLOT ROUTINE KELSYMC
C
C  2- ROUTINE PARAMETERS:
C    INPUT/OUTPUT
C      ISPSP    : PSP FILE UNIT                          I
C      NBCAR    : NUMBER OF CHARACTER TO PRINT           I
C      TEXT     : TEXT TO PRINT                          C*(*)
C      YXPOS    : POSITION OF TEXT                       R(2)
C      HEIGHT   : TEXT HEIGHT                            R
C      JUST     : JUSTIFICATION                          I
C                 = 0 CENTER
C                 = 1 LEFT
C                 = 2 RIGHT
C      ANGL     : TEXT ROTATION ANGLE                    R
C    LOCAL
C      IBSL     : ASCII REPRESENTATION OF BACKSLASH      I
C
C---------------------------   PSTEXT  --------------------------------
C
      IMPLICIT         NONE
      INTEGER          ISPSP,NBCAR,JUST
      CHARACTER        TEXT*(*)
      REAL             XYPOS(2),HEIGHT,ANGL
C----
C  LOCAL VARIABLES
C----
      INTEGER          IBSL,MXCHAR
      CHARACTER        NAMSBR*6
      REAL             CONVER,SZRAT,PI
      PARAMETER       (IBSL=92,MXCHAR=80,NAMSBR='PSTEXT',
     >                 CONVER=72.0,SZRAT=0.6,PI=3.1415926535897932)
      INTEGER          IHT,ICHAR,NRCHAR,LJUST
      CHARACTER        CBSL*1,CMDSTR*132,LINE*(MXCHAR),
     >                 CADD*16,CBDD*16
      REAL             STRLEN,ANGD,XYROT(2)
C----
C  STROKE PREVIOUS PATHS BEFORE THIS WRITE
C----
      CBSL=CHAR(IBSL)
      CMDSTR='S'
      CALL PSCPUT(ISPSP,CMDSTR)
C----
C  SET CURRENT CHARACTER SIZE
C----
      IHT=INT(HEIGHT*CONVER/SZRAT)
      IF(IHT .NE. 12) THEN
        CMDSTR=' '
        WRITE(CMDSTR,'(I3,1X,A4)') IHT,'Setf'
        CALL PSCPUT(ISPSP,CMDSTR)
      ENDIF
C----
C  CHECK IF TEXT CONTAINS ( OR ) OR "Backslash".
C  THESE CHARACTERS ARE TREATED BY PRECEDING THEM WITH A "Backslash".
c  DO THIS TO ( AND ) EVEN THOU
C  THEY MIGHT BE BALANCED, I.E. () WITHIN A STRING, WHICH CAN BE TREATED
C  NORMALLY.
C----
      NRCHAR=1
      LINE='('
      DO 100 ICHAR=1,NBCAR
        IF(TEXT(ICHAR:ICHAR).EQ.'(' .OR.
     >     TEXT(ICHAR:ICHAR).EQ.')' .OR.
     >     TEXT(ICHAR:ICHAR).EQ.CBSL ) THEN
          IF(NRCHAR .EQ. MXCHAR-6) THEN
            GO TO 105
          ENDIF
          NRCHAR=NRCHAR+1
          LINE(NRCHAR:NRCHAR)=CBSL
        ENDIF
        IF(NRCHAR .EQ. MXCHAR-6) THEN
          GO TO 105
        ENDIF
        NRCHAR=NRCHAR+1
        LINE(NRCHAR:NRCHAR)=TEXT(ICHAR:ICHAR)
 100  CONTINUE
 105  CONTINUE
      NRCHAR=NRCHAR+1
      LINE(NRCHAR:NRCHAR+5)=') Lend'
C----
C  CHARACTER SPACE HEIGHT IS 2.0 X CHAR HEIGHT
C  CHARACTER SPACE WIDTH IS 1.5 X CHAR WIDTH
C  ACTUAL TEXT LENGTH IS NRCHAR-2
C  ACTUAL STRING LENGTH IS (NRCHAR-3)*1.5*CHAR WIDTH + CHAR WIDTH
C  OR CHAR WIDHT*(1.5*NRCHAR-4.5+1)=CHAR WIDHT*(1.5*NRCHAR-3.5)
C----
      STRLEN=(HEIGHT*SZRAT)*(1.5*NRCHAR-3.5)
      ANGD=ANGL*PI/180.0
      CMDSTR=' '
      WRITE(CMDSTR,'(F8.2,1X,A5)') XYPOS(1)*CONVER,'Xposd'
      CALL PSCPUT(ISPSP,CMDSTR)
      CMDSTR=' '
      WRITE(CMDSTR,'(F8.2,1X,A5)') XYPOS(2)*CONVER,'Yposd'
      CALL PSCPUT(ISPSP,CMDSTR)
C----
C  CHECH FOR VALID JUSTIFICATION.
C  IF NOT VALID SET TO CENTERED
C----
      LJUST=JUST
      IF(LJUST .LT. 0 .AND. LJUST .GT. 2) THEN
        LJUST=0
      ENDIF
      XYROT(1)=COS(ANGD)*LJUST/2.
      XYROT(2)=SIN(ANGD)*LJUST/2.
      CADD=' '
      CBDD=' '
      IF(XYROT(1) .NE. 0.0 ) THEN
        WRITE(CADD,'(1X,F7.3,1X,A6)') XYROT(1),'Xposjd'
      ENDIF
      IF(XYROT(2) .NE. 0.0 ) THEN
        WRITE(CBDD,'(1X,F7.3,1X,A6)') XYROT(2),'Yposjd'
      ENDIF
      CMDSTR=LINE(1:NRCHAR+5)//CADD//CBDD
      CALL PSCPUT(ISPSP,CMDSTR)
      LINE(NRCHAR:NRCHAR+5)=') show'
      CADD=' '
      CBDD=' '
      IF(ANGL.NE.0.) THEN
        WRITE(CADD,'(1X,F7.1,1X,A7)') ANGL,'rotate '
        WRITE(CBDD,'(1X,F7.1,1X,A7)') -ANGL,'rotate '
      ENDIF
      CMDSTR='xydef mover'//CADD//LINE(1:NRCHAR+5)//CBDD
      CALL PSCPUT(ISPSP,CMDSTR)
      CMDSTR=' '
      WRITE(CMDSTR,'(F6.1,1X,A7)') ANGL,'Xyprset'
      CALL PSCPUT(ISPSP,CMDSTR)
      RETURN
      END