From 61317325b7b4b4ffafd9400ab5966e8d7c67df2e Mon Sep 17 00:00:00 2001 From: Chris Craik Date: Wed, 21 May 2014 13:03:52 -0700 Subject: [PATCH] Disable shadow drawing for empty/null outlines Change-Id: I60d0f326cfab97d88c49d17cf32e619b5e60b94a --- libs/hwui/DisplayListOp.h | 36 +++++++++++------------------------- libs/hwui/Outline.h | 4 ++++ libs/hwui/RenderNode.cpp | 5 +++-- 3 files changed, 18 insertions(+), 27 deletions(-) diff --git a/libs/hwui/DisplayListOp.h b/libs/hwui/DisplayListOp.h index f1d70eb338621..e48672200b1dc 100644 --- a/libs/hwui/DisplayListOp.h +++ b/libs/hwui/DisplayListOp.h @@ -1547,32 +1547,23 @@ class DrawShadowOp : public DrawOp { public: DrawShadowOp(const mat4& transformXY, const mat4& transformZ, float casterAlpha, bool casterUnclipped, - float fallbackWidth, float fallbackHeight, - const SkPath* outline, const SkPath* revealClip) + const SkPath* casterOutline, const SkPath* revealClip) : DrawOp(NULL), mTransformXY(transformXY), mTransformZ(transformZ), - mCasterAlpha(casterAlpha), mCasterUnclipped(casterUnclipped), - mFallbackWidth(fallbackWidth), mFallbackHeight(fallbackHeight), - mOutline(outline), mRevealClip(revealClip) {} + mCasterAlpha(casterAlpha), mCasterUnclipped(casterUnclipped) { + mOutline = *casterOutline; + if (revealClip) { + // intersect the outline with the convex reveal clip + Op(mOutline, *revealClip, kIntersect_PathOp, &mOutline); + } + } virtual status_t applyDraw(OpenGLRenderer& renderer, Rect& dirty) { - SkPath casterPerimeter; - if (!mOutline || mOutline->isEmpty()) { - casterPerimeter.addRect(0, 0, mFallbackWidth, mFallbackHeight); - } else { - casterPerimeter = *mOutline; - } - - if (mRevealClip) { - // intersect the outline with the convex reveal clip - Op(casterPerimeter, *mRevealClip, kIntersect_PathOp, &casterPerimeter); - } - return renderer.drawShadow(mTransformXY, mTransformZ, - mCasterAlpha, mCasterUnclipped, &casterPerimeter); + mCasterAlpha, mCasterUnclipped, &mOutline); } virtual void output(int level, uint32_t logFlags) const { - OP_LOG("DrawShadow of outline %p", mOutline); + OP_LOGS("DrawShadow"); } virtual const char* name() { return "DrawShadow"; } @@ -1582,12 +1573,7 @@ private: const mat4 mTransformZ; const float mCasterAlpha; const bool mCasterUnclipped; - const float mFallbackWidth; - const float mFallbackHeight; - - // these point at convex SkPaths owned by RenderProperties, or null - const SkPath* mOutline; - const SkPath* mRevealClip; + SkPath mOutline; }; class DrawLayerOp : public DrawOp { diff --git a/libs/hwui/Outline.h b/libs/hwui/Outline.h index 5c24335bc41a7..5e7f899f01a5b 100644 --- a/libs/hwui/Outline.h +++ b/libs/hwui/Outline.h @@ -49,6 +49,10 @@ public: mBounds.set(outline->getBounds()); } + bool isEmpty() const { + return mType == kOutlineType_None; + } + void setEmpty() { mType = kOutlineType_None; mPath.reset(); diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp index f0645a9eb2ed8..df74f31cf5175 100644 --- a/libs/hwui/RenderNode.cpp +++ b/libs/hwui/RenderNode.cpp @@ -473,7 +473,7 @@ void RenderNode::buildZSortedChildList(Vector& zTranslat template void RenderNode::issueDrawShadowOperation(const Matrix4& transformFromParent, T& handler) { - if (properties().getAlpha() <= 0.0f) return; + if (properties().getAlpha() <= 0.0f || properties().getOutline().isEmpty()) return; mat4 shadowMatrixXY(transformFromParent); applyViewPropertyTransforms(shadowMatrixXY); @@ -487,6 +487,8 @@ void RenderNode::issueDrawShadowOperation(const Matrix4& transformFromParent, T& const SkPath* revealClipPath = revealClip.hasConvexClip() ? revealClip.getPath() : NULL; // only pass the reveal clip's path if it's convex + if (revealClipPath && revealClipPath->isEmpty()) return; + /** * The drawing area of the caster is always the same as the its perimeter (which * the shadow system uses) *except* in the inverse clip case. Inform the shadow @@ -498,7 +500,6 @@ void RenderNode::issueDrawShadowOperation(const Matrix4& transformFromParent, T& DisplayListOp* shadowOp = new (handler.allocator()) DrawShadowOp( shadowMatrixXY, shadowMatrixZ, properties().getAlpha(), casterUnclipped, - properties().getWidth(), properties().getHeight(), outlinePath, revealClipPath); handler(shadowOp, PROPERTY_SAVECOUNT, properties().getClipToBounds()); }