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 #ifndef SkBmpStandardCodec_DEFINED 8*c8dee2aaSAndroid Build Coastguard Worker #define SkBmpStandardCodec_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/codec/SkCodec.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/SkEncodedInfo.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/codec/SkBmpBaseCodec.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/codec/SkColorPalette.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/codec/SkSwizzler.h" 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef> 19*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 20*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker class SkSampler; 23*c8dee2aaSAndroid Build Coastguard Worker class SkStream; 24*c8dee2aaSAndroid Build Coastguard Worker enum SkAlphaType : int; 25*c8dee2aaSAndroid Build Coastguard Worker enum SkColorType : int; 26*c8dee2aaSAndroid Build Coastguard Worker struct SkImageInfo; 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker /* 29*c8dee2aaSAndroid Build Coastguard Worker * This class implements the decoding for bmp images that use "standard" modes, 30*c8dee2aaSAndroid Build Coastguard Worker * which essentially means they do not contain bit masks or RLE codes. 31*c8dee2aaSAndroid Build Coastguard Worker */ 32*c8dee2aaSAndroid Build Coastguard Worker class SkBmpStandardCodec : public SkBmpBaseCodec { 33*c8dee2aaSAndroid Build Coastguard Worker public: 34*c8dee2aaSAndroid Build Coastguard Worker 35*c8dee2aaSAndroid Build Coastguard Worker /* 36*c8dee2aaSAndroid Build Coastguard Worker * Creates an instance of the decoder 37*c8dee2aaSAndroid Build Coastguard Worker * 38*c8dee2aaSAndroid Build Coastguard Worker * Called only by SkBmpCodec::MakeFromStream 39*c8dee2aaSAndroid Build Coastguard Worker * There should be no other callers despite this being public 40*c8dee2aaSAndroid Build Coastguard Worker * 41*c8dee2aaSAndroid Build Coastguard Worker * @param info contains properties of the encoded data 42*c8dee2aaSAndroid Build Coastguard Worker * @param stream the stream of encoded image data 43*c8dee2aaSAndroid Build Coastguard Worker * @param bitsPerPixel the number of bits used to store each pixel 44*c8dee2aaSAndroid Build Coastguard Worker * @param numColors the number of colors in the color table 45*c8dee2aaSAndroid Build Coastguard Worker * @param bytesPerColor the number of bytes in the stream used to represent 46*c8dee2aaSAndroid Build Coastguard Worker each color in the color table 47*c8dee2aaSAndroid Build Coastguard Worker * @param offset the offset of the image pixel data from the end of the 48*c8dee2aaSAndroid Build Coastguard Worker * headers 49*c8dee2aaSAndroid Build Coastguard Worker * @param rowOrder indicates whether rows are ordered top-down or bottom-up 50*c8dee2aaSAndroid Build Coastguard Worker * @param isOpaque indicates if the bmp itself is opaque (before applying 51*c8dee2aaSAndroid Build Coastguard Worker * the icp mask, if there is one) 52*c8dee2aaSAndroid Build Coastguard Worker * @param inIco indicates if the bmp is embedded in an ico file 53*c8dee2aaSAndroid Build Coastguard Worker */ 54*c8dee2aaSAndroid Build Coastguard Worker SkBmpStandardCodec(SkEncodedInfo&& info, std::unique_ptr<SkStream> stream, 55*c8dee2aaSAndroid Build Coastguard Worker uint16_t bitsPerPixel, uint32_t numColors, uint32_t bytesPerColor, 56*c8dee2aaSAndroid Build Coastguard Worker uint32_t offset, SkCodec::SkScanlineOrder rowOrder, 57*c8dee2aaSAndroid Build Coastguard Worker bool isOpaque, bool inIco); 58*c8dee2aaSAndroid Build Coastguard Worker 59*c8dee2aaSAndroid Build Coastguard Worker protected: 60*c8dee2aaSAndroid Build Coastguard Worker 61*c8dee2aaSAndroid Build Coastguard Worker Result onGetPixels(const SkImageInfo& dstInfo, void* dst, 62*c8dee2aaSAndroid Build Coastguard Worker size_t dstRowBytes, const Options&, 63*c8dee2aaSAndroid Build Coastguard Worker int*) override; 64*c8dee2aaSAndroid Build Coastguard Worker onInIco()65*c8dee2aaSAndroid Build Coastguard Worker bool onInIco() const override { 66*c8dee2aaSAndroid Build Coastguard Worker return fInIco; 67*c8dee2aaSAndroid Build Coastguard Worker } 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker SkCodec::Result onPrepareToDecode(const SkImageInfo& dstInfo, 70*c8dee2aaSAndroid Build Coastguard Worker const SkCodec::Options& options) override; 71*c8dee2aaSAndroid Build Coastguard Worker getSampler(bool createIfNecessary)72*c8dee2aaSAndroid Build Coastguard Worker SkSampler* getSampler(bool createIfNecessary) override { 73*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fSwizzler); 74*c8dee2aaSAndroid Build Coastguard Worker return fSwizzler.get(); 75*c8dee2aaSAndroid Build Coastguard Worker } 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker private: 78*c8dee2aaSAndroid Build Coastguard Worker bool createColorTable(SkColorType colorType, SkAlphaType alphaType); 79*c8dee2aaSAndroid Build Coastguard Worker SkEncodedInfo swizzlerInfo() const; 80*c8dee2aaSAndroid Build Coastguard Worker void initializeSwizzler(const SkImageInfo& dstInfo, const Options& opts); 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker int decodeRows(const SkImageInfo& dstInfo, void* dst, size_t dstRowBytes, 83*c8dee2aaSAndroid Build Coastguard Worker const Options& opts) override; 84*c8dee2aaSAndroid Build Coastguard Worker 85*c8dee2aaSAndroid Build Coastguard Worker /* 86*c8dee2aaSAndroid Build Coastguard Worker * @param stream This may be a pointer to the stream owned by the parent SkCodec 87*c8dee2aaSAndroid Build Coastguard Worker * or a sub-stream of the stream owned by the parent SkCodec. 88*c8dee2aaSAndroid Build Coastguard Worker * Either way, this stream is unowned. 89*c8dee2aaSAndroid Build Coastguard Worker */ 90*c8dee2aaSAndroid Build Coastguard Worker void decodeIcoMask(SkStream* stream, const SkImageInfo& dstInfo, void* dst, size_t dstRowBytes); 91*c8dee2aaSAndroid Build Coastguard Worker 92*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorPalette> fColorTable; 93*c8dee2aaSAndroid Build Coastguard Worker // fNumColors is the number specified in the header, or 0 if not present in the header. 94*c8dee2aaSAndroid Build Coastguard Worker const uint32_t fNumColors; 95*c8dee2aaSAndroid Build Coastguard Worker const uint32_t fBytesPerColor; 96*c8dee2aaSAndroid Build Coastguard Worker const uint32_t fOffset; 97*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkSwizzler> fSwizzler; 98*c8dee2aaSAndroid Build Coastguard Worker const bool fIsOpaque; 99*c8dee2aaSAndroid Build Coastguard Worker const bool fInIco; 100*c8dee2aaSAndroid Build Coastguard Worker const size_t fAndMaskRowBytes; // only used for fInIco decodes 101*c8dee2aaSAndroid Build Coastguard Worker 102*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = SkBmpBaseCodec; 103*c8dee2aaSAndroid Build Coastguard Worker }; 104*c8dee2aaSAndroid Build Coastguard Worker #endif // SkBmpStandardCodec_DEFINED 105