| /* |
| * Copyright 2017 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef SkPngEncoder_DEFINED |
| #define SkPngEncoder_DEFINED |
| |
| #include "SkEncoder.h" |
| #include "SkDataTable.h" |
| |
| class SkPngEncoderMgr; |
| class SkWStream; |
| |
| class SK_API SkPngEncoder : public SkEncoder { |
| public: |
| |
| enum class FilterFlag : int { |
| kZero = 0x00, |
| kNone = 0x08, |
| kSub = 0x10, |
| kUp = 0x20, |
| kAvg = 0x40, |
| kPaeth = 0x80, |
| kAll = kNone | kSub | kUp | kAvg | kPaeth, |
| }; |
| |
| struct Options { |
| /** |
| * Selects which filtering strategies to use. |
| * |
| * If a single filter is chosen, libpng will use that filter for every row. |
| * |
| * If multiple filters are chosen, libpng will use a heuristic to guess which filter |
| * will encode smallest, then apply that filter. This happens on a per row basis, |
| * different rows can use different filters. |
| * |
| * Using a single filter (or less filters) is typically faster. Trying all of the |
| * filters may help minimize the output file size. |
| * |
| * Our default value matches libpng's default. |
| */ |
| FilterFlag fFilterFlags = FilterFlag::kAll; |
| |
| /** |
| * Must be in [0, 9] where 9 corresponds to maximal compression. This value is passed |
| * directly to zlib. 0 is a special case to skip zlib entirely, creating dramatically |
| * larger pngs. |
| * |
| * Our default value matches libpng's default. |
| */ |
| int fZLibLevel = 6; |
| |
| /** |
| * If the input is premultiplied, this controls the unpremultiplication behavior. |
| * The encoder can convert to linear before unpremultiplying or ignore the transfer |
| * function and unpremultiply the input as is. |
| */ |
| SkTransferFunctionBehavior fUnpremulBehavior = SkTransferFunctionBehavior::kRespect; |
| |
| /** |
| * Represents comments in the tEXt ancillary chunk of the png. |
| * The 2i-th entry is the keyword for the i-th comment, |
| * and the (2i + 1)-th entry is the text for the i-th comment. |
| */ |
| sk_sp<SkDataTable> fComments; |
| }; |
| |
| /** |
| * Encode the |src| pixels to the |dst| stream. |
| * |options| may be used to control the encoding behavior. |
| * |
| * Returns true on success. Returns false on an invalid or unsupported |src|. |
| */ |
| static bool Encode(SkWStream* dst, const SkPixmap& src, const Options& options); |
| |
| /** |
| * Create a png encoder that will encode the |src| pixels to the |dst| stream. |
| * |options| may be used to control the encoding behavior. |
| * |
| * |dst| is unowned but must remain valid for the lifetime of the object. |
| * |
| * This returns nullptr on an invalid or unsupported |src|. |
| */ |
| static std::unique_ptr<SkEncoder> Make(SkWStream* dst, const SkPixmap& src, |
| const Options& options); |
| |
| ~SkPngEncoder() override; |
| |
| protected: |
| bool onEncodeRows(int numRows) override; |
| |
| SkPngEncoder(std::unique_ptr<SkPngEncoderMgr>, const SkPixmap& src); |
| |
| std::unique_ptr<SkPngEncoderMgr> fEncoderMgr; |
| typedef SkEncoder INHERITED; |
| }; |
| |
| static inline SkPngEncoder::FilterFlag operator|(SkPngEncoder::FilterFlag x, |
| SkPngEncoder::FilterFlag y) { |
| return (SkPngEncoder::FilterFlag)((int)x | (int)y); |
| } |
| |
| #endif |