Handle static/single frame images in SkAnimCodecPlayer
Bug: skia:
Change-Id: I9fae9b56133e7de877021e846dbc431c69477113
Reviewed-on: https://skia-review.googlesource.com/c/168900
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Florin Malita <fmalita@chromium.org>
diff --git a/src/codec/SkCodecImageGenerator.cpp b/src/codec/SkCodecImageGenerator.cpp
index b26fe71..8341df8 100644
--- a/src/codec/SkCodecImageGenerator.cpp
+++ b/src/codec/SkCodecImageGenerator.cpp
@@ -19,6 +19,13 @@
return std::unique_ptr<SkImageGenerator>(new SkCodecImageGenerator(std::move(codec), data));
}
+std::unique_ptr<SkImageGenerator>
+SkCodecImageGenerator::MakeFromCodec(std::unique_ptr<SkCodec> codec) {
+ return codec
+ ? std::unique_ptr<SkImageGenerator>(new SkCodecImageGenerator(std::move(codec), nullptr))
+ : nullptr;
+}
+
static SkImageInfo adjust_info(SkCodec* codec) {
SkImageInfo info = codec->getInfo();
if (kUnpremul_SkAlphaType == info.alphaType()) {
diff --git a/src/codec/SkCodecImageGenerator.h b/src/codec/SkCodecImageGenerator.h
index de6cf93..afd0b99 100644
--- a/src/codec/SkCodecImageGenerator.h
+++ b/src/codec/SkCodecImageGenerator.h
@@ -19,6 +19,8 @@
*/
static std::unique_ptr<SkImageGenerator> MakeFromEncodedCodec(sk_sp<SkData>);
+ static std::unique_ptr<SkImageGenerator> MakeFromCodec(std::unique_ptr<SkCodec>);
+
protected:
sk_sp<SkData> onRefEncodedData() override;
diff --git a/src/utils/SkAnimCodecPlayer.cpp b/src/utils/SkAnimCodecPlayer.cpp
index 0a9bbc0..d2fcdab 100644
--- a/src/utils/SkAnimCodecPlayer.cpp
+++ b/src/utils/SkAnimCodecPlayer.cpp
@@ -7,6 +7,7 @@
#include "SkAnimCodecPlayer.h"
#include "SkCodec.h"
+#include "SkCodecImageGenerator.h"
#include "SkData.h"
#include "SkImage.h"
#include <algorithm>
@@ -23,6 +24,14 @@
f.fDuration = dur;
}
fTotalDuration = dur;
+
+ if (!fTotalDuration) {
+ // Static image -- may or may not have returned a single frame info.
+ fFrameInfos.clear();
+ fImages.clear();
+ fImages.push_back(SkImage::MakeFromGenerator(
+ SkCodecImageGenerator::MakeFromCodec(std::move(fCodec))));
+ }
}
SkAnimCodecPlayer::~SkAnimCodecPlayer() {}
@@ -61,10 +70,18 @@
}
sk_sp<SkImage> SkAnimCodecPlayer::getFrame() {
- return this->getFrameAt(fCurrIndex);
+ SkASSERT(fTotalDuration > 0 || fImages.size() == 1);
+
+ return fTotalDuration > 0
+ ? this->getFrameAt(fCurrIndex)
+ : fImages.front();
}
bool SkAnimCodecPlayer::seek(uint32_t msec) {
+ if (!fTotalDuration) {
+ return false;
+ }
+
msec %= fTotalDuration;
auto lower = std::lower_bound(fFrameInfos.begin(), fFrameInfos.end(), msec,