aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/codec/SkGifCodec.cpp
diff options
context:
space:
mode:
authorGravatar Leon Scroggins III <scroggo@google.com>2017-04-12 10:49:52 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-04-12 15:22:43 +0000
commite132e7be5f9108692254c37db592ea7611abbc15 (patch)
tree44e7973680edc107da087f71d41619dd3aea178e /src/codec/SkGifCodec.cpp
parente5efa51b2acc86d1993132348d5b465855a653cc (diff)
Add SkCodec methods for individual frames
Add a version of getFrameInfo that returns information about a single frame, allowing a client to skip creating the entire vector. Add getFrameCount, for determining the number of frames in the image. Reimplement std::vector<FrameInfo> getFrameInfo with the new methods. Updates to the test: - getFrameInfo(size_t, FrameInfo*) fails before parsing - Test both versions of getFrameInfo - Recreate the codec between tests, to test parsing Change-Id: I77c19087f2f8dcf2c536d80167b18ad1ca96ae94 Reviewed-on: https://skia-review.googlesource.com/13190 Reviewed-by: Matt Sarett <msarett@google.com> Reviewed-by: Mike Reed <reed@google.com> Reviewed-by: Chris Blume <cblume@google.com> Commit-Queue: Leon Scroggins <scroggo@google.com>
Diffstat (limited to 'src/codec/SkGifCodec.cpp')
-rw-r--r--src/codec/SkGifCodec.cpp32
1 files changed, 21 insertions, 11 deletions
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() {