diff --git a/image/Decoder.cpp b/image/Decoder.cpp index 8f065908f240..af72265aac0c 100644 --- a/image/Decoder.cpp +++ b/image/Decoder.cpp @@ -44,7 +44,9 @@ class MOZ_STACK_CLASS AutoRecordDecoderTelemetry final { }; Decoder::Decoder(RasterImage* aImage) - : mImageData(nullptr), + : mInProfile(nullptr), + mTransform(nullptr), + mImageData(nullptr), mImageDataLength(0), mImage(aImage), mFrameRecycler(nullptr), @@ -72,6 +74,14 @@ Decoder::~Decoder() { "Destroying Decoder without taking all its invalidations"); mInitialized = false; + if (mInProfile) { + // mTransform belongs to us only if mInProfile is non-null + if (mTransform) { + qcms_transform_release(mTransform); + } + qcms_profile_release(mInProfile); + } + if (mImage && !NS_IsMainThread()) { // Dispatch mImage to main thread to prevent it from being destructed by the // decode thread. diff --git a/image/Decoder.h b/image/Decoder.h index 5e673cc082e3..74d19c123411 100644 --- a/image/Decoder.h +++ b/image/Decoder.h @@ -19,6 +19,7 @@ #include "SourceBuffer.h" #include "StreamingLexer.h" #include "SurfaceFlags.h" +#include "qcms.h" namespace mozilla { @@ -559,6 +560,12 @@ class Decoder { protected: Maybe mDownscaler; + /// Color management profile from the ICCP chunk in the image. + qcms_profile* mInProfile; + + /// Color management transform to apply to image data. + qcms_transform* mTransform; + uint8_t* mImageData; // Pointer to image data in BGRA/X uint32_t mImageDataLength; diff --git a/image/decoders/nsJPEGDecoder.cpp b/image/decoders/nsJPEGDecoder.cpp index 0a9796fc97ab..33dc1cf28977 100644 --- a/image/decoders/nsJPEGDecoder.cpp +++ b/image/decoders/nsJPEGDecoder.cpp @@ -124,12 +124,6 @@ nsJPEGDecoder::~nsJPEGDecoder() { free(mBackBuffer); mBackBuffer = nullptr; - if (mTransform) { - qcms_transform_release(mTransform); - } - if (mInProfile) { - qcms_profile_release(mInProfile); - } MOZ_LOG(sJPEGDecoderAccountingLog, LogLevel::Debug, ("nsJPEGDecoder::~nsJPEGDecoder: Destroying JPEG decoder %p", this)); diff --git a/image/decoders/nsJPEGDecoder.h b/image/decoders/nsJPEGDecoder.h index 7f934c1f615e..82f99ff6df23 100644 --- a/image/decoders/nsJPEGDecoder.h +++ b/image/decoders/nsJPEGDecoder.h @@ -17,7 +17,6 @@ #include "nsIInputStream.h" #include "nsIPipe.h" -#include "qcms.h" extern "C" { #include "jpeglib.h" @@ -100,9 +99,6 @@ class nsJPEGDecoder : public Decoder { JOCTET* mProfile; uint32_t mProfileLength; - qcms_profile* mInProfile; - qcms_transform* mTransform; - bool mReading; const Decoder::DecodeStyle mDecodeStyle; diff --git a/image/decoders/nsPNGDecoder.cpp b/image/decoders/nsPNGDecoder.cpp index dbb700fc4e5e..785c1d43e96d 100644 --- a/image/decoders/nsPNGDecoder.cpp +++ b/image/decoders/nsPNGDecoder.cpp @@ -109,8 +109,6 @@ nsPNGDecoder::nsPNGDecoder(RasterImage* aImage) mInfo(nullptr), mCMSLine(nullptr), interlacebuf(nullptr), - mInProfile(nullptr), - mTransform(nullptr), mFormat(SurfaceFormat::UNKNOWN), mCMSMode(0), mChannels(0), @@ -130,14 +128,6 @@ nsPNGDecoder::~nsPNGDecoder() { if (interlacebuf) { free(interlacebuf); } - if (mInProfile) { - qcms_profile_release(mInProfile); - - // mTransform belongs to us only if mInProfile is non-null - if (mTransform) { - qcms_transform_release(mTransform); - } - } } nsPNGDecoder::TransparencyType nsPNGDecoder::GetTransparencyType( diff --git a/image/decoders/nsPNGDecoder.h b/image/decoders/nsPNGDecoder.h index 4cbc97a307e5..4ed454fea2b3 100644 --- a/image/decoders/nsPNGDecoder.h +++ b/image/decoders/nsPNGDecoder.h @@ -9,7 +9,6 @@ #include "Decoder.h" #include "png.h" -#include "qcms.h" #include "StreamingLexer.h" #include "SurfacePipe.h" @@ -92,8 +91,6 @@ class nsPNGDecoder : public Decoder { nsIntRect mFrameRect; uint8_t* mCMSLine; uint8_t* interlacebuf; - qcms_profile* mInProfile; - qcms_transform* mTransform; gfx::SurfaceFormat mFormat; // whether CMS or premultiplied alpha are forced off diff --git a/image/decoders/nsWebPDecoder.cpp b/image/decoders/nsWebPDecoder.cpp index ebf496ead9d7..3c5c459478e6 100644 --- a/image/decoders/nsWebPDecoder.cpp +++ b/image/decoders/nsWebPDecoder.cpp @@ -30,9 +30,7 @@ nsWebPDecoder::nsWebPDecoder(RasterImage* aImage) mLength(0), mIteratorComplete(false), mNeedDemuxer(true), - mGotColorProfile(false), - mInProfile(nullptr), - mTransform(nullptr) { + mGotColorProfile(false) { MOZ_LOG(sWebPLog, LogLevel::Debug, ("[this=%p] nsWebPDecoder::nsWebPDecoder", this)); } @@ -44,13 +42,6 @@ nsWebPDecoder::~nsWebPDecoder() { WebPIDelete(mDecoder); WebPFreeDecBuffer(&mBuffer); } - if (mInProfile) { - // mTransform belongs to us only if mInProfile is non-null - if (mTransform) { - qcms_transform_release(mTransform); - } - qcms_profile_release(mInProfile); - } } LexerResult nsWebPDecoder::ReadData() { diff --git a/image/decoders/nsWebPDecoder.h b/image/decoders/nsWebPDecoder.h index 87784b14a756..b8b86b31992a 100644 --- a/image/decoders/nsWebPDecoder.h +++ b/image/decoders/nsWebPDecoder.h @@ -97,12 +97,6 @@ class nsWebPDecoder final : public Decoder { /// True if we have setup the color profile for the image. bool mGotColorProfile; - - /// Color management profile from the ICCP chunk in the image. - qcms_profile* mInProfile; - - /// Color management transform to apply to image data. - qcms_transform* mTransform; }; } // namespace image