summaryrefslogtreecommitdiff
path: root/dviware/ln03/rmcs/ginotosix.for
blob: a232e5e4e083afb55ff5efb844bafd239f34739c (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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
	 IMPLICIT NONE
C 
C PROGRAM DESCRIPTION: 
C 
C	 Converts a GINO SAVDRA file into a sixel file suitable for importing
C	 into TeX via the /special{SX filename} command
C 
C AUTHORS: 
C 
C	 Sqn Ldr J P Baggott MBE MA CEng MIEE RAF
C 
C CREATION DATE: 	1 Dec 88
C 
C 
C	     C H A N G E   L O G
C 
C	 Date     | Name  | Description
C ----------------+-------+-----------------------------------------------------
C
C
C
	CHARACTER*4096	LINE		!Line buffer
	INTEGER*4	COUNT		!Number of chars in line
	INTEGER*4	START		!Start of outpur line in buffer
	INTEGER*4	ILLEGAL		!Position of illegal sequence in buffer
	INTEGER*4	STATE		!Window state retuned by WINENQ
	INTEGER*4	SEGMENT		!Segment number in saved drawing
	REAL*4		SAVEDWINDOW(4)	!Window bounds of saved drawing
	REAL*4		WIDTH		!Desired width
	REAL*4		HEIGHT		!Desired height
	REAL*4		SCALE		!Desired scale factor
	CHARACTER*255	INPUT		!Name of input file
	CHARACTER*255	OUTPUT		!Name of output file
	LOGICAL		FORMFEED	!Do we want a formfeed at the end of the
					!file?

	COMMON/GINOTOSIX/INPUT,OUTPUT,WIDTH,HEIGHT,SCALE,SEGMENT,FORMFEED

C	Get the parameters from the command line
	 
	CALL CLI

	CALL GINO
	
C	First use the dummy driver to find the window size of the saved drawing

	CALL DUMMY

	OPEN (UNIT=3,
	1   FILE = INPUT,
	1   STATUS = 'OLD',
	1   READONLY)

	CALL WINDOW(2)

	CALL GETDRA(3,SEGMENT,3,1)
	CALL WINENQ(STATE,1,4,SAVEDWINDOW)

	CALL DEVEND

C	Now open the LN03 driver and set up the transformations to rotate the
C	picture through 90 degrees and scale it to the user's desired size

	IF (HEIGHT.EQ.0.0) HEIGHT = SAVEDWINDOW(4)-SAVEDWINDOW(3)
	IF (WIDTH.EQ.0.0) WIDTH = SAVEDWINDOW(2)-SAVEDWINDOW(1)
	IF (SCALE.EQ.0.0) THEN
	    SCALE = WIDTH/(SAVEDWINDOW(2)-SAVEDWINDOW(1))
	    SCALE = MIN(SCALE,HEIGHT/(SAVEDWINDOW(4)-SAVEDWINDOW(3)))
	END IF
	
	OPEN (UNIT=1,
	1   FILE = 'GINOTOSIX.TMP',
	1   RECL = 4096,
	1   STATUS  = 'NEW')

	OPEN (UNIT=3,
	1   FILE = INPUT,
	1   STATUS = 'OLD',
	1   READONLY)

	CALL LN03

	CALL LINWID(0.2)
	CALL WINDO2(0.0,HEIGHT,0.0,WIDTH)
	CALL CHASWI(1)
	CALL SCALE2(SCALE,SCALE)
	CALL ROTAT2(90.0)
	CALL SHIFT2(-SAVEDWINDOW(1),-SAVEDWINDOW(4))
	CALL GETPIC(3,SEGMENT)
	CALL DEVEND

	CLOSE(3)

C	Next, open the sixel file produced by GINO, and prepare to filter it to
C	remove <ESC>c (printer reset), split lines longer than 256 bytes, and
C	remove the FORTRAN carriage controls 

	OPEN (UNIT=1,
	1   FILE = 'GINOTOSIX.TMP',
	1   STATUS  = 'OLD',
	1   DISPOSE = 'DELETE')

	OPEN (UNIT=2,
	1   FILE = OUTPUT,
	1   ACCESS	    = 'SEQUENTIAL',
	1   CARRIAGECONTROL = 'NONE',
	1   FORM	    = 'FORMATTED',
	1   RECORDTYPE	    = 'VARIABLE',
	1   RECL	    = 256,
	1   STATUS	    = 'NEW')
	
C	Repeat until end-of-file

	DO WHILE (.TRUE.)
	
	    READ (1,999,END=500) COUNT,LINE(1:COUNT)

C	    Remove all occurences of <ESC>c

	    ILLEGAL = INDEX(LINE(1:COUNT),CHAR(27)//'c')
	
	    DO WHILE (ILLEGAL.GT.0)
		IF (ILLEGAL.EQ.COUNT-1) THEN
		    IF (COUNT.GT.2) LINE(1:COUNT-2) = LINE(1:ILLEGAL-1)
		ELSE
		    LINE(1:COUNT-2) = LINE(1:ILLEGAL-1)//LINE(ILLEGAL+2:COUNT)
		END IF
		COUNT = COUNT-2
		IF (COUNT.GT.2) THEN
		    ILLEGAL = INDEX(CHAR(27)//'c',LINE(1:COUNT))
		ELSE
		    ILLEGAL = 0
		END IF
	    END DO

C	    Split lines longer than 256 bytes

	    START=1

	    DO WHILE (START.LE.COUNT.AND.COUNT.GT.0)
		WRITE(2,998)LINE(START:MIN(START+255,COUNT))
		START = START+256
	    END DO
	
	END DO

500	IF (FORMFEED) WRITE(2,997) '0C'X
	
C	Close the files and exit

	CLOSE(1)
	CLOSE(2)

	CALL GINEND

997	FORMAT(A1)
998	FORMAT(A)
999	FORMAT(X,Q,A)
	END