"src/codec/SkJpegCodec.cpp",
"src/codec/SkJpegDecoderMgr.cpp",
"src/codec/SkJpegUtility.cpp",
- "src/images/SkJPEGImageEncoder.cpp",
"src/images/SkJPEGWriteUtility.cpp",
+ "src/images/SkJpegEncoder.cpp",
]
}
sources = [
"src/codec/SkIcoCodec.cpp",
"src/codec/SkPngCodec.cpp",
- "src/images/SkPNGImageEncoder.cpp",
+ "src/images/SkPngEncoder.cpp",
]
}
sources = [
"src/codec/SkWebpAdapterCodec.cpp",
"src/codec/SkWebpCodec.cpp",
- "src/images/SkWEBPImageEncoder.cpp",
+ "src/images/SkWebpEncoder.cpp",
]
}
#include "SkJpegEncoder.h"
#include "SkPngEncoder.h"
#include "SkUnPreMultiply.h"
+#include "SkWebpEncoder.h"
namespace skiagm {
bool success = SkJpegEncoder::Encode(&buf, src, SkJpegEncoder::Options());
return success ? buf.detachAsData() : nullptr;
}
- case SkEncodedImageFormat::kWEBP:
- return SkEncodeImageAsWEBP(&buf, src, 100) ? buf.detachAsData() : nullptr;
+ case SkEncodedImageFormat::kWEBP: {
+ SkWebpEncoder::Options options;
+ options.fUnpremulBehavior = SkTransferFunctionBehavior::kIgnore;
+ bool success = SkWebpEncoder::Encode(&buf, src, options);
+ return success ? buf.detachAsData() : nullptr;
+ }
default:
SkASSERT(false);
return nullptr;
#include "SkPngEncoder.h"
#include "SkPM4f.h"
#include "SkSRGB.h"
+#include "SkWebpEncoder.h"
namespace skiagm {
SkDynamicMemoryWStream buf;
SkPngEncoder::Options pngOptions;
- SkEncodeOptions options;
+ SkWebpEncoder::Options webpOptions;
if (bitmap.colorSpace()) {
pngOptions.fUnpremulBehavior = SkTransferFunctionBehavior::kRespect;
- options.fUnpremulBehavior = SkTransferFunctionBehavior::kRespect;
+ webpOptions.fUnpremulBehavior = SkTransferFunctionBehavior::kRespect;
}
switch (format) {
SkAssertResult(SkPngEncoder::Encode(&buf, src, pngOptions));
break;
case SkEncodedImageFormat::kWEBP:
- SkAssertResult(SkEncodeImageAsWEBP(&buf, src, options));
+ SkAssertResult(SkWebpEncoder::Encode(&buf, src, webpOptions));
break;
case SkEncodedImageFormat::kJPEG:
SkAssertResult(SkJpegEncoder::Encode(&buf, src, SkJpegEncoder::Options()));
#include "SkImageEncoderPriv.h"
#include "SkJpegEncoder.h"
#include "SkPngEncoder.h"
+#include "SkWebpEncoder.h"
bool SkEncodeImage(SkWStream* dst, const SkPixmap& src,
SkEncodedImageFormat format, int quality) {
opts.fUnpremulBehavior = SkTransferFunctionBehavior::kIgnore;
return SkPngEncoder::Encode(dst, src, opts);
}
- case SkEncodedImageFormat::kWEBP:
- return SkEncodeImageAsWEBP(dst, src, quality);
+ case SkEncodedImageFormat::kWEBP: {
+ SkWebpEncoder::Options opts;
+ opts.fQuality = quality;
+ opts.fUnpremulBehavior = SkTransferFunctionBehavior::kIgnore;
+ return SkWebpEncoder::Encode(dst, src, opts);
+ }
default:
return false;
}
return true;
}
-struct SkEncodeOptions {
- SkTransferFunctionBehavior fUnpremulBehavior = SkTransferFunctionBehavior::kIgnore;
-};
-
-#ifdef SK_HAS_WEBP_LIBRARY
- bool SkEncodeImageAsWEBP(SkWStream*, const SkPixmap&, const SkEncodeOptions&);
- bool SkEncodeImageAsWEBP(SkWStream*, const SkPixmap&, int quality);
-#else
- #define SkEncodeImageAsWEBP(...) false
-#endif
-
#if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS)
bool SkEncodeImageWithCG(SkWStream*, const SkPixmap&, SkEncodedImageFormat);
#else
// Add options for png filters and zlib compression.
struct Options {
+ /**
+ * 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;
};
#include "SkTemplates.h"
#include "SkUnPreMultiply.h"
#include "SkUtils.h"
+#include "SkWebpEncoder.h"
// A WebP encoder only, on top of (subset of) libwebp
// For more information on WebP image format, and libwebp library, see:
return stream->write(data, data_size) ? 1 : 0;
}
-static bool do_encode(SkWStream* stream, const SkPixmap& pixmap, const SkEncodeOptions& opts,
- int quality) {
- if (SkTransferFunctionBehavior::kRespect == opts.fUnpremulBehavior) {
- if (!pixmap.colorSpace() || (!pixmap.colorSpace()->gammaCloseToSRGB() &&
- !pixmap.colorSpace()->gammaIsLinear())) {
- return false;
- }
+static bool do_encode(SkWStream* stream, const SkPixmap& pixmap, const SkWebpEncoder::Options& opts)
+{
+ if (!SkPixmapIsValid(pixmap, opts.fUnpremulBehavior)) {
+ return false;
}
const transform_scanline_proc proc = choose_proc(pixmap.info(), opts.fUnpremulBehavior);
}
WebPConfig webp_config;
- if (!WebPConfigPreset(&webp_config, WEBP_PRESET_DEFAULT, (float) quality)) {
+ if (!WebPConfigPreset(&webp_config, WEBP_PRESET_DEFAULT, opts.fQuality)) {
return false;
}
return true;
}
-bool SkEncodeImageAsWEBP(SkWStream* stream, const SkPixmap& src, int quality) {
- return do_encode(stream, src, SkEncodeOptions(), quality);
-}
-
-bool SkEncodeImageAsWEBP(SkWStream* stream, const SkPixmap& src, const SkEncodeOptions& opts) {
- return do_encode(stream, src, opts, 100);
+bool SkWebpEncoder::Encode(SkWStream* dst, const SkPixmap& src, const Options& opts) {
+ return do_encode(dst, src, opts);
}
#endif
--- /dev/null
+/*
+ * 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 SkWebpEncoder_DEFINED
+#define SkWebpEncoder_DEFINED
+
+#include "SkEncoder.h"
+
+class SkWStream;
+
+namespace SkWebpEncoder {
+
+ struct Options {
+ /**
+ * |fQuality| must be in [0.0f, 100.0f] where 0.0f corresponds to the lowest quality.
+ */
+ float fQuality = 100.0f;
+
+ /**
+ * 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;
+ };
+
+ /**
+ * 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|.
+ */
+ bool Encode(SkWStream* dst, const SkPixmap& src, const Options& options);
+};
+
+#endif
#include "SkRandom.h"
#include "SkStream.h"
#include "SkStreamPriv.h"
+#include "SkWebpEncoder.h"
#include "Test.h"
#include "png.h"
SkTransferFunctionBehavior unpremulBehavior,
SkEncodedImageFormat format) {
SkPngEncoder::Options pngOptions;
- SkEncodeOptions options;
+ SkWebpEncoder::Options webpOptions;
pngOptions.fUnpremulBehavior = unpremulBehavior;
- options.fUnpremulBehavior = unpremulBehavior;
+ webpOptions.fUnpremulBehavior = unpremulBehavior;
switch (format) {
case SkEncodedImageFormat::kPNG:
SkPngEncoder::Encode(stream, pixmap, pngOptions);
SkJpegEncoder::Encode(stream, pixmap, SkJpegEncoder::Options());
break;
case SkEncodedImageFormat::kWEBP:
- SkEncodeImageAsWEBP(stream, pixmap, options);
+ SkWebpEncoder::Encode(stream, pixmap, webpOptions);
break;
default:
SkASSERT(false);