Coverage Report

Created: 2025-06-22 06:59

/src/gdal/frmts/gtiff/libgeotiff/xtiff.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * xtiff.c
3
 *
4
 * Extended TIFF Directory GEO Tag Support.
5
 *
6
 *  You may use this file as a template to add your own
7
 *  extended tags to the library. Only the parts of the code
8
 *  marked with "XXX" require modification.
9
 *
10
 *  Author: Niles D. Ritter
11
 *
12
 *  Revisions:
13
 *    18 Sep 1995   -- Deprecated Integraph Matrix tag with new one.
14
 *                     Backward compatible support provided.  --NDR.
15
 */
16
17
#include "xtiffio.h"
18
#include <stdio.h>
19
#include "cpl_serv.h"
20
21
/*  Tiff info structure.
22
 *
23
 *     Entry format:
24
 *        { TAGNUMBER, ReadCount, WriteCount, DataType, FIELDNUM,
25
 *          OkToChange, PassDirCountOnSet, AsciiName }
26
 *
27
 *     For ReadCount, WriteCount, -1 = unknown.
28
 */
29
30
static const TIFFFieldInfo xtiffFieldInfo[] = {
31
32
  /* XXX Insert Your tags here */
33
    { TIFFTAG_GEOPIXELSCALE,  -1,-1, TIFF_DOUBLE, FIELD_CUSTOM,
34
      TRUE, TRUE, "GeoPixelScale" },
35
    { TIFFTAG_INTERGRAPH_MATRIX,-1,-1, TIFF_DOUBLE, FIELD_CUSTOM,
36
      TRUE, TRUE, "Intergraph TransformationMatrix" },
37
    { TIFFTAG_GEOTRANSMATRIX, -1,-1, TIFF_DOUBLE, FIELD_CUSTOM,
38
      TRUE, TRUE, "GeoTransformationMatrix" },
39
    { TIFFTAG_GEOTIEPOINTS, -1,-1, TIFF_DOUBLE, FIELD_CUSTOM,
40
      TRUE, TRUE, "GeoTiePoints" },
41
    { TIFFTAG_GEOKEYDIRECTORY,-1,-1, TIFF_SHORT,  FIELD_CUSTOM,
42
      TRUE, TRUE, "GeoKeyDirectory" },
43
    { TIFFTAG_GEODOUBLEPARAMS,  -1,-1, TIFF_DOUBLE, FIELD_CUSTOM,
44
      TRUE, TRUE, "GeoDoubleParams" },
45
    { TIFFTAG_GEOASCIIPARAMS, -1,-1, TIFF_ASCII,  FIELD_CUSTOM,
46
      TRUE, FALSE,  "GeoASCIIParams" },
47
#ifdef JPL_TAG_SUPPORT
48
    { TIFFTAG_JPL_CARTO_IFD,   1, 1, TIFF_LONG, FIELD_CUSTOM,
49
      TRUE, TRUE, "JPL Carto IFD offset" },  /** Don't use this! **/
50
#endif
51
};
52
53
0
#define N(a)  (sizeof (a) / sizeof (a[0]))
54
static void _XTIFFLocalDefaultDirectory(TIFF *tif)
55
0
{
56
    /* Install the extended Tag field info */
57
0
    TIFFMergeFieldInfo(tif, xtiffFieldInfo, N(xtiffFieldInfo));
58
0
}
59
60
61
/**********************************************************************
62
 *    Nothing below this line should need to be changed.
63
 **********************************************************************/
64
65
static TIFFExtendProc _ParentExtender;
66
67
/*
68
 *  This is the callback procedure, and is
69
 *  called by the DefaultDirectory method
70
 *  every time a new TIFF directory is opened.
71
 */
