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 "include/core/SkDataTable.h" |
12 | #include "include/encode/SkEncoder.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 | * Represents comments in the tEXt ancillary chunk of the png. |
58 | * The 2i-th entry is the keyword for the i-th comment, |
59 | * and the (2i + 1)-th entry is the text for the i-th comment. |
60 | */ |
61 | sk_sp<SkDataTable> ; |
62 | }; |
63 | |
64 | /** |
65 | * Encode the |src| pixels to the |dst| stream. |
66 | * |options| may be used to control the encoding behavior. |
67 | * |
68 | * Returns true on success. Returns false on an invalid or unsupported |src|. |
69 | */ |
70 | static bool Encode(SkWStream* dst, const SkPixmap& src, const Options& options); |
71 | |
72 | /** |
73 | * Create a png encoder that will encode the |src| pixels to the |dst| stream. |
74 | * |options| may be used to control the encoding behavior. |
75 | * |
76 | * |dst| is unowned but must remain valid for the lifetime of the object. |
77 | * |
78 | * This returns nullptr on an invalid or unsupported |src|. |
79 | */ |
80 | static std::unique_ptr<SkEncoder> Make(SkWStream* dst, const SkPixmap& src, |
81 | const Options& options); |
82 | |
83 | ~SkPngEncoder() override; |
84 | |
85 | protected: |
86 | bool onEncodeRows(int numRows) override; |
87 | |
88 | SkPngEncoder(std::unique_ptr<SkPngEncoderMgr>, const SkPixmap& src); |
89 | |
90 | std::unique_ptr<SkPngEncoderMgr> fEncoderMgr; |
91 | typedef SkEncoder INHERITED; |
92 | }; |
93 | |
94 | static inline SkPngEncoder::FilterFlag operator|(SkPngEncoder::FilterFlag x, |
95 | SkPngEncoder::FilterFlag y) { |
96 | return (SkPngEncoder::FilterFlag)((int)x | (int)y); |
97 | } |
98 | |
99 | #endif |
100 | |