Bug 37589 - strange dots next to slashdot news headers (gif decoder).

Patch by paper@animecity.nu, r=biesi, sr=tor.
This commit is contained in:
tor%cs.brown.edu 2002-11-06 20:49:09 +00:00
Родитель 53f34d33c0
Коммит 252c7f3e5f
1 изменённых файлов: 40 добавлений и 8 удалений

Просмотреть файл

@ -207,30 +207,33 @@ static NS_METHOD ReadDataOut(nsIInputStream* in,
NS_METHOD
nsGIFDecoder2::FlushImageData()
{
PRInt32 width;
PRInt32 height;
mImageFrame->GetWidth(&width);
mImageFrame->GetHeight(&height);
PRInt32 imgWidth;
mImageContainer->GetWidth(&imgWidth);
nsRect frameRect;
mImageFrame->GetRect(frameRect);
switch (mCurrentPass - mLastFlushedPass) {
case 0: { // same pass
PRInt32 remainingRows = mCurrentRow - mLastFlushedRow;
if (remainingRows) {
nsRect r(0, mLastFlushedRow+1, width, remainingRows);
nsRect r(0, frameRect.y + mLastFlushedRow + 1,
imgWidth, remainingRows);
mObserver->OnDataAvailable(nsnull, nsnull, mImageFrame, &r);
}
}
break;
case 1: { // one pass on - need to handle bottom & top rects
nsRect r(0, 0, width, mCurrentRow+1);
nsRect r(0, frameRect.y, imgWidth, mCurrentRow + 1);
mObserver->OnDataAvailable(nsnull, nsnull, mImageFrame, &r);
nsRect r2(0, mLastFlushedRow+1, width, height-mLastFlushedRow-1);
nsRect r2(0, frameRect.y + mLastFlushedRow + 1,
imgWidth, frameRect.height - mLastFlushedRow - 1);
mObserver->OnDataAvailable(nsnull, nsnull, mImageFrame, &r2);
}
break;
default: { // more than one pass on - push the whole frame
nsRect r(0, 0, width, height);
nsRect r(0, frameRect.y, imgWidth, frameRect.height);
mObserver->OnDataAvailable(nsnull, nsnull, mImageFrame, &r);
}
}
@ -337,6 +340,18 @@ int BeginImageFrame(
decoder->mGIFStruct->width = aFrameWidth;
decoder->mGIFStruct->height = aFrameHeight;
if (aFrameNumber == 1) {
// Send a onetime OnDataAvailable (Display Refresh) for the first frame
// if it has a y-axis offset. Otherwise, the area may never be refreshed
// and the placeholder will remain on the screen. (Bug 37589)
PRInt32 imgWidth;
decoder->mImageContainer->GetWidth(&imgWidth);
if (aFrameYOffset > 0) {
nsRect r(0, 0, imgWidth, aFrameYOffset);
decoder->mObserver->OnDataAvailable(nsnull, nsnull, decoder->mImageFrame, &r);
}
}
return 0;
}
@ -369,6 +384,23 @@ int EndImageFrame(
decoder->FlushImageData();
if (aFrameNumber == 1) {
// If the first frame is smaller in height than the entire image, send a
// OnDataAvailable (Display Refresh) for the area it does not have data for.
// This will clear the remaining bits of the placeholder. (Bug 37589)
PRInt32 imgHeight;
PRInt32 realFrameHeight = decoder->mGIFStruct->height + decoder->mGIFStruct->y_offset;
decoder->mImageContainer->GetHeight(&imgHeight);
if (imgHeight > realFrameHeight) {
PRInt32 imgWidth;
decoder->mImageContainer->GetWidth(&imgWidth);
nsRect r(0, realFrameHeight, imgWidth, imgHeight - realFrameHeight);
decoder->mObserver->OnDataAvailable(nsnull, nsnull, decoder->mImageFrame, &r);
}
}
decoder->mCurrentRow = decoder->mLastFlushedRow = -1;
decoder->mCurrentPass = decoder->mLastFlushedPass = 0;