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