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
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <imhdr.h>
include <imio.h>
include <mach.h>
include "stf.h"
# STF_MERGEGPB -- Merge the non-reserved parameters from an existing GPB into
# a new GPB; called to construct a new GPB when an image is opened in new-copy
# mode. Since the new copy may not be the same size and dimension as the
# original, the reserved parameters must be set up fresh for the new copy
# image, i.e., we cannot simply copy them from the old image. Likewise, the
# WCS must be transformed if the new copy image does not geometrically overlay
# the original.
#
# NOTE: no longer called by stf_opix; save this code for future use!
# <dlb--11/4/87>
procedure stf_mergegpb (n_im, o_im)
pointer n_im # new copy image
pointer o_im # image being copied
bool match
int n_i, o_i, n, ip, axis
int up_psize
pointer sp, cd_pat, n_stf, o_stf, n_pp, o_pp
int strncmp(), strlen(), patmake(), patmatch(), ctoi()
begin
call smark (sp)
call salloc (cd_pat, SZ_LINE, TY_CHAR)
# Make a pattern to match the CDa_b parameter names.
if (patmake ("CD[0-9]_[0-9]", Memc[cd_pat], SZ_LINE) < 0)
; # cannot happen
n_stf = IM_KDES(n_im)
o_stf = IM_KDES(o_im)
# Examine each parameter in the old GPB and make an entry for the new
# ones in the new GPB. Note that all we are doing here is defining
# the structure; the GPB data is not physically written until the new
# header is updated on disk. The FITS encoded values for the GPB
# parameters will already have been copied to the user area of the
# new image.
up_psize = 0
for (o_i=1; o_i <= STF_PCOUNT(o_stf); o_i=o_i+1) {
o_pp = STF_PDES(o_stf,o_i)
n = strlen (P_PTYPE(o_pp))
if (P_PTYPE(o_pp) == 'C')
if (strncmp (P_PTYPE(o_pp), "CRPIX", 5) == 0 ||
strncmp (P_PTYPE(o_pp), "CRVAL", 5) == 0 ||
strncmp (P_PTYPE(o_pp), "CTYPE", 5) == 0 ||
patmatch (P_PTYPE(o_pp), Memc[cd_pat]) > 0) {
ip = 6
if (ctoi (P_PTYPE(o_pp), ip, axis) <= 0)
axis = IM_MAXDIM + 1
if (axis <= STF_NAXIS(n_stf))
next
}
# Is there a parameter of the same name in the new descriptor?
match = false
for (n_i=1; n_i <= STF_PCOUNT(n_stf); n_i=n_i+1) {
n_pp = STF_PDES(n_stf,n_i)
if (strncmp (P_PTYPE(o_pp), P_PTYPE(n_pp), n) == 0) {
match = true
break
}
}
# If there was no match for the parameter, add a definition for
# it to the GPB descriptor for the new image.
if (!match) {
n = STF_PCOUNT(n_stf) + 1
if (n > MAX_PCOUNT)
call error (4, "stf_merge: too many group parameters")
STF_PCOUNT(n_stf) = n
up_psize = up_psize + P_PSIZE(o_pp)
n_pp = STF_PDES(n_stf,n)
P_SPPTYPE(n_pp) = P_SPPTYPE(o_pp)
P_PSIZE(n_pp) = P_PSIZE(o_pp)
P_LEN(n_pp) = P_LEN(o_pp)
call strcpy (P_PTYPE(o_pp), P_PTYPE(n_pp), SZ_PTYPE)
call strcpy (P_PDTYPE(o_pp), P_PDTYPE(n_pp), SZ_PDTYPE)
}
}
# Moved the PSIZE, SZGROUP calculations here to fix error in the
# computation of PSIZE--dlb, 11/2/87
STF_PSIZE(n_stf) = STF_PSIZE(n_stf) + up_psize
STF_SZGROUP(n_stf) = STF_SZGROUP(n_stf) +
up_psize / (SZB_CHAR * NBITS_BYTE)
call sfree (sp)
end
|