source: trunk/third/tiff/libtiff/tif_tile.c @ 18174

Revision 18174, 6.1 KB checked in by ghudson, 22 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r18173, which included commits to RCS files with non-trunk default branches.
Line 
1/* $Header: /afs/dev.mit.edu/source/repository/third/tiff/libtiff/tif_tile.c,v 1.1.1.1 2002-12-26 02:37:36 ghudson Exp $ */
2
3/*
4 * Copyright (c) 1991-1997 Sam Leffler
5 * Copyright (c) 1991-1997 Silicon Graphics, Inc.
6 *
7 * Permission to use, copy, modify, distribute, and sell this software and
8 * its documentation for any purpose is hereby granted without fee, provided
9 * that (i) the above copyright notices and this permission notice appear in
10 * all copies of the software and related documentation, and (ii) the names of
11 * Sam Leffler and Silicon Graphics may not be used in any advertising or
12 * publicity relating to the software without the specific, prior written
13 * permission of Sam Leffler and Silicon Graphics.
14 *
15 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
17 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. 
18 *
19 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
20 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
21 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
22 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
23 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
24 * OF THIS SOFTWARE.
25 */
26
27/*
28 * TIFF Library.
29 *
30 * Tiled Image Support Routines.
31 */
32#include "tiffiop.h"
33
34/*
35 * Compute which tile an (x,y,z,s) value is in.
36 */
37ttile_t
38TIFFComputeTile(TIFF* tif, uint32 x, uint32 y, uint32 z, tsample_t s)
39{
40        TIFFDirectory *td = &tif->tif_dir;
41        uint32 dx = td->td_tilewidth;
42        uint32 dy = td->td_tilelength;
43        uint32 dz = td->td_tiledepth;
44        ttile_t tile = 1;
45
46        if (td->td_imagedepth == 1)
47                z = 0;
48        if (dx == (uint32) -1)
49                dx = td->td_imagewidth;
50        if (dy == (uint32) -1)
51                dy = td->td_imagelength;
52        if (dz == (uint32) -1)
53                dz = td->td_imagedepth;
54        if (dx != 0 && dy != 0 && dz != 0) {
55                uint32 xpt = TIFFhowmany(td->td_imagewidth, dx);
56                uint32 ypt = TIFFhowmany(td->td_imagelength, dy);
57                uint32 zpt = TIFFhowmany(td->td_imagedepth, dz);
58
59                if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
60                        tile = (xpt*ypt*zpt)*s +
61                             (xpt*ypt)*(z/dz) +
62                             xpt*(y/dy) +
63                             x/dx;
64                else
65                        tile = (xpt*ypt)*(z/dz) + xpt*(y/dy) + x/dx + s;
66        }
67        return (tile);
68}
69
70/*
71 * Check an (x,y,z,s) coordinate
72 * against the image bounds.
73 */
74int
75TIFFCheckTile(TIFF* tif, uint32 x, uint32 y, uint32 z, tsample_t s)
76{
77        TIFFDirectory *td = &tif->tif_dir;
78
79        if (x >= td->td_imagewidth) {
80                TIFFError(tif->tif_name, "Col %ld out of range, max %lu",
81                    (long) x, (u_long) td->td_imagewidth);
82                return (0);
83        }
84        if (y >= td->td_imagelength) {
85                TIFFError(tif->tif_name, "Row %ld out of range, max %lu",
86                    (long) y, (u_long) td->td_imagelength);
87                return (0);
88        }
89        if (z >= td->td_imagedepth) {
90                TIFFError(tif->tif_name, "Depth %ld out of range, max %lu",
91                    (long) z, (u_long) td->td_imagedepth);
92                return (0);
93        }
94        if (td->td_planarconfig == PLANARCONFIG_SEPARATE &&
95            s >= td->td_samplesperpixel) {
96                TIFFError(tif->tif_name, "Sample %d out of range, max %u",
97                    (int) s, td->td_samplesperpixel);
98                return (0);
99        }
100        return (1);
101}
102
103/*
104 * Compute how many tiles are in an image.
105 */
106ttile_t
107TIFFNumberOfTiles(TIFF* tif)
108{
109        TIFFDirectory *td = &tif->tif_dir;
110        uint32 dx = td->td_tilewidth;
111        uint32 dy = td->td_tilelength;
112        uint32 dz = td->td_tiledepth;
113        ttile_t ntiles;
114
115        if (dx == (uint32) -1)
116                dx = td->td_imagewidth;
117        if (dy == (uint32) -1)
118                dy = td->td_imagelength;
119        if (dz == (uint32) -1)
120                dz = td->td_imagedepth;
121        ntiles = (dx == 0 || dy == 0 || dz == 0) ? 0 :
122            (TIFFhowmany(td->td_imagewidth, dx) *
123             TIFFhowmany(td->td_imagelength, dy) *
124             TIFFhowmany(td->td_imagedepth, dz));
125        if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
126                ntiles *= td->td_samplesperpixel;
127        return (ntiles);
128}
129
130/*
131 * Compute the # bytes in each row of a tile.
132 */
133tsize_t
134TIFFTileRowSize(TIFF* tif)
135{
136        TIFFDirectory *td = &tif->tif_dir;
137        tsize_t rowsize;
138       
139        if (td->td_tilelength == 0 || td->td_tilewidth == 0)
140                return ((tsize_t) 0);
141        rowsize = td->td_bitspersample * td->td_tilewidth;
142        if (td->td_planarconfig == PLANARCONFIG_CONTIG)
143                rowsize *= td->td_samplesperpixel;
144        return ((tsize_t) TIFFhowmany(rowsize, 8));
145}
146
147/*
148 * Compute the # bytes in a variable length, row-aligned tile.
149 */
150tsize_t
151TIFFVTileSize(TIFF* tif, uint32 nrows)
152{
153        TIFFDirectory *td = &tif->tif_dir;
154        tsize_t tilesize;
155
156        if (td->td_tilelength == 0 || td->td_tilewidth == 0 ||
157            td->td_tiledepth == 0)
158                return ((tsize_t) 0);
159#ifdef YCBCR_SUPPORT
160        if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
161            td->td_photometric == PHOTOMETRIC_YCBCR &&
162            !isUpSampled(tif)) {
163                /*
164                 * Packed YCbCr data contain one Cb+Cr for every
165                 * HorizontalSampling*VerticalSampling Y values.
166                 * Must also roundup width and height when calculating
167                 * since images that are not a multiple of the
168                 * horizontal/vertical subsampling area include
169                 * YCbCr data for the extended image.
170                 */
171                tsize_t w =
172                    TIFFroundup(td->td_tilewidth, td->td_ycbcrsubsampling[0]);
173                tsize_t rowsize = TIFFhowmany(w*td->td_bitspersample, 8);
174                tsize_t samplingarea =
175                    td->td_ycbcrsubsampling[0]*td->td_ycbcrsubsampling[1];
176                nrows = TIFFroundup(nrows, td->td_ycbcrsubsampling[1]);
177                /* NB: don't need TIFFhowmany here 'cuz everything is rounded */
178                tilesize = nrows*rowsize + 2*(nrows*rowsize / samplingarea);
179        } else
180#endif
181                tilesize = nrows * TIFFTileRowSize(tif);
182        return ((tsize_t)(tilesize * td->td_tiledepth));
183}
184
185/*
186 * Compute the # bytes in a row-aligned tile.
187 */
188tsize_t
189TIFFTileSize(TIFF* tif)
190{
191        return (TIFFVTileSize(tif, tif->tif_dir.td_tilelength));
192}
193
194/*
195 * Compute a default tile size based on the image
196 * characteristics and a requested value.  If a
197 * request is <1 then we choose a size according
198 * to certain heuristics.
199 */
200void
201TIFFDefaultTileSize(TIFF* tif, uint32* tw, uint32* th)
202{
203        (*tif->tif_deftilesize)(tif, tw, th);
204}
205
206void
207_TIFFDefaultTileSize(TIFF* tif, uint32* tw, uint32* th)
208{
209        (void) tif;
210        if (*(int32*) tw < 1)
211                *tw = 256;
212        if (*(int32*) th < 1)
213                *th = 256;
214        /* roundup to a multiple of 16 per the spec */
215        if (*tw & 0xf)
216                *tw = TIFFroundup(*tw, 16);
217        if (*th & 0xf)
218                *th = TIFFroundup(*th, 16);
219}
Note: See TracBrowser for help on using the repository browser.