File: r3dtogd.f

package info (click to toggle)
raster3d 3.0-2-4
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 4,988 kB
  • sloc: fortran: 10,785; ansic: 1,057; makefile: 317; sh: 252; csh: 15
file content (222 lines) | stat: -rw-r--r-- 6,645 bytes parent folder | download | duplicates (5)
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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
*******************************************************************************
*               Support routines for libgd labels                             *
*******************************************************************************
*     Version 3.0
*
* PCC Apr 2010	- Initial version (some code came from r3dtops.f)
* PCC May 2010	- Allow for LABELSTRING to have null pointers
* EAM Dec 2010	- Fix antialiasing scales
*******************************************************************************
*
* These routines are called from render.f to handle object types 10, 11 and 12.
* The parsed information will be passed onto the mylabel_() function in local.c
*
* The "libgd file" describes a canvas with the same dimension in pixels as
* the image created by render. The libgd canvas can be composited on top
* of the rendered image to produce a labeled figure.
*
*	Object types 10 and 11 are used for specifying labels.
*	Label object types are
*	  - type 10: Font_Name size alignment
*	  - type 11: XYZ RGB on first line
*		     label (ascii characters enclosed in quotes) on second line
*	Object type 12 is reserved to go with this, as I have a nagging
*	suspicion more information may turn out to be necessary.
*
*******************************************************************************
      SUBROUTINE LOPEN( FILENAME )
      CHARACTER*132 FILENAME
      RETURN
      END

      SUBROUTINE LCLOSE( )
      RETURN
      END

      SUBROUTINE LSETUP( PSCALE, BKGND, TITLE )
      REAL     PSCALE
      REAL     BKGND(3)
      CHARACTER*80 TITLE
      COMMON /OPTIONS/ FONTSCALE, GAMMA, ZOOM, NSCHEME, SHADOWFLAG, XBG,
     &                 NAX, NAY, OTMODE, QUALITY, INVERT, LFLAG
      REAL             FONTSCALE, GAMMA, ZOOM
      INTEGER          NSCHEME, SHADOWFLAG, XBG
      INTEGER*4        NAX, NAY, OTMODE, QUALITY
      LOGICAL*2        INVERT, LFLAG
C     Might as well always handle labels?
C	LFLAG = .TRUE.
      RETURN
      END
*******************************************************************************

      SUBROUTINE LINP( INPUT, INTYPE, MATCOL, RGBMAT )
      IMPLICIT NONE

      INTEGER  I, J, LEN
      INTEGER  INPUT, INTYPE
      LOGICAL  MATCOL
      REAL     RGBMAT(3)
      REAL     AASCALE
*
*     Input transformation
      COMMON /MATRICES/ XCENT, YCENT, SCALE, EYEPOS, SXCENT, SYCENT,
     &                  TMAT, TINV, TINVT, SROT, SRTINV, SRTINVT
     &                 ,RAFTER, TAFTER
      REAL   XCENT, YCENT, SCALE, SXCENT, SYCENT
*     Transformation matrix, inverse of transpose, and transposed inverse
      REAL   TMAT(4,4), TINV(4,4), TINVT(4,4)
*     Shortest rotation from light source to +z axis
      REAL   SROT(4,4), SRTINV(4,4), SRTINVT(4,4)
*     Post-hoc transformation on top of original TMAT
      REAL   RAFTER(4,4), TAFTER(3)
      EXTERNAL DET
      REAL     DET
*     Distance (in +z) of viewing eye
      REAL   EYEPOS
*
      EXTERNAL PERSP
      REAL     PERSP, PFAC
*
*     Stuff for labels
      CHARACTER*80  FONTNAME, FONTALIGN
      CHARACTER*128 LABELSTRING
      SAVE          FONTNAME
      SAVE          LABELSTRING
      INTEGER       MAXLABLEN
      PARAMETER    (MAXLABLEN = 128)
      INTEGER      IALIGN
      SAVE         IALIGN
      INTEGER      FONT, LABEL
      PARAMETER   (FONT = 10, LABEL = 11)
      REAL         XA, YA, ZA, RED, GRN, BLU
      REAL         FONTSIZE
      SAVE         FONTSIZE
*
*     Keep track of actual coordinate limits
      COMMON /NICETIES/ TRULIM, ZLIM, FRONTCLIP, BACKCLIP, ISOLATION
      REAL              TRULIM(3,2), ZLIM(2), FRONTCLIP, BACKCLIP
      INTEGER           ISOLATION
