Bug 1145560 - During downscale-during-decode, compute the original size invalid rect based on the target size invalid rect. r=tn

This commit is contained in:
Seth Fowler 2015-05-05 15:35:34 -07:00
parent 55dc8bf30b
commit eb02069aa5
3 changed files with 35 additions and 13 deletions

View File

@ -719,16 +719,16 @@ nsJPEGDecoder::OutputScanlines(bool* suspend)
}
}
if (top != mInfo.output_scanline) {
if (mDownscaler && mDownscaler->HasInvalidation()) {
DownscalerInvalidRect invalidRect = mDownscaler->TakeInvalidRect();
PostInvalidation(invalidRect.mOriginalSizeRect,
Some(invalidRect.mTargetSizeRect));
MOZ_ASSERT(!mDownscaler->HasInvalidation());
} else if (!mDownscaler && top != mInfo.output_scanline) {
PostInvalidation(nsIntRect(0, top,
mInfo.output_width,
mInfo.output_scanline - top),
mDownscaler ? Some(mDownscaler->TakeInvalidRect())
: Nothing());
mInfo.output_scanline - top));
}
MOZ_ASSERT(!mDownscaler || !mDownscaler->HasInvalidation(),
"Didn't send downscaler's invalidation");
}
// Override the standard error method in the IJG JPEG decoder code.

View File

@ -69,6 +69,8 @@ Downscaler::BeginFrame(const nsIntSize& aOriginalSize,
"Invalid original size");
mOriginalSize = aOriginalSize;
mScale = gfxSize(double(mOriginalSize.width) / mTargetSize.width,
double(mOriginalSize.height) / mTargetSize.height);
mOutputBuffer = aOutputBuffer;
mHasAlpha = aHasAlpha;
@ -183,17 +185,25 @@ Downscaler::HasInvalidation() const
return mCurrentOutLine > mPrevInvalidatedLine;
}
nsIntRect
DownscalerInvalidRect
Downscaler::TakeInvalidRect()
{
if (MOZ_UNLIKELY(!HasInvalidation())) {
return nsIntRect();
return DownscalerInvalidRect();
}
nsIntRect invalidRect(0, mPrevInvalidatedLine,
mTargetSize.width,
mCurrentOutLine - mPrevInvalidatedLine);
DownscalerInvalidRect invalidRect;
// Compute the target size invalid rect.
invalidRect.mTargetSizeRect =
nsIntRect(0, mPrevInvalidatedLine,
mTargetSize.width, mCurrentOutLine - mPrevInvalidatedLine);
mPrevInvalidatedLine = mCurrentOutLine;
// Compute the original size invalid rect.
invalidRect.mOriginalSizeRect = invalidRect.mTargetSizeRect;
invalidRect.mOriginalSizeRect.ScaleRoundOut(mScale.width, mScale.height);
return invalidRect;
}

View File

@ -24,6 +24,16 @@ namespace skia {
namespace mozilla {
namespace image {
/**
* DownscalerInvalidRect wraps two invalidation rects: one in terms of the
* original image size, and one in terms of the target size.
*/
struct DownscalerInvalidRect
{
nsIntRect mOriginalSizeRect;
nsIntRect mTargetSizeRect;
};
/**
* Downscaler is a high-quality, streaming image downscaler based upon Skia's
* scaling implementation.
@ -47,6 +57,7 @@ public:
const nsIntSize& OriginalSize() const { return mOriginalSize; }
const nsIntSize& TargetSize() const { return mTargetSize; }
const gfxSize& Scale() const { return mScale; }
/**
* Begins a new frame and reinitializes the Downscaler.
@ -73,7 +84,7 @@ public:
bool HasInvalidation() const;
/// Takes the Downscaler's current invalid rect and resets it.
nsIntRect TakeInvalidRect();
DownscalerInvalidRect TakeInvalidRect();
/**
* Resets the Downscaler's position in the image, for a new progressive pass
@ -88,6 +99,7 @@ private:
nsIntSize mOriginalSize;
nsIntSize mTargetSize;
gfxSize mScale;
uint8_t* mOutputBuffer;