Bug 1218823 - use UniquePtr<> in preference to delete[] in image/; r=seth

This commit is contained in:
Nathan Froyd 2015-10-27 10:47:51 -04:00
parent f5a7d91c7c
commit edc9df0468
6 changed files with 25 additions and 31 deletions

View File

@ -273,15 +273,13 @@ private:
, mLength(0)
{
MOZ_ASSERT(aCapacity > 0, "Creating zero-capacity chunk");
mData = new (fallible) char[mCapacity];
mData.reset(new (fallible) char[mCapacity]);
}
~Chunk() { delete[] mData; }
Chunk(Chunk&& aOther)
: mCapacity(aOther.mCapacity)
, mLength(aOther.mLength)
, mData(aOther.mData)
, mData(Move(aOther.mData))
{
aOther.mCapacity = aOther.mLength = 0;
aOther.mData = nullptr;
@ -291,7 +289,7 @@ private:
{
mCapacity = aOther.mCapacity;
mLength = aOther.mLength;
mData = aOther.mData;
mData = Move(aOther.mData);
aOther.mCapacity = aOther.mLength = 0;
aOther.mData = nullptr;
return *this;
@ -304,7 +302,7 @@ private:
char* Data() const
{
MOZ_ASSERT(mData, "Allocation failed but nobody checked for it");
return mData;
return mData.get();
}
void AddLength(size_t aAdditionalLength)
@ -319,7 +317,7 @@ private:
size_t mCapacity;
size_t mLength;
char* mData;
UniquePtr<char[]> mData;
};
nsresult AppendChunk(Maybe<Chunk>&& aChunk);

View File

@ -575,11 +575,11 @@ nsIconChannel::MakeInputStream(nsIInputStream** _retval, bool aNonBlocking)
colorHeader.biSizeImage +
maskHeader.biSizeImage;
char* buffer = new char[iconSize];
UniquePtr<char[]> buffer = MakeUnique<char[]>(iconSize);
if (!buffer) {
rv = NS_ERROR_OUT_OF_MEMORY;
} else {
char* whereTo = buffer;
char* whereTo = buffer.get();
int howMuch;
// the data starts with an icon file header
@ -640,7 +640,7 @@ nsIconChannel::MakeInputStream(nsIInputStream** _retval, bool aNonBlocking)
iconSize, iconSize, aNonBlocking);
if (NS_SUCCEEDED(rv)) {
uint32_t written;
rv = outStream->Write(buffer, iconSize, &written);
rv = outStream->Write(buffer.get(), iconSize, &written);
if (NS_SUCCEEDED(rv)) {
NS_ADDREF(*_retval = inStream);
}
@ -650,7 +650,6 @@ nsIconChannel::MakeInputStream(nsIInputStream** _retval, bool aNonBlocking)
delete maskInfo;
} // if we got mask bits
delete colorInfo;
delete [] buffer;
} // if we allocated the buffer
} // if we got mask size

View File

