diff options
| author | 2018-04-20 16:13:31 -0400 | |
|---|---|---|
| committer | 2018-05-01 02:45:43 +0000 | |
| commit | 551d08e2d50c7f73c5eb65fd366b92efba4f0ed5 (patch) | |
| tree | 9ac55bbd3f8a5886fb611d35c79627fc3c2031db /libs/hwui/Layer.cpp | |
| parent | 9ea13ca0b67e77c5efda1c94c141dc49987c0745 (diff) | |
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
Merged-In: Ic0446a0d861e86a5a9d0382346b57fcc45c8a61b
Change-Id: Ic0446a0d861e86a5a9d0382346b57fcc45c8a61b
Diffstat (limited to 'libs/hwui/Layer.cpp')
| -rw-r--r-- | libs/hwui/Layer.cpp | 40 |
1 files changed, 32 insertions, 8 deletions
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 <SkColorFilter.h> +#include <SkToSRGBColorFilter.h> namespace android { namespace uirenderer { -Layer::Layer(RenderState& renderState, Api api, SkColorFilter* colorFilter, int alpha, +Layer::Layer(RenderState& renderState, Api api, sk_sp<SkColorFilter> 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<SkColorFilter> filter) { + if (filter != mColorFilter) { + mColorFilter = filter; + buildColorSpaceWithFilter(); + } +} + +void Layer::setDataSpace(android_dataspace dataspace) { + if (dataspace != mCurrentDataspace) { + mCurrentDataspace = dataspace; + buildColorSpaceWithFilter(); + } +} + +void Layer::buildColorSpaceWithFilter() { + sk_sp<SkColorFilter> colorSpaceFilter; + sk_sp<SkColorSpace> 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() { |