Index: src/codec/SkBmpRLECodec.cpp |
diff --git a/src/codec/SkBmpRLECodec.cpp b/src/codec/SkBmpRLECodec.cpp |
index e76a23ed14ad78ac93f9bd6b73a24ce69beb6f31..fe499c6a6d402b2628f088be11738ec164daa338 100644 |
--- a/src/codec/SkBmpRLECodec.cpp |
+++ b/src/codec/SkBmpRLECodec.cpp |
@@ -43,10 +43,6 @@ SkCodec::Result SkBmpRLECodec::onGetPixels(const SkImageInfo& dstInfo, |
// Subsets are not supported. |
return kUnimplemented; |
} |
- if (dstInfo.dimensions() != this->getInfo().dimensions()) { |
- SkCodecPrintf("Error: scaling not supported.\n"); |
- return kInvalidScale; |
- } |
if (!conversion_possible(dstInfo, this->getInfo())) { |
SkCodecPrintf("Error: cannot convert input type to output type.\n"); |
return kInvalidConversion; |
@@ -253,6 +249,9 @@ void SkBmpRLECodec::setRGBPixel(void* dst, size_t dstRowBytes, |
SkCodec::Result SkBmpRLECodec::prepareToDecode(const SkImageInfo& dstInfo, |
const SkCodec::Options& options, SkPMColor inputColorPtr[], int* inputColorCount) { |
+ // Reset fSampleX. If it needs to be a value other than 1, it will get modified by |
+ // the sampler. |
+ fSampleX = 1; |
// Create the color table if necessary and prepare the stream for decode |
// Note that if it is non-NULL, inputColorCount will be modified |
if (!this->createColorTable(inputColorCount)) { |
@@ -269,8 +268,6 @@ SkCodec::Result SkBmpRLECodec::prepareToDecode(const SkImageInfo& dstInfo, |
return SkCodec::kInvalidConversion; |
} |
- SkScaledCodec::ComputeSampleSize(dstInfo, this->getInfo(), &fSampleX, NULL); |
- |
return SkCodec::kSuccess; |
} |
@@ -278,7 +275,7 @@ SkCodec::Result SkBmpRLECodec::prepareToDecode(const SkImageInfo& dstInfo, |
* Performs the bitmap decoding for RLE input format |
* RLE decoding is performed all at once, rather than a one row at a time |
*/ |
-SkCodec::Result SkBmpRLECodec::decodeRows(const SkImageInfo& dstInfo, |
+SkCodec::Result SkBmpRLECodec::decodeRows(const SkImageInfo& info, |
void* dst, size_t dstRowBytes, |
const Options& opts) { |
// Set RLE flags |
@@ -289,7 +286,10 @@ SkCodec::Result SkBmpRLECodec::decodeRows(const SkImageInfo& dstInfo, |
// Set constant values |
const int width = this->getInfo().width(); |
- const int height = dstInfo.height(); |
+ const int height = info.height(); |
+ |
+ // Account for sampling. |
+ SkImageInfo dstInfo = info.makeWH(get_scaled_dimension(width, fSampleX), height); |
// Destination parameters |
int x = 0; |
@@ -466,3 +466,33 @@ SkCodec::Result SkBmpRLECodec::decodeRows(const SkImageInfo& dstInfo, |
} |
} |
} |
+ |
+class SkBmpRLESampler : public SkSampler { |
+public: |
+ SkBmpRLESampler(SkBmpRLECodec* codec) |
+ : fCodec(codec) |
+ { |
+ SkASSERT(fCodec); |
+ } |
+ |
+private: |
+ int onSetSampleX(int sampleX) { |
+ return fCodec->setSampleX(sampleX); |
+ } |
+ |
+ // Unowned pointer. fCodec will delete this class in its destructor. |
+ SkBmpRLECodec* fCodec; |
+}; |
+ |
+SkSampler* SkBmpRLECodec::getSampler() { |
+ if (!fSampler) { |
+ fSampler.reset(new SkBmpRLESampler(this)); |
+ } |
+ |
+ return fSampler; |
+} |
+ |
+int SkBmpRLECodec::setSampleX(int sampleX) { |
+ fSampleX = sampleX; |
+ return get_scaled_dimension(this->getInfo().width(), sampleX); |
+} |