OLD | NEW |
| (Empty) |
1 /* $Id: tif_open.c,v 1.46 2010-12-06 16:54:54 faxguy Exp $ */ | |
2 | |
3 /* | |
4 * Copyright (c) 1988-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 #include "tiffiop.h" | |
31 | |
32 /* | |
33 * Dummy functions to fill the omitted client procedures. | |
34 */ | |
35 static int | |
36 _tiffDummyMapProc(thandle_t fd, void** pbase, toff_t* psize) | |
37 { | |
38 (void) fd; (void) pbase; (void) psize; | |
39 return (0); | |
40 } | |
41 | |
42 static void | |
43 _tiffDummyUnmapProc(thandle_t fd, void* base, toff_t size) | |
44 { | |
45 (void) fd; (void) base; (void) size; | |
46 } | |
47 | |
48 int | |
49 _TIFFgetMode(const char* mode, const char* module) | |
50 { | |
51 int m = -1; | |
52 | |
53 switch (mode[0]) { | |
54 case 'r': | |
55 m = O_RDONLY; | |
56 if (mode[1] == '+') | |
57 m = O_RDWR; | |
58 break; | |
59 case 'w': | |
60 case 'a': | |
61 m = O_RDWR|O_CREAT; | |
62 if (mode[0] == 'w') | |
63 m |= O_TRUNC; | |
64 break; | |
65 default: | |
66 TIFFErrorExt(0, module, "\"%s\": Bad mode", mode); | |
67 break; | |
68 } | |
69 return (m); | |
70 } | |
71 | |
72 TIFF* | |
73 TIFFClientOpen( | |
74 const char* name, const char* mode, | |
75 thandle_t clientdata, | |
76 TIFFReadWriteProc readproc, | |
77 TIFFReadWriteProc writeproc, | |
78 TIFFSeekProc seekproc, | |
79 TIFFCloseProc closeproc, | |
80 TIFFSizeProc sizeproc, | |
81 TIFFMapFileProc mapproc, | |
82 TIFFUnmapFileProc unmapproc | |
83 ) | |
84 { | |
85 static const char module[] = "TIFFClientOpen"; | |
86 TIFF *tif; | |
87 int m; | |
88 const char* cp; | |
89 | |
90 /* The following are configuration checks. They should be redundant, but
should not | |
91 * compile to any actual code in an optimised release build anyway. If a
ny of them | |
92 * fail, (makefile-based or other) configuration is not correct */ | |
93 assert(sizeof(uint8)==1); | |
94 assert(sizeof(int8)==1); | |
95 assert(sizeof(uint16)==2); | |
96 assert(sizeof(int16)==2); | |
97 assert(sizeof(uint32)==4); | |
98 assert(sizeof(int32)==4); | |
99 assert(sizeof(uint64)==8); | |
100 assert(sizeof(int64)==8); | |
101 assert(sizeof(tmsize_t)==sizeof(void*)); | |
102 { | |
103 union{ | |
104 uint8 a8[2]; | |
105 uint16 a16; | |
106 } n; | |
107 n.a8[0]=1; | |
108 n.a8[1]=0; | |
109 #ifdef WORDS_BIGENDIAN | |
110 assert(n.a16==256); | |
111 #else | |
112 assert(n.a16==1); | |
113 #endif | |
114 } | |
115 | |
116 m = _TIFFgetMode(mode, module); | |
117 if (m == -1) | |
118 goto bad2; | |
119 tif = (TIFF *)_TIFFmalloc((tmsize_t)(sizeof (TIFF) + strlen(name) + 1)); | |
120 if (tif == NULL) { | |
121 TIFFErrorExt(clientdata, module, "%s: Out of memory (TIFF struct
ure)", name); | |
122 goto bad2; | |
123 } | |
124 _TIFFmemset(tif, 0, sizeof (*tif)); | |
125 tif->tif_name = (char *)tif + sizeof (TIFF); | |
126 strcpy(tif->tif_name, name); | |
127 tif->tif_mode = m &~ (O_CREAT|O_TRUNC); | |
128 tif->tif_curdir = (uint16) -1; /* non-existent directory */ | |
129 tif->tif_curoff = 0; | |
130 tif->tif_curstrip = (uint32) -1; /* invalid strip */ | |
131 tif->tif_row = (uint32) -1; /* read/write pre-increment */ | |
132 tif->tif_clientdata = clientdata; | |
133 if (!readproc || !writeproc || !seekproc || !closeproc || !sizeproc) { | |
134 TIFFErrorExt(clientdata, module, | |
135 "One of the client procedures is NULL pointer."); | |
136 goto bad2; | |
137 } | |
138 tif->tif_readproc = readproc; | |
139 tif->tif_writeproc = writeproc; | |
140 tif->tif_seekproc = seekproc; | |
141 tif->tif_closeproc = closeproc; | |
142 tif->tif_sizeproc = sizeproc; | |
143 if (mapproc) | |
144 tif->tif_mapproc = mapproc; | |
145 else | |
146 tif->tif_mapproc = _tiffDummyMapProc; | |
147 if (unmapproc) | |
148 tif->tif_unmapproc = unmapproc; | |
149 else | |
150 tif->tif_unmapproc = _tiffDummyUnmapProc; | |
151 _TIFFSetDefaultCompressionState(tif); /* setup default state */ | |
152 /* | |
153 * Default is to return data MSB2LSB and enable the | |
154 * use of memory-mapped files and strip chopping when | |
155 * a file is opened read-only. | |
156 */ | |
157 tif->tif_flags = FILLORDER_MSB2LSB; | |
158 if (m == O_RDONLY ) | |
159 tif->tif_flags |= TIFF_MAPPED; | |
160 | |
161 #ifdef STRIPCHOP_DEFAULT | |
162 if (m == O_RDONLY || m == O_RDWR) | |
163 tif->tif_flags |= STRIPCHOP_DEFAULT; | |
164 #endif | |
165 | |
166 /* | |
167 * Process library-specific flags in the open mode string. | |
168 * The following flags may be used to control intrinsic library | |
169 * behaviour that may or may not be desirable (usually for | |
170 * compatibility with some application that claims to support | |
171 * TIFF but only supports some braindead idea of what the | |
172 * vendor thinks TIFF is): | |
173 * | |
174 * 'l' use little-endian byte order for creating a file | |
175 * 'b' use big-endian byte order for creating a file | |
176 * 'L' read/write information using LSB2MSB bit order | |
177 * 'B' read/write information using MSB2LSB bit order | |
178 * 'H' read/write information using host bit order | |
179 * 'M' enable use of memory-mapped files when supported | |
180 * 'm' disable use of memory-mapped files | |
181 * 'C' enable strip chopping support when reading | |
182 * 'c' disable strip chopping support | |
183 * 'h' read TIFF header only, do not load the first IFD | |
184 * '4' ClassicTIFF for creating a file (default) | |
185 * '8' BigTIFF for creating a file | |
186 * | |
187 * The use of the 'l' and 'b' flags is strongly discouraged. | |
188 * These flags are provided solely because numerous vendors, | |
189 * typically on the PC, do not correctly support TIFF; they | |
190 * only support the Intel little-endian byte order. This | |
191 * support is not configured by default because it supports | |
192 * the violation of the TIFF spec that says that readers *MUST* | |
193 * support both byte orders. It is strongly recommended that | |
194 * you not use this feature except to deal with busted apps | |
195 * that write invalid TIFF. And even in those cases you should | |
196 * bang on the vendors to fix their software. | |
197 * | |
198 * The 'L', 'B', and 'H' flags are intended for applications | |
199 * that can optimize operations on data by using a particular | |
200 * bit order. By default the library returns data in MSB2LSB | |
201 * bit order for compatibiltiy with older versions of this | |
202 * library. Returning data in the bit order of the native cpu | |
203 * makes the most sense but also requires applications to check | |
204 * the value of the FillOrder tag; something they probably do | |
205 * not do right now. | |
206 * | |
207 * The 'M' and 'm' flags are provided because some virtual memory | |
208 * systems exhibit poor behaviour when large images are mapped. | |
209 * These options permit clients to control the use of memory-mapped | |
210 * files on a per-file basis. | |
211 * | |
212 * The 'C' and 'c' flags are provided because the library support | |
213 * for chopping up large strips into multiple smaller strips is not | |
214 * application-transparent and as such can cause problems. The 'c' | |
215 * option permits applications that only want to look at the tags, | |
216 * for example, to get the unadulterated TIFF tag information. | |
217 */ | |
218 for (cp = mode; *cp; cp++) | |
219 switch (*cp) { | |
220 case 'b': | |
221 #ifndef WORDS_BIGENDIAN | |
222 if (m&O_CREAT) | |
223 tif->tif_flags |= TIFF_SWAB; | |
224 #endif | |
225 break; | |
226 case 'l': | |
227 #ifdef WORDS_BIGENDIAN | |
228 if ((m&O_CREAT)) | |
229 tif->tif_flags |= TIFF_SWAB; | |
230 #endif | |
231 break; | |
232 case 'B': | |
233 tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORD
ER) | | |
234 FILLORDER_MSB2LSB; | |
235 break; | |
236 case 'L': | |
237 tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORD
ER) | | |
238 FILLORDER_LSB2MSB; | |
239 break; | |
240 case 'H': | |
241 tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORD
ER) | | |
242 HOST_FILLORDER; | |
243 break; | |
244 case 'M': | |
245 if (m == O_RDONLY) | |
246 tif->tif_flags |= TIFF_MAPPED; | |
247 break; | |
248 case 'm': | |
249 if (m == O_RDONLY) | |
250 tif->tif_flags &= ~TIFF_MAPPED; | |
251 break; | |
252 case 'C': | |
253 if (m == O_RDONLY) | |
254 tif->tif_flags |= TIFF_STRIPCHOP; | |
255 break; | |
256 case 'c': | |
257 if (m == O_RDONLY) | |
258 tif->tif_flags &= ~TIFF_STRIPCHOP; | |
259 break; | |
260 case 'h': | |
261 tif->tif_flags |= TIFF_HEADERONLY; | |
262 break; | |
263 case '8': | |
264 if (m&O_CREAT) | |
265 tif->tif_flags |= TIFF_BIGTIFF; | |
266 break; | |
267 } | |
268 /* | |
269 * Read in TIFF header. | |
270 */ | |
271 if ((m & O_TRUNC) || | |
272 !ReadOK(tif, &tif->tif_header, sizeof (TIFFHeaderClassic))) { | |
273 if (tif->tif_mode == O_RDONLY) { | |
274 TIFFErrorExt(tif->tif_clientdata, name, | |
275 "Cannot read TIFF header"); | |
276 goto bad; | |
277 } | |
278 /* | |
279 * Setup header and write. | |
280 */ | |
281 #ifdef WORDS_BIGENDIAN | |
282 tif->tif_header.common.tiff_magic = tif->tif_flags & TIFF_SWAB | |
283 ? TIFF_LITTLEENDIAN : TIFF_BIGENDIAN; | |
284 #else | |
285 tif->tif_header.common.tiff_magic = tif->tif_flags & TIFF_SWAB | |
286 ? TIFF_BIGENDIAN : TIFF_LITTLEENDIAN; | |
287 #endif | |
288 if (!(tif->tif_flags&TIFF_BIGTIFF)) | |
289 { | |
290 tif->tif_header.common.tiff_version = TIFF_VERSION_CLASS
IC; | |
291 tif->tif_header.classic.tiff_diroff = 0; | |
292 if (tif->tif_flags & TIFF_SWAB) | |
293 TIFFSwabShort(&tif->tif_header.common.tiff_versi
on); | |
294 tif->tif_header_size = sizeof(TIFFHeaderClassic); | |
295 } | |
296 else | |
297 { | |
298 tif->tif_header.common.tiff_version = TIFF_VERSION_BIG; | |
299 tif->tif_header.big.tiff_offsetsize = 8; | |
300 tif->tif_header.big.tiff_unused = 0; | |
301 tif->tif_header.big.tiff_diroff = 0; | |
302 if (tif->tif_flags & TIFF_SWAB) | |
303 { | |
304 TIFFSwabShort(&tif->tif_header.common.tiff_versi
on); | |
305 TIFFSwabShort(&tif->tif_header.big.tiff_offsetsi
ze); | |
306 } | |
307 tif->tif_header_size = sizeof (TIFFHeaderBig); | |
308 } | |
309 /* | |
310 * The doc for "fopen" for some STD_C_LIBs says that if you | |
311 * open a file for modify ("+"), then you must fseek (or | |
312 * fflush?) between any freads and fwrites. This is not | |
313 * necessary on most systems, but has been shown to be needed | |
314 * on Solaris. | |
315 */ | |
316 TIFFSeekFile( tif, 0, SEEK_SET ); | |
317 if (!WriteOK(tif, &tif->tif_header, (tmsize_t)(tif->tif_header_s
ize))) { | |
318 TIFFErrorExt(tif->tif_clientdata, name, | |
319 "Error writing TIFF header"); | |
320 goto bad; | |
321 } | |
322 /* | |
323 * Setup the byte order handling. | |
324 */ | |
325 if (tif->tif_header.common.tiff_magic == TIFF_BIGENDIAN) { | |
326 #ifndef WORDS_BIGENDIAN | |
327 tif->tif_flags |= TIFF_SWAB; | |
328 #endif | |
329 } else { | |
330 #ifdef WORDS_BIGENDIAN | |
331 tif->tif_flags |= TIFF_SWAB; | |
332 #endif | |
333 } | |
334 /* | |
335 * Setup default directory. | |
336 */ | |
337 if (!TIFFDefaultDirectory(tif)) | |
338 goto bad; | |
339 tif->tif_diroff = 0; | |
340 tif->tif_dirlist = NULL; | |
341 tif->tif_dirlistsize = 0; | |
342 tif->tif_dirnumber = 0; | |
343 return (tif); | |
344 } | |
345 /* | |
346 * Setup the byte order handling. | |
347 */ | |
348 if (tif->tif_header.common.tiff_magic != TIFF_BIGENDIAN && | |
349 tif->tif_header.common.tiff_magic != TIFF_LITTLEENDIAN | |
350 #if MDI_SUPPORT | |
351 && | |
352 #if HOST_BIGENDIAN | |
353 tif->tif_header.common.tiff_magic != MDI_BIGENDIAN | |
354 #else | |
355 tif->tif_header.common.tiff_magic != MDI_LITTLEENDIAN | |
356 #endif | |
357 ) { | |
358 TIFFErrorExt(tif->tif_clientdata, name, | |
359 "Not a TIFF or MDI file, bad magic number %d (0x%x)", | |
360 #else | |
361 ) { | |
362 TIFFErrorExt(tif->tif_clientdata, name, | |
363 "Not a TIFF file, bad magic number %d (0x%x)", | |
364 #endif | |
365 tif->tif_header.common.tiff_magic, | |
366 tif->tif_header.common.tiff_magic); | |
367 goto bad; | |
368 } | |
369 if (tif->tif_header.common.tiff_magic == TIFF_BIGENDIAN) { | |
370 #ifndef WORDS_BIGENDIAN | |
371 tif->tif_flags |= TIFF_SWAB; | |
372 #endif | |
373 } else { | |
374 #ifdef WORDS_BIGENDIAN | |
375 tif->tif_flags |= TIFF_SWAB; | |
376 #endif | |
377 } | |
378 if (tif->tif_flags & TIFF_SWAB) | |
379 TIFFSwabShort(&tif->tif_header.common.tiff_version); | |
380 if ((tif->tif_header.common.tiff_version != TIFF_VERSION_CLASSIC)&& | |
381 (tif->tif_header.common.tiff_version != TIFF_VERSION_BIG)) { | |
382 TIFFErrorExt(tif->tif_clientdata, name, | |
383 "Not a TIFF file, bad version number %d (0x%x)", | |
384 tif->tif_header.common.tiff_version, | |
385 tif->tif_header.common.tiff_version); | |
386 goto bad; | |
387 } | |
388 if (tif->tif_header.common.tiff_version == TIFF_VERSION_CLASSIC) | |
389 { | |
390 if (tif->tif_flags & TIFF_SWAB) | |
391 TIFFSwabLong(&tif->tif_header.classic.tiff_diroff); | |
392 tif->tif_header_size = sizeof(TIFFHeaderClassic); | |
393 } | |
394 else | |
395 { | |
396 if (!ReadOK(tif, ((uint8*)(&tif->tif_header) + sizeof(TIFFHeader
Classic)), (sizeof(TIFFHeaderBig)-sizeof(TIFFHeaderClassic)))) | |
397 { | |
398 TIFFErrorExt(tif->tif_clientdata, name, | |
399 "Cannot read TIFF header"); | |
400 goto bad; | |
401 } | |
402 if (tif->tif_flags & TIFF_SWAB) | |
403 { | |
404 TIFFSwabShort(&tif->tif_header.big.tiff_offsetsize); | |
405 TIFFSwabLong8(&tif->tif_header.big.tiff_diroff); | |
406 } | |
407 if (tif->tif_header.big.tiff_offsetsize != 8) | |
408 { | |
409 TIFFErrorExt(tif->tif_clientdata, name, | |
410 "Not a TIFF file, bad BigTIFF offsetsize %d (0x%x)", | |
411 tif->tif_header.big.tiff_offsetsize, | |
412 tif->tif_header.big.tiff_offsetsize); | |
413 goto bad; | |
414 } | |
415 if (tif->tif_header.big.tiff_unused != 0) | |
416 { | |
417 TIFFErrorExt(tif->tif_clientdata, name, | |
418 "Not a TIFF file, bad BigTIFF unused %d (0x%x)", | |
419 tif->tif_header.big.tiff_unused, | |
420 tif->tif_header.big.tiff_unused); | |
421 goto bad; | |
422 } | |
423 tif->tif_header_size = sizeof(TIFFHeaderBig); | |
424 tif->tif_flags |= TIFF_BIGTIFF; | |
425 } | |
426 tif->tif_flags |= TIFF_MYBUFFER; | |
427 tif->tif_rawcp = tif->tif_rawdata = 0; | |
428 tif->tif_rawdatasize = 0; | |
429 tif->tif_rawdataoff = 0; | |
430 tif->tif_rawdataloaded = 0; | |
431 | |
432 switch (mode[0]) { | |
433 case 'r': | |
434 if (!(tif->tif_flags&TIFF_BIGTIFF)) | |
435 tif->tif_nextdiroff = tif->tif_header.classic.ti
ff_diroff; | |
436 else | |
437 tif->tif_nextdiroff = tif->tif_header.big.tiff_d
iroff; | |
438 /* | |
439 * Try to use a memory-mapped file if the client | |
440 * has not explicitly suppressed usage with the | |
441 * 'm' flag in the open mode (see above). | |
442 */ | |
443 if (tif->tif_flags & TIFF_MAPPED) | |
444 { | |
445 toff_t n; | |
446 if (TIFFMapFileContents(tif,(void**)(&tif->tif_b
ase),&n)) | |
447 { | |
448 tif->tif_size=(tmsize_t)n; | |
449 assert((toff_t)tif->tif_size==n); | |
450 } | |
451 else | |
452 tif->tif_flags &= ~TIFF_MAPPED; | |
453 } | |
454 /* | |
455 * Sometimes we do not want to read the first directory
(for example, | |
456 * it may be broken) and want to proceed to other direct
ories. I this | |
457 * case we use the TIFF_HEADERONLY flag to open file and
return | |
458 * immediately after reading TIFF header. | |
459 */ | |
460 if (tif->tif_flags & TIFF_HEADERONLY) | |
461 return (tif); | |
462 | |
463 /* | |
464 * Setup initial directory. | |
465 */ | |
466 if (TIFFReadDirectory(tif)) { | |
467 tif->tif_rawcc = (tmsize_t)-1; | |
468 tif->tif_flags |= TIFF_BUFFERSETUP; | |
469 return (tif); | |
470 } | |
471 break; | |
472 case 'a': | |
473 /* | |
474 * New directories are automatically append | |
475 * to the end of the directory chain when they | |
476 * are written out (see TIFFWriteDirectory). | |
477 */ | |
478 if (!TIFFDefaultDirectory(tif)) | |
479 goto bad; | |
480 return (tif); | |
481 } | |
482 bad: | |
483 tif->tif_mode = O_RDONLY; /* XXX avoid flush */ | |
484 TIFFCleanup(tif); | |
485 bad2: | |
486 return ((TIFF*)0); | |
487 } | |
488 | |
489 /* | |
490 * Query functions to access private data. | |
491 */ | |
492 | |
493 /* | |
494 * Return open file's name. | |
495 */ | |
496 const char * | |
497 TIFFFileName(TIFF* tif) | |
498 { | |
499 return (tif->tif_name); | |
500 } | |
501 | |
502 /* | |
503 * Set the file name. | |
504 */ | |
505 const char * | |
506 TIFFSetFileName(TIFF* tif, const char *name) | |
507 { | |
508 const char* old_name = tif->tif_name; | |
509 tif->tif_name = (char *)name; | |
510 return (old_name); | |
511 } | |
512 | |
513 /* | |
514 * Return open file's I/O descriptor. | |
515 */ | |
516 int | |
517 TIFFFileno(TIFF* tif) | |
518 { | |
519 return (tif->tif_fd); | |
520 } | |
521 | |
522 /* | |
523 * Set open file's I/O descriptor, and return previous value. | |
524 */ | |
525 int | |
526 TIFFSetFileno(TIFF* tif, int fd) | |
527 { | |
528 int old_fd = tif->tif_fd; | |
529 tif->tif_fd = fd; | |
530 return old_fd; | |
531 } | |
532 | |
533 /* | |
534 * Return open file's clientdata. | |
535 */ | |
536 thandle_t | |
537 TIFFClientdata(TIFF* tif) | |
538 { | |
539 return (tif->tif_clientdata); | |
540 } | |
541 | |
542 /* | |
543 * Set open file's clientdata, and return previous value. | |
544 */ | |
545 thandle_t | |
546 TIFFSetClientdata(TIFF* tif, thandle_t newvalue) | |
547 { | |
548 thandle_t m = tif->tif_clientdata; | |
549 tif->tif_clientdata = newvalue; | |
550 return m; | |
551 } | |
552 | |
553 /* | |
554 * Return read/write mode. | |
555 */ | |
556 int | |
557 TIFFGetMode(TIFF* tif) | |
558 { | |
559 return (tif->tif_mode); | |
560 } | |
561 | |
562 /* | |
563 * Return read/write mode. | |
564 */ | |
565 int | |
566 TIFFSetMode(TIFF* tif, int mode) | |
567 { | |
568 int old_mode = tif->tif_mode; | |
569 tif->tif_mode = mode; | |
570 return (old_mode); | |
571 } | |
572 | |
573 /* | |
574 * Return nonzero if file is organized in | |
575 * tiles; zero if organized as strips. | |
576 */ | |
577 int | |
578 TIFFIsTiled(TIFF* tif) | |
579 { | |
580 return (isTiled(tif)); | |
581 } | |
582 | |
583 /* | |
584 * Return current row being read/written. | |
585 */ | |
586 uint32 | |
587 TIFFCurrentRow(TIFF* tif) | |
588 { | |
589 return (tif->tif_row); | |
590 } | |
591 | |
592 /* | |
593 * Return index of the current directory. | |
594 */ | |
595 uint16 | |
596 TIFFCurrentDirectory(TIFF* tif) | |
597 { | |
598 return (tif->tif_curdir); | |
599 } | |
600 | |
601 /* | |
602 * Return current strip. | |
603 */ | |
604 uint32 | |
605 TIFFCurrentStrip(TIFF* tif) | |
606 { | |
607 return (tif->tif_curstrip); | |
608 } | |
609 | |
610 /* | |
611 * Return current tile. | |
612 */ | |
613 uint32 | |
614 TIFFCurrentTile(TIFF* tif) | |
615 { | |
616 return (tif->tif_curtile); | |
617 } | |
618 | |
619 /* | |
620 * Return nonzero if the file has byte-swapped data. | |
621 */ | |
622 int | |
623 TIFFIsByteSwapped(TIFF* tif) | |
624 { | |
625 return ((tif->tif_flags & TIFF_SWAB) != 0); | |
626 } | |
627 | |
628 /* | |
629 * Return nonzero if the data is returned up-sampled. | |
630 */ | |
631 int | |
632 TIFFIsUpSampled(TIFF* tif) | |
633 { | |
634 return (isUpSampled(tif)); | |
635 } | |
636 | |
637 /* | |
638 * Return nonzero if the data is returned in MSB-to-LSB bit order. | |
639 */ | |
640 int | |
641 TIFFIsMSB2LSB(TIFF* tif) | |
642 { | |
643 return (isFillOrder(tif, FILLORDER_MSB2LSB)); | |
644 } | |
645 | |
646 /* | |
647 * Return nonzero if given file was written in big-endian order. | |
648 */ | |
649 int | |
650 TIFFIsBigEndian(TIFF* tif) | |
651 { | |
652 return (tif->tif_header.common.tiff_magic == TIFF_BIGENDIAN); | |
653 } | |
654 | |
655 /* | |
656 * Return pointer to file read method. | |
657 */ | |
658 TIFFReadWriteProc | |
659 TIFFGetReadProc(TIFF* tif) | |
660 { | |
661 return (tif->tif_readproc); | |
662 } | |
663 | |
664 /* | |
665 * Return pointer to file write method. | |
666 */ | |
667 TIFFReadWriteProc | |
668 TIFFGetWriteProc(TIFF* tif) | |
669 { | |
670 return (tif->tif_writeproc); | |
671 } | |
672 | |
673 /* | |
674 * Return pointer to file seek method. | |
675 */ | |
676 TIFFSeekProc | |
677 TIFFGetSeekProc(TIFF* tif) | |
678 { | |
679 return (tif->tif_seekproc); | |
680 } | |
681 | |
682 /* | |
683 * Return pointer to file close method. | |
684 */ | |
685 TIFFCloseProc | |
686 TIFFGetCloseProc(TIFF* tif) | |
687 { | |
688 return (tif->tif_closeproc); | |
689 } | |
690 | |
691 /* | |
692 * Return pointer to file size requesting method. | |
693 */ | |
694 TIFFSizeProc | |
695 TIFFGetSizeProc(TIFF* tif) | |
696 { | |
697 return (tif->tif_sizeproc); | |
698 } | |
699 | |
700 /* | |
701 * Return pointer to memory mapping method. | |
702 */ | |
703 TIFFMapFileProc | |
704 TIFFGetMapFileProc(TIFF* tif) | |
705 { | |
706 return (tif->tif_mapproc); | |
707 } | |
708 | |
709 /* | |
710 * Return pointer to memory unmapping method. | |
711 */ | |
712 TIFFUnmapFileProc | |
713 TIFFGetUnmapFileProc(TIFF* tif) | |
714 { | |
715 return (tif->tif_unmapproc); | |
716 } | |
717 | |
718 /* vim: set ts=8 sts=8 sw=8 noet: */ | |
719 /* | |
720 * Local Variables: | |
721 * mode: c | |
722 * c-basic-offset: 8 | |
723 * fill-column: 78 | |
724 * End: | |
725 */ | |
726 | |
OLD | NEW |