aboutsummaryrefslogtreecommitdiff
path: root/sys/gio/ncarutil/autograph/aglbls.f
blob: d99b038da53c83ad2181f2eee23264056654837b (plain) (blame)
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
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
C
C                                                                               
C +-----------------------------------------------------------------+           
C |                                                                 |           
C |                Copyright (C) 1986 by UCAR                       |           
C |        University Corporation for Atmospheric Research          |           
C |                    All Rights Reserved                          |           
C |                                                                 |           
C |                 NCARGRAPHICS  Version 1.00                      |           
C |                                                                 |           
C +-----------------------------------------------------------------+           
C                                                                               
C                                                                               
C ---------------------------------------------------------------------
C
      SUBROUTINE AGLBLS (ITST,WCWP,HCWP,FLLB,LBIM,FLLN,DBOX,SBOX,RBOX)
C
      DIMENSION FLLB(10,8),FLLN(6,16),DBOX(6,4),SBOX(6,4),RBOX(6)
C
C The routine AGLBLS is used (if ITST .LE. 0) to predict the amount of
C space which will be required for graph labels (excluding the numeric
C labels on the axes, which are handled by AGAXIS) or (if ITST .GT. 0)
C to actually draw the graph labels.
C
C The labels in question are defined by the label list (FLLB array) and
C the line list (FLLN array).  Each label is assumed to lie in one of
C five boxes, as follows:
C
C    Box 1 is to the left of the curve window.
C    Box 2 is to the right of the curve window.
C    Box 3 is below the curve window.
C    Box 4 is above the curve window.
C    Box 5 is the curve window itself.
C    Box 6 is the entire plot (graph) window.
C
C A test run of AGLBLS returns two sets of box dimensions to the caller.
C DBOX contains the dimensions required if all labels are to have their
C desired sizes, SBOX the dimensions required if all labels are to have
C their smallest sizes.  The caller is expected to use this information
C to determine a final set of box dimensions (stored in DBOX), and then
C call AGLBLS again to actually draw the labels in those boxes.
C
C The arguments of AGLBLS are as follows:
C
C -- ITST specifies whether the call is a test call (ITST .LE. 0) or a
C    real call (ITST .GT. 0).  If ABSV(ITST) .GT. 1, AGLBLS is allowed
C    to shrink the labels if they would not otherwise fit in their box.
C    If ABSV(ITST) .EQ. 1, shrinkage of labels is prohibited.  If ITST
C    .EQ. 0, labels are suppressed.
C
C -- WCWP and HCWP are the width and height of the curve window, in
C    plotter-coordinate-system units.  AGLBLS assumes that the last call
C    to the plot package routine "SET" had arguments XLCW, XRCW, YBCW,
C    YTCW, 0., 1., 0., 1., and 1 - defining the most convenient system
C    of coordinates for it.
C
C -- FLLB is the array in which the label list is stored.  The array is
C    doubly-dimensioned.  The first subscript specifies one of ten label
C    attributes, the second a particular label.  The attributes are as
C    follows (the name ILLB(M,N) refers to a label attribute which is
C    intrinsically an integer, despite being stored as a real):
C
C    -- ILLB(1,N) specifies the name of label N.  If ILLB(1,N) is zero,
C       no label is defined.  Otherwise, ILLB(1,N) is an identifier
C       returned by AGSTCH when the name of the label (a character
C       string) was stored away.
C
C    -- ILLB(2,N) may be set non-zero to suppress label N.
C
C    -- FLLB(3,N) and FLLB(4,N) are the x and y coordinates of a base-
C       point relative to which label N is positioned, as fractions of
C       the width and height, respectively, of the curve window.  The
C       position of the base-point determines the box in which label N
C       is considered to lie.
C
C    -- FLLB(5,N) and FLLB(6,N) are small offsets (typically about the
C       size of a character width), stated as fractions of the smaller
C       side of the curve window.  They are used to offset the label
C       base-point (after the box number is determined).  Typically,
C       this provides a minimum spacing between the label and one side
C       of the curve window.
C
C    -- ILLB(7,N) is the orientation angle of the label, in degrees
C       counter-clockwise from horizontal.  The base-line for label N
C       is a vector emanating from the base-point at this angle.  The
C       specified angle must be a multiple of 90 degrees.
C
C    -- ILLB(8,N) is the centering option for the label.  It specifies
C       how each line of the label is to be positioned relative to a
C       line perpendicular to the base-line at the base-point.
C
C       -- If ILLB(8,N) .LT. 0, the left edge of each line lies on
C          the perpendicular.
C
C       -- If ILLB(8,N) .EQ. 0, the center of each line lies on the
C          perpendicular.
C
C       -- If ILLB(8,N) .GT. 0, the right edge of each line lies on
C          the perpendicular.
C
C    -- ILLB(9,N) is the number of lines in label N.
C
C    -- ILLB(10,N) is the second subscript (in the line list) of the
C       first line of label N.
C
C -- LBIM is the maximum number of labels the label list will hold.
C
C -- FLLN is the array in which the line list is stored.  The array is
C    doubly-dimensioned.  The first subscript specifies one of six line
C    attributes, the second a particular line.  The attributes are as
C    follows (the name ILLN(M,N) refers to a line attribute which is
C    intrinsically an integer, despite being stored as a real):
C
C    -- ILLN(1,N) is the position number of line N.  The lines of a
C       label are ordered according to their position numbers, the one
C       having the largest position number being top-most.  Moreover,
C       lines having position numbers .GT. 0 are placed above the label
C       base-line, those having position numbers .EQ. 0 (of which there
C       should be but one) are placed on the label base-line, and those
C       having position numbers .LT. 0 are placed below the label base-
C       line.  The magnitudes of the position numbers have nothing to
C       do with inter-line spacing - that is up to AGLBLS to determine.
C
C    -- ILLN(2,N) may be set non-zero to suppress line N.
C
C    -- FLLN(3,N) is the desired width of characters in the line, as a
C       fraction of the smaller side of the curve window.
C
C    -- ILLN(4,N) is the identifier of the character string comprising
C       the text of the line, as returned by AGSTCH at the time the
C       string was stored.
C
C    -- ILLN(5,N) is the number of characters in the line.
C
C    -- ILLN(6,N) is the index of the next line of the label.  The
C       lines of a label must be ordered by position number (largest
C       to smallest).
C
C -- DBOX and SBOX, dimensioned 6 X 4, contain box dimensions, as dis-
C    cussed above.  D/SBOX(M,N) is the Nth edge-coordinate of box M,
C    where N .EQ. 1 for the left edge, 2 for the right edge, 3 for the
C    bottom edge, and 4 for the top edge, of the box.  The first two are
C    stated as fractions of the width, the second two as fractions of
C    the height, of the curve window.
C
C    RBOX, dimensioned 6, holds reduction factors for the sizes of the
C    characters in labels in each of the six boxes.  Each RBOX(M) is
C
C    -- negative to specify smallest-size characters, or
C
C    -- zero to specify that no reduction factor has been chosen, or
C
C    -- positive, between 0. and 1. (an actual reduction factor).
C
C *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
C
C The following common block contains other AUTOGRAPH variables, both
C real and integer, which are not control parameters.  The only one of
C interest here is MWCL, which is the minimum usable character width,
C in plotter units.
C
      COMMON /AGORIP/ SMRL , ISLD , MWCL,MWCM,MWCE,MDLA,MWCD,MWDQ ,
     +                INIF
