From be3876c434864d6c05212158b25d778d29b07eb0 Mon Sep 17 00:00:00 2001 From: Derek Sollenberger Date: Fri, 20 Apr 2018 16:13:31 -0400 Subject: Respect a Layer's (e.g. SurfaceTexture) colorSpace when compositing This CL extracts the android_dataspace from the GLConsumer and converts it to a SkColorSpace. HWUI always expects to composite into an sRGB destination so when we draw the layer we run the draw through a colorFilter that converts the input colorSpace into that of the destination. Test: CtsViewTestCases Bug: 78016220 Change-Id: Ic0446a0d861e86a5a9d0382346b57fcc45c8a61b --- libs/hwui/Layer.cpp | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) (limited to 'libs/hwui/Layer.cpp') diff --git a/libs/hwui/Layer.cpp b/libs/hwui/Layer.cpp index 86950d5ebb10..fb8f0337c95e 100644 --- a/libs/hwui/Layer.cpp +++ b/libs/hwui/Layer.cpp @@ -18,34 +18,58 @@ #include "renderstate/RenderState.h" -#include +#include namespace android { namespace uirenderer { -Layer::Layer(RenderState& renderState, Api api, SkColorFilter* colorFilter, int alpha, +Layer::Layer(RenderState& renderState, Api api, sk_sp colorFilter, int alpha, SkBlendMode mode) : GpuMemoryTracker(GpuObjectType::Layer) , mRenderState(renderState) , mApi(api) - , colorFilter(nullptr) + , mColorFilter(colorFilter) , alpha(alpha) , mode(mode) { // TODO: This is a violation of Android's typical ref counting, but it // preserves the old inc/dec ref locations. This should be changed... incStrong(nullptr); - + buildColorSpaceWithFilter(); renderState.registerLayer(this); } Layer::~Layer() { - SkSafeUnref(colorFilter); - mRenderState.unregisterLayer(this); } -void Layer::setColorFilter(SkColorFilter* filter) { - SkRefCnt_SafeAssign(colorFilter, filter); +void Layer::setColorFilter(sk_sp filter) { + if (filter != mColorFilter) { + mColorFilter = filter; + buildColorSpaceWithFilter(); + } +} + +void Layer::setDataSpace(android_dataspace dataspace) { + if (dataspace != mCurrentDataspace) { + mCurrentDataspace = dataspace; + buildColorSpaceWithFilter(); + } +} + +void Layer::buildColorSpaceWithFilter() { + sk_sp colorSpaceFilter; + sk_sp colorSpace = DataSpaceToColorSpace(mCurrentDataspace); + if (colorSpace && !colorSpace->isSRGB()) { + colorSpaceFilter = SkToSRGBColorFilter::Make(colorSpace); + } + + if (mColorFilter && colorSpaceFilter) { + mColorSpaceWithFilter = mColorFilter->makeComposed(colorSpaceFilter); + } else if (colorSpaceFilter) { + mColorSpaceWithFilter = colorSpaceFilter; + } else { + mColorSpaceWithFilter = mColorFilter; + } } void Layer::postDecStrong() { -- cgit v1.2.3-59-g8ed1b