xref: /aosp_15_r20/external/pdfium/third_party/libtiff/tif_dumpmode.c (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
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