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

Commit 9b5a1a28 authored by Romain Guy's avatar Romain Guy
Browse files

Take shadow bounds into account for quick rejects

Bug #8634346

Change-Id: I995c5205c2959d8e4da638ae47fedcda92eb1b36
parent d81a15c6
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;