Index: src/codec/SkCodec.cpp |
diff --git a/src/codec/SkCodec.cpp b/src/codec/SkCodec.cpp |
index cabcadcccda5c872b69834daa18bbe1701be82fd..54d529d20e143d4727c2ddb56b36ddb4c13b5ed2 100644 |
--- a/src/codec/SkCodec.cpp |
+++ b/src/codec/SkCodec.cpp |
@@ -152,7 +152,21 @@ SkCodec::Result SkCodec::getPixels(const SkImageInfo& info, void* pixels, size_t |
Options optsStorage; |
if (nullptr == options) { |
options = &optsStorage; |
+ } else if (options->fSubset) { |
msarett
2015/10/01 19:34:33
I'm guessing that, for some reason (maybe the kSub
scroggo
2015/10/01 21:16:57
That is correct. I don't think this is best long t
|
+ SkIRect subset(*options->fSubset); |
+ if (!this->onGetValidSubset(&subset) || subset != *options->fSubset) { |
+ // FIXME: How to differentiate between not supporting subset at all |
+ // and not supporting this particular subset? |
+ return kUnimplemented; |
+ } |
+ } |
+ |
+ // FIXME: Support subsets somehow? Note that this works for SkWebpCodec |
msarett
2015/10/01 19:34:33
There's a couple ways we could go about this, I do
scroggo
2015/10/01 21:16:57
Yeah, I considered that. I decided to punt that un
msarett
2015/10/01 22:53:07
That makes perfect sense.
|
+ // because it supports arbitrary scaling/subset combinations. |
+ if (!this->dimensionsSupported(info.dimensions())) { |
+ return kInvalidScale; |
} |
+ |
const Result result = this->onGetPixels(info, pixels, rowBytes, *options, ctable, ctableCount); |
if ((kIncompleteInput == result || kSuccess == result) && ctableCount) { |
@@ -190,6 +204,18 @@ SkCodec::Result SkCodec::startScanlineDecode(const SkImageInfo& dstInfo, |
Options optsStorage; |
if (nullptr == options) { |
options = &optsStorage; |
+ } else if (options->fSubset) { |
+ SkIRect subset(*options->fSubset); |
+ if (!this->onGetValidSubset(&subset) || subset != *options->fSubset) { |
+ // FIXME: How to differentiate between not supporting subset at all |
+ // and not supporting this particular subset? |
+ return kUnimplemented; |
+ } |
+ } |
+ |
+ // FIXME: Support subsets somehow? |
+ if (!this->dimensionsSupported(dstInfo.dimensions())) { |
+ return kInvalidScale; |
} |
const Result result = this->onStartScanlineDecode(dstInfo, *options, ctable, ctableCount); |
@@ -213,8 +239,14 @@ SkCodec::Result SkCodec::getScanlines(void* dst, int countLines, size_t rowBytes |
} |
SkASSERT(!fDstInfo.isEmpty()); |
- if ((rowBytes < fDstInfo.minRowBytes() && countLines > 1 ) || countLines <= 0 |
- || fCurrScanline + countLines > fDstInfo.height()) { |
+ |
+ if (rowBytes < fDstInfo.minRowBytes() && countLines > 1) { |
+ // FIXME: This check breaks down when we sample without letting SkCodec |
scroggo
2015/10/01 15:33:14
The problem shows up when we want to scale down an
msarett
2015/10/01 19:34:33
I've deleted this check in my scaled subsetting CL
scroggo
2015/10/01 21:16:57
Done.
|
+ // know about it. |
+ // return kInvalidParameters; |
+ } |
+ |
+ if (countLines <= 0 || fCurrScanline + countLines > fDstInfo.height()) { |
return kInvalidParameters; |
} |