C
C The following common block contains other AUTOGRAPH variables, of type
C character.
C
      COMMON /AGOCHP/ CHS1,CHS2
C
c+noao
c     CHARACTER*504 CHS1,CHS2
      CHARACTER*500 CHS1,CHS2
c-noao
C
C HCFW(WDTH) specifies the height of a character as a function of width.
C
      HCFW(WDTH)=2.*WDTH
C
C *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
C
C This is the main section of AGLBLS.
C
C Compute the length of the smallest side of the curve window.
C
      SCWP=AMIN1(WCWP,HCWP)
C
C Preset certain jumps in the internal procedure which follows.
C
      ASSIGN 211 TO JMP1
      ASSIGN 216 TO JMP2
      ASSIGN 221 TO JMP3
C
C Jump if this is a test run.
C
      IF (ITST.LE.0) GO TO 101
C
C This is not a test run.  If the reduction factors for the six boxes
C are already set, jump directly to the plotting section; otherwise, we
C must first compute the coordinates of the six smallest-size boxes.
C
      IF (RBOX(1).NE.0.) GO TO 115
      GO TO 105
C
C This is a test run.  Compute the coordinates of the edges of the six
C desired-size boxes.
C
  101 RWCL=1.
      NBOX=0
      ASSIGN 102 TO JMP4
      GO TO 200
