1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2015 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkBmpMaskCodec_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SkBmpMaskCodec_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/codec/SkCodec.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/codec/SkBmpBaseCodec.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/codec/SkMaskSwizzler.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkMasks.h" 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef> 18*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 19*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker class SkSampler; 22*c8dee2aaSAndroid Build Coastguard Worker class SkStream; 23*c8dee2aaSAndroid Build Coastguard Worker struct SkEncodedInfo; 24*c8dee2aaSAndroid Build Coastguard Worker struct SkImageInfo; 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker /* 27*c8dee2aaSAndroid Build Coastguard Worker * This class implements the decoding for bmp images using bit masks 28*c8dee2aaSAndroid Build Coastguard Worker */ 29*c8dee2aaSAndroid Build Coastguard Worker class SkBmpMaskCodec : public SkBmpBaseCodec { 30*c8dee2aaSAndroid Build Coastguard Worker public: 31*c8dee2aaSAndroid Build Coastguard Worker 32*c8dee2aaSAndroid Build Coastguard Worker /* 33*c8dee2aaSAndroid Build Coastguard Worker * Creates an instance of the decoder 34*c8dee2aaSAndroid Build Coastguard Worker * 35*c8dee2aaSAndroid Build Coastguard Worker * Called only by SkBmpCodec::MakeFromStream 36*c8dee2aaSAndroid Build Coastguard Worker * There should be no other callers despite this being public 37*c8dee2aaSAndroid Build Coastguard Worker * 38*c8dee2aaSAndroid Build Coastguard Worker * @param info contains properties of the encoded data 39*c8dee2aaSAndroid Build Coastguard Worker * @param stream the stream of encoded image data 40*c8dee2aaSAndroid Build Coastguard Worker * @param bitsPerPixel the number of bits used to store each pixel 41*c8dee2aaSAndroid Build Coastguard Worker * @param masks color masks for certain bmp formats 42*c8dee2aaSAndroid Build Coastguard Worker * @param rowOrder indicates whether rows are ordered top-down or bottom-up 43*c8dee2aaSAndroid Build Coastguard Worker */ 44*c8dee2aaSAndroid Build Coastguard Worker SkBmpMaskCodec(SkEncodedInfo&& info, std::unique_ptr<SkStream>, 45*c8dee2aaSAndroid Build Coastguard Worker uint16_t bitsPerPixel, SkMasks* masks, 46*c8dee2aaSAndroid Build Coastguard Worker SkCodec::SkScanlineOrder rowOrder); 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Worker protected: 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker Result onGetPixels(const SkImageInfo& dstInfo, void* dst, 51*c8dee2aaSAndroid Build Coastguard Worker size_t dstRowBytes, const Options&, 52*c8dee2aaSAndroid Build Coastguard Worker int*) override; 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker SkCodec::Result onPrepareToDecode(const SkImageInfo& dstInfo, 55*c8dee2aaSAndroid Build Coastguard Worker const SkCodec::Options& options) override; 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker private: 58*c8dee2aaSAndroid Build Coastguard Worker getSampler(bool createIfNecessary)59*c8dee2aaSAndroid Build Coastguard Worker SkSampler* getSampler(bool createIfNecessary) override { 60*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fMaskSwizzler); 61*c8dee2aaSAndroid Build Coastguard Worker return fMaskSwizzler.get(); 62*c8dee2aaSAndroid Build Coastguard Worker } 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker int decodeRows(const SkImageInfo& dstInfo, void* dst, size_t dstRowBytes, 65*c8dee2aaSAndroid Build Coastguard Worker const Options& opts) override; 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkMasks> fMasks; 68*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkMaskSwizzler> fMaskSwizzler; 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = SkBmpBaseCodec; 71*c8dee2aaSAndroid Build Coastguard Worker }; 72*c8dee2aaSAndroid Build Coastguard Worker #endif // SkBmpMaskCodec_DEFINED 73