Line data Source code
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 26511 : void _GTIFSetDefaultTIFF(TIFFMethod *method)
35 : {
36 26511 : if (!method) return;
37 :
38 26511 : method->get = _GTIFGetField;
39 26511 : method->set = _GTIFSetField;
40 26511 : method->type = _GTIFTagType;
41 : }
42 :
43 174155 : gdata_t _GTIFcalloc(gsize_t size)
44 : {
45 174155 : gdata_t data=(gdata_t)_TIFFmalloc((tsize_t)size);
46 174159 : if (data) _TIFFmemset((tdata_t)data,0,(tsize_t)size);
47 174157 : return data;
48 : }
49 :
50 24368 : gdata_t _GTIFrealloc(gdata_t ptr, gsize_t size)
51 : {
52 24368 : return _TIFFrealloc((tdata_t)ptr, (tsize_t) size);
53 : }
54 :
55 95816 : void _GTIFmemcpy(gdata_t out,gdata_t in,gsize_t size)
56 : {
57 95816 : _TIFFmemcpy((tdata_t)out,(tdata_t)in,(tsize_t)size);
58 95817 : }
59 :
60 174156 : void _GTIFFree(gdata_t data)
61 : {
62 174156 : if (data) _TIFFfree((tdata_t)data);
63 174155 : }
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 79531 : static int _GTIFGetField (tiff_t *tif, pinfo_t tag, int *count, void *val )
73 : {
74 : int status;
75 79531 : unsigned short scount=0;
76 : char *tmp;
77 79531 : const gsize_t size = _gtiff_size[_GTIFTagType (tif,tag)];
78 :
79 79531 : if (_GTIFTagType(tif, tag) == TYPE_ASCII)
80 : {
81 26511 : status = TIFFGetField((TIFF *)tif,tag,&tmp);
82 26510 : if (!status) return status;
83 15950 : scount = (unsigned short) (strlen(tmp)+1);
84 : }
85 53020 : else status = TIFFGetField((TIFF *)tif,tag,&scount,&tmp);
86 68969 : if (!status) return status;
87 :
88 40316 : *count = scount;
89 :
90 40316 : char *value = (char *)_GTIFcalloc( (scount+MAX_VALUES)*size);
91 40320 : if (!value) return 0;
92 :
93 40320 : _TIFFmemcpy( value, tmp, size * scount);
94 :
95 40319 : *(char **)val = value;
96 40319 : return status;
97 : }
98 :
99 : /*
100 : * Set a GeoTIFF TIFF field.
101 : */
102 7958 : static int _GTIFSetField (tiff_t *tif, pinfo_t tag, int count, void *value )
103 : {
104 7958 : const unsigned short scount = (unsigned short) count;
105 :
106 : int status;
107 : /* libtiff ASCII uses null-delimiter */
108 7958 : if (_GTIFTagType(tif, tag) == TYPE_ASCII)
109 2872 : status = TIFFSetField((TIFF *)tif,tag,value);
110 : else
111 5086 : status = TIFFSetField((TIFF *)tif,tag,scount,value);
112 7958 : return status;
113 : }
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 271750 : static tagtype_t _GTIFTagType (tiff_t *tif, pinfo_t tag)
126 : {
127 : (void) tif; /* dummy reference */
128 :
129 : tagtype_t ttype;
130 271750 : switch (tag)
131 : {
132 74939 : case GTIFF_ASCIIPARAMS: ttype=TYPE_ASCII; break;
133 72026 : case GTIFF_PIXELSCALE:
134 : case GTIFF_TRANSMATRIX:
135 : case GTIFF_TIEPOINTS:
136 72026 : case GTIFF_DOUBLEPARAMS: ttype=TYPE_DOUBLE; break;
137 124784 : case GTIFF_GEOKEYDIRECTORY: ttype=TYPE_SHORT; break;
138 1 : default: ttype = TYPE_UNKNOWN;
139 : }
140 :
141 271750 : return ttype;
142 : }
|