Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4bb692cd authored by Chris Craik's avatar Chris Craik Committed by Android (Google) Code Review
Browse files

Merge "Disable shadow drawing for empty/null outlines"

parents c106c12e 61317325
Loading
Loading
Loading
Loading
+10 −24
Original line number Original line Diff line number Diff line
@@ -1547,32 +1547,23 @@ class DrawShadowOp : public DrawOp {
public:
public:
    DrawShadowOp(const mat4& transformXY, const mat4& transformZ,
    DrawShadowOp(const mat4& transformXY, const mat4& transformZ,
            float casterAlpha, bool casterUnclipped,
            float casterAlpha, bool casterUnclipped,
            float fallbackWidth, float fallbackHeight,
            const SkPath* casterOutline, const SkPath* revealClip)
            const SkPath* outline, const SkPath* revealClip)
            : DrawOp(NULL), mTransformXY(transformXY), mTransformZ(transformZ),
            : DrawOp(NULL), mTransformXY(transformXY), mTransformZ(transformZ),
            mCasterAlpha(casterAlpha), mCasterUnclipped(casterUnclipped),
            mCasterAlpha(casterAlpha), mCasterUnclipped(casterUnclipped) {
            mFallbackWidth(fallbackWidth), mFallbackHeight(fallbackHeight),
        mOutline = *casterOutline;
            mOutline(outline), mRevealClip(revealClip) {}
        if (revealClip) {

    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
            // intersect the outline with the convex reveal clip
            Op(casterPerimeter, *mRevealClip, kIntersect_PathOp, &casterPerimeter);
            Op(mOutline, *revealClip, kIntersect_PathOp, &mOutline);
        }
    }
    }


    virtual status_t applyDraw(OpenGLRenderer& renderer, Rect& dirty) {
        return renderer.drawShadow(mTransformXY, mTransformZ,
        return renderer.drawShadow(mTransformXY, mTransformZ,
                mCasterAlpha, mCasterUnclipped, &casterPerimeter);
                mCasterAlpha, mCasterUnclipped, &mOutline);
    }
    }


    virtual void output(int level, uint32_t logFlags) const {
    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"; }
    virtual const char* name() { return "DrawShadow"; }
@@ -1582,12 +1573,7 @@ private:
    const mat4 mTransformZ;
    const mat4 mTransformZ;
    const float mCasterAlpha;
    const float mCasterAlpha;
    const bool mCasterUnclipped;
    const bool mCasterUnclipped;
    const float mFallbackWidth;
    SkPath mOutline;
    const float mFallbackHeight;

    // these point at convex SkPaths owned by RenderProperties, or null
    const SkPath* mOutline;
    const SkPath* mRevealClip;
};
};


class DrawLayerOp : public DrawOp {
class DrawLayerOp : public DrawOp {
+4 −0
Original line number Original line Diff line number Diff line
@@ -49,6 +49,10 @@ public:
        mBounds.set(outline->getBounds());
        mBounds.set(outline->getBounds());
    }
    }


    bool isEmpty() const {
        return mType == kOutlineType_None;
    }

    void setEmpty() {
    void setEmpty() {
        mType = kOutlineType_None;
        mType = kOutlineType_None;
        mPath.reset();
        mPath.reset();
+3 −2
Original line number Original line Diff line number Diff line
@@ -473,7 +473,7 @@ void RenderNode::buildZSortedChildList(Vector<ZDrawDisplayListOpPair>& zTranslat


template <class T>
template <class T>
void RenderNode::issueDrawShadowOperation(const Matrix4& transformFromParent, T& handler) {
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);
    mat4 shadowMatrixXY(transformFromParent);
    applyViewPropertyTransforms(shadowMatrixXY);
    applyViewPropertyTransforms(shadowMatrixXY);
@@ -487,6 +487,8 @@ void RenderNode::issueDrawShadowOperation(const Matrix4& transformFromParent, T&
    const SkPath* revealClipPath = revealClip.hasConvexClip()
    const SkPath* revealClipPath = revealClip.hasConvexClip()
            ?  revealClip.getPath() : NULL; // only pass the reveal clip's path if it's convex
            ?  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 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
     * 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(
    DisplayListOp* shadowOp  = new (handler.allocator()) DrawShadowOp(
            shadowMatrixXY, shadowMatrixZ,
            shadowMatrixXY, shadowMatrixZ,
            properties().getAlpha(), casterUnclipped,
            properties().getAlpha(), casterUnclipped,
            properties().getWidth(), properties().getHeight(),
            outlinePath, revealClipPath);
            outlinePath, revealClipPath);
    handler(shadowOp, PROPERTY_SAVECOUNT, properties().getClipToBounds());
    handler(shadowOp, PROPERTY_SAVECOUNT, properties().getClipToBounds());
}
}