C
  102 DBOX(NBOX,1)=XLBX
      DBOX(NBOX,2)=XRBX
      DBOX(NBOX,3)=YBBX
      DBOX(NBOX,4)=YTBX
C
      IF (NBOX.LT.6) GO TO 200
C
C This is a test run.  Compute the coordinates of the edges of the six
C smallest-size boxes, in one of two ways.
C
      IF (IABS(ITST).GT.1) GO TO 105
C
C This is a test run.  Determine smallest-size boxes (no shrinking).
C
      DO 104 J=1,4
        DO 103 I=1,6
          SBOX(I,J)=DBOX(I,J)
  103   CONTINUE
  104 CONTINUE
      RETURN
C
C Determine smallest-size boxes (shrinking allowed).
C
  105 RWCL=0.
      NBOX=0
      ASSIGN 106 TO JMP4
      GO TO 200
C
  106 SBOX(NBOX,1)=XLBX
      SBOX(NBOX,2)=XRBX
      SBOX(NBOX,3)=YBBX
      SBOX(NBOX,4)=YTBX
C
      IF (NBOX.LT.6) GO TO 200
C
C If this is not a test run, jump to compute reduction factors for each
C of the six boxes and then plot the labels.  Otherwise, return.
C
      IF (ITST.GT.0) GO TO 107
      RETURN
C
C This is not a test run.  Compute reduction factors for each of the
C six boxes.
C
  107 NBOX=1
      ASSIGN 110 TO JMP4
C
C (DBOX(NBOX,I),I=1,4) specifies the box in which the labels are to be
C drawn, (SBOX(NBOX,I),I=1,4) the minimum box in which they can be drawn
C if shrunk.  Check first whether the latter is contained in the former.
C If so, we have a chance.  If not, the best we can do is shrink the
C labels to minimum size and hope for the best.
C
  108 IF (SBOX(NBOX,1).LT.SBOX(NBOX,2).AND.
     +    DBOX(NBOX,1)-SBOX(NBOX,1).LT..0001.AND.
     +    SBOX(NBOX,2)-DBOX(NBOX,2).LT..0001.AND.
     +    DBOX(NBOX,3)-SBOX(NBOX,3).LT..0001.AND.
     +    SBOX(NBOX,4)-DBOX(NBOX,4).LT..0001      ) GO TO 109
C
      RBOX(NBOX)=-1.
      GO TO 114
C
C Mimimum-size labels will fit.  Find the largest value of RBOX(NBOX)
C for which the labels will fit.
C
  109 RWCL=1.
      DWCL=.5
      SWCL=0.
      GO TO 201
C
C See if the last value of RBOX(NBOX) gave us labels which would fit or
C not and adjust the value accordingly.
C
  110 IF (DBOX(NBOX,1)-XLBX.LT..0001.AND.
     +    XRBX-DBOX(NBOX,2).LT..0001.AND.
     +    DBOX(NBOX,3)-YBBX.LT..0001.AND.
     +    YTBX-DBOX(NBOX,4).LT..0001      ) GO TO 111
