LCOV - code coverage report
Current view: top level - frmts/gtiff/libtiff - tif_tile.c (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 66 108 61.1 %
Date: 2026-04-23 19:47:11 Functions: 8 11 72.7 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 1991-1997 Sam Leffler
       3             :  * Copyright (c) 1991-1997 Silicon Graphics, Inc.
       4             :  *
       5             :  * Permission to use, copy, modify, distribute, and sell this software and
       6             :  * its documentation for any purpose is hereby granted without fee, provided
       7             :  * that (i) the above copyright notices and this permission notice appear in
       8             :  * all copies of the software and related documentation, and (ii) the names of
       9             :  * Sam Leffler and Silicon Graphics may not be used in any advertising or
      10             :  * publicity relating to the software without the specific, prior written
      11             :  * permission of Sam Leffler and Silicon Graphics.
      12             :  *
      13             :  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
      14             :  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
      15             :  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
      16             :  *
      17             :  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
      18             :  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
      19             :  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
      20             :  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
      21             :  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
      22             :  * OF THIS SOFTWARE.
      23             :  */
      24             : 
      25             : /*
      26             :  * TIFF Library.
      27             :  *
      28             :  * Tiled Image Support Routines.
      29             :  */
      30             : #include "tiffiop.h"
      31             : 
      32             : /*
      33             :  * Compute which tile an (x,y,z,s) value is in.
      34             :  */
      35           6 : uint32_t TIFFComputeTile(TIFF *tif, uint32_t x, uint32_t y, uint32_t z,
      36             :                          uint16_t s)
      37             : {
      38           6 :     TIFFDirectory *td = &tif->tif_dir;
      39           6 :     uint32_t dx = td->td_tilewidth;
      40           6 :     uint32_t dy = td->td_tilelength;
      41           6 :     uint32_t dz = td->td_tiledepth;
      42           6 :     uint32_t tile = 1;
      43             : 
      44           6 :     if (td->td_imagedepth == 1)
      45           6 :         z = 0;
      46           6 :     if (dx == (uint32_t)-1)
      47           0 :         dx = td->td_imagewidth;
      48           6 :     if (dy == (uint32_t)-1)
      49           0 :         dy = td->td_imagelength;
      50           6 :     if (dz == (uint32_t)-1)
      51           0 :         dz = td->td_imagedepth;
      52           6 :     if (dx != 0 && dy != 0 && dz != 0)
      53             :     {
      54           6 :         uint32_t xpt = TIFFhowmany_32(td->td_imagewidth, dx);
      55           6 :         uint32_t ypt = TIFFhowmany_32(td->td_imagelength, dy);
      56           6 :         uint32_t zpt = TIFFhowmany_32(td->td_imagedepth, dz);
      57             : 
      58           6 :         if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
      59           4 :             tile = (xpt * ypt * zpt) * s + (xpt * ypt) * (z / dz) +
      60           4 :                    xpt * (y / dy) + x / dx;
      61             :         else
      62           2 :             tile = (xpt * ypt) * (z / dz) + xpt * (y / dy) + x / dx;
      63             :     }
      64           6 :     return (tile);
      65             : }
      66             : 
      67             : /*
      68             :  * Check an (x,y,z,s) coordinate
      69             :  * against the image bounds.
      70             :  */
      71           6 : int TIFFCheckTile(TIFF *tif, uint32_t x, uint32_t y, uint32_t z, uint16_t s)
      72             : {
      73           6 :     TIFFDirectory *td = &tif->tif_dir;
      74             : 
      75           6 :     if (x >= td->td_imagewidth)
      76             :     {
      77           0 :         TIFFErrorExtR(tif, tif->tif_name, "%lu: Col out of range, max %lu",
      78           0 :                       (unsigned long)x, (unsigned long)(td->td_imagewidth - 1));
      79           0 :         return (0);
      80             :     }
      81           6 :     if (y >= td->td_imagelength)
      82             :     {
      83           0 :         TIFFErrorExtR(tif, tif->tif_name, "%lu: Row out of range, max %lu",
      84             :                       (unsigned long)y,
      85           0 :                       (unsigned long)(td->td_imagelength - 1));
      86           0 :         return (0);
      87             :     }
      88           6 :     if (z >= td->td_imagedepth)
      89             :     {
      90           0 :         TIFFErrorExtR(tif, tif->tif_name, "%lu: Depth out of range, max %lu",
      91           0 :                       (unsigned long)z, (unsigned long)(td->td_imagedepth - 1));
      92           0 :         return (0);
      93             :     }
      94           6 :     if (td->td_planarconfig == PLANARCONFIG_SEPARATE &&
      95           4 :         s >= td->td_samplesperpixel)
      96             :     {
      97           0 :         TIFFErrorExtR(tif, tif->tif_name, "%lu: Sample out of range, max %lu",
      98             :                       (unsigned long)s,
      99           0 :                       (unsigned long)(td->td_samplesperpixel - 1));
     100           0 :         return (0);
     101             :     }
     102           6 :     return (1);
     103             : }
     104             : 
     105             : /*
     106             :  * Compute how many tiles are in an image.
     107             :  */
     108       46619 : uint32_t TIFFNumberOfTiles(TIFF *tif)
     109             : {
     110       46619 :     TIFFDirectory *td = &tif->tif_dir;
     111       46619 :     uint32_t dx = td->td_tilewidth;
     112       46619 :     uint32_t dy = td->td_tilelength;
     113       46619 :     uint32_t dz = td->td_tiledepth;
     114             :     uint32_t ntiles;
     115             : 
     116       46619 :     if (dx == (uint32_t)-1)
     117           0 :         dx = td->td_imagewidth;
     118       46619 :     if (dy == (uint32_t)-1)
     119           0 :         dy = td->td_imagelength;
     120       46619 :     if (dz == (uint32_t)-1)
     121           0 :         dz = td->td_imagedepth;
     122       46618 :     ntiles =
     123       46618 :         (dx == 0 || dy == 0 || dz == 0)
     124             :             ? 0
     125       93237 :             : _TIFFMultiply32(
     126             :                   tif,
     127       46618 :                   _TIFFMultiply32(tif, TIFFhowmany_32(td->td_imagewidth, dx),
     128       46618 :                                   TIFFhowmany_32(td->td_imagelength, dy),
     129             :                                   "TIFFNumberOfTiles"),
     130       46618 :                   TIFFhowmany_32(td->td_imagedepth, dz), "TIFFNumberOfTiles");
     131       46618 :     if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
     132        6687 :         ntiles = _TIFFMultiply32(tif, ntiles, td->td_samplesperpixel,
     133             :                                  "TIFFNumberOfTiles");
     134       46618 :     return (ntiles);
     135             : }
     136             : 
     137             : /*
     138             :  * Compute the # bytes in each row of a tile.
     139             :  */
     140      172470 : uint64_t TIFFTileRowSize64(TIFF *tif)
     141             : {
     142             :     static const char module[] = "TIFFTileRowSize64";
     143      172470 :     TIFFDirectory *td = &tif->tif_dir;
     144             :     uint64_t rowsize;
     145             :     uint64_t tilerowsize;
     146             : 
     147      172470 :     if (td->td_tilelength == 0)
     148             :     {
     149           0 :         TIFFErrorExtR(tif, module, "Tile length is zero");
     150           0 :         return 0;
     151             :     }
     152      172470 :     if (td->td_tilewidth == 0)
     153             :     {
     154           0 :         TIFFErrorExtR(tif, module, "Tile width is zero");
     155           0 :         return (0);
     156             :     }
     157      172470 :     rowsize = _TIFFMultiply64(tif, td->td_bitspersample, td->td_tilewidth,
     158             :                               "TIFFTileRowSize");
     159      172557 :     if (td->td_planarconfig == PLANARCONFIG_CONTIG)
     160             :     {
     161      153670 :         if (td->td_samplesperpixel == 0)
     162             :         {
     163           0 :             TIFFErrorExtR(tif, module, "Samples per pixel is zero");
     164           0 :             return 0;
     165             :         }
     166      153670 :         rowsize = _TIFFMultiply64(tif, rowsize, td->td_samplesperpixel,
     167             :                                   "TIFFTileRowSize");
     168             :     }
     169      172482 :     tilerowsize = TIFFhowmany8_64(rowsize);
     170      172482 :     if (tilerowsize == 0)
     171             :     {
     172           0 :         TIFFErrorExtR(tif, module, "Computed tile row size is zero");
     173           0 :         return 0;
     174             :     }
     175      172482 :     return (tilerowsize);
     176             : }
     177        1164 : tmsize_t TIFFTileRowSize(TIFF *tif)
     178             : {
     179             :     static const char module[] = "TIFFTileRowSize";
     180             :     uint64_t m;
     181        1164 :     m = TIFFTileRowSize64(tif);
     182        1164 :     return _TIFFCastUInt64ToSSize(tif, m, module);
     183             : }
     184             : 
     185             : /*
     186             :  * Compute the # bytes in a variable length, row-aligned tile.
     187             :  */
     188      171976 : uint64_t TIFFVTileSize64(TIFF *tif, uint32_t nrows)
     189             : {
     190      171976 :     return _TIFFStrileSize64(tif, nrows, /* isStrip = */ FALSE);
     191             : }
     192             : 
     193           0 : tmsize_t TIFFVTileSize(TIFF *tif, uint32_t nrows)
     194             : {
     195             :     static const char module[] = "TIFFVTileSize";
     196             :     uint64_t m;
     197           0 :     m = TIFFVTileSize64(tif, nrows);
     198           0 :     return _TIFFCastUInt64ToSSize(tif, m, module);
     199             : }
     200             : 
     201             : /*
     202             :  * Compute the # bytes in a row-aligned tile.
     203             :  */
     204      150316 : uint64_t TIFFTileSize64(TIFF *tif)
     205             : {
     206      150316 :     return (TIFFVTileSize64(tif, tif->tif_dir.td_tilelength));
     207             : }
     208      141657 : tmsize_t TIFFTileSize(TIFF *tif)
     209             : {
     210             :     static const char module[] = "TIFFTileSize";
     211             :     uint64_t m;
     212      141657 :     m = TIFFTileSize64(tif);
     213      141647 :     return _TIFFCastUInt64ToSSize(tif, m, module);
     214             : }
     215             : 
     216             : /*
     217             :  * Compute a default tile size based on the image
     218             :  * characteristics and a requested value.  If a
     219             :  * request is <1 then we choose a size according
     220             :  * to certain heuristics.
     221             :  */
     222           0 : void TIFFDefaultTileSize(TIFF *tif, uint32_t *tw, uint32_t *th)
     223             : {
     224           0 :     (*tif->tif_deftilesize)(tif, tw, th);
     225           0 : }
     226             : 
     227           0 : void _TIFFDefaultTileSize(TIFF *tif, uint32_t *tw, uint32_t *th)
     228             : {
     229             :     (void)tif;
     230           0 :     if (*(int32_t *)tw < 1)
     231           0 :         *tw = 256;
     232           0 :     if (*(int32_t *)th < 1)
     233           0 :         *th = 256;
     234             :     /* roundup to a multiple of 16 per the spec */
     235           0 :     if (*tw & 0xf)
     236           0 :         *tw = TIFFroundup_32(*tw, 16);
     237           0 :     if (*th & 0xf)
     238           0 :         *th = TIFFroundup_32(*th, 16);
     239           0 : }

Generated by: LCOV version 1.14