| Index: src/images/SkScaledBitmapSampler.cpp
|
| diff --git a/src/images/SkScaledBitmapSampler.cpp b/src/images/SkScaledBitmapSampler.cpp
|
| index cad97ead270765a130ef3f70f493f587de04c98d..825f9d5268fb64485abd5219d86903ebc1ba3b15 100644
|
| --- a/src/images/SkScaledBitmapSampler.cpp
|
| +++ b/src/images/SkScaledBitmapSampler.cpp
|
| @@ -576,6 +576,8 @@ SkScaledBitmapSampler::SkScaledBitmapSampler(int width, int height,
|
| sk_throw();
|
| }
|
|
|
| + SkDEBUGCODE(fSampleMode = kUninitialized_SampleMode);
|
| +
|
| if (sampleSize <= 1) {
|
| fScaledWidth = width;
|
| fScaledHeight = height;
|
| @@ -711,6 +713,8 @@ bool SkScaledBitmapSampler::begin(SkBitmap* dst, SrcConfig sc,
|
| }
|
|
|
| bool SkScaledBitmapSampler::next(const uint8_t* SK_RESTRICT src) {
|
| + SkASSERT(kInterlaced_SampleMode != fSampleMode);
|
| + SkDEBUGCODE(fSampleMode = kConsecutive_SampleMode);
|
| SkASSERT((unsigned)fCurrY < (unsigned)fScaledHeight);
|
|
|
| bool hadAlpha = fRowProc(fDstRow, src + fX0 * fSrcPixelSize, fScaledWidth,
|
| @@ -720,6 +724,29 @@ bool SkScaledBitmapSampler::next(const uint8_t* SK_RESTRICT src) {
|
| return hadAlpha;
|
| }
|
|
|
| +bool SkScaledBitmapSampler::sampleInterlaced(const uint8_t* SK_RESTRICT src, int srcY) {
|
| + SkASSERT(kConsecutive_SampleMode != fSampleMode);
|
| + SkDEBUGCODE(fSampleMode = kInterlaced_SampleMode);
|
| + // Any line that should be a part of the destination can be created by the formula:
|
| + // fY0 + (some multiplier) * fDY
|
| + // so if srcY - fY0 is not an integer multiple of fDY that srcY will be skipped.
|
| + const int srcYMinusY0 = srcY - fY0;
|
| + if (srcYMinusY0 % fDY != 0) {
|
| + // This line is not part of the output, so return false for alpha, since we have
|
| + // not added an alpha to the output.
|
| + return false;
|
| + }
|
| + // Unlike in next(), where the data is used sequentially, this function skips around,
|
| + // so fDstRow and fCurrY are never updated. fDstRow must always be the starting point
|
| + // of the destination bitmap's pixels, which is used to calculate the destination row
|
| + // each time this function is called.
|
| + const int dstY = srcYMinusY0 / fDY;
|
| + SkASSERT(dstY < fScaledHeight);
|
| + char* dstRow = fDstRow + dstY * fDstRowBytes;
|
| + return fRowProc(dstRow, src + fX0 * fSrcPixelSize, fScaledWidth,
|
| + fDX * fSrcPixelSize, dstY, fCTable);
|
| +}
|
| +
|
| #ifdef SK_DEBUG
|
| // The following code is for a test to ensure that changing the method to get the right row proc
|
| // did not change the row proc unintentionally. Tested by ImageDecodingTest.cpp
|
|
|