1 /* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* ***** BEGIN LICENSE BLOCK *****
3 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4 *
5 * The contents of this file are subject to the Mozilla Public License Version
6 * 1.1 (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 * http://www.mozilla.org/MPL/
9 *
10 * Software distributed under the License is distributed on an "AS IS" basis,
11 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12 * for the specific language governing rights and limitations under the
13 * License.
14 *
15 * The Original Code is mozilla.org code.
16 *
17 * The Initial Developer of the Original Code is
18 * Netscape Communications Corporation.
19 * Portions created by the Initial Developer are Copyright (C) 1998
20 * the Initial Developer. All Rights Reserved.
21 *
22 * Contributor(s):
23 * Chris Saari <saari@netscape.com>
24 * Apple Computer
25 *
26 * Alternatively, the contents of this file may be used under the terms of
27 * either the GNU General Public License Version 2 or later (the "GPL"), or
28 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
29 * in which case the provisions of the GPL or the LGPL are applicable instead
30 * of those above. If you wish to allow use of your version of this file only
31 * under the terms of either the GPL or the LGPL, and not to allow others to
32 * use your version of this file under the terms of the MPL, indicate your
33 * decision by deleting the provisions above and replace them with the notice
34 * and other provisions required by the GPL or the LGPL. If you do not delete
35 * the provisions above, a recipient may use your version of this file under
36 * the terms of any one of the MPL, the GPL or the LGPL.
37 *
38 * ***** END LICENSE BLOCK ***** */
39
40 /*
41 The Graphics Interchange Format(c) is the copyright property of CompuServe
42 Incorporated. Only CompuServe Incorporated is authorized to define, redefine,
43 enhance, alter, modify or change in any way the definition of the format.
44
45 CompuServe Incorporated hereby grants a limited, non-exclusive, royalty-free
46 license for the use of the Graphics Interchange Format(sm) in computer
47 software; computer software utilizing GIF(sm) must acknowledge ownership of the
48 Graphics Interchange Format and its Service Mark by CompuServe Incorporated, in
49 User and Technical Documentation. Computer software utilizing GIF, which is
50 distributed or may be distributed without User or Technical Documentation must
51 display to the screen or printer a message acknowledging ownership of the
52 Graphics Interchange Format and the Service Mark by CompuServe Incorporated; in
53 this case, the acknowledgement may be displayed in an opening screen or leading
54 banner, or a closing screen or trailing banner. A message such as the following
55 may be used:
56
57 "The Graphics Interchange Format(c) is the Copyright property of
58 CompuServe Incorporated. GIF(sm) is a Service Mark property of
59 CompuServe Incorporated."
60
61 For further information, please contact :
62
63 CompuServe Incorporated
64 Graphics Technology Department
65 5000 Arlington Center Boulevard
66 Columbus, Ohio 43220
67 U. S. A.
68
69 CompuServe Incorporated maintains a mailing list with all those individuals and
70 organizations who wish to receive copies of this document when it is corrected
71 or revised. This service is offered free of charge; please provide us with your
72 mailing address.
73 */
74
75 #include "SkGifImageReader.h"
76 #include "SkColorPriv.h"
77 #include "SkGifCodec.h"
78
79 #include <algorithm>
80 #include <string.h>
81
82
83 // GETN(n, s) requests at least 'n' bytes available from 'q', at start of state 's'.
84 //
85 // Note, the hold will never need to be bigger than 256 bytes to gather up in the hold,
86 // as each GIF block (except colormaps) can never be bigger than 256 bytes.
87 // Colormaps are directly copied in the resp. global_colormap or dynamically allocated local_colormap.
88 // So a fixed buffer in SkGifImageReader is good enough.
89 // This buffer is only needed to copy left-over data from one GifWrite call to the next
90 #define GETN(n, s) \
91 do { \
92 m_bytesToConsume = (n); \
93 m_state = (s); \
94 } while (0)
95
96 // Get a 16-bit value stored in little-endian format.
97 #define GETINT16(p) ((p)[1]<<8|(p)[0])
98
99 namespace {
is_palette_index_valid(int transparentIndex)100 bool is_palette_index_valid(int transparentIndex) {
101 // -1 is a signal that there is no transparent index.
102 // Otherwise, it is encoded in 8 bits, and all 256 values are considered
103 // valid since a GIF may use an index outside of the palette to be
104 // transparent.
105 return transparentIndex >= 0;
106 }
107 } // anonymous namespace
108
109 // Send the data to the display front-end.
outputRow(const unsigned char * rowBegin)110 void SkGIFLZWContext::outputRow(const unsigned char* rowBegin)
111 {
112 int drowStart = irow;
113 int drowEnd = irow;
114
115 // Haeberli-inspired hack for interlaced GIFs: Replicate lines while
116 // displaying to diminish the "venetian-blind" effect as the image is
117 // loaded. Adjust pixel vertical positions to avoid the appearance of the
118 // image crawling up the screen as successive passes are drawn.
119 if (m_frameContext->progressiveDisplay() && m_frameContext->interlaced() && ipass < 4) {
120 unsigned rowDup = 0;
121 unsigned rowShift = 0;
122
123 switch (ipass) {
124 case 1:
125 rowDup = 7;
126 rowShift = 3;
127 break;
128 case 2:
129 rowDup = 3;
130 rowShift = 1;
131 break;
132 case 3:
133 rowDup = 1;
134 rowShift = 0;
135 break;
136 default:
137 break;
138 }
139
140 drowStart -= rowShift;
141 drowEnd = drowStart + rowDup;
142
143 // Extend if bottom edge isn't covered because of the shift upward.
144 if ((unsigned)((m_frameContext->height() - 1) - drowEnd) <= rowShift)
145 drowEnd = m_frameContext->height() - 1;
146
147 // Clamp first and last rows to upper and lower edge of image.
148 if (drowStart < 0)
149 drowStart = 0;
150
151 if (drowEnd >= m_frameContext->height())
152 drowEnd = m_frameContext->height() - 1;
153 }
154
155 // Protect against too much image data.
156 if (drowStart >= m_frameContext->height())
157 return;
158
159 // CALLBACK: Let the client know we have decoded a row.
160 const bool writeTransparentPixels =
161 SkCodec::kNoFrame == m_frameContext->getRequiredFrame();
162 m_client->haveDecodedRow(m_frameContext->frameId(), rowBegin,
163 drowStart, drowEnd - drowStart + 1, writeTransparentPixels);
164
165 if (!m_frameContext->interlaced())
166 irow++;
167 else {
168 do {
169 switch (ipass) {
170 case 1:
171 irow += 8;
172 if (irow >= (unsigned) m_frameContext->height()) {
173 ipass++;
174 irow = 4;
175 }
176 break;
177
178 case 2:
179 irow += 8;
180 if (irow >= (unsigned) m_frameContext->height()) {
181 ipass++;
182 irow = 2;
183 }
184 break;
185
186 case 3:
187 irow += 4;
188 if (irow >= (unsigned) m_frameContext->height()) {
189 ipass++;
190 irow = 1;
191 }
192 break;
193
194 case 4:
195 irow += 2;
196 if (irow >= (unsigned) m_frameContext->height()) {
197 ipass++;
198 irow = 0;
199 }
200 break;
201
202 default:
203 break;
204 }
205 } while (irow > (unsigned) (m_frameContext->height() - 1));
206 }
207 }
208
209 // Perform Lempel-Ziv-Welch decoding.
210 // Returns true if decoding was successful. In this case the block will have been completely consumed and/or rowsRemaining will be 0.
211 // Otherwise, decoding failed; returns false in this case, which will always cause the SkGifImageReader to set the "decode failed" flag.
doLZW(const unsigned char * block,size_t bytesInBlock)212 bool SkGIFLZWContext::doLZW(const unsigned char* block, size_t bytesInBlock)
213 {
214 const int width = m_frameContext->width();
215
216 if (rowIter == rowBuffer.end())
217 return true;
218
219 for (const unsigned char* ch = block; bytesInBlock-- > 0; ch++) {
220 // Feed the next byte into the decoder's 32-bit input buffer.
221 datum += ((int) *ch) << bits;
222 bits += 8;
223
224 // Check for underflow of decoder's 32-bit input buffer.
225 while (bits >= codesize) {
226 // Get the leading variable-length symbol from the data stream.
227 int code = datum & codemask;
228 datum >>= codesize;
229 bits -= codesize;
230
231 // Reset the dictionary to its original state, if requested.
232 if (code == clearCode) {
233 codesize = m_frameContext->dataSize() + 1;
234 codemask = (1 << codesize) - 1;
235 avail = clearCode + 2;
236 oldcode = -1;
237 continue;
238 }
239
240 // Check for explicit end-of-stream code.
241 if (code == (clearCode + 1)) {
242 // end-of-stream should only appear after all image data.
243 if (!rowsRemaining)
244 return true;
245 return false;
246 }
247
248 const int tempCode = code;
249 unsigned short codeLength = 0;
250 if (code < avail) {
251 // This is a pre-existing code, so we already know what it
252 // encodes.
253 codeLength = suffixLength[code];
254 rowIter += codeLength;
255 } else if (code == avail && oldcode != -1) {
256 // This is a new code just being added to the dictionary.
257 // It must encode the contents of the previous code, plus
258 // the first character of the previous code again.
259 codeLength = suffixLength[oldcode] + 1;
260 rowIter += codeLength;
261 *--rowIter = firstchar;
262 code = oldcode;
263 } else {
264 // This is an invalid code. The dictionary is just initialized
265 // and the code is incomplete. We don't know how to handle
266 // this case.
267 return false;
268 }
269
270 while (code >= clearCode) {
271 *--rowIter = suffix[code];
272 code = prefix[code];
273 }
274
275 *--rowIter = firstchar = suffix[code];
276
277 // Define a new codeword in the dictionary as long as we've read
278 // more than one value from the stream.
279 if (avail < SK_MAX_DICTIONARY_ENTRIES && oldcode != -1) {
280 prefix[avail] = oldcode;
281 suffix[avail] = firstchar;
282 suffixLength[avail] = suffixLength[oldcode] + 1;
283 ++avail;
284
285 // If we've used up all the codewords of a given length
286 // increase the length of codewords by one bit, but don't
287 // exceed the specified maximum codeword size.
288 if (!(avail & codemask) && avail < SK_MAX_DICTIONARY_ENTRIES) {
289 ++codesize;
290 codemask += avail;
291 }
292 }
293 oldcode = tempCode;
294 rowIter += codeLength;
295
296 // Output as many rows as possible.
297 unsigned char* rowBegin = rowBuffer.begin();
298 for (; rowBegin + width <= rowIter; rowBegin += width) {
299 outputRow(rowBegin);
300 rowsRemaining--;
301 if (!rowsRemaining)
302 return true;
303 }
304
305 if (rowBegin != rowBuffer.begin()) {
306 // Move the remaining bytes to the beginning of the buffer.
307 const size_t bytesToCopy = rowIter - rowBegin;
308 memcpy(&rowBuffer.front(), rowBegin, bytesToCopy);
309 rowIter = rowBuffer.begin() + bytesToCopy;
310 }
311 }
312 }
313 return true;
314 }
315
buildTable(SkStreamBuffer * streamBuffer,SkColorType colorType,int transparentPixel) const316 sk_sp<SkColorTable> SkGIFColorMap::buildTable(SkStreamBuffer* streamBuffer, SkColorType colorType,
317 int transparentPixel) const
318 {
319 if (!m_isDefined)
320 return nullptr;
321
322 const PackColorProc proc = choose_pack_color_proc(false, colorType);
323 if (m_table && proc == m_packColorProc && m_transPixel == transparentPixel) {
324 SkASSERT(transparentPixel == kNotFound || transparentPixel > m_table->count()
325 || m_table->operator[](transparentPixel) == SK_ColorTRANSPARENT);
326 // This SkColorTable has already been built with the same transparent color and
327 // packing proc. Reuse it.
328 return m_table;
329 }
330 m_packColorProc = proc;
331 m_transPixel = transparentPixel;
332
333 const size_t bytes = m_colors * SK_BYTES_PER_COLORMAP_ENTRY;
334 sk_sp<SkData> rawData(streamBuffer->getDataAtPosition(m_position, bytes));
335 if (!rawData) {
336 return nullptr;
337 }
338
339 SkASSERT(m_colors <= SK_MAX_COLORS);
340 const uint8_t* srcColormap = rawData->bytes();
341 SkPMColor colorStorage[SK_MAX_COLORS];
342 for (int i = 0; i < m_colors; i++) {
343 if (i == transparentPixel) {
344 colorStorage[i] = SK_ColorTRANSPARENT;
345 } else {
346 colorStorage[i] = proc(255, srcColormap[0], srcColormap[1], srcColormap[2]);
347 }
348 srcColormap += SK_BYTES_PER_COLORMAP_ENTRY;
349 }
350 for (int i = m_colors; i < SK_MAX_COLORS; i++) {
351 colorStorage[i] = SK_ColorTRANSPARENT;
352 }
353 m_table = sk_sp<SkColorTable>(new SkColorTable(colorStorage, SK_MAX_COLORS));
354 return m_table;
355 }
356
getColorTable(SkColorType colorType,int index)357 sk_sp<SkColorTable> SkGifImageReader::getColorTable(SkColorType colorType, int index) {
358 if (index < 0 || index >= m_frames.count()) {
359 return nullptr;
360 }
361
362 const SkGIFFrameContext* frameContext = m_frames[index].get();
363 const SkGIFColorMap& localColorMap = frameContext->localColorMap();
364 const int transPix = frameContext->transparentPixel();
365 if (localColorMap.isDefined()) {
366 return localColorMap.buildTable(&m_streamBuffer, colorType, transPix);
367 }
368 if (m_globalColorMap.isDefined()) {
369 return m_globalColorMap.buildTable(&m_streamBuffer, colorType, transPix);
370 }
371 return nullptr;
372 }
373
374 // Perform decoding for this frame. frameComplete will be true if the entire frame is decoded.
375 // Returns false if a decoding error occurred. This is a fatal error and causes the SkGifImageReader to set the "decode failed" flag.
376 // Otherwise, either not enough data is available to decode further than before, or the new data has been decoded successfully; returns true in this case.
decode(SkStreamBuffer * streamBuffer,SkGifCodec * client,bool * frameComplete)377 bool SkGIFFrameContext::decode(SkStreamBuffer* streamBuffer, SkGifCodec* client,
378 bool* frameComplete)
379 {
380 *frameComplete = false;
381 if (!m_lzwContext) {
382 // Wait for more data to properly initialize SkGIFLZWContext.
383 if (!isDataSizeDefined() || !isHeaderDefined())
384 return true;
385
386 m_lzwContext.reset(new SkGIFLZWContext(client, this));
387 if (!m_lzwContext->prepareToDecode()) {
388 m_lzwContext.reset();
389 return false;
390 }
391
392 m_currentLzwBlock = 0;
393 }
394
395 // Some bad GIFs have extra blocks beyond the last row, which we don't want to decode.
396 while (m_currentLzwBlock < m_lzwBlocks.count() && m_lzwContext->hasRemainingRows()) {
397 const auto& block = m_lzwBlocks[m_currentLzwBlock];
398 const size_t len = block.blockSize;
399
400 sk_sp<SkData> data(streamBuffer->getDataAtPosition(block.blockPosition, len));
401 if (!data) {
402 return false;
403 }
404 if (!m_lzwContext->doLZW(reinterpret_cast<const unsigned char*>(data->data()), len)) {
405 return false;
406 }
407 ++m_currentLzwBlock;
408 }
409
410 // If this frame is data complete then the previous loop must have completely decoded all LZW blocks.
411 // There will be no more decoding for this frame so it's time to cleanup.
412 if (isComplete()) {
413 *frameComplete = true;
414 m_lzwContext.reset();
415 }
416 return true;
417 }
418
419 // Decode a frame.
420 // This method uses SkGIFFrameContext:decode() to decode the frame; decoding error is reported to client as a critical failure.
421 // Return true if decoding has progressed. Return false if an error has occurred.
decode(int frameIndex,bool * frameComplete)422 bool SkGifImageReader::decode(int frameIndex, bool* frameComplete)
423 {
424 SkGIFFrameContext* currentFrame = m_frames[frameIndex].get();
425
426 return currentFrame->decode(&m_streamBuffer, m_client, frameComplete);
427 }
428
429 // Parse incoming GIF data stream into internal data structures.
parse(SkGifImageReader::SkGIFParseQuery query)430 SkCodec::Result SkGifImageReader::parse(SkGifImageReader::SkGIFParseQuery query)
431 {
432 if (m_parseCompleted) {
433 return SkCodec::kSuccess;
434 }
435
436 if (SkGIFLoopCountQuery == query && m_loopCount != cLoopCountNotSeen) {
437 // Loop count has already been parsed.
438 return SkCodec::kSuccess;
439 }
440
441 // SkGIFSizeQuery and SkGIFFrameCountQuery are negative, so this is only meaningful when >= 0.
442 const int lastFrameToParse = (int) query;
443 if (lastFrameToParse >= 0 && m_frames.count() > lastFrameToParse
444 && m_frames[lastFrameToParse]->isComplete()) {
445 // We have already parsed this frame.
446 return SkCodec::kSuccess;
447 }
448
449 while (true) {
450 if (!m_streamBuffer.buffer(m_bytesToConsume)) {
451 // The stream does not yet have enough data.
452 return SkCodec::kIncompleteInput;
453 }
454
455 switch (m_state) {
456 case SkGIFLZW: {
457 SkASSERT(!m_frames.empty());
458 auto* frame = m_frames.back().get();
459 frame->addLzwBlock(m_streamBuffer.markPosition(), m_bytesToConsume);
460 GETN(1, SkGIFSubBlock);
461 break;
462 }
463 case SkGIFLZWStart: {
464 SkASSERT(!m_frames.empty());
465 auto* currentFrame = m_frames.back().get();
466
467 currentFrame->setDataSize(this->getOneByte());
468 GETN(1, SkGIFSubBlock);
469 break;
470 }
471
472 case SkGIFType: {
473 const char* currentComponent = m_streamBuffer.get();
474
475 // All GIF files begin with "GIF87a" or "GIF89a".
476 if (!memcmp(currentComponent, "GIF89a", 6))
477 m_version = 89;
478 else if (!memcmp(currentComponent, "GIF87a", 6))
479 m_version = 87;
480 else {
481 // This prevents attempting to continue reading this invalid stream.
482 GETN(0, SkGIFDone);
483 return SkCodec::kInvalidInput;
484 }
485 GETN(7, SkGIFGlobalHeader);
486 break;
487 }
488
489 case SkGIFGlobalHeader: {
490 const unsigned char* currentComponent =
491 reinterpret_cast<const unsigned char*>(m_streamBuffer.get());
492
493 // This is the height and width of the "screen" or frame into which
494 // images are rendered. The individual images can be smaller than
495 // the screen size and located with an origin anywhere within the
496 // screen.
497 // Note that we don't inform the client of the size yet, as it might
498 // change after we read the first frame's image header.
499 fScreenWidth = GETINT16(currentComponent);
500 fScreenHeight = GETINT16(currentComponent + 2);
501
502 const int globalColorMapColors = 2 << (currentComponent[4] & 0x07);
503
504 if ((currentComponent[4] & 0x80) && globalColorMapColors > 0) { /* global map */
505 m_globalColorMap.setNumColors(globalColorMapColors);
506 GETN(SK_BYTES_PER_COLORMAP_ENTRY * globalColorMapColors, SkGIFGlobalColormap);
507 break;
508 }
509
510 GETN(1, SkGIFImageStart);
511 break;
512 }
513
514 case SkGIFGlobalColormap: {
515 m_globalColorMap.setTablePosition(m_streamBuffer.markPosition());
516 GETN(1, SkGIFImageStart);
517 break;
518 }
519
520 case SkGIFImageStart: {
521 const char currentComponent = m_streamBuffer.get()[0];
522
523 if (currentComponent == '!') { // extension.
524 GETN(2, SkGIFExtension);
525 break;
526 }
527
528 if (currentComponent == ',') { // image separator.
529 GETN(9, SkGIFImageHeader);
530 break;
531 }
532
533 // If we get anything other than ',' (image separator), '!'
534 // (extension), or ';' (trailer), there is extraneous data
535 // between blocks. The GIF87a spec tells us to keep reading
536 // until we find an image separator, but GIF89a says such
537 // a file is corrupt. We follow Mozilla's implementation and
538 // proceed as if the file were correctly terminated, so the
539 // GIF will display.
540 GETN(0, SkGIFDone);
541 break;
542 }
543
544 case SkGIFExtension: {
545 const unsigned char* currentComponent =
546 reinterpret_cast<const unsigned char*>(m_streamBuffer.get());
547
548 size_t bytesInBlock = currentComponent[1];
549 SkGIFState exceptionState = SkGIFSkipBlock;
550
551 switch (*currentComponent) {
552 case 0xf9:
553 // The GIF spec mandates that the GIFControlExtension header block length is 4 bytes,
554 exceptionState = SkGIFControlExtension;
555 // and the parser for this block reads 4 bytes, so we must enforce that the buffer
556 // contains at least this many bytes. If the GIF specifies a different length, we
557 // allow that, so long as it's larger; the additional data will simply be ignored.
558 bytesInBlock = std::max(bytesInBlock, static_cast<size_t>(4));
559 break;
560
561 // The GIF spec also specifies the lengths of the following two extensions' headers
562 // (as 12 and 11 bytes, respectively). Because we ignore the plain text extension entirely
563 // and sanity-check the actual length of the application extension header before reading it,
564 // we allow GIFs to deviate from these values in either direction. This is important for
565 // real-world compatibility, as GIFs in the wild exist with application extension headers
566 // that are both shorter and longer than 11 bytes.
567 case 0x01:
568 // ignoring plain text extension
569 break;
570
571 case 0xff:
572 exceptionState = SkGIFApplicationExtension;
573 break;
574
575 case 0xfe:
576 exceptionState = SkGIFConsumeComment;
577 break;
578 }
579
580 if (bytesInBlock)
581 GETN(bytesInBlock, exceptionState);
582 else
583 GETN(1, SkGIFImageStart);
584 break;
585 }
586
587 case SkGIFConsumeBlock: {
588 const unsigned char currentComponent = this->getOneByte();
589 if (!currentComponent)
590 GETN(1, SkGIFImageStart);
591 else
592 GETN(currentComponent, SkGIFSkipBlock);
593 break;
594 }
595
596 case SkGIFSkipBlock: {
597 GETN(1, SkGIFConsumeBlock);
598 break;
599 }
600
601 case SkGIFControlExtension: {
602 const unsigned char* currentComponent =
603 reinterpret_cast<const unsigned char*>(m_streamBuffer.get());
604
605 addFrameIfNecessary();
606 SkGIFFrameContext* currentFrame = m_frames.back().get();
607 if (*currentComponent & 0x1)
608 currentFrame->setTransparentPixel(currentComponent[3]);
609
610 // We ignore the "user input" bit.
611
612 // NOTE: This relies on the values in the FrameDisposalMethod enum
613 // matching those in the GIF spec!
614 int rawDisposalMethod = ((*currentComponent) >> 2) & 0x7;
615 switch (rawDisposalMethod) {
616 case 1:
617 case 2:
618 case 3:
619 currentFrame->setDisposalMethod((SkCodecAnimation::DisposalMethod) rawDisposalMethod);
620 break;
621 case 4:
622 // Some specs say that disposal method 3 is "overwrite previous", others that setting
623 // the third bit of the field (i.e. method 4) is. We map both to the same value.
624 currentFrame->setDisposalMethod(SkCodecAnimation::DisposalMethod::kRestorePrevious);
625 break;
626 default:
627 // Other values use the default.
628 currentFrame->setDisposalMethod(SkCodecAnimation::DisposalMethod::kKeep);
629 break;
630 }
631 currentFrame->setDuration(GETINT16(currentComponent + 1) * 10);
632 GETN(1, SkGIFConsumeBlock);
633 break;
634 }
635
636 case SkGIFCommentExtension: {
637 const unsigned char currentComponent = this->getOneByte();
638 if (currentComponent)
639 GETN(currentComponent, SkGIFConsumeComment);
640 else
641 GETN(1, SkGIFImageStart);
642 break;
643 }
644
645 case SkGIFConsumeComment: {
646 GETN(1, SkGIFCommentExtension);
647 break;
648 }
649
650 case SkGIFApplicationExtension: {
651 // Check for netscape application extension.
652 if (m_bytesToConsume == 11) {
653 const unsigned char* currentComponent =
654 reinterpret_cast<const unsigned char*>(m_streamBuffer.get());
655
656 if (!memcmp(currentComponent, "NETSCAPE2.0", 11) || !memcmp(currentComponent, "ANIMEXTS1.0", 11))
657 GETN(1, SkGIFNetscapeExtensionBlock);
658 }
659
660 if (m_state != SkGIFNetscapeExtensionBlock)
661 GETN(1, SkGIFConsumeBlock);
662 break;
663 }
664
665 // Netscape-specific GIF extension: animation looping.
666 case SkGIFNetscapeExtensionBlock: {
667 const int currentComponent = this->getOneByte();
668 // SkGIFConsumeNetscapeExtension always reads 3 bytes from the stream; we should at least wait for this amount.
669 if (currentComponent)
670 GETN(std::max(3, currentComponent), SkGIFConsumeNetscapeExtension);
671 else
672 GETN(1, SkGIFImageStart);
673 break;
674 }
675
676 // Parse netscape-specific application extensions
677 case SkGIFConsumeNetscapeExtension: {
678 const unsigned char* currentComponent =
679 reinterpret_cast<const unsigned char*>(m_streamBuffer.get());
680
681 int netscapeExtension = currentComponent[0] & 7;
682
683 // Loop entire animation specified # of times. Only read the loop count during the first iteration.
684 if (netscapeExtension == 1) {
685 m_loopCount = GETINT16(currentComponent + 1);
686
687 // Zero loop count is infinite animation loop request.
688 if (!m_loopCount)
689 m_loopCount = SkCodec::kRepetitionCountInfinite;
690
691 GETN(1, SkGIFNetscapeExtensionBlock);
692
693 if (SkGIFLoopCountQuery == query) {
694 m_streamBuffer.flush();
695 return SkCodec::kSuccess;
696 }
697 } else if (netscapeExtension == 2) {
698 // Wait for specified # of bytes to enter buffer.
699
700 // Don't do this, this extension doesn't exist (isn't used at all)
701 // and doesn't do anything, as our streaming/buffering takes care of it all...
702 // See: http://semmix.pl/color/exgraf/eeg24.htm
703 GETN(1, SkGIFNetscapeExtensionBlock);
704 } else {
705 // 0,3-7 are yet to be defined netscape extension codes
706 // This prevents attempting to continue reading this invalid stream.
707 GETN(0, SkGIFDone);
708 return SkCodec::kInvalidInput;
709 }
710 break;
711 }
712
713 case SkGIFImageHeader: {
714 int height, width, xOffset, yOffset;
715 const unsigned char* currentComponent =
716 reinterpret_cast<const unsigned char*>(m_streamBuffer.get());
717
718 /* Get image offsets, with respect to the screen origin */
719 xOffset = GETINT16(currentComponent);
720 yOffset = GETINT16(currentComponent + 2);
721
722 /* Get image width and height. */
723 width = GETINT16(currentComponent + 4);
724 height = GETINT16(currentComponent + 6);
725
726 // Some GIF files have frames that don't fit in the specified
727 // overall image size. For the first frame, we can simply enlarge
728 // the image size to allow the frame to be visible. We can't do
729 // this on subsequent frames because the rest of the decoding
730 // infrastructure assumes the image size won't change as we
731 // continue decoding, so any subsequent frames that are even
732 // larger will be cropped.
733 // Luckily, handling just the first frame is sufficient to deal
734 // with most cases, e.g. ones where the image size is erroneously
735 // set to zero, since usually the first frame completely fills
736 // the image.
737 if (currentFrameIsFirstFrame()) {
738 fScreenHeight = std::max(fScreenHeight, yOffset + height);
739 fScreenWidth = std::max(fScreenWidth, xOffset + width);
740 }
741
742 // NOTE: Chromium placed this block after setHeaderDefined, down
743 // below we returned true when asked for the size. So Chromium
744 // created an image which would fail. Is this the correct behavior?
745 // We choose to return false early, so we will not create an
746 // SkCodec.
747
748 // Work around more broken GIF files that have zero image width or
749 // height.
750 if (!height || !width) {
751 height = fScreenHeight;
752 width = fScreenWidth;
753 if (!height || !width) {
754 // This prevents attempting to continue reading this invalid stream.
755 GETN(0, SkGIFDone);
756 return SkCodec::kInvalidInput;
757 }
758 }
759
760 const bool isLocalColormapDefined = SkToBool(currentComponent[8] & 0x80);
761 // The three low-order bits of currentComponent[8] specify the bits per pixel.
762 const int numColors = 2 << (currentComponent[8] & 0x7);
763 if (currentFrameIsFirstFrame()) {
764 const int transPix = m_frames.empty() ? SkGIFColorMap::kNotFound
765 : m_frames[0]->transparentPixel();
766 if (is_palette_index_valid(transPix)) {
767 m_firstFrameHasAlpha = true;
768 } else {
769 const bool frameIsSubset = xOffset > 0 || yOffset > 0
770 || width < fScreenWidth
771 || height < fScreenHeight;
772 m_firstFrameHasAlpha = frameIsSubset;
773 }
774 }
775
776 addFrameIfNecessary();
777 SkGIFFrameContext* currentFrame = m_frames.back().get();
778 currentFrame->setHeaderDefined();
779
780 if (query == SkGIFSizeQuery) {
781 // The decoder needs to stop, so we return here, before
782 // flushing the buffer. Next time through, we'll be in the same
783 // state, requiring the same amount in the buffer.
784 return SkCodec::kSuccess;
785 }
786
787
788 currentFrame->setXYWH(xOffset, yOffset, width, height);
789 currentFrame->setInterlaced(SkToBool(currentComponent[8] & 0x40));
790
791 // Overlaying interlaced, transparent GIFs over
792 // existing image data using the Haeberli display hack
793 // requires saving the underlying image in order to
794 // avoid jaggies at the transparency edges. We are
795 // unprepared to deal with that, so don't display such
796 // images progressively. Which means only the first
797 // frame can be progressively displayed.
798 // FIXME: It is possible that a non-transparent frame
799 // can be interlaced and progressively displayed.
800 currentFrame->setProgressiveDisplay(currentFrameIsFirstFrame());
801
802 if (isLocalColormapDefined) {
803 currentFrame->localColorMap().setNumColors(numColors);
804 GETN(SK_BYTES_PER_COLORMAP_ENTRY * numColors, SkGIFImageColormap);
805 break;
806 }
807
808 setAlphaAndRequiredFrame(currentFrame);
809 GETN(1, SkGIFLZWStart);
810 break;
811 }
812
813 case SkGIFImageColormap: {
814 SkASSERT(!m_frames.empty());
815 auto* currentFrame = m_frames.back().get();
816 auto& cmap = currentFrame->localColorMap();
817 cmap.setTablePosition(m_streamBuffer.markPosition());
818 setAlphaAndRequiredFrame(currentFrame);
819 GETN(1, SkGIFLZWStart);
820 break;
821 }
822
823 case SkGIFSubBlock: {
824 const size_t bytesInBlock = this->getOneByte();
825 if (bytesInBlock)
826 GETN(bytesInBlock, SkGIFLZW);
827 else {
828 // Finished parsing one frame; Process next frame.
829 SkASSERT(!m_frames.empty());
830 // Note that some broken GIF files do not have enough LZW blocks to fully
831 // decode all rows but we treat it as frame complete.
832 m_frames.back()->setComplete();
833 GETN(1, SkGIFImageStart);
834 if (lastFrameToParse >= 0 && m_frames.count() > lastFrameToParse) {
835 m_streamBuffer.flush();
836 return SkCodec::kSuccess;
837 }
838 }
839 break;
840 }
841
842 case SkGIFDone: {
843 m_parseCompleted = true;
844 return SkCodec::kSuccess;
845 }
846
847 default:
848 // We shouldn't ever get here.
849 // This prevents attempting to continue reading this invalid stream.
850 GETN(0, SkGIFDone);
851 return SkCodec::kInvalidInput;
852 break;
853 } // switch
854 m_streamBuffer.flush();
855 }
856 }
857
addFrameIfNecessary()858 void SkGifImageReader::addFrameIfNecessary()
859 {
860 if (m_frames.empty() || m_frames.back()->isComplete()) {
861 const int i = m_frames.count();
862 m_frames.emplace_back(new SkGIFFrameContext(i));
863 }
864 }
865
onReportedAlpha() const866 SkEncodedInfo::Alpha SkGIFFrameContext::onReportedAlpha() const {
867 // Note: We could correct these after decoding - i.e. some frames may turn out to be
868 // independent and opaque if they do not use the transparent pixel, but that would require
869 // checking whether each pixel used the transparent index.
870 return is_palette_index_valid(this->transparentPixel()) ? SkEncodedInfo::kBinary_Alpha
871 : SkEncodedInfo::kOpaque_Alpha;
872 }
873
874 // FIXME: Move this method to close to doLZW().
prepareToDecode()875 bool SkGIFLZWContext::prepareToDecode()
876 {
877 SkASSERT(m_frameContext->isDataSizeDefined() && m_frameContext->isHeaderDefined());
878
879 // Since we use a codesize of 1 more than the datasize, we need to ensure
880 // that our datasize is strictly less than the SK_MAX_DICTIONARY_ENTRY_BITS.
881 if (m_frameContext->dataSize() >= SK_MAX_DICTIONARY_ENTRY_BITS)
882 return false;
883 clearCode = 1 << m_frameContext->dataSize();
884 avail = clearCode + 2;
885 oldcode = -1;
886 codesize = m_frameContext->dataSize() + 1;
887 codemask = (1 << codesize) - 1;
888 datum = bits = 0;
889 ipass = m_frameContext->interlaced() ? 1 : 0;
890 irow = 0;
891
892 // We want to know the longest sequence encodable by a dictionary with
893 // SK_MAX_DICTIONARY_ENTRIES entries. If we ignore the need to encode the base
894 // values themselves at the beginning of the dictionary, as well as the need
895 // for a clear code or a termination code, we could use every entry to
896 // encode a series of multiple values. If the input value stream looked
897 // like "AAAAA..." (a long string of just one value), the first dictionary
898 // entry would encode AA, the next AAA, the next AAAA, and so forth. Thus
899 // the longest sequence would be SK_MAX_DICTIONARY_ENTRIES + 1 values.
900 //
901 // However, we have to account for reserved entries. The first |datasize|
902 // bits are reserved for the base values, and the next two entries are
903 // reserved for the clear code and termination code. In theory a GIF can
904 // set the datasize to 0, meaning we have just two reserved entries, making
905 // the longest sequence (SK_MAX_DICTIONARY_ENTIRES + 1) - 2 values long. Since
906 // each value is a byte, this is also the number of bytes in the longest
907 // encodable sequence.
908 const size_t maxBytes = SK_MAX_DICTIONARY_ENTRIES - 1;
909
910 // Now allocate the output buffer. We decode directly into this buffer
911 // until we have at least one row worth of data, then call outputRow().
912 // This means worst case we may have (row width - 1) bytes in the buffer
913 // and then decode a sequence |maxBytes| long to append.
914 rowBuffer.reset(m_frameContext->width() - 1 + maxBytes);
915 rowIter = rowBuffer.begin();
916 rowsRemaining = m_frameContext->height();
917
918 // Clearing the whole suffix table lets us be more tolerant of bad data.
919 for (int i = 0; i < clearCode; ++i) {
920 suffix[i] = i;
921 suffixLength[i] = 1;
922 }
923 return true;
924 }
925
926