diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/codec/SkBmpBaseCodec.cpp | 16 | ||||
-rw-r--r-- | src/codec/SkBmpBaseCodec.h | 38 | ||||
-rw-r--r-- | src/codec/SkBmpCodec.cpp | 17 | ||||
-rw-r--r-- | src/codec/SkBmpMaskCodec.cpp | 3 | ||||
-rw-r--r-- | src/codec/SkBmpMaskCodec.h | 7 | ||||
-rw-r--r-- | src/codec/SkBmpStandardCodec.cpp | 11 | ||||
-rw-r--r-- | src/codec/SkBmpStandardCodec.h | 7 |
7 files changed, 79 insertions, 20 deletions
diff --git a/src/codec/SkBmpBaseCodec.cpp b/src/codec/SkBmpBaseCodec.cpp new file mode 100644 index 0000000000..0e744351f0 --- /dev/null +++ b/src/codec/SkBmpBaseCodec.cpp @@ -0,0 +1,16 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +#include "SkBmpBaseCodec.h" +#include "../private/SkMalloc.h" + +SkBmpBaseCodec::~SkBmpBaseCodec() {} + +SkBmpBaseCodec::SkBmpBaseCodec(int width, int height, const SkEncodedInfo& info, SkStream* stream, + uint16_t bitsPerPixel, SkCodec::SkScanlineOrder rowOrder) + : INHERITED(width, height, info, stream, bitsPerPixel, rowOrder) + , fSrcBuffer(sk_malloc_flags(this->srcRowBytes(), 0)) +{} diff --git a/src/codec/SkBmpBaseCodec.h b/src/codec/SkBmpBaseCodec.h new file mode 100644 index 0000000000..0b9f91977e --- /dev/null +++ b/src/codec/SkBmpBaseCodec.h @@ -0,0 +1,38 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ +#ifndef SkBmpBaseCodec_DEFINED +#define SkBmpBaseCodec_DEFINED + +#include "SkBmpCodec.h" +#include "SkTemplates.h" + +/* + * Common base class for SkBmpStandardCodec and SkBmpMaskCodec. + */ +class SkBmpBaseCodec : public SkBmpCodec { +public: + ~SkBmpBaseCodec() override; + + /* + * Whether fSrcBuffer was successfully created. + * + * If false, this Codec must not be used. + */ + bool didCreateSrcBuffer() const { return fSrcBuffer != nullptr; } + +protected: + SkBmpBaseCodec(int width, int height, const SkEncodedInfo& info, SkStream* stream, + uint16_t bitsPerPixel, SkCodec::SkScanlineOrder rowOrder); + + uint8_t* srcBuffer() { return reinterpret_cast<uint8_t*>(fSrcBuffer.get()); } + +private: + SkAutoFree fSrcBuffer; + + typedef SkBmpCodec INHERITED; +}; +#endif // SkBmpBaseCodec_DEFINED diff --git a/src/codec/SkBmpCodec.cpp b/src/codec/SkBmpCodec.cpp index 3158e992d2..0525d9530c 100644 --- a/src/codec/SkBmpCodec.cpp +++ b/src/codec/SkBmpCodec.cpp @@ -481,8 +481,13 @@ bool SkBmpCodec::ReadHeader(SkStream* stream, bool inIco, SkCodec** codecOut) { // Set the image info and create a codec. const SkEncodedInfo info = SkEncodedInfo::Make(color, alpha, bitsPerComponent); - *codecOut = new SkBmpStandardCodec(width, height, info, stream, bitsPerPixel, - numColors, bytesPerColor, offset - bytesRead, rowOrder, isOpaque, inIco); + std::unique_ptr<SkBmpStandardCodec> codec(new SkBmpStandardCodec(width, height, + info, stream, bitsPerPixel, numColors, bytesPerColor, offset - bytesRead, + rowOrder, isOpaque, inIco)); + if (!codec->didCreateSrcBuffer()) { + return false; + } + *codecOut = codec.release(); } return true; } @@ -534,8 +539,12 @@ bool SkBmpCodec::ReadHeader(SkStream* stream, bool inIco, SkCodec** codecOut) { alpha = SkEncodedInfo::kOpaque_Alpha; } const SkEncodedInfo info = SkEncodedInfo::Make(color, alpha, 8); - *codecOut = new SkBmpMaskCodec(width, height, info, stream, bitsPerPixel, - masks.release(), rowOrder); + std::unique_ptr<SkBmpMaskCodec> codec(new SkBmpMaskCodec(width, height, info, + stream, bitsPerPixel, masks.release(), rowOrder)); + if (!codec->didCreateSrcBuffer()) { + return false; + } + *codecOut = codec.release(); } return true; } diff --git a/src/codec/SkBmpMaskCodec.cpp b/src/codec/SkBmpMaskCodec.cpp index 9612a23b53..c839983d43 100644 --- a/src/codec/SkBmpMaskCodec.cpp +++ b/src/codec/SkBmpMaskCodec.cpp @@ -18,7 +18,6 @@ SkBmpMaskCodec::SkBmpMaskCodec(int width, int height, const SkEncodedInfo& info, : INHERITED(width, height, info, stream, bitsPerPixel, rowOrder) , fMasks(masks) , fMaskSwizzler(nullptr) - , fSrcBuffer(new uint8_t [this->srcRowBytes()]) {} /* @@ -81,7 +80,7 @@ int SkBmpMaskCodec::decodeRows(const SkImageInfo& dstInfo, void* dst, size_t dstRowBytes, const Options& opts) { // Iterate over rows of the image - uint8_t* srcRow = fSrcBuffer.get(); + uint8_t* srcRow = this->srcBuffer(); const int height = dstInfo.height(); for (int y = 0; y < height; y++) { // Read a row of the input diff --git a/src/codec/SkBmpMaskCodec.h b/src/codec/SkBmpMaskCodec.h index 50e285dff3..2f8c060c7a 100644 --- a/src/codec/SkBmpMaskCodec.h +++ b/src/codec/SkBmpMaskCodec.h @@ -8,7 +8,7 @@ #ifndef SkBmpMaskCodec_DEFINED #define SkBmpMaskCodec_DEFINED -#include "SkBmpCodec.h" +#include "SkBmpBaseCodec.h" #include "SkImageInfo.h" #include "SkMaskSwizzler.h" #include "SkTypes.h" @@ -16,7 +16,7 @@ /* * This class implements the decoding for bmp images using bit masks */ -class SkBmpMaskCodec : public SkBmpCodec { +class SkBmpMaskCodec : public SkBmpBaseCodec { public: /* @@ -57,8 +57,7 @@ private: std::unique_ptr<SkMasks> fMasks; std::unique_ptr<SkMaskSwizzler> fMaskSwizzler; - std::unique_ptr<uint8_t[]> fSrcBuffer; - typedef SkBmpCodec INHERITED; + typedef SkBmpBaseCodec INHERITED; }; #endif // SkBmpMaskCodec_DEFINED diff --git a/src/codec/SkBmpStandardCodec.cpp b/src/codec/SkBmpStandardCodec.cpp index a0ad7875eb..c223678769 100644 --- a/src/codec/SkBmpStandardCodec.cpp +++ b/src/codec/SkBmpStandardCodec.cpp @@ -25,7 +25,6 @@ SkBmpStandardCodec::SkBmpStandardCodec(int width, int height, const SkEncodedInf , fBytesPerColor(bytesPerColor) , fOffset(offset) , fSwizzler(nullptr) - , fSrcBuffer(new uint8_t[this->srcRowBytes()]) , fIsOpaque(isOpaque) , fInIco(inIco) , fAndMaskRowBytes(fInIco ? SkAlign4(compute_row_bytes(this->getInfo().width(), 1)) : 0) @@ -231,7 +230,7 @@ int SkBmpStandardCodec::decodeRows(const SkImageInfo& dstInfo, void* dst, size_t const int height = dstInfo.height(); for (int y = 0; y < height; y++) { // Read a row of the input - if (this->stream()->read(fSrcBuffer.get(), this->srcRowBytes()) != this->srcRowBytes()) { + if (this->stream()->read(this->srcBuffer(), this->srcRowBytes()) != this->srcRowBytes()) { SkCodecPrintf("Warning: incomplete input stream.\n"); return y; } @@ -244,10 +243,10 @@ int SkBmpStandardCodec::decodeRows(const SkImageInfo& dstInfo, void* dst, size_t if (fXformOnDecode) { SkASSERT(this->colorXform()); SkImageInfo xformInfo = dstInfo.makeWH(fSwizzler->swizzleWidth(), dstInfo.height()); - fSwizzler->swizzle(this->xformBuffer(), fSrcBuffer.get()); + fSwizzler->swizzle(this->xformBuffer(), this->srcBuffer()); this->applyColorXform(xformInfo, dstRow, this->xformBuffer()); } else { - fSwizzler->swizzle(dstRow, fSrcBuffer.get()); + fSwizzler->swizzle(dstRow, this->srcBuffer()); } } @@ -321,7 +320,7 @@ void SkBmpStandardCodec::decodeIcoMask(SkStream* stream, const SkImageInfo& dstI SkPMColor* dstPtr = (SkPMColor*) dst; for (int y = 0; y < dstInfo.height(); y++) { // The srcBuffer will at least be large enough - if (stream->read(fSrcBuffer.get(), fAndMaskRowBytes) != fAndMaskRowBytes) { + if (stream->read(this->srcBuffer(), fAndMaskRowBytes) != fAndMaskRowBytes) { SkCodecPrintf("Warning: incomplete AND mask for bmp-in-ico.\n"); return; } @@ -346,7 +345,7 @@ void SkBmpStandardCodec::decodeIcoMask(SkStream* stream, const SkImageInfo& dstI int modulus; SkTDivMod(srcX, 8, "ient, &modulus); uint32_t shift = 7 - modulus; - uint64_t alphaBit = (fSrcBuffer.get()[quotient] >> shift) & 0x1; + uint64_t alphaBit = (this->srcBuffer()[quotient] >> shift) & 0x1; applyMask(dstRow, dstX, alphaBit); srcX += sampleX; } diff --git a/src/codec/SkBmpStandardCodec.h b/src/codec/SkBmpStandardCodec.h index 740db8ead0..82937f385c 100644 --- a/src/codec/SkBmpStandardCodec.h +++ b/src/codec/SkBmpStandardCodec.h @@ -7,7 +7,7 @@ #ifndef SkBmpStandardCodec_DEFINED #define SkBmpStandardCodec_DEFINED -#include "SkBmpCodec.h" +#include "SkBmpBaseCodec.h" #include "SkColorTable.h" #include "SkImageInfo.h" #include "SkSwizzler.h" @@ -17,7 +17,7 @@ * This class implements the decoding for bmp images that use "standard" modes, * which essentially means they do not contain bit masks or RLE codes. */ -class SkBmpStandardCodec : public SkBmpCodec { +class SkBmpStandardCodec : public SkBmpBaseCodec { public: /* @@ -92,12 +92,11 @@ private: const uint32_t fBytesPerColor; const uint32_t fOffset; std::unique_ptr<SkSwizzler> fSwizzler; - std::unique_ptr<uint8_t[]> fSrcBuffer; const bool fIsOpaque; const bool fInIco; const size_t fAndMaskRowBytes; // only used for fInIco decodes bool fXformOnDecode; - typedef SkBmpCodec INHERITED; + typedef SkBmpBaseCodec INHERITED; }; #endif // SkBmpStandardCodec_DEFINED |