diff options
author | Leon Scroggins III <scroggo@google.com> | 2017-11-14 16:11:40 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-11-14 21:33:14 +0000 |
commit | 42bae8faa4b9b6a3341b15c6ac7c6b466e95625c (patch) | |
tree | 9768d1ffe37ccadfafab062b80a28d8564a393c8 /src/codec/SkWebpCodec.cpp | |
parent | af71accc86e85f8ea17c516f26364e33480bcb6b (diff) |
Fix webp bug compositing alpha frames on opaque
select_xform_alpha is used to determine how the color transform should
handle alpha values. In a similar way, we're using it here to determine
whether to premultiply pixels before blending them. In this case, the
source is unpremul, so we should be premultiplying them, but since we
are compositing on an opaque frame, the dst must be opaque and
select_xform_alpha returns kOpaque. As a result, we do not premultiply
(and even hint to the transform that the pixels are opaque). Since this
all applies to the pre-blended pixels, we should not care that the dst
is opaque. So drop the call to select_xform_alpha and just use the alpha
type of the source. This matches the comment on the lines above.
Add the test image that failed (https://mathiasbynens.be/demo/animated-webp)
Change-Id: Ibd13c1f067bdf369ce1c882d4f6057aadccfa313
Reviewed-on: https://skia-review.googlesource.com/71560
Commit-Queue: Leon Scroggins <scroggo@google.com>
Reviewed-by: Mike Klein <mtklein@chromium.org>
Diffstat (limited to 'src/codec/SkWebpCodec.cpp')
-rw-r--r-- | src/codec/SkWebpCodec.cpp | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/src/codec/SkWebpCodec.cpp b/src/codec/SkWebpCodec.cpp index 6287617373..9cb44d275e 100644 --- a/src/codec/SkWebpCodec.cpp +++ b/src/codec/SkWebpCodec.cpp @@ -571,7 +571,6 @@ SkCodec::Result SkWebpCodec::onGetPixels(const SkImageInfo& dstInfo, void* dst, // We're only transforming the new part of the frame, so no need to worry about the // final composited alpha. const auto srcAlpha = 0 == index ? srcInfo.alphaType() : alpha_type(frame.has_alpha); - const auto xformAlphaType = select_xform_alpha(dstInfo.alphaType(), srcAlpha); const bool needsSrgbToLinear = dstInfo.gammaCloseToSRGB() && options.fPremulBehavior == SkTransferFunctionBehavior::kRespect; @@ -593,9 +592,9 @@ SkCodec::Result SkWebpCodec::onGetPixels(const SkImageInfo& dstInfo, void* dst, xformDst = dst; } for (int y = 0; y < rowsDecoded; y++) { - this->applyColorXform(xformDst, xformSrc, scaledWidth, xformAlphaType); + this->applyColorXform(xformDst, xformSrc, scaledWidth, srcAlpha); if (blendWithPrevFrame) { - blend_line(dstCT, dst, dstCT, xformDst, needsSrgbToLinear, xformAlphaType, + blend_line(dstCT, dst, dstCT, xformDst, needsSrgbToLinear, srcAlpha, scaledWidth); dst = SkTAddOffset<void>(dst, rowBytes); } else { @@ -608,7 +607,7 @@ SkCodec::Result SkWebpCodec::onGetPixels(const SkImageInfo& dstInfo, void* dst, for (int y = 0; y < rowsDecoded; y++) { blend_line(dstCT, dst, webpDst.colorType(), src, needsSrgbToLinear, - xformAlphaType, scaledWidth); + srcAlpha, scaledWidth); src = SkTAddOffset<const uint8_t>(src, srcRowBytes); dst = SkTAddOffset<void>(dst, rowBytes); } |