123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- /*
- * 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 "include/core/SkDataTable.h"
- #include "include/encode/SkEncoder.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;
- /**
- * 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
|