/src/gdal/frmts/gtiff/libgeotiff/geo_tiffp.c
Line | Count | Source (jump to first uncovered line) |
1 | | /********************************************************************** |
2 | | * |
3 | | * geo_tiffp.c Private TIFF interface module for GEOTIFF |
4 | | * |
5 | | * This module implements the interface between the GEOTIFF |
6 | | * tag parser and the TIFF i/o module. The current setup |
7 | | * relies on the "libtiff" code, but if you use your own |
8 | | * TIFF reader software, you may replace the module implementations |
9 | | * here with your own calls. No "libtiff" dependencies occur |
10 | | * anywhere else in this code. |
11 | | * |
12 | | * copyright (c) 1995 Niles D. Ritter |
13 | | * |
14 | | * Permission granted to use this software, so long as this copyright |
15 | | * notice accompanies any products derived therefrom. |
16 | | * |
17 | | **********************************************************************/ |
18 | | |
19 | | #include "geotiff.h" /* public GTIFF interface */ |
20 | | |
21 | | #include "geo_tiffp.h" /* Private TIFF interface */ |
22 | | #include "geo_keyp.h" /* Private GTIFF interface */ |
23 | | |
24 | | /* tiff size array global */ |
25 | | gsize_t _gtiff_size[] = { 0, 1, 2, 4, 8, 1, 4, 8, 1, 2, 4, 1 }; |
26 | | |
27 | | static int _GTIFGetField (tiff_t *tif, pinfo_t tag, int *count, void *value ); |
28 | | static int _GTIFSetField (tiff_t *tif, pinfo_t tag, int count, void *value ); |
29 | | static tagtype_t _GTIFTagType (tiff_t *tif, pinfo_t tag); |
30 | | |
31 | | /* |
32 | | * Set up default TIFF handlers. |
33 | | */ |
34 | | void _GTIFSetDefaultTIFF(TIFFMethod *method) |
35 | 0 | { |
36 | 0 | if (!method) return; |
37 | | |
38 | 0 | method->get = _GTIFGetField; |
39 | 0 | method->set = _GTIFSetField; |
40 | 0 | method->type = _GTIFTagType; |
41 | 0 | } |
42 | | |
43 | | gdata_t _GTIFcalloc(gsize_t size) |
44 | 0 | { |
45 | 0 | gdata_t data=(gdata_t)_TIFFmalloc((tsize_t)size); |
46 | 0 | if (data) _TIFFmemset((tdata_t)data,0,(tsize_t)size); |
47 | 0 | return data; |
48 | 0 | } |
49 | | |
50 | | gdata_t _GTIFrealloc(gdata_t ptr, gsize_t size) |
51 | 0 | { |
52 | 0 | return _TIFFrealloc((tdata_t)ptr, (tsize_t) size); |
53 | 0 | } |
54 | | |
55 | | void _GTIFmemcpy(gdata_t out,gdata_t in,gsize_t size) |
56 | 0 | { |
57 | 0 | _TIFFmemcpy((tdata_t)out,(tdata_t)in,(tsize_t)size); |
58 | 0 | } |
59 | | |
60 | | void _GTIFFree(gdata_t data) |
61 | 0 | { |
62 | 0 | if (data) _TIFFfree((tdata_t)data); |
63 | 0 | } |
64 | | |
65 | | |
66 | | |
67 | | /* returns the value of TIFF tag <tag>, or if |
68 | | * the value is an array, returns an allocated buffer |
69 | | * containing the values. Allocate a copy of the actual |
70 | | * buffer, sized up for updating. |
71 | | */ |
72 | | static int _GTIFGetField (tiff_t *tif, pinfo_t tag, int *count, void *val ) |
73 | 0 | { |
74 | 0 | int status; |
75 | 0 | unsigned short scount=0; |
76 | 0 | char *tmp; |
77 | 0 | const gsize_t size = _gtiff_size[_GTIFTagType (tif,tag)]; |
78 | |
|
79 | 0 | if (_GTIFTagType(tif, tag) == TYPE_ASCII) |
80 | 0 | { |
81 | 0 | status = TIFFGetField((TIFF *)tif,tag,&tmp); |
82 | 0 | if (!status) return status; |
83 | 0 | scount = (unsigned short) (strlen(tmp)+1); |
84 | 0 | } |
85 | 0 | else status = TIFFGetField((TIFF *)tif,tag,&scount,&tmp); |
86 | 0 | if (!status) return status; |
87 | | |
88 | 0 | *count = scount; |
89 | |
|
90 | 0 | char *value = (char *)_GTIFcalloc( (scount+MAX_VALUES)*size); |
91 | 0 | if (!value) return 0; |
92 | | |
93 | 0 | _TIFFmemcpy( value, tmp, size * scount); |
94 | |
|
95 | 0 | *(char **)val = value; |
96 | 0 | return status; |
97 | 0 | } |
98 | | |
99 | | /* |
100 | | * Set a GeoTIFF TIFF field. |
101 | | */ |
102 | | static int _GTIFSetField (tiff_t *tif, pinfo_t tag, int count, void *value ) |
103 | 0 | { |
104 | 0 | const unsigned short scount = (unsigned short) count; |
105 | |
|
106 | 0 | int status; |
107 | | /* libtiff ASCII uses null-delimiter */ |
108 | 0 | if (_GTIFTagType(tif, tag) == TYPE_ASCII) |
109 | 0 | status = TIFFSetField((TIFF *)tif,tag,value); |
110 | 0 | else |
111 | 0 | status = TIFFSetField((TIFF *)tif,tag,scount,value); |
112 | 0 | return status; |
113 | 0 | } |
114 | | |
115 | | |
116 | | /* |
117 | | * This routine is supposed to return the TagType of the <tag> |
118 | | * TIFF tag. Unfortunately, "libtiff" does not provide this |
119 | | * service by default, so we just have to "know" what type of tags |
120 | | * we've got, and how many. We only define the ones Geotiff |
121 | | * uses here, and others return UNKNOWN. The "tif" parameter |
122 | | * is provided for those TIFF implementations that provide |
123 | | * for tag-type queries. |
124 | | */ |
125 | | static tagtype_t _GTIFTagType (tiff_t *tif, pinfo_t tag) |
126 | 0 | { |
127 | 0 | (void) tif; /* dummy reference */ |
128 | |
|
129 | 0 | tagtype_t ttype; |
130 | 0 | switch (tag) |
131 | 0 | { |
132 | 0 | case GTIFF_ASCIIPARAMS: ttype=TYPE_ASCII; break; |
133 | 0 | case GTIFF_PIXELSCALE: |
134 | 0 | case GTIFF_TRANSMATRIX: |
135 | 0 | case GTIFF_TIEPOINTS: |
136 | 0 | case GTIFF_DOUBLEPARAMS: ttype=TYPE_DOUBLE; break; |
137 | 0 | case GTIFF_GEOKEYDIRECTORY: ttype=TYPE_SHORT; break; |
138 | 0 | default: ttype = TYPE_UNKNOWN; |
139 | 0 | } |
140 | | |
141 | 0 | return ttype; |
142 | 0 | } |