72
73
static void
74
_XTIFFDefaultDirectory(TIFF *tif)
75
0
{
76
    /* set up our own defaults */
77
0
    _XTIFFLocalDefaultDirectory(tif);
78
79
    /* Since an XTIFF client module may have overridden
80
     * the default directory method, we call it now to
81
     * allow it to set up the rest of its own methods.
82
     */
83
84
0
    if (_ParentExtender)
85
0
        (*_ParentExtender)(tif);
86
0
}
87
88
89
/**
90
Registers an extension with libtiff for adding GeoTIFF tags.
91
After this one-time initialization, any TIFF open function may be called in
92
the usual manner to create a TIFF file that compatible with libgeotiff.
93
The XTIFF open functions are simply for convenience: they call this
94
and then pass their parameters on to the appropriate TIFF open function.
95
96
<p>This function may be called any number of times safely, since it will
97
only register the extension the first time it is called.
98
**/
99
100
void XTIFFInitialize(void)
101
0
{
102
0
    static int first_time=1;
103
104
0
    if (! first_time) return; /* Been there. Done that. */
105
0
    first_time = 0;
106
107
    /* Grab the inherited method and install */
108
0
    _ParentExtender = TIFFSetTagExtender(_XTIFFDefaultDirectory);
109
0
}
110
111
112
/**
113
 * GeoTIFF compatible TIFF file open function.
114
 *
115
 * @param name The filename of a TIFF file to open.
116
 * @param mode The open mode ("r", "w" or "a").
117
 *
118
 * @return a TIFF * for the file, or NULL if the open failed.
119
 *
120
This function is used to open GeoTIFF files instead of TIFFOpen() from
121
libtiff.  Internally it calls TIFFOpen(), but sets up some extra hooks
122
so that GeoTIFF tags can be extracted from the file.  If XTIFFOpen() isn't
123
used, GTIFNew() won't work properly.  Files opened
124
with XTIFFOpen() should be closed with XTIFFClose().
125
126
The name of the file to be opened should be passed as <b>name</b>, and an
127
opening mode ("r", "w" or "a") acceptable to TIFFOpen() should be passed as the
128
<b>mode</b>.<p>
129
130
If XTIFFOpen() fails it will return NULL.  Otherwise, normal TIFFOpen()
131
error reporting steps will have already taken place.<p>
132
 */
133
134
TIFF*
135
XTIFFOpen(const char* name, const char* mode)
136
0
{
137
0
    TIFF *tif;
138
139
    /* Set up the callback */
140
0
    XTIFFInitialize();
141
142
    /* Open the file; the callback will set everything up
143
     */
144
0
    tif = TIFFOpen(name, mode);
145
0
    if (!tif) return tif;
146
147
0
    return tif;
148
0
}
149
150
TIFF*
151
XTIFFFdOpen(int fd, const char* name, const char* mode)
152
0
{
153
0
    TIFF *tif;
154
155
    /* Set up the callback */
156
0
    XTIFFInitialize();
157
158
    /* Open the file; the callback will set everything up
159
     */
160
0
    tif = TIFFFdOpen(fd, name, mode);
161
0
    if (!tif) return tif;
162
163
0
    return tif;
164
0
}
165
166
TIFF*
167
XTIFFClientOpen(const char* name, const char* mode, thandle_t thehandle,
168
      TIFFReadWriteProc RWProc, TIFFReadWriteProc RWProc2,
169
      TIFFSeekProc SProc, TIFFCloseProc CProc,
170
      TIFFSizeProc SzProc,
171
      TIFFMapFileProc MFProvc, TIFFUnmapFileProc UMFProc )
172
0
{
173
0
    TIFF *tif;
174
175
    /* Set up the callback */
176
0
    XTIFFInitialize();
177
178
    /* Open the file; the callback will set everything up
179
     */
180
0
    tif = TIFFClientOpen(name, mode, thehandle,
181
0
                         RWProc, RWProc2,
182
0
                         SProc, CProc,
183
0
                         SzProc,
184
0
                         MFProvc, UMFProc);
185
186
0
    if (!tif) return tif;
187
188
0
    return tif;
189
0
}
190
191
/**
192
 * Close a file opened with XTIFFOpen().
193
 *
194
 * @param tif The file handle returned by XTIFFOpen().
195
 *
196
 * If a GTIF structure was created with GTIFNew()
197
 * for this file, it should be freed with GTIFFree()
198
 * <i>before</i> calling XTIFFClose().
199
*/
200
201
void
202
XTIFFClose(TIFF *tif)
203
0
{
204
0
    TIFFClose(tif);
205
0
}