• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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                                                  SkPngEncoder::FilterFlag y) {
103     return (SkPngEncoder::FilterFlag)((int)x | (int)y);
104 }
105 
106 #endif
107