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

Commit 583ed765 authored by Romain Guy's avatar Romain Guy Committed by Android (Google) Code Review
Browse files

Merge "Take shadow bounds into account for quick rejects Bug #8634346" into klp-dev

parents 67d5c290 9b5a1a28
Loading
Loading
Loading
Loading
+12 −3
Original line number Original line Diff line number Diff line
@@ -249,11 +249,16 @@ public:
    }
    }


    // default empty constructor for bounds, to be overridden in child constructor body
    // default empty constructor for bounds, to be overridden in child constructor body
    DrawBoundedOp(SkPaint* paint)
    DrawBoundedOp(SkPaint* paint): DrawOp(paint) { }
            : DrawOp(paint) {}


    bool getLocalBounds(Rect& localBounds) {
    bool getLocalBounds(Rect& localBounds) {
        localBounds.set(mLocalBounds);
        localBounds.set(mLocalBounds);
        if (state.mDrawModifiers.mHasShadow) {
            Rect shadow(mLocalBounds);
            shadow.translate(state.mDrawModifiers.mShadowDx, state.mDrawModifiers.mShadowDy);
            shadow.outset(state.mDrawModifiers.mShadowRadius);
            localBounds.unionWith(shadow);
        }
        return true;
        return true;
    }
    }


@@ -1442,8 +1447,10 @@ public:
    }
    }


    virtual status_t applyDraw(OpenGLRenderer& renderer, Rect& dirty) {
    virtual status_t applyDraw(OpenGLRenderer& renderer, Rect& dirty) {
        Rect bounds;
        getLocalBounds(bounds);
        return renderer.drawText(mText, mBytesCount, mCount, mX, mY,
        return renderer.drawText(mText, mBytesCount, mCount, mX, mY,
                mPositions, getPaint(renderer), mTotalAdvance, mLocalBounds);
                mPositions, getPaint(renderer), mTotalAdvance, bounds);
    }
    }


    virtual status_t multiDraw(OpenGLRenderer& renderer, Rect& dirty,
    virtual status_t multiDraw(OpenGLRenderer& renderer, Rect& dirty,
@@ -1454,6 +1461,8 @@ public:
            renderer.restoreDisplayState(ops[i]->state, true); // restore all but the clip
            renderer.restoreDisplayState(ops[i]->state, true); // restore all but the clip


            DrawTextOp& op = *((DrawTextOp*)ops[i]);
            DrawTextOp& op = *((DrawTextOp*)ops[i]);
            // quickReject() will not occure in drawText() so we can use mLocalBounds
            // directly, we do not need to account for shadow by calling getLocalBounds()
            status |= renderer.drawText(op.mText, op.mBytesCount, op.mCount, op.mX, op.mY,
            status |= renderer.drawText(op.mText, op.mBytesCount, op.mCount, op.mX, op.mY,
                    op.mPositions, op.getPaint(renderer), op.mTotalAdvance, op.mLocalBounds,
                    op.mPositions, op.getPaint(renderer), op.mTotalAdvance, op.mLocalBounds,
                    drawOpMode);
                    drawOpMode);
+8 −0
Original line number Original line Diff line number Diff line
@@ -464,10 +464,12 @@ void DisplayListRenderer::setupColorFilter(SkiaColorFilter* filter) {


void DisplayListRenderer::resetShadow() {
void DisplayListRenderer::resetShadow() {
    addStateOp(new (alloc()) ResetShadowOp());
    addStateOp(new (alloc()) ResetShadowOp());
    OpenGLRenderer::resetShadow();
}
}


void DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
void DisplayListRenderer::setupShadow(float radius, float dx, float dy, int color) {
    addStateOp(new (alloc()) SetupShadowOp(radius, dx, dy, color));
    addStateOp(new (alloc()) SetupShadowOp(radius, dx, dy, color));
    OpenGLRenderer::setupShadow(radius, dx, dy, color);
}
}


void DisplayListRenderer::resetPaintFilter() {
void DisplayListRenderer::resetPaintFilter() {
@@ -503,11 +505,17 @@ void DisplayListRenderer::addStateOp(StateOp* op) {


void DisplayListRenderer::addDrawOp(DrawOp* op) {
void DisplayListRenderer::addDrawOp(DrawOp* op) {
    Rect localBounds;
    Rect localBounds;
    if (mDrawModifiers.mHasShadow) {
        op->state.mDrawModifiers = mDrawModifiers;
    }
    if (op->getLocalBounds(localBounds)) {
    if (op->getLocalBounds(localBounds)) {
        bool rejected = quickRejectNoScissor(localBounds.left, localBounds.top,
        bool rejected = quickRejectNoScissor(localBounds.left, localBounds.top,
                localBounds.right, localBounds.bottom);
                localBounds.right, localBounds.bottom);
        op->setQuickRejected(rejected);
        op->setQuickRejected(rejected);
    }
    }
    if (mDrawModifiers.mHasShadow) {
        op->state.mDrawModifiers.reset();
    }
    mHasDrawOps = true;
    mHasDrawOps = true;
    addOpInternal(op);
    addOpInternal(op);
}
}
+8 −0
Original line number Original line Diff line number Diff line
@@ -52,6 +52,14 @@ namespace android {
namespace uirenderer {
namespace uirenderer {


struct DrawModifiers {
struct DrawModifiers {
    DrawModifiers() {
        reset();
    }

    void reset() {
        memset(this, 0, sizeof(DrawModifiers));
    }

    SkiaShader* mShader;
    SkiaShader* mShader;
    SkiaColorFilter* mColorFilter;
    SkiaColorFilter* mColorFilter;
    float mOverrideLayerAlpha;
    float mOverrideLayerAlpha;