C
C Labels did not fit.  Adjust RBOX(NBOX) downward.
C
      RWCL=RWCL-DWCL
      DWCL=.5*DWCL
      IF (DWCL.LT..001) RWCL=SWCL
      GO TO 201
C
C Labels did fit.  Adjust RBOX(NBOX) upward, unless it is equal to 1.
C
  111 IF (RWCL.EQ.1.) GO TO 113
      SWCL=RWCL
      RWCL=RWCL+DWCL
      DWCL=.5*DWCL
      IF (DWCL.GT..001) GO TO 201
C
C The current value of RBOX(NBOX) is acceptable.  Do next box, if any.
C
  113 IF (NBOX.GE.5) GO TO 114
C
C Return updated box-edge coordinates for boxes 1 through 4.
C
      DBOX(NBOX,1)=XLBX
      DBOX(NBOX,2)=XRBX
      DBOX(NBOX,3)=YBBX
      DBOX(NBOX,4)=YTBX
C
  114 NBOX=NBOX+1
      IF (NBOX.LE.6) GO TO 108
C
C We have done all we can to make the labels fit.  Plot them now.
C
  115 NBOX=0
      LBIN=0
      ASSIGN 117 TO JMP3
      ASSIGN 120 TO JMP4
C
C Get a label to chew on.
C
  116 ASSIGN 211 TO JMP1
      ASSIGN 216 TO JMP2
      GO TO 202
C
C We have a label.  Initialize the re-loop through the lines in it.
C
  117 XPLN=XPLB-DTLB*YDLB/WCWP
      YPLN=YPLB+DTLB*XDLB/HCWP
      PHCL=0.
      LNIN=LNII
      ASSIGN 118 TO JMP1
      ASSIGN 116 TO JMP2
      GO TO 210
C
C Get ready to plot the label line.
C
  118 XPLN=XPLN+.5*(PHCL+FHCL)*YDLB/WCWP
      YPLN=YPLN-.5*(PHCL+FHCL)*XDLB/HCWP
      PHCL=FHCL
      CALL AGGTCH (IFIX(FLLN(4,LNIN)),CHS2,LNC2)
C
C Give the user a chance to change the appearance of the label line.
C
      CALL AGCHIL (0,CHS1(1:LNC1),IFIX(FLLN(1,LNIN)))
C
C Plot the label line.
C
      CALL AGPWRT (XPLN,YPLN,CHS2,LNC2,IWCL,LBOR,LBCN)
C
C Give the user a chance to undo the changes he made above.
C
      CALL AGCHIL (1,CHS1(1:LNC1),IFIX(FLLN(1,LNIN)))
C
C Go get the next line, if any.
C
      GO TO 215
C
C All labels are drawn.  Return.
C
  120 RETURN
C
C *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
C
C This internal procedure, which may be entered and exited in a number
C of different ways, is used to scan the label list and the line list
C and to return information about the labels and lines defined there.
C
C Entry occurs here to bump the box number, store away a reduction
C factor for the sizes of labels in that box, and then compute the edge
C coordinates of the box required to hold labels of the size implied by
C that reduction factor.
C
  200 NBOX=NBOX+1
C
C Entry occurs here to do all of the above except the bumping of the box
C number.
C
  201 RBOX(NBOX)=RWCL
C
C Initialize the label-list index and the box-edge parameters.
C
      LBIN=0
      XLBX=+1000.
      XRBX=-1000.
      YBBX=+1000.
      YTBX=-1000.
      IF (ITST.EQ.0) GO TO 222
C
C This is the beginning of the loop through the labels.  Entry occurs
C here to find the next label in the list and return positioning info.
C
C Increment the label index and test for end of label list.
C
  202 LBIN=LBIN+1
      IF (LBIN.GT.LBIM) GO TO 222
