Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(618)

Side by Side Diff: src/codec/SkCodec_libgif.cpp

Issue 1372973002: Move all knowledge of X sampling into SkScaledCodec (Closed) Base URL: https://skia.googlesource.com/skia.git@codecSDmerge
Patch Set: Attempt to fix RLE overflow Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/codec/SkCodec_libgif.h ('k') | src/codec/SkCodec_libico.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2015 Google Inc. 2 * Copyright 2015 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkCodec_libgif.h" 8 #include "SkCodec_libgif.h"
9 #include "SkCodecPriv.h" 9 #include "SkCodecPriv.h"
10 #include "SkColorPriv.h" 10 #include "SkColorPriv.h"
11 #include "SkColorTable.h" 11 #include "SkColorTable.h"
12 #include "SkScaledCodec.h"
13 #include "SkStream.h" 12 #include "SkStream.h"
14 #include "SkSwizzler.h" 13 #include "SkSwizzler.h"
15 #include "SkUtils.h" 14 #include "SkUtils.h"
16 15
17 /* 16 /*
18 * Checks the start of the stream to see if the image is a gif 17 * Checks the start of the stream to see if the image is a gif
19 */ 18 */
20 bool SkGifCodec::IsGif(SkStream* stream) { 19 bool SkGifCodec::IsGif(SkStream* stream) {
21 char buf[GIF_STAMP_LEN]; 20 char buf[GIF_STAMP_LEN];
22 if (stream->read(buf, GIF_STAMP_LEN) == GIF_STAMP_LEN) { 21 if (stream->read(buf, GIF_STAMP_LEN) == GIF_STAMP_LEN) {
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after
478 477
479 // Initialize color table and copy to the client if necessary 478 // Initialize color table and copy to the client if necessary
480 this->initializeColorTable(dstInfo, inputColorPtr, inputColorCount); 479 this->initializeColorTable(dstInfo, inputColorPtr, inputColorCount);
481 return kSuccess; 480 return kSuccess;
482 } 481 }
483 482
484 SkCodec::Result SkGifCodec::initializeSwizzler(const SkImageInfo& dstInfo, 483 SkCodec::Result SkGifCodec::initializeSwizzler(const SkImageInfo& dstInfo,
485 ZeroInitialized zeroInit) { 484 ZeroInitialized zeroInit) {
486 const SkPMColor* colorPtr = get_color_ptr(fColorTable.get()); 485 const SkPMColor* colorPtr = get_color_ptr(fColorTable.get());
487 fSwizzler.reset(SkSwizzler::CreateSwizzler(SkSwizzler::kIndex, 486 fSwizzler.reset(SkSwizzler::CreateSwizzler(SkSwizzler::kIndex,
488 colorPtr, dstInfo, zeroInit, this->getInfo())); 487 colorPtr, dstInfo, zeroInit));
489 if (nullptr != fSwizzler.get()) { 488 if (nullptr != fSwizzler.get()) {
490 return kSuccess; 489 return kSuccess;
491 } 490 }
492 return kUnimplemented; 491 return kUnimplemented;
493 } 492 }
494 493
495 SkCodec::Result SkGifCodec::readRow() { 494 SkCodec::Result SkGifCodec::readRow() {
496 if (GIF_ERROR == DGifGetLine(fGif, fSrcBuffer.get(), fFrameDims.width())) { 495 if (GIF_ERROR == DGifGetLine(fGif, fSrcBuffer.get(), fFrameDims.width())) {
497 return kIncompleteInput; 496 return kIncompleteInput;
498 } 497 }
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
578 } 577 }
579 578
580 SkCodec::Result SkGifCodec::onStartScanlineDecode(const SkImageInfo& dstInfo, 579 SkCodec::Result SkGifCodec::onStartScanlineDecode(const SkImageInfo& dstInfo,
581 const SkCodec::Options& opts, SkPMColor inputColorPtr[], int* inputColor Count) { 580 const SkCodec::Options& opts, SkPMColor inputColorPtr[], int* inputColor Count) {
582 Result result = this->prepareToDecode(dstInfo, inputColorPtr, inputColorCoun t, 581 Result result = this->prepareToDecode(dstInfo, inputColorPtr, inputColorCoun t,
583 this->options()); 582 this->options());
584 if (kSuccess != result) { 583 if (kSuccess != result) {
585 return result; 584 return result;
586 } 585 }
587 586
588 // Check to see if scaling was requested.
589 if (dstInfo.dimensions() != this->getInfo().dimensions()) {
590 if (!SkScaledCodec::DimensionsSupportedForSampling(this->getInfo(), dstI nfo)) {
591 return gif_error("Scaling not supported.\n", SkCodec::kInvalidScale) ;
592 }
593 }
594
595 // Initialize the swizzler 587 // Initialize the swizzler
596 if (fFrameIsSubset) { 588 if (fFrameIsSubset) {
597 int sampleX; 589 const SkImageInfo subsetDstInfo = dstInfo.makeWH(fFrameDims.width(), fFr ameDims.height());
598 SkScaledCodec::ComputeSampleSize(dstInfo, this->getInfo(), &sampleX, NUL L);
599 const SkImageInfo subsetDstInfo = dstInfo.makeWH(
600 get_scaled_dimension(fFrameDims.width(), sampleX),
601 fFrameDims.height());
602 if (kSuccess != this->initializeSwizzler(subsetDstInfo, opts.fZeroInitia lized)) { 590 if (kSuccess != this->initializeSwizzler(subsetDstInfo, opts.fZeroInitia lized)) {
603 return gif_error("Could not initialize swizzler.\n", kUnimplemented) ; 591 return gif_error("Could not initialize swizzler.\n", kUnimplemented) ;
604 } 592 }
605 } else { 593 } else {
606 if (kSuccess != this->initializeSwizzler(dstInfo, opts.fZeroInitialized) ) { 594 if (kSuccess != this->initializeSwizzler(dstInfo, opts.fZeroInitialized) ) {
607 return gif_error("Could not initialize swizzler.\n", kUnimplemented) ; 595 return gif_error("Could not initialize swizzler.\n", kUnimplemented) ;
608 } 596 }
609 } 597 }
610 598
611 return kSuccess; 599 return kSuccess;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
661 } 649 }
662 650
663 int SkGifCodec::onNextScanline() const { 651 int SkGifCodec::onNextScanline() const {
664 if (fGif->Image.Interlace) { 652 if (fGif->Image.Interlace) {
665 return get_output_row_interlaced(this->INHERITED::onNextScanline(), this ->dstInfo().height()); 653 return get_output_row_interlaced(this->INHERITED::onNextScanline(), this ->dstInfo().height());
666 } else { 654 } else {
667 return this->INHERITED::onNextScanline(); 655 return this->INHERITED::onNextScanline();
668 } 656 }
669 } 657 }
670 658
OLDNEW
« no previous file with comments | « src/codec/SkCodec_libgif.h ('k') | src/codec/SkCodec_libico.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698