1*3ac0a46fSAndroid Build Coastguard Worker /*
2*3ac0a46fSAndroid Build Coastguard Worker * Copyright (c) 1988-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 * "Null" Compression Algorithm Support.
29*3ac0a46fSAndroid Build Coastguard Worker */
30*3ac0a46fSAndroid Build Coastguard Worker #include "tiffiop.h"
31*3ac0a46fSAndroid Build Coastguard Worker
DumpFixupTags(TIFF * tif)32*3ac0a46fSAndroid Build Coastguard Worker static int DumpFixupTags(TIFF *tif)
33*3ac0a46fSAndroid Build Coastguard Worker {
34*3ac0a46fSAndroid Build Coastguard Worker (void)tif;
35*3ac0a46fSAndroid Build Coastguard Worker return (1);
36*3ac0a46fSAndroid Build Coastguard Worker }
37*3ac0a46fSAndroid Build Coastguard Worker
38*3ac0a46fSAndroid Build Coastguard Worker /*
39*3ac0a46fSAndroid Build Coastguard Worker * Encode a hunk of pixels.
40*3ac0a46fSAndroid Build Coastguard Worker */
DumpModeEncode(TIFF * tif,uint8_t * pp,tmsize_t cc,uint16_t s)41*3ac0a46fSAndroid Build Coastguard Worker static int DumpModeEncode(TIFF *tif, uint8_t *pp, tmsize_t cc, uint16_t s)
42*3ac0a46fSAndroid Build Coastguard Worker {
43*3ac0a46fSAndroid Build Coastguard Worker (void)s;
44*3ac0a46fSAndroid Build Coastguard Worker while (cc > 0)
45*3ac0a46fSAndroid Build Coastguard Worker {
46*3ac0a46fSAndroid Build Coastguard Worker tmsize_t n;
47*3ac0a46fSAndroid Build Coastguard Worker
48*3ac0a46fSAndroid Build Coastguard Worker n = cc;
49*3ac0a46fSAndroid Build Coastguard Worker if (tif->tif_rawcc + n > tif->tif_rawdatasize)
50*3ac0a46fSAndroid Build Coastguard Worker n = tif->tif_rawdatasize - tif->tif_rawcc;
51*3ac0a46fSAndroid Build Coastguard Worker
52*3ac0a46fSAndroid Build Coastguard Worker assert(n > 0);
53*3ac0a46fSAndroid Build Coastguard Worker
54*3ac0a46fSAndroid Build Coastguard Worker /*
55*3ac0a46fSAndroid Build Coastguard Worker * Avoid copy if client has setup raw
56*3ac0a46fSAndroid Build Coastguard Worker * data buffer to avoid extra copy.
57*3ac0a46fSAndroid Build Coastguard Worker */
58*3ac0a46fSAndroid Build Coastguard Worker if (tif->tif_rawcp != pp)
59*3ac0a46fSAndroid Build Coastguard Worker _TIFFmemcpy(tif->tif_rawcp, pp, n);
60*3ac0a46fSAndroid Build Coastguard Worker tif->tif_rawcp += n;
61*3ac0a46fSAndroid Build Coastguard Worker tif->tif_rawcc += n;
62*3ac0a46fSAndroid Build Coastguard Worker pp += n;
63*3ac0a46fSAndroid Build Coastguard Worker cc -= n;
64*3ac0a46fSAndroid Build Coastguard Worker if (tif->tif_rawcc >= tif->tif_rawdatasize && !TIFFFlushData1(tif))
65*3ac0a46fSAndroid Build Coastguard Worker return (0);
66*3ac0a46fSAndroid Build Coastguard Worker }
67*3ac0a46fSAndroid Build Coastguard Worker return (1);
68*3ac0a46fSAndroid Build Coastguard Worker }
69*3ac0a46fSAndroid Build Coastguard Worker
70*3ac0a46fSAndroid Build Coastguard Worker /*
71*3ac0a46fSAndroid Build Coastguard Worker * Decode a hunk of pixels.
72*3ac0a46fSAndroid Build Coastguard Worker */
DumpModeDecode(TIFF * tif,uint8_t * buf,tmsize_t cc,uint16_t s)73*3ac0a46fSAndroid Build Coastguard Worker static int DumpModeDecode(TIFF *tif, uint8_t *buf, tmsize_t cc, uint16_t s)
74*3ac0a46fSAndroid Build Coastguard Worker {
75*3ac0a46fSAndroid Build Coastguard Worker static const char module[] = "DumpModeDecode";
76*3ac0a46fSAndroid Build Coastguard Worker (void)s;
77*3ac0a46fSAndroid Build Coastguard Worker if (tif->tif_rawcc < cc)
78*3ac0a46fSAndroid Build Coastguard Worker {
79*3ac0a46fSAndroid Build Coastguard Worker TIFFErrorExtR(tif, module,
80*3ac0a46fSAndroid Build Coastguard Worker "Not enough data for scanline %" PRIu32
81*3ac0a46fSAndroid Build Coastguard Worker ", expected a request for at most %" TIFF_SSIZE_FORMAT
82*3ac0a46fSAndroid Build Coastguard Worker " bytes, got a request for %" TIFF_SSIZE_FORMAT " bytes",
83*3ac0a46fSAndroid Build Coastguard Worker tif->tif_row, tif->tif_rawcc, cc);
84*3ac0a46fSAndroid Build Coastguard Worker return (0);
85*3ac0a46fSAndroid Build Coastguard Worker }
86*3ac0a46fSAndroid Build Coastguard Worker /*
87*3ac0a46fSAndroid Build Coastguard Worker * Avoid copy if client has setup raw
88*3ac0a46fSAndroid Build Coastguard Worker * data buffer to avoid extra copy.
89*3ac0a46fSAndroid Build Coastguard Worker */
90*3ac0a46fSAndroid Build Coastguard Worker if (tif->tif_rawcp != buf)
91*3ac0a46fSAndroid Build Coastguard Worker _TIFFmemcpy(buf, tif->tif_rawcp, cc);
92*3ac0a46fSAndroid Build Coastguard Worker tif->tif_rawcp += cc;
93*3ac0a46fSAndroid Build Coastguard Worker tif->tif_rawcc -= cc;
94*3ac0a46fSAndroid Build Coastguard Worker return (1);
95*3ac0a46fSAndroid Build Coastguard Worker }
96*3ac0a46fSAndroid Build Coastguard Worker
97*3ac0a46fSAndroid Build Coastguard Worker /*
98*3ac0a46fSAndroid Build Coastguard Worker * Seek forwards nrows in the current strip.
99*3ac0a46fSAndroid Build Coastguard Worker */
DumpModeSeek(TIFF * tif,uint32_t nrows)100*3ac0a46fSAndroid Build Coastguard Worker static int DumpModeSeek(TIFF *tif, uint32_t nrows)
101*3ac0a46fSAndroid Build Coastguard Worker {
102*3ac0a46fSAndroid Build Coastguard Worker tif->tif_rawcp += nrows * tif->tif_scanlinesize;
103*3ac0a46fSAndroid Build Coastguard Worker tif->tif_rawcc -= nrows * tif->tif_scanlinesize;
104*3ac0a46fSAndroid Build Coastguard Worker return (1);
105*3ac0a46fSAndroid Build Coastguard Worker }
106*3ac0a46fSAndroid Build Coastguard Worker
107*3ac0a46fSAndroid Build Coastguard Worker /*
108*3ac0a46fSAndroid Build Coastguard Worker * Initialize dump mode.
109*3ac0a46fSAndroid Build Coastguard Worker */
TIFFInitDumpMode(TIFF * tif,int scheme)110*3ac0a46fSAndroid Build Coastguard Worker int TIFFInitDumpMode(TIFF *tif, int scheme)
111*3ac0a46fSAndroid Build Coastguard Worker {
112*3ac0a46fSAndroid Build Coastguard Worker (void)scheme;
113*3ac0a46fSAndroid Build Coastguard Worker tif->tif_fixuptags = DumpFixupTags;
114*3ac0a46fSAndroid Build Coastguard Worker tif->tif_decoderow = DumpModeDecode;
115*3ac0a46fSAndroid Build Coastguard Worker tif->tif_decodestrip = DumpModeDecode;
116*3ac0a46fSAndroid Build Coastguard Worker tif->tif_decodetile = DumpModeDecode;
117*3ac0a46fSAndroid Build Coastguard Worker tif->tif_encoderow = DumpModeEncode;
118*3ac0a46fSAndroid Build Coastguard Worker tif->tif_encodestrip = DumpModeEncode;
119*3ac0a46fSAndroid Build Coastguard Worker tif->tif_encodetile = DumpModeEncode;
120*3ac0a46fSAndroid Build Coastguard Worker tif->tif_seek = DumpModeSeek;
121*3ac0a46fSAndroid Build Coastguard Worker return (1);
122*3ac0a46fSAndroid Build Coastguard Worker }
123