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