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
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <plset.h>
include <plio.h>
# PL_L2R -- Convert a line list to a range list. The length of the output
# range list is returned as the function value.
int procedure pl_l2rl (ll_src, xs, rl, npix)
short ll_src[ARB] #I input line list
int xs #I starting index in ll_src
long rl[3,ARB] #O output range list
int npix #I number of pixels to convert
int pv, hi
bool skipword
int opcode, data, ll_len, ll_first
int x1, x2, i1, i2, xe, np, rn, ip
define range_ 91
define putrange_ 92
begin
# Support old format line lists.
if (LL_OLDFORMAT(ll_src)) {
ll_len = OLL_LEN(ll_src)
ll_first = OLL_FIRST
} else {
ll_len = LL_LEN(ll_src)
ll_first = LL_FIRST(ll_src)
}
# No pixels?
if (npix <= 0 || ll_len <= 0)
return (0)
rn = RL_FIRST
xe = xs + npix - 1
skipword = false
x1 = 1
hi = 1
do ip = ll_first, ll_len {
if (skipword) {
skipword = false
next
}
opcode = I_OPCODE(ll_src[ip])
data = I_DATA(ll_src[ip])
switch (opcode) {
case I_ZN:
pv = 0
goto range_
case I_HN:
pv = hi
range_
# Determine inbounds region of segment.
x2 = x1 + data - 1
i1 = max (x1, xs)
i2 = min (x2, xe)
np = i2 - i1 + 1
x1 = x2 + 1
case I_PN:
pv = hi
x2 = x1 + data - 1
if (x2 < xs || x2 > xe)
np = 0
else {
i1 = x2
np = 1
}
x1 = x2 + 1
case I_SH:
hi = (int(ll_src[ip+1]) * I_SHIFT) + data
skipword = true
next
case I_IH:
hi = hi + data
next
case I_DH:
hi = hi - data
next
case I_IS, I_DS:
if (opcode == I_IS)
hi = hi + data
else
hi = hi - data
i1 = max (x1, xs)
i2 = min (x1, xe)
np = i2 - i1 + 1
x1 = x1 + 1
pv = hi
}
# Output a range entry?
if (np > 0 && pv > 0) {
rl[1,rn] = i1
rl[2,rn] = np
rl[3,rn] = pv
rn = rn + 1
}
if (x1 > xe)
break
}
RL_LEN(rl) = rn - 1
RL_AXLEN(rl) = npix
return (rn - 1)
end
|