aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/codec/SkCodec.cpp21
-rw-r--r--src/codec/SkGifCodec.cpp32
-rw-r--r--src/codec/SkGifCodec.h3
3 files changed, 44 insertions, 12 deletions
diff --git a/src/codec/SkCodec.cpp b/src/codec/SkCodec.cpp
index 5bdb3e2b59..6a6fdc78c9 100644
--- a/src/codec/SkCodec.cpp
+++ b/src/codec/SkCodec.cpp
@@ -489,3 +489,24 @@ bool SkCodec::initializeColorXform(const SkImageInfo& dstInfo,
return true;
}
+
+std::vector<SkCodec::FrameInfo> SkCodec::getFrameInfo() {
+ const size_t frameCount = this->getFrameCount();
+ switch (frameCount) {
+ case 0:
+ return std::vector<FrameInfo>{};
+ case 1:
+ if (!this->onGetFrameInfo(0, nullptr)) {
+ // Not animated.
+ return std::vector<FrameInfo>{};
+ }
+ // fall through
+ default: {
+ std::vector<FrameInfo> result(frameCount);
+ for (size_t i = 0; i < frameCount; ++i) {
+ SkAssertResult(this->onGetFrameInfo(i, &result[i]));
+ }
+ return result;
+ }
+ }
+}
diff --git a/src/codec/SkGifCodec.cpp b/src/codec/SkGifCodec.cpp
index 06c0803136..2e0ec3057d 100644
--- a/src/codec/SkGifCodec.cpp
+++ b/src/codec/SkGifCodec.cpp
@@ -132,19 +132,29 @@ SkGifCodec::SkGifCodec(const SkEncodedInfo& encodedInfo, const SkImageInfo& imag
reader->setClient(this);
}
-std::vector<SkCodec::FrameInfo> SkGifCodec::onGetFrameInfo() {
+size_t SkGifCodec::onGetFrameCount() {
fReader->parse(SkGifImageReader::SkGIFFrameCountQuery);
- const size_t size = fReader->imagesCount();
- std::vector<FrameInfo> result(size);
- for (size_t i = 0; i < size; i++) {
- const SkGIFFrameContext* frameContext = fReader->frameContext(i);
- result[i].fDuration = frameContext->delayTime();
- result[i].fRequiredFrame = frameContext->getRequiredFrame();
- result[i].fFullyReceived = frameContext->isComplete();
- result[i].fAlphaType = frameContext->hasAlpha() ? kUnpremul_SkAlphaType
- : kOpaque_SkAlphaType;
+ return fReader->imagesCount();
+}
+
+bool SkGifCodec::onGetFrameInfo(size_t i, SkCodec::FrameInfo* frameInfo) const {
+ if (i >= fReader->imagesCount()) {
+ return false;
}
- return result;
+
+ const SkGIFFrameContext* frameContext = fReader->frameContext(i);
+ if (!frameContext->reachedStartOfData()) {
+ return false;
+ }
+
+ if (frameInfo) {
+ frameInfo->fDuration = frameContext->delayTime();
+ frameInfo->fRequiredFrame = frameContext->getRequiredFrame();
+ frameInfo->fFullyReceived = frameContext->isComplete();
+ frameInfo->fAlphaType = frameContext->hasAlpha() ? kUnpremul_SkAlphaType
+ : kOpaque_SkAlphaType;
+ }
+ return true;
}
int SkGifCodec::onGetRepetitionCount() {
diff --git a/src/codec/SkGifCodec.h b/src/codec/SkGifCodec.h
index 67654d3b55..11714eb39e 100644
--- a/src/codec/SkGifCodec.h
+++ b/src/codec/SkGifCodec.h
@@ -50,7 +50,8 @@ protected:
uint64_t onGetFillValue(const SkImageInfo&) const override;
- std::vector<FrameInfo> onGetFrameInfo() override;
+ size_t onGetFrameCount() override;
+ bool onGetFrameInfo(size_t, FrameInfo*) const override;
int onGetRepetitionCount() override;
Result onStartIncrementalDecode(const SkImageInfo& /*dstInfo*/, void*, size_t,