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
14class SkPngEncoderMgr;
15class SkWStream;
16
17class SK_API SkPngEncoder : public SkEncoder {
18public:
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> fComments;
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
85protected:
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
94static inline SkPngEncoder::FilterFlag operator|(SkPngEncoder::FilterFlag x,
95 SkPngEncoder::FilterFlag y) {
96 return (SkPngEncoder::FilterFlag)((int)x | (int)y);
97}
98
99#endif
100