Bug 1131446. mFrameHasNoAlpha is mostly pointless. r=seth
Starting with
bug 391583 we detect whether a png image has any transparency
during decode. I don't think this is worth doing anymore. We choose the format
of image based on the png header, that should be sufficient for the performance
improvement we desire from opaque images. This gets us faster image decoding.
--- a/image/decoders/nsPNGDecoder.cpp
+++ b/image/decoders/nsPNGDecoder.cpp
@@ -164,17 +164,16 @@ void nsPNGDecoder::CreateFrame(png_uint_
}
NeedNewFrame(mNumFrames, x_offset, y_offset, width, height, format);
} else if (mNumFrames != 0) {
NeedNewFrame(mNumFrames, x_offset, y_offset, width, height, format);
}
mFrameRect = neededRect;
- mFrameHasNoAlpha = true;
PR_LOG(GetPNGDecoderAccountingLog(), PR_LOG_DEBUG,
("PNGDecoderAccounting: nsPNGDecoder::CreateFrame -- created "
"image frame with %dx%d pixels in container %p",
width, height,
&mImage));
#ifdef PNG_APNG_SUPPORTED
@@ -196,17 +195,17 @@ nsPNGDecoder::EndImageFrame()
{
if (mFrameIsHidden) {
return;
}
mNumFrames++;
Opacity opacity = Opacity::SOME_TRANSPARENCY;
- if (format == gfx::SurfaceFormat::B8G8R8X8 || mFrameHasNoAlpha) {
+ if (format == gfx::SurfaceFormat::B8G8R8X8) {
opacity = Opacity::OPAQUE;
}
#ifdef PNG_APNG_SUPPORTED
uint32_t numFrames = GetFrameCount();
// We can't use mPNG->num_frames_read as it may be one ahead.
if (numFrames > 1) {
@@ -734,17 +733,16 @@ nsPNGDecoder::row_callback(png_structp p
png_bytep line = new_row;
if (decoder->interlacebuf) {
line = decoder->interlacebuf + (row_num * decoder->mChannels * width);
png_progressive_combine_row(png_ptr, line, new_row);
}
uint32_t bpr = width * sizeof(uint32_t);
uint32_t* cptr32 = (uint32_t*)(decoder->mImageData + (row_num*bpr));
- bool rowHasNoAlpha = true;
if (decoder->mTransform) {
if (decoder->mCMSLine) {
qcms_transform_data(decoder->mTransform, line, decoder->mCMSLine,
iwidth);
// copy alpha over
uint32_t channels = decoder->mChannels;
if (channels == 2 || channels == 4) {
@@ -783,41 +781,31 @@ nsPNGDecoder::row_callback(png_structp p
line += 3;
}
}
break;
case gfx::SurfaceFormat::B8G8R8A8: {
if (!decoder->mDisablePremultipliedAlpha) {
for (uint32_t x=width; x>0; --x) {
*cptr32++ = gfxPackedPixel(line[3], line[0], line[1], line[2]);
- if (line[3] != 0xff) {
- rowHasNoAlpha = false;
- }
line += 4;
}
} else {
for (uint32_t x=width; x>0; --x) {
*cptr32++ = gfxPackedPixelNoPreMultiply(line[3], line[0], line[1],
line[2]);
- if (line[3] != 0xff) {
- rowHasNoAlpha = false;
- }
line += 4;
}
}
}
break;
default:
png_longjmp(decoder->mPNG, 1);
}
- if (!rowHasNoAlpha) {
- decoder->mFrameHasNoAlpha = false;
- }
-
if (decoder->mNumFrames <= 1) {
// Only do incremental image display for the first frame
// XXXbholley - this check should be handled in the superclass
nsIntRect r(0, row_num, width, 1);
decoder->PostInvalidation(r);
}
}
}
--- a/image/decoders/nsPNGDecoder.h
+++ b/image/decoders/nsPNGDecoder.h
@@ -81,17 +81,16 @@ public:
// For size decodes
uint8_t mSizeBytes[8]; // Space for width and height, both 4 bytes
uint32_t mHeaderBytesRead;
// whether CMS or premultiplied alpha are forced off
uint32_t mCMSMode;
uint8_t mChannels;
- bool mFrameHasNoAlpha;
bool mFrameIsHidden;
bool mDisablePremultipliedAlpha;
struct AnimFrameInfo
{
AnimFrameInfo();
#ifdef PNG_APNG_SUPPORTED
AnimFrameInfo(png_structp aPNG, png_infop aInfo);