@ -137,7 +137,8 @@ SetPixel(uint32_t*& aDecoded, uint8_t aRed, uint8_t aGreen,
}
static void
SetPixel(uint32_t*& aDecoded, uint8_t idx, bmp::ColorTableEntry* aColors)
SetPixel(uint32_t*& aDecoded, uint8_t idx,
const UniquePtr<ColorTableEntry[]>& aColors)
{
SetPixel(aDecoded,
aColors[idx].mRed, aColors[idx].mGreen, aColors[idx].mBlue);
@ -150,7 +151,7 @@ SetPixel(uint32_t*& aDecoded, uint8_t idx, bmp::ColorTableEntry* aColors)
/// @param aCount Current count. Is decremented by one or two.
static void
Set4BitPixel(uint32_t*& aDecoded, uint8_t aData, uint32_t& aCount,
bmp::ColorTableEntry* aColors)
const UniquePtr<ColorTableEntry[]>& aColors)
{
uint8_t idx = aData >> 4;
SetPixel(aDecoded, idx, aColors);
@ -191,7 +192,6 @@ nsBMPDecoder::nsBMPDecoder(RasterImage* aImage)
nsBMPDecoder::~nsBMPDecoder()
{
delete[] mColors;
}
// Obtains the bits per pixel from the internal BIH header.
@ -671,8 +671,8 @@ nsBMPDecoder::ReadBitfields(const char* aData, size_t aLength)
// Always allocate and zero 256 entries, even though mNumColors might be
// smaller, because the file might erroneously index past mNumColors.
mColors = new ColorTableEntry[256];
memset(mColors, 0, 256 * sizeof(ColorTableEntry));
mColors = MakeUnique<ColorTableEntry[]>(256);
memset(mColors.get(), 0, 256 * sizeof(ColorTableEntry));
// OS/2 Bitmaps have no padding byte.
mBytesPerColor = (mBIH.bihsize == InfoHeaderLength::WIN_V2) ? 3 : 4;

View File

@ -11,6 +11,7 @@
#include "Decoder.h"
#include "gfxColor.h"
#include "StreamingLexer.h"
#include "mozilla/UniquePtr.h"
namespace mozilla {
namespace image {
@ -190,7 +191,7 @@ private:
uint32_t mNumColors; // The number of used colors, i.e. the number of
// entries in mColors, if it's present.
bmp::ColorTableEntry* mColors; // The color table, if it's present.
UniquePtr<bmp::ColorTableEntry[]> mColors; // The color table, if it's present.
uint32_t mBytesPerColor; // 3 or 4, depending on the format
// The number of bytes prior to the optional gap that have been read. This

View File

@ -162,19 +162,19 @@ nsJPEGEncoder::InitFromData(const uint8_t* aData,
jpeg_write_scanlines(&cinfo, const_cast<uint8_t**>(&row), 1);
}
} else if (aInputFormat == INPUT_FORMAT_RGBA) {
uint8_t* row = new uint8_t[aWidth * 3];
UniquePtr<uint8_t[]> rowptr = MakeUnique<uint8_t[]>(aWidth * 3);
uint8_t* row = rowptr.get();
while (cinfo.next_scanline < cinfo.image_height) {
ConvertRGBARow(&aData[cinfo.next_scanline * aStride], row, aWidth);
jpeg_write_scanlines(&cinfo, &row, 1);
}
delete[] row;
} else if (aInputFormat == INPUT_FORMAT_HOSTARGB) {
uint8_t* row = new uint8_t[aWidth * 3];
UniquePtr<uint8_t[]> rowptr = MakeUnique<uint8_t[]>(aWidth * 3);
uint8_t* row = rowptr.get();
while (cinfo.next_scanline < cinfo.image_height) {
ConvertHostARGBRow(&aData[cinfo.next_scanline * aStride], row, aWidth);
jpeg_write_scanlines(&cinfo, &row, 1);
}
delete[] row;
}
jpeg_finish_compress(&cinfo);

View File

@ -287,22 +287,18 @@ nsPNGEncoder::AddImageFrame(const uint8_t* aData,
if (aInputFormat == INPUT_FORMAT_HOSTARGB) {
// PNG requires RGBA with post-multiplied alpha, so we need to
// convert
uint8_t* row = new uint8_t[aWidth * 4];
UniquePtr<uint8_t[]> row = MakeUnique<uint8_t[]>(aWidth * 4);
for (uint32_t y = 0; y < aHeight; y++) {
ConvertHostARGBRow(&aData[y * aStride], row, aWidth, useTransparency);
png_write_row(mPNG, row);
ConvertHostARGBRow(&aData[y * aStride], row.get(), aWidth, useTransparency);
png_write_row(mPNG, row.get());
}
delete[] row;
} else if (aInputFormat == INPUT_FORMAT_RGBA && !useTransparency) {
// RBGA, but we need to strip the alpha
uint8_t* row = new uint8_t[aWidth * 4];
UniquePtr<uint8_t[]> row = MakeUnique<uint8_t[]>(aWidth * 4);
for (uint32_t y = 0; y < aHeight; y++) {
StripAlpha(&aData[y * aStride], row, aWidth);
png_write_row(mPNG, row);
StripAlpha(&aData[y * aStride], row.get(), aWidth);
png_write_row(mPNG, row.get());
}
delete[] row;
} else if (aInputFormat == INPUT_FORMAT_RGB ||
aInputFormat == INPUT_FORMAT_RGBA) {
// simple RBG(A), no conversion needed