LCOV - code coverage report
Current view: top level - frmts/gtiff/libgeotiff - geo_tiffp.c (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 45 46 97.8 %
Date: 2024-05-04 12:52:34 Functions: 8 8 100.0 %

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

Generated by: LCOV version 1.14