*
*     Command line options (Aug 1999) NB: nax,nay,quality MUST be integer*2
      COMMON /OPTIONS/ FONTSCALE, GAMMA, ZOOM, NSCHEME, SHADOWFLAG, XBG,
     &                 NAX, NAY, OTMODE, QUALITY, INVERT, LFLAG
      REAL             FONTSCALE, GAMMA, ZOOM
      INTEGER          NSCHEME, SHADOWFLAG, XBG
      INTEGER*4        NAX, NAY, OTMODE, QUALITY
      LOGICAL*2        INVERT, LFLAG
*
*     Copy of NOISE for ASSERT to see
      COMMON /ASSCOM/ NOISE, VERBOSE
      INTEGER NOISE
      LOGICAL VERBOSE

c*****DEFAULTS:
c FONTSCALE = 1.0
c
c     Read in next object
      IF (INTYPE .EQ. FONT) THEN
	READ (INPUT,*,END=50) FONTNAME, FONTSIZE, FONTALIGN
	IF (FONTALIGN(1:1).EQ.'C') THEN
	    IALIGN=1
	ELSE IF (FONTALIGN(1:1).EQ.'R') THEN
	    IALIGN=2
	ELSE IF (FONTALIGN(1:1).EQ.'O') THEN
	    IALIGN=3
	ELSE
	    IALIGN=0
	ENDIF
c
* TODO: The following can probably be removed
c	len = 0
c	DO i=1,80
c	    if (fontname(i:i).ne.' ') len = i
c	enddo

      ELSE IF (INTYPE .EQ. LABEL ) THEN
	READ (INPUT,*,END=50) XA, YA, ZA, RED, GRN, BLU
	IF (MATCOL) THEN
	    RED = RGBMAT(1)
	    GRN = RGBMAT(2)
	    BLU = RGBMAT(3)
	ENDIF
c
c       Here is where Perl would shine
c
	READ (INPUT,'(A)',END=50) LABELSTRING
	len = len_trim(LABELSTRING)
c
c Isolated objects not transformed by TMAT, but still subject to inversion.
        IF (ISOLATION.GT.0) THEN
          IF (INVERT) YA = -YA
	  if (isolation.eq.2) then
	    if (xcent.gt.ycent) xa = xa * xcent / ycent
	    if (xcent.lt.ycent) ya = ya * ycent / xcent
	  endif
        ELSE
c modify the input, as it were
	  IF (IALIGN.NE.3) THEN
	    CALL TRANSF (XA,YA,ZA, TMAT)
c           YA = -YA
	  ENDIF
        ENDIF
c perspective
        IF (EYEPOS.GT.0) THEN
	    PFAC = PERSP(ZA)
	ELSE
	    PFAC = 1.0
	ENDIF
c
	AASCALE = 1.0
	IF (NSCHEME.EQ.2) AASCALE = 0.5
	IF (NSCHEME.EQ.3) AASCALE = 2./3.
	IF (NSCHEME.EQ.4) AASCALE = 2./3.

	IF (IALIGN.EQ.3) THEN
	    XA = XA * SCALE
	    YA = YA * SCALE
	ELSE IF (ISOLATION.GT.0) THEN
	    XA = XA * SCALE + XCENT
	    YA = YA * SCALE + YCENT
	ELSE
c scale and translate to pixel space
	    XA = XA * PFAC * SCALE + XCENT
	    YA = YA * PFAC * SCALE + YCENT
	    ZA = ZA
	ENDIF

c allow for the antialiasing
	XA = XA * AASCALE
	YA = YA * AASCALE
	ZA = ZA * AASCALE

c
c 	IF (ZA * SCALE .LT. BACKCLIP .OR. ZA * SCALE .GT. FRONTCLIP) RETURN
 
	CALL CHKRGB( RED, GRN, BLU, 'invalid label color')
c	WRITE (0,*) 'COLOR VALUES = ', RED, GRN, BLU
	RED = SQRT(RED)
	GRN = SQRT(GRN)
	BLU = SQRT(BLU)
c
c
C =============================================================================
C Ready to pass on information to libgd via local.c
c
	CALL ADDLABEL(FONTNAME//CHAR(0), FONTSIZE, FONTSCALE, IALIGN,
     &  XA,YA,ZA, RED,GRN,BLU, LABELSTRING//CHAR(0))
c
C =============================================================================
c
c
  800   FORMAT(A,'-x,y,z: ',3F10.3)
  801   FORMAT(A,4F10.1)
      ENDIF
      RETURN

c
c Error handling
c
 50     WRITE (NOISE,*) '>>> Unrecognized label command'
        RETURN

        END