mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:30:27 +00:00
877b16186b
- Bug 1157954 - Report each surface in the ImageLib SurfaceCache individually in about:memory. r=dholbert (3810a2b1f) - Bug 1139641 - Return more information from SurfaceCache::Lookup and SurfaceCache::LookupBestMatch. r=dholbert (fdd62b01d) - Bug 1177615 - Rip everything related to FLAG_DECODE_STARTED out of ImageLib. r=tn (818a77ac1) - Bug 1153253 - move nsImageBoxFrame::mRequestRegistered to pack better with other members; r=dholbert (fe26ff0ce) - Bug 1177604 - Stop delaying the load event for XUL images until the image is decoded. r=tn (6c0100f5a) - Bug 1180931 (Part 1) - Allow sync size decoding for single core devices. r=tn (62eae65e3) - Bug 1180931 (Part 2) - Allow sync size decoding for transient (i.e. multipart) images. r=tn (537dea273) - Bug 1165009 - Bail in RasterImage::OnAddedFrame if we hit an error during decoding. r=tn (e9a85bf7d) - Bug 1171356 - On B2G, retry image decodes that fail because allocation of the first frame failed. r=tn (06e712f65) - Bug 1151166 - Fix two Coverity warnings in nsPNGDecoder.cpp. r=jrmuizel (848f4f0c2) - Bug 857040 - Warn on bad CRC instead of error exit. r=joe (74a6438ab) - Bug 1117607 - Make decoders responsible for their own frame allocations. r=tn (d224b33a8) - Bug 1178274 - Don't enable decode-only-on-draw if the APZ pref is true but e10s is disabled. r=dvander (76ca02965) - Bug 1177323 - disable decode-only-on-draw preference. r=seth (b6ac4e9b0) - Bug 1183836 - Remove support for decode-on-draw-only. r=tn (af0b79370) - Bug 1183852 - Only mark surfaces as used in the SurfaceCache if a caller requested exactly that surface. r=dholbert (e8d94d193) - Bug 1176124 (Part 1) - Add a MatchType enum to LookupResult to let Lookup*() return more detailed information. r=dholbert (b3b7b01c0) - Bug 1176124 (Part 2) - Add placeholder support to the SurfaceCache so we can avoid launching redundant decoders. r=dholbert (6fa4cae4d) - Bug 1185582 - Back out bug 1171356, a hack to retry image decoding which is now useless. r=tn (0bac6a812) - Bug 1155332 - If we don't have enough memory to fully decode an image, discard it immediately. r=tn (2adc2f8ea) - Bug 1185592 (Part 1) - Remove obsolete logging macros. r=baku (b1e98c8a8) - Bug 1185592 (Part 2) - Make RasterImage store the decoder type instead of the MIME type. r=baku (abce7fd06) - Bug 1186667 - Correctly report IMAGE_DECODE_COUNT and IMAGE_MAX_DECODE_COUNT telemetry for only non-size decodes. r=tn (97bfbbc82) - make WEBPDecoder comply Bug 1117607 - Make decoders responsible for their own frame allocation (03866748e) - make JXR decoder crudely compliant to 1117607 and make it allocate its frame - can probably be improved (b804d6f67)
134 lines
3.1 KiB
C++
134 lines
3.1 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "nsIconDecoder.h"
|
|
#include "nsIInputStream.h"
|
|
#include "nspr.h"
|
|
#include "nsRect.h"
|
|
#include "nsError.h"
|
|
#include "RasterImage.h"
|
|
#include <algorithm>
|
|
|
|
namespace mozilla {
|
|
namespace image {
|
|
|
|
nsIconDecoder::nsIconDecoder(RasterImage* aImage)
|
|
: Decoder(aImage),
|
|
mWidth(-1),
|
|
mHeight(-1),
|
|
mPixBytesRead(0),
|
|
mState(iconStateStart)
|
|
{
|
|
// Nothing to do
|
|
}
|
|
|
|
nsIconDecoder::~nsIconDecoder()
|
|
{ }
|
|
|
|
void
|
|
nsIconDecoder::WriteInternal(const char* aBuffer, uint32_t aCount)
|
|
{
|
|
MOZ_ASSERT(!HasError(), "Shouldn't call WriteInternal after error!");
|
|
|
|
// We put this here to avoid errors about crossing initialization with case
|
|
// jumps on linux.
|
|
uint32_t bytesToRead = 0;
|
|
|
|
// Loop until the input data is gone
|
|
while (aCount > 0) {
|
|
switch (mState) {
|
|
case iconStateStart:
|
|
|
|
// Grab the width
|
|
mWidth = (uint8_t)*aBuffer;
|
|
|
|
// Book Keeping
|
|
aBuffer++;
|
|
aCount--;
|
|
mState = iconStateHaveHeight;
|
|
break;
|
|
|
|
case iconStateHaveHeight:
|
|
|
|
// Grab the Height
|
|
mHeight = (uint8_t)*aBuffer;
|
|
|
|
// Post our size to the superclass
|
|
PostSize(mWidth, mHeight);
|
|
|
|
PostHasTransparency();
|
|
|
|
if (HasError()) {
|
|
// Setting the size led to an error.
|
|
mState = iconStateFinished;
|
|
return;
|
|
}
|
|
|
|
// If We're doing a size decode, we're done
|
|
if (IsSizeDecode()) {
|
|
mState = iconStateFinished;
|
|
break;
|
|
}
|
|
|
|
{
|
|
MOZ_ASSERT(!mImageData, "Already have a buffer allocated?");
|
|
nsresult rv = AllocateBasicFrame();
|
|
if (NS_FAILED(rv)) {
|
|
mState = iconStateFinished;
|
|
return;
|
|
}
|
|
}
|
|
|
|
MOZ_ASSERT(mImageData, "Should have a buffer now");
|
|
|
|
// Book Keeping
|
|
aBuffer++;
|
|
aCount--;
|
|
mState = iconStateReadPixels;
|
|
break;
|
|
|
|
case iconStateReadPixels: {
|
|
|
|
// How many bytes are we reading?
|
|
bytesToRead = std::min(aCount, mImageDataLength - mPixBytesRead);
|
|
|
|
// Copy the bytes
|
|
memcpy(mImageData + mPixBytesRead, aBuffer, bytesToRead);
|
|
|
|
// Performance isn't critical here, so our update rectangle is
|
|
// always the full icon
|
|
nsIntRect r(0, 0, mWidth, mHeight);
|
|
|
|
// Invalidate
|
|
PostInvalidation(r);
|
|
|
|
// Book Keeping
|
|
aBuffer += bytesToRead;
|
|
aCount -= bytesToRead;
|
|
mPixBytesRead += bytesToRead;
|
|
|
|
// If we've got all the pixel bytes, we're finished
|
|
if (mPixBytesRead == mImageDataLength) {
|
|
PostFrameStop();
|
|
PostDecodeDone();
|
|
mState = iconStateFinished;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case iconStateFinished:
|
|
|
|
// Consume all excess data silently
|
|
aCount = 0;
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
} // namespace image
|
|
} // namespace mozilla
|