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 #ifndef SkCodec_wbmp_DEFINED
9 #define SkCodec_wbmp_DEFINED
10 
11 #include "SkCodec.h"
12 #include "SkColorSpace.h"
13 #include "SkSwizzler.h"
14 
15 class SkWbmpCodec final : public SkCodec {
16 public:
17     static bool IsWbmp(const void*, size_t);
18 
19     /*
20      * Assumes IsWbmp was called and returned true
21      * Creates a wbmp codec
22      * Takes ownership of the stream
23      */
24     static std::unique_ptr<SkCodec> MakeFromStream(std::unique_ptr<SkStream>, Result*);
25 
26 protected:
27     SkEncodedImageFormat onGetEncodedFormat() const override;
28     Result onGetPixels(const SkImageInfo&, void*, size_t,
29                        const Options&, int*) override;
30     bool onRewind() override;
31     bool conversionSupported(const SkImageInfo& dst, bool srcIsOpaque,
32                              bool needsXform) override;
33     // No need to Xform; all pixels are either black or white.
34     bool usesColorXform() const override { return false; }
35 private:
36     SkSampler* getSampler(bool createIfNecessary) override {
37         SkASSERT(fSwizzler || !createIfNecessary);
38         return fSwizzler.get();
39     }
40 
41     /*
42      * Read a src row from the encoded stream
43      */
44     bool readRow(uint8_t* row);
45 
46     SkWbmpCodec(SkEncodedInfo&&, std::unique_ptr<SkStream>);
47 
48     const size_t                fSrcRowBytes;
49 
50     // Used for scanline decodes:
51     std::unique_ptr<SkSwizzler> fSwizzler;
52     SkAutoTMalloc<uint8_t>      fSrcBuffer;
53 
54     int onGetScanlines(void* dst, int count, size_t dstRowBytes) override;
55     bool onSkipScanlines(int count) override;
56     Result onStartScanlineDecode(const SkImageInfo& dstInfo,
57             const Options& options) override;
58 
59     typedef SkCodec INHERITED;
60 };
61 
62 #endif  // SkCodec_wbmp_DEFINED
63