SkBmpStandardCodec.h revision 6193568fed3983e406544a46a5e1fd292729ca84
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
8#include "SkBmpCodec.h"
9#include "SkColorTable.h"
10#include "SkImageInfo.h"
11#include "SkSwizzler.h"
12#include "SkTypes.h"
13
14/*
15 * This class implements the decoding for bmp images that use "standard" modes,
16 * which essentially means they do not contain bit masks or RLE codes.
17 */
18class SkBmpStandardCodec : public SkBmpCodec {
19public:
20
21    /*
22     * Creates an instance of the decoder
23     *
24     * Called only by SkBmpCodec::NewFromStream
25     * There should be no other callers despite this being public
26     *
27     * @param info contains properties of the encoded data
28     * @param stream the stream of encoded image data
29     * @param bitsPerPixel the number of bits used to store each pixel
30     * @param numColors the number of colors in the color table
31     * @param bytesPerColor the number of bytes in the stream used to represent
32                            each color in the color table
33     * @param offset the offset of the image pixel data from the end of the
34     *               headers
35     * @param rowOrder indicates whether rows are ordered top-down or bottom-up
36     * @param isOpaque indicates if the bmp itself is opaque (before applying
37     *                 the icp mask, if there is one)
38     * @param inIco    indicates if the bmp is embedded in an ico file
39     */
40    SkBmpStandardCodec(int width, int height, const SkEncodedInfo& info, SkStream* stream,
41            uint16_t bitsPerPixel, uint32_t numColors, uint32_t bytesPerColor,
42            uint32_t offset, SkCodec::SkScanlineOrder rowOrder, bool isOpaque,
43            bool inIco);
44
45protected:
46
47    Result onGetPixels(const SkImageInfo& dstInfo, void* dst,
48                       size_t dstRowBytes, const Options&, SkPMColor*,
49                       int*, int*) override;
50
51    bool onInIco() const override {
52        return fInIco;
53    }
54
55    SkCodec::Result prepareToDecode(const SkImageInfo& dstInfo,
56            const SkCodec::Options& options, SkPMColor inputColorPtr[],
57            int* inputColorCount) override;
58
59
60    uint64_t onGetFillValue(const SkImageInfo&) const override;
61
62    SkSampler* getSampler(bool createIfNecessary) override {
63        SkASSERT(fSwizzler);
64        return fSwizzler;
65    }
66
67private:
68
69    /*
70     * Creates the color table
71     * Sets colorCount to the new color count if it is non-nullptr
72     */
73    bool createColorTable(SkColorType colorType, SkAlphaType alphaType, int* colorCount);
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    SkAutoTUnref<SkColorTable>          fColorTable;     // owned
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    SkAutoTDelete<SkSwizzler>           fSwizzler;
93    std::unique_ptr<uint8_t[]>          fSrcBuffer;
94    const bool                          fIsOpaque;
95    const bool                          fInIco;
96    const size_t                        fAndMaskRowBytes; // only used for fInIco decodes
97
98    typedef SkBmpCodec INHERITED;
99};
100