/src/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 "include/core/SkDataTable.h" |
12 | | #include "include/core/SkRefCnt.h" |
13 | | #include "include/private/base/SkAPI.h" |
14 | | |
15 | | // TODO(kjlubick) update clients to directly include this |
16 | | #include "include/encode/SkEncoder.h" // IWYU pragma: keep |
17 | | |
18 | | #include <memory> |
19 | | |
20 | | class GrDirectContext; |
21 | | class SkData; |
22 | | class SkImage; |
23 | | class SkPixmap; |
24 | | class SkWStream; |
25 | | struct skcms_ICCProfile; |
26 | | |
27 | | namespace SkPngEncoder { |
28 | | |
29 | | enum class FilterFlag : int { |
30 | | kZero = 0x00, |
31 | | kNone = 0x08, |
32 | | kSub = 0x10, |
33 | | kUp = 0x20, |
34 | | kAvg = 0x40, |
35 | | kPaeth = 0x80, |
36 | | kAll = kNone | kSub | kUp | kAvg | kPaeth, |
37 | | }; |
38 | | |
39 | 0 | inline FilterFlag operator|(FilterFlag x, FilterFlag y) { return (FilterFlag)((int)x | (int)y); } |
40 | | |
41 | | struct Options { |
42 | | /** |
43 | | * Selects which filtering strategies to use. |
44 | | * |
45 | | * If a single filter is chosen, libpng will use that filter for every row. |
46 | | * |
47 | | * If multiple filters are chosen, libpng will use a heuristic to guess which filter |
48 | | * will encode smallest, then apply that filter. This happens on a per row basis, |
49 | | * different rows can use different filters. |
50 | | * |
51 | | * Using a single filter (or less filters) is typically faster. Trying all of the |
52 | | * filters may help minimize the output file size. |
53 | | * |
54 | | * Our default value matches libpng's default. |
55 | | */ |
56 | | FilterFlag fFilterFlags = FilterFlag::kAll; |
57 | | |
58 | | /** |
59 | | * Must be in [0, 9] where 9 corresponds to maximal compression. This value is passed |
60 | | * directly to zlib. 0 is a special case to skip zlib entirely, creating dramatically |
61 | | * larger pngs. |
62 | | * |
63 | | * Our default value matches libpng's default. |
64 | | */ |
65 | | int fZLibLevel = 6; |
66 | | |
67 | | /** |
68 | | * Represents comments in the tEXt ancillary chunk of the png. |
69 | | * The 2i-th entry is the keyword for the i-th comment, |
70 | | * and the (2i + 1)-th entry is the text for the i-th comment. |
71 | | */ |
72 | | sk_sp<SkDataTable> fComments; |
73 | | |
74 | | /** |
75 | | * An optional ICC profile to override the default behavior. |
76 | | * |
77 | | * The default behavior is to generate an ICC profile using a primary matrix and |
78 | | * analytic transfer function. If the color space of |src| cannot be represented |
79 | | * in this way (e.g, it is HLG or PQ), then no profile will be embedded. |
80 | | */ |
81 | | const skcms_ICCProfile* fICCProfile = nullptr; |
82 | | const char* fICCProfileDescription = nullptr; |
83 | | }; |
84 | | |
85 | | /** |
86 | | * Encode the |src| pixels to the |dst| stream. |
87 | | * |options| may be used to control the encoding behavior. |
88 | | * |
89 | | * Returns true on success. Returns false on an invalid or unsupported |src|. |
90 | | */ |
91 | | SK_API bool Encode(SkWStream* dst, const SkPixmap& src, const Options& options); |
92 | | |
93 | | /** |
94 | | * Encode the provided image and return the resulting bytes. If the image was created as |
95 | | * a texture-backed image on a GPU context, that |ctx| must be provided so the pixels |
96 | | * can be read before being encoded. For raster-backed images, |ctx| can be nullptr. |
97 | | * |options| may be used to control the encoding behavior. |
98 | | * |
99 | | * Returns nullptr if the pixels could not be read or encoding otherwise fails. |
100 | | */ |
101 | | SK_API sk_sp<SkData> Encode(GrDirectContext* ctx, const SkImage* img, const Options& options); |
102 | | |
103 | | /** |
104 | | * Create a png encoder that will encode the |src| pixels to the |dst| stream. |
105 | | * |options| may be used to control the encoding behavior. |
106 | | * |
107 | | * The primary use of this is incremental encoding of the pixels. |
108 | | * |
109 | | * |dst| is unowned but must remain valid for the lifetime of the object. |
110 | | * |
111 | | * This returns nullptr on an invalid or unsupported |src|. |
112 | | */ |
113 | | SK_API std::unique_ptr<SkEncoder> Make(SkWStream* dst, const SkPixmap& src, const Options& options); |
114 | | |
115 | | } // namespace SkPngEncoder |
116 | | |
117 | | #endif |