C
C Skip this label if it is non-existent, suppressed, or empty.
C
      IF (FLLB(1,LBIN).EQ.0..OR.FLLB(2,LBIN).NE.0.
     +                      .OR.FLLB(9,LBIN).EQ.0.) GO TO 202
C
C Unpack the parameters specifying the label-base-point position.
C
      XBLB=FLLB(3,LBIN)
      YBLB=FLLB(4,LBIN)
      XOLB=FLLB(5,LBIN)
      YOLB=FLLB(6,LBIN)
C
C Determine in which of five boxes the label lies:
C
C in the box to the left of the curve window.
C
      LBBX=1
      IF (XBLB.EQ.0..AND.XOLB.LE.0.) GO TO 203
C
C in the box to the right of the curve window,
C
      LBBX=2
      IF (XBLB.EQ.1..AND.XOLB.GE.0.) GO TO 203
C
C in the box below the curve window,
C
      LBBX=3
      IF (YBLB.EQ.0..AND.YOLB.LE.0.) GO TO 203
C
C in the box above the curve window,
C
      LBBX=4
      IF (YBLB.EQ.1..AND.YOLB.GE.0.) GO TO 203
C
C in the curve window,
C
      LBBX=5
      IF ( (XBLB.EQ.0..AND.XOLB.GT.0.).OR.
     +     (XBLB.EQ.1..AND.XOLB.LT.0.).OR.
     +     (YBLB.EQ.0..AND.YOLB.GT.0.).OR.
     +     (YBLB.EQ.1..AND.YOLB.LT.0.)    ) GO TO 203
C
C or elsewhere.
C
      LBBX=6
C
C If we are interested in a particular box and this label is not in that
C box, skip it.
C
  203 IF (NBOX.NE.0.AND.LBBX.NE.NBOX) GO TO 202
C
C On a non-test run, get the label name and length for call to AGCHIL.
C
      IF (ITST.GT.0) CALL AGGTCH (IFIX(FLLB(1,LBIN)),CHS1,LNC1)
C
C Unpack the label orientation and compute its direction cosines.
C
      LBOR=IFIX(FLLB(7,LBIN))
C
      XDLB=COS(.017453292519943*FLLB(7,LBIN))
      YDLB=SIN(.017453292519943*FLLB(7,LBIN))
C
C Unpack the label-centering option.
C
      LBCN=IFIX(FLLB(8,LBIN))
C
C Unpack the index of the initial line of the label and save it.
C
      LNIN=IFIX(FLLB(10,LBIN))
      LNII=LNIN
C
C If this is not a test run, modify the label-base-point position as
C needed to move the label into the actual box in which it must fit.
C
      IF (ITST.LE.0) GO TO 209
C
      GO TO (204,205,206,207,208,209) , LBBX
C
  204 XBLB=XBLB+DBOX(1,2)
      GO TO 209
C
  205 XBLB=XBLB+DBOX(2,1)-1.
      GO TO 209
C
  206 YBLB=YBLB+DBOX(3,4)
      GO TO 209
C
  207 YBLB=YBLB+DBOX(4,3)-1.
      GO TO 209
C
  208 IF (XBLB.EQ.0.) XBLB=XBLB+DBOX(5,1)
      IF (XBLB.EQ.1.) XBLB=XBLB+DBOX(5,2)-1.
      IF (YBLB.EQ.0.) YBLB=YBLB+DBOX(5,3)
      IF (YBLB.EQ.1.) YBLB=YBLB+DBOX(5,4)-1.
C
C Compute the final label-base-point position.
C
  209 XPLB=XBLB+XOLB*SCWP/WCWP
      YPLB=YBLB+YOLB*SCWP/HCWP
C
C Before entering the loop through the line list, initialize the label-
C dimension parameters.
C
      DLLB=0.
      DRLB=0.
      DBLB=0.
      DTLB=0.
