1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2015 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifndef SkCodec_wbmp_DEFINED
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define SkCodec_wbmp_DEFINED
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCodec.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColorSpace.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkSwizzler.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkWbmpCodec final : public SkCodec {
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static bool IsWbmp(const void*, size_t);
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Assumes IsWbmp was called and returned true
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Creates a wbmp codec
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Takes ownership of the stream
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static std::unique_ptr<SkCodec> MakeFromStream(std::unique_ptr<SkStream>, Result*);
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkEncodedImageFormat onGetEncodedFormat() const override;
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    Result onGetPixels(const SkImageInfo&, void*, size_t,
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                       const Options&, int*) override;
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool onRewind() override;
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool conversionSupported(const SkImageInfo& dst, SkColorType srcColor,
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                             bool srcIsOpaque, const SkColorSpace* srcCS) const override;
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // No need to Xform; all pixels are either black or white.
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool usesColorXform() const override { return false; }
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Returns a swizzler on success, nullptr on failure
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkSwizzler* initializeSwizzler(const SkImageInfo& info,
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                   const Options& opts);
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkSampler* getSampler(bool createIfNecessary) override {
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkASSERT(fSwizzler || !createIfNecessary);
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fSwizzler.get();
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Read a src row from the encoded stream
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool readRow(uint8_t* row);
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkWbmpCodec(int width, int height, const SkEncodedInfo&, std::unique_ptr<SkStream>);
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const size_t                fSrcRowBytes;
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // Used for scanline decodes:
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    std::unique_ptr<SkSwizzler> fSwizzler;
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkAutoTMalloc<uint8_t>      fSrcBuffer;
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int onGetScanlines(void* dst, int count, size_t dstRowBytes) override;
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool onSkipScanlines(int count) override;
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    Result onStartScanlineDecode(const SkImageInfo& dstInfo,
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const Options& options) override;
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef SkCodec INHERITED;
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif  // SkCodec_wbmp_DEFINED
68