00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "geotiff.h"
00015
00016 #include "geo_tiffp.h"
00017 #include "geo_keyp.h"
00018
00019
00020 gsize_t _gtiff_size[] = { 0, 1, 2, 4, 8, 1, 4, 8, 1, 2, 4, 1 };
00021
00022 static int _GTIFGetField (tiff_t *tif, pinfo_t tag, int *count, void *value );
00023 static int _GTIFSetField (tiff_t *tif, pinfo_t tag, int count, void *value );
00024 static tagtype_t _GTIFTagType (tiff_t *tif, pinfo_t tag);
00025
00026
00027
00028
00029 void _GTIFSetDefaultTIFF(TIFFMethod *method)
00030 {
00031 if (!method) return;
00032
00033 method->get = _GTIFGetField;
00034 method->set = _GTIFSetField;
00035 method->type = _GTIFTagType;
00036 }
00037
00038 gdata_t _GTIFcalloc(gsize_t size)
00039 {
00040 gdata_t data=(gdata_t)_TIFFmalloc((tsize_t)size);
00041 if (data) _TIFFmemset((tdata_t)data,0,(tsize_t)size);
00042 return data;
00043 }
00044
00045 gdata_t _GTIFrealloc(gdata_t ptr, gsize_t size)
00046 {
00047 return( _TIFFrealloc((tdata_t)ptr, (tsize_t) size) );
00048 }
00049
00050 void _GTIFmemcpy(gdata_t out,gdata_t in,gsize_t size)
00051 {
00052 _TIFFmemcpy((tdata_t)out,(tdata_t)in,(tsize_t)size);
00053 }
00054
00055 void _GTIFFree(gdata_t data)
00056 {
00057 if (data) _TIFFfree((tdata_t)data);
00058 }
00059
00060
00061
00062
00063
00064
00065
00066
00067 static int _GTIFGetField (tiff_t *tif, pinfo_t tag, int *count, void *val )
00068 {
00069 int status;
00070 unsigned short scount=0;
00071 char *tmp;
00072 char *value;
00073 gsize_t size = _gtiff_size[_GTIFTagType (tif,tag)];
00074
00075 if (_GTIFTagType(tif, tag) == TYPE_ASCII)
00076 {
00077 status = TIFFGetField((TIFF *)tif,tag,&tmp);
00078 if (!status) return status;
00079 scount = strlen(tmp)+1;
00080 }
00081 else status = TIFFGetField((TIFF *)tif,tag,&scount,&tmp);
00082 if (!status) return status;
00083
00084 *count = scount;
00085
00086 value = (char *)_GTIFcalloc( (scount+MAX_VALUES)*size);
00087 if (!value) return 0;
00088
00089 _TIFFmemcpy( value, tmp, size * scount);
00090
00091 *(char **)val = value;
00092 return status;
00093 }
00094
00095
00096
00097
00098 static int _GTIFSetField (tiff_t *tif, pinfo_t tag, int count, void *value )
00099 {
00100 int status;
00101 unsigned short scount = count;
00102
00103
00104 if (_GTIFTagType(tif, tag) == TYPE_ASCII)
00105 status = TIFFSetField((TIFF *)tif,tag,value);
00106 else
00107 status = TIFFSetField((TIFF *)tif,tag,scount,value);
00108 return status;
00109 }
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121 static tagtype_t _GTIFTagType (tiff_t *tif, pinfo_t tag)
00122 {
00123 tagtype_t ttype;
00124
00125 (void) tif;
00126
00127 switch (tag)
00128 {
00129 case GTIFF_ASCIIPARAMS: ttype=TYPE_ASCII; break;
00130 case GTIFF_PIXELSCALE:
00131 case GTIFF_TRANSMATRIX:
00132 case GTIFF_TIEPOINTS:
00133 case GTIFF_DOUBLEPARAMS: ttype=TYPE_DOUBLE; break;
00134 case GTIFF_GEOKEYDIRECTORY: ttype=TYPE_SHORT; break;
00135 default: ttype = TYPE_UNKNOWN;
00136 }
00137
00138 return ttype;
00139 }
00140