aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Matt Sarett <msarett@google.com>2017-04-06 09:50:47 -0400
committerGravatar Matt Sarett <msarett@google.com>2017-04-06 14:43:11 +0000
commit4293a1e5f259cf12560d6e794c1a05ad4dbc0b32 (patch)
treea369394db7b7900e4bc40c827606d753371f813f
parente2a3f5fdb83fef6c5f09b2f6033f17c16fc5eabe (diff)
Manual revert: Add support for writing ICC profiles to webp encoder
Bug: skia: Change-Id: I4e70bee8c2ea8dbd5ae1e84aa097f5a7e2e62721 Reviewed-on: https://skia-review.googlesource.com/11444 Reviewed-by: Matt Sarett <msarett@google.com> Reviewed-by: Leon Scroggins <scroggo@google.com> Commit-Queue: Matt Sarett <msarett@google.com>
-rw-r--r--src/images/SkWEBPImageEncoder.cpp56
-rw-r--r--tests/CodecTest.cpp2
-rw-r--r--third_party/libwebp/BUILD.gn4
3 files changed, 11 insertions, 51 deletions
diff --git a/src/images/SkWEBPImageEncoder.cpp b/src/images/SkWEBPImageEncoder.cpp
index c0cd4a6cae..66b425bff5 100644
--- a/src/images/SkWEBPImageEncoder.cpp
+++ b/src/images/SkWEBPImageEncoder.cpp
@@ -26,7 +26,7 @@
#include "SkUnPreMultiply.h"
#include "SkUtils.h"
-// A WebP encoder only, on top of (subset of) libwebp
+// A WebP decoder only, on top of (subset of) libwebp
// For more information on WebP image format, and libwebp library, see:
// http://code.google.com/speed/webp/
// http://www.webmproject.org/code/#libwebp_webp_image_decoder_library
@@ -37,7 +37,6 @@ extern "C" {
// If moving libwebp out of skia source tree, path for webp headers must be
// updated accordingly. Here, we enforce using local copy in webp sub-directory.
#include "webp/encode.h"
-#include "webp/mux.h"
}
static transform_scanline_proc choose_proc(const SkImageInfo& info,
@@ -172,17 +171,10 @@ static bool do_encode(SkWStream* stream, const SkPixmap& pixmap, const SkEncodeO
WebPPicture pic;
WebPPictureInit(&pic);
- SkAutoTCallVProc<WebPPicture, WebPPictureFree> autoPic(&pic);
pic.width = pixmap.width();
pic.height = pixmap.height();
pic.writer = stream_writer;
-
- // If there is no need to embed an ICC profile, we write directly to the input stream.
- // Otherwise, we will first encode to |tmp| and use a mux to add the ICC chunk. libwebp
- // forces us to have an encoded image before we can add a profile.
- sk_sp<SkData> icc = pixmap.colorSpace() ? icc_from_color_space(*pixmap.colorSpace()) : nullptr;
- SkDynamicMemoryWStream tmp;
- pic.custom_ptr = icc ? (void*)&tmp : (void*)stream;
+ pic.custom_ptr = (void*)stream;
const uint8_t* src = (uint8_t*)pixmap.addr();
const int rgbStride = pic.width * bpp;
@@ -195,47 +187,21 @@ static bool do_encode(SkWStream* stream, const SkPixmap& pixmap, const SkEncodeO
proc((char*) &rgb[y * rgbStride], (const char*) &src[y * rowBytes], pic.width, bpp, colors);
}
- auto importProc = WebPPictureImportRGB;
- if (3 != bpp) {
+ bool ok;
+ if (bpp == 3) {
+ ok = SkToBool(WebPPictureImportRGB(&pic, &rgb[0], rgbStride));
+ } else {
if (pixmap.isOpaque()) {
- importProc = WebPPictureImportRGBX;
+ ok = SkToBool(WebPPictureImportRGBX(&pic, &rgb[0], rgbStride));
} else {
- importProc = WebPPictureImportRGBA;
+ ok = SkToBool(WebPPictureImportRGBA(&pic, &rgb[0], rgbStride));
}
}
- if (!importProc(&pic, &rgb[0], rgbStride)) {
- return false;
- }
-
- if (!WebPEncode(&webp_config, &pic)) {
- return false;
- }
-
- if (icc) {
- sk_sp<SkData> encodedData = tmp.detachAsData();
- WebPData encoded = { encodedData->bytes(), encodedData->size() };
- WebPData iccChunk = { icc->bytes(), icc->size() };
-
- SkAutoTCallVProc<WebPMux, WebPMuxDelete> mux(WebPMuxNew());
- if (WEBP_MUX_OK != WebPMuxSetImage(mux, &encoded, 0)) {
- return false;
- }
-
- if (WEBP_MUX_OK != WebPMuxSetChunk(mux, "ICCP", &iccChunk, 0)) {
- return false;
- }
-
- WebPData assembled;
- if (WEBP_MUX_OK != WebPMuxAssemble(mux, &assembled)) {
- return false;
- }
-
- stream->write(assembled.bytes, assembled.size);
- WebPDataClear(&assembled);
- }
+ ok = ok && WebPEncode(&webp_config, &pic);
+ WebPPictureFree(&pic);
- return true;
+ return ok;
}
bool SkEncodeImageAsWEBP(SkWStream* stream, const SkPixmap& src, int quality) {
diff --git a/tests/CodecTest.cpp b/tests/CodecTest.cpp
index 2c601fadb0..323a49159f 100644
--- a/tests/CodecTest.cpp
+++ b/tests/CodecTest.cpp
@@ -1590,8 +1590,6 @@ static void test_encode_icc(skiatest::Reporter* r, SkEncodedImageFormat format,
DEF_TEST(Codec_EncodeICC, r) {
test_encode_icc(r, SkEncodedImageFormat::kPNG, SkTransferFunctionBehavior::kRespect);
test_encode_icc(r, SkEncodedImageFormat::kJPEG, SkTransferFunctionBehavior::kRespect);
- test_encode_icc(r, SkEncodedImageFormat::kWEBP, SkTransferFunctionBehavior::kRespect);
test_encode_icc(r, SkEncodedImageFormat::kPNG, SkTransferFunctionBehavior::kIgnore);
test_encode_icc(r, SkEncodedImageFormat::kJPEG, SkTransferFunctionBehavior::kIgnore);
- test_encode_icc(r, SkEncodedImageFormat::kWEBP, SkTransferFunctionBehavior::kIgnore);
}
diff --git a/third_party/libwebp/BUILD.gn b/third_party/libwebp/BUILD.gn
index 7fec982e35..3e9bd06020 100644
--- a/third_party/libwebp/BUILD.gn
+++ b/third_party/libwebp/BUILD.gn
@@ -128,10 +128,6 @@ if (skia_use_system_libwebp) {
"../externals/libwebp/src/enc/tree_enc.c",
"../externals/libwebp/src/enc/vp8l_enc.c",
"../externals/libwebp/src/enc/webp_enc.c",
- "../externals/libwebp/src/mux/anim_encode.c",
- "../externals/libwebp/src/mux/muxedit.c",
- "../externals/libwebp/src/mux/muxinternal.c",
- "../externals/libwebp/src/mux/muxread.c",
"../externals/libwebp/src/utils/bit_reader_utils.c",
"../externals/libwebp/src/utils/bit_writer_utils.c",
"../externals/libwebp/src/utils/color_cache_utils.c",