Coverage Report

Created: 2024-05-20 07:14

/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