SkWebpEncoder: use bgra for lossless and yuv for lossy
authorMatt Sarett <msarett@google.com>
Fri, 19 May 2017 23:12:54 +0000 (19:12 -0400)
committerSkia Commit-Bot <skia-commit-bot@chromium.org>
Fri, 19 May 2017 23:35:46 +0000 (23:35 +0000)
Previosuly, we would (accidentally) always use just yuv.

Bug: 713862
Change-Id: I00acc6ca2841ba0636494119b7b4f46a9deee401
Reviewed-on: https://skia-review.googlesource.com/17406
Commit-Queue: Matt Sarett <msarett@google.com>
Reviewed-by: Leon Scroggins <scroggo@google.com>
src/images/SkWebpEncoder.cpp
tests/EncodeTest.cpp

index 276837c..38e6773 100644 (file)
@@ -167,25 +167,29 @@ bool SkWebpEncoder::Encode(SkWStream* stream, const SkPixmap& pixmap, const Opti
         return false;
     }
 
-    // The choice of |webp_config.method| currently just match Chrome's defaults.  We
-    // could potentially expose this to the client.
+    WebPPicture pic;
+    WebPPictureInit(&pic);
+    SkAutoTCallVProc<WebPPicture, WebPPictureFree> autoPic(&pic);
+    pic.width = pixmap.width();
+    pic.height = pixmap.height();
+    pic.writer = stream_writer;
+
+    // Set compression, method, and pixel format.
+    // libwebp recommends using BGRA for lossless and YUV for lossy.
+    // The choices of |webp_config.method| currently just match Chrome's defaults.  We
+    // could potentially expose this decision to the client.
     if (Compression::kLossy == opts.fCompression) {
         webp_config.lossless = 0;
 #ifndef SK_WEBP_ENCODER_USE_DEFAULT_METHOD
         webp_config.method = 3;
 #endif
+        pic.use_argb = 0;
     } else {
         webp_config.lossless = 1;
         webp_config.method = 0;
+        pic.use_argb = 1;
     }
 
-    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.
index 102b4cd..4d0ade1 100644 (file)
@@ -255,6 +255,6 @@ DEF_TEST(Encode_WebpOptions, r) {
     SkImage::MakeFromEncoded(data2)->asLegacyBitmap(&bm2, SkImage::kRO_LegacyBitmapMode);
     SkImage::MakeFromEncoded(data3)->asLegacyBitmap(&bm3, SkImage::kRO_LegacyBitmapMode);
     REPORTER_ASSERT(r, almost_equals(bm0, bm1, 0));
-    REPORTER_ASSERT(r, almost_equals(bm0, bm2, 6));
+    REPORTER_ASSERT(r, almost_equals(bm0, bm2, 90));
     REPORTER_ASSERT(r, almost_equals(bm2, bm3, 45));
 }