Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/gfx/skia/skia/include/encode/SkPngEncoder.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright 2017 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 SkPngEncoder_DEFINED
9
#define SkPngEncoder_DEFINED
10
11
#include "SkEncoder.h"
12
#include "SkDataTable.h"
13
14
class SkPngEncoderMgr;
15
class SkWStream;
16
17
class SK_API SkPngEncoder : public SkEncoder {
18
public:
19
20
    enum class FilterFlag : int {
21
        kZero  = 0x00,
22
        kNone  = 0x08,
23
        kSub   = 0x10,
24
        kUp    = 0x20,
25
        kAvg   = 0x40,
26
        kPaeth = 0x80,
27
        kAll   = kNone | kSub | kUp | kAvg | kPaeth,
28
    };
29
30
    struct Options {
31
        /**
32
         *  Selects which filtering strategies to use.
33
         *
34
         *  If a single filter is chosen, libpng will use that filter for every row.
35
         *
36
         *  If multiple filters are chosen, libpng will use a heuristic to guess which filter
37
         *  will encode smallest, then apply that filter.  This happens on a per row basis,
38
         *  different rows can use different filters.
39
         *
40
         *  Using a single filter (or less filters) is typically faster.  Trying all of the
41
         *  filters may help minimize the output file size.
42
         *
43
         *  Our default value matches libpng's default.
44
         */
45
        FilterFlag fFilterFlags = FilterFlag::kAll;
46
47
        /**
48
         *  Must be in [0, 9] where 9 corresponds to maximal compression.  This value is passed
49
         *  directly to zlib.  0 is a special case to skip zlib entirely, creating dramatically
50
         *  larger pngs.
51
         *
52
         *  Our default value matches libpng's default.
53
         */
54
        int fZLibLevel = 6;
55
56
        /**
57
         *  If the input is premultiplied, this controls the unpremultiplication behavior.
58
         *  The encoder can convert to linear before unpremultiplying or ignore the transfer
59
         *  function and unpremultiply the input as is.
60
         */
61
        SkTransferFunctionBehavior fUnpremulBehavior = SkTransferFunctionBehavior::kRespect;
62
63
        /**
64
         *  Represents comments in the tEXt ancillary chunk of the png.
65
         *  The 2i-th entry is the keyword for the i-th comment,
66
         *  and the (2i + 1)-th entry is the text for the i-th comment.
67
         */
68
        sk_sp<SkDataTable> fComments;
69
    };
70
71
    /**
72
     *  Encode the |src| pixels to the |dst| stream.
73
     *  |options| may be used to control the encoding behavior.
74
     *
75
     *  Returns true on success.  Returns false on an invalid or unsupported |src|.
76
     */
77
    static bool Encode(SkWStream* dst, const SkPixmap& src, const Options& options);
78
79
    /**
80
     *  Create a png encoder that will encode the |src| pixels to the |dst| stream.
81
     *  |options| may be used to control the encoding behavior.
82
     *
83
     *  |dst| is unowned but must remain valid for the lifetime of the object.
84
     *
85
     *  This returns nullptr on an invalid or unsupported |src|.
86
     */
87
    static std::unique_ptr<SkEncoder> Make(SkWStream* dst, const SkPixmap& src,
88
                                           const Options& options);
89
90
    ~SkPngEncoder() override;
91
92
protected:
93
    bool onEncodeRows(int numRows) override;
94
95
    SkPngEncoder(std::unique_ptr<SkPngEncoderMgr>, const SkPixmap& src);
96
97
    std::unique_ptr<SkPngEncoderMgr> fEncoderMgr;
98
    typedef SkEncoder INHERITED;
99
};
100
101
static inline SkPngEncoder::FilterFlag operator|(SkPngEncoder::FilterFlag x,
102
0
                                                 SkPngEncoder::FilterFlag y) {
103
0
    return (SkPngEncoder::FilterFlag)((int)x | (int)y);
104
0
}
105
106
#endif