diff options
| -rw-r--r-- | services/surfaceflinger/ContainerLayer.cpp | 28 | ||||
| -rw-r--r-- | services/surfaceflinger/ContainerLayer.h | 1 | ||||
| -rw-r--r-- | services/surfaceflinger/Layer.cpp | 7 | ||||
| -rw-r--r-- | services/surfaceflinger/Layer.h | 4 |
4 files changed, 34 insertions, 6 deletions
diff --git a/services/surfaceflinger/ContainerLayer.cpp b/services/surfaceflinger/ContainerLayer.cpp index 7927fa95b6..ad08a92885 100644 --- a/services/surfaceflinger/ContainerLayer.cpp +++ b/services/surfaceflinger/ContainerLayer.cpp @@ -42,4 +42,32 @@ bool ContainerLayer::canReceiveInput() const { void ContainerLayer::setPerFrameData(const sp<const DisplayDevice>&, const ui::Transform&, const Rect&, int32_t, const ui::Dataspace) {} +Layer::RoundedCornerState ContainerLayer::getRoundedCornerStateInternal( + const FloatRect bounds) const { + const auto& p = mDrawingParent.promote(); + if (p != nullptr) { + RoundedCornerState parentState = p->getRoundedCornerStateInternal(bounds); + if (parentState.radius > 0) { + ui::Transform t = getActiveTransform(getDrawingState()); + t = t.inverse(); + parentState.cropRect = t.transform(parentState.cropRect); + // The rounded corners shader only accepts 1 corner radius for performance reasons, + // but a transform matrix can define horizontal and vertical scales. + // Let's take the average between both of them and pass into the shader, practically we + // never do this type of transformation on windows anyway. + parentState.radius *= (t[0][0] + t[1][1]) / 2.0f; + return parentState; + } + } + const float radius = getDrawingState().cornerRadius; + if (radius > 0) { + const Rect crop = getCrop(getDrawingState()); + if (!crop.isEmpty()) { + return RoundedCornerState(bounds.intersect(crop.toFloatRect()), radius); + } + return RoundedCornerState(bounds, radius); + } + return RoundedCornerState(); +} + } // namespace android diff --git a/services/surfaceflinger/ContainerLayer.h b/services/surfaceflinger/ContainerLayer.h index 7222a3e15a..cd8e72280b 100644 --- a/services/surfaceflinger/ContainerLayer.h +++ b/services/surfaceflinger/ContainerLayer.h @@ -40,6 +40,7 @@ public: bool isCreatedFromMainThread() const override { return true; } bool onPreComposition(nsecs_t /*refreshStartTime*/) override { return false; } + Layer::RoundedCornerState getRoundedCornerStateInternal(const FloatRect bounds) const override; protected: bool prepareClientLayer(const RenderArea& renderArea, const Region& clip, diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 898d37e787..73f27e472f 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -1791,10 +1791,10 @@ Layer::RoundedCornerState Layer::getRoundedCornerState() const { return getRoundedCornerStateInternal(mSourceBounds); } -Layer::RoundedCornerState Layer::getRoundedCornerStateInternal(const FloatRect bounds) const { +Layer::RoundedCornerState Layer::getRoundedCornerStateInternal(const FloatRect) const { const auto& p = mDrawingParent.promote(); if (p != nullptr) { - RoundedCornerState parentState = p->getRoundedCornerStateInternal(bounds); + RoundedCornerState parentState = p->getRoundedCornerStateInternal(mSourceBounds); if (parentState.radius > 0) { ui::Transform t = getActiveTransform(getDrawingState()); t = t.inverse(); @@ -1809,7 +1809,8 @@ Layer::RoundedCornerState Layer::getRoundedCornerStateInternal(const FloatRect b } const float radius = getDrawingState().cornerRadius; return radius > 0 - ? RoundedCornerState(bounds.intersect(getCrop(getDrawingState()).toFloatRect()), radius) + ? RoundedCornerState(mSourceBounds.intersect(getCrop(getDrawingState()).toFloatRect()), + radius) : RoundedCornerState(); } diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 83ff3b6cc9..b9dc7ecd36 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -452,13 +452,13 @@ public: virtual void setPostTime(nsecs_t /*postTime*/) {} virtual void setDesiredPresentTime(nsecs_t /*desiredPresentTime*/) {} + virtual RoundedCornerState getRoundedCornerStateInternal(const FloatRect bounds) const; protected: virtual bool prepareClientLayer(const RenderArea& renderArea, const Region& clip, bool useIdentityTransform, Region& clearRegion, const bool supportProtectedContent, renderengine::LayerSettings& layer); - public: /* * compositionengine::LayerFE overrides @@ -908,8 +908,6 @@ private: */ Rect getCroppedBufferSize(const Layer::State& s) const; - RoundedCornerState getRoundedCornerStateInternal(const FloatRect bounds) const; - // Cached properties computed from drawing state // Effective transform taking into account parent transforms and any parent scaling. ui::Transform mEffectiveTransform; |