Index: src/codec/SkWebpCodec.cpp |
diff --git a/src/codec/SkWebpCodec.cpp b/src/codec/SkWebpCodec.cpp |
index ccffda9276857e9549cd9fb1263577b3a9c59d68..3e6d11feda2c101504cf68b1927dee4805b7417b 100644 |
--- a/src/codec/SkWebpCodec.cpp |
+++ b/src/codec/SkWebpCodec.cpp |
@@ -158,7 +158,8 @@ bool SkWebpCodec::onGetValidSubset(SkIRect* desiredSubset) const { |
} |
SkCodec::Result SkWebpCodec::onGetPixels(const SkImageInfo& dstInfo, void* dst, size_t rowBytes, |
- const Options& options, SkPMColor*, int*) { |
+ const Options& options, SkPMColor*, int*, |
+ int* rowsDecoded) { |
if (!webp_conversion_possible(dstInfo, this->getInfo())) { |
return kInvalidConversion; |
} |
@@ -216,6 +217,7 @@ SkCodec::Result SkWebpCodec::onGetPixels(const SkImageInfo& dstInfo, void* dst, |
config.options.scaled_width = dstDimensions.width(); |
config.options.scaled_height = dstDimensions.height(); |
} |
+ fDstWidth = dstDimensions.width(); |
config.output.colorspace = webp_decode_mode(dstInfo.colorType(), |
dstInfo.alphaType() == kPremul_SkAlphaType); |
@@ -234,10 +236,8 @@ SkCodec::Result SkWebpCodec::onGetPixels(const SkImageInfo& dstInfo, void* dst, |
while (true) { |
const size_t bytesRead = stream()->read(buffer, BUFFER_SIZE); |
if (0 == bytesRead) { |
- // FIXME: Maybe this is an incomplete image? How to decide? Based |
- // on the number of rows decoded? We can know the number of rows |
- // decoded using WebPIDecGetRGB. |
- return kInvalidInput; |
+ WebPIDecGetRGB(idec, rowsDecoded, NULL, NULL, NULL); |
+ return kIncompleteInput; |
} |
switch (WebPIAppend(idec, buffer, bytesRead)) { |
@@ -253,4 +253,38 @@ SkCodec::Result SkWebpCodec::onGetPixels(const SkImageInfo& dstInfo, void* dst, |
} |
SkWebpCodec::SkWebpCodec(const SkImageInfo& info, SkStream* stream) |
- : INHERITED(info, stream) {} |
+ : INHERITED(info, stream) |
+ , fDstWidth(info.width()) |
+{} |
+ |
+class SkWebpSampler : public SkSampler { |
+public: |
+ SkWebpSampler(SkWebpCodec* codec) |
+ : fCodec(codec) |
+ { |
+ SkASSERT(fCodec); |
+ } |
+ |
+private: |
+ // We not support sampling of webps. Webps support arbitrary native scaling. |
+ int onSetSampleX(int sampleX) { |
+ SkASSERT(false); |
+ return fCodec->fDstWidth; |
+ } |
+ |
+ |
+ int onGetScaledWidth() override { |
+ return fCodec->fDstWidth; |
+ } |
+ |
+ // Unowned pointer. fCodec will delete this class in its destructor. |
+ SkWebpCodec* fCodec; |
+}; |
+ |
+SkSampler* SkWebpCodec::getSampler() { |
+ if (!fSampler) { |
+ fSampler.reset(new SkWebpSampler(this)); |
+ } |
+ |
+ return fSampler; |
+} |