C
C This is the beginning of the loop through the lines in a given label.
C Entry may occur here to find the next line and return info about it.
C
C If the line is suppressed or of zero length, skip it.
C
  210 IF (FLLN(2,LNIN).NE.0..OR.FLLN(5,LNIN).LE.0.) GO TO 215
C
C Unpack the position-number, character-width, and character-count
C parameters for the line.
C
      LNPN=IFIX(FLLN(1,LNIN))
      WCLN=FLLN(3,LNIN)
      LNCC=IFIX(FLLN(5,LNIN))
C
C Compute the integer width (IWCL) and the floating-point width and
C height (FWCL and FHCL) of characters in the label.  All are expressed
C in plotter-coordinate-system units.
C
      IWCL=MAX0(MWCL,IFIX(RBOX(LBBX)*WCLN*SCWP+.5))
      FWCL=FLOAT(IWCL)
      FHCL=HCFW(FWCL)
C
C Jump back with line information or drop through, as directed.
C
      GO TO JMP1 , (118,211)
C
C Update the label-dimension parameters.
C
  211 DRLB=AMAX1(DRLB,FLOAT(LNCC)*FWCL)
C
      IF (LNPN) 212,213,214
C
  212 DBLB=DBLB+FHCL
      GO TO 215
C
  213 DBLB=DBLB+.5*FHCL
      DTLB=DTLB+.5*FHCL
      GO TO 215
C
  214 DTLB=DTLB+FHCL
C
C Go to the next line in the label, if there is one.
C
  215 LNIN=IFIX(FLLN(6,LNIN))
      IF (LNIN.NE.0) GO TO 210
C
C Jump back on end of lines or drop through, as directed.
C
      GO TO JMP2 , (116,216)
C
C If all the lines in the label were either suppressed or of zero
C length, skip this label.
C
  216 IF (DRLB.EQ.0.) GO TO 202
C
C Complete the computation of the label dimensions.  The four parameters
C DLLB, DRLB, DBLB, and DTLB represent the distances from the base-point
C to the left edge, right edge, bottom edge, and top edge of the label,
C in plotter-coordinate-system units, where left, right, etc., are as
C viewed by a reader of the label.
C
      IF (LBCN) 217,218,219
C
C Left edges of lines are aligned.
C
  217 GO TO 220
C
C Centers of lines are aligned.
C
  218 DLLB=.5*(DLLB+DRLB)
      DRLB=DLLB
      GO TO 220
C
C Right edges of lines are aligned.
C
  219 SWAP=DLLB
      DLLB=DRLB
      DRLB=SWAP
C
C Jump back with label information or drop through, as directed.
C
  220 GO TO JMP3 , (117,221)
C
C Update the x and y coordinates of the label box edges.
C
  221 XLBX=AMIN1(XLBX,XBLB,
     +     XPLB-AMAX1(+DLLB*XDLB,-DRLB*XDLB,-DBLB*YDLB,+DTLB*YDLB)/WCWP)
      XRBX=AMAX1(XRBX,XBLB,
     +     XPLB+AMAX1(-DLLB*XDLB,+DRLB*XDLB,+DBLB*YDLB,-DTLB*YDLB)/WCWP)
      YBBX=AMIN1(YBBX,YBLB,
     +     YPLB-AMAX1(+DLLB*YDLB,-DRLB*YDLB,+DBLB*XDLB,-DTLB*XDLB)/HCWP)
      YTBX=AMAX1(YTBX,YBLB,
     +     YPLB+AMAX1(-DLLB*YDLB,+DRLB*YDLB,-DBLB*XDLB,+DTLB*XDLB)/HCWP)
C
C Go back for the next label.
C
      GO TO 202
C
C End of label list.  Jump as directed.
C
  222 GO TO JMP4 , (102,106,110,120)
C
C *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
C
      END