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

Commit 07bee70e authored by Mike Reed's avatar Mike Reed
Browse files

Revert "Revert "Simplify calling loopers""

This reverts commit 1edec352.

Previous attempt at this mistakenly used a pointer to an rvalue,
which was out of scope when it was used.

e.g.
    const SkPaint* sk_paint = filterBitmap(paint);
    ...
    // now use sk_paint <-- bad

Test: make

Bug: 178700363
Change-Id: I2e2913385e05257c482a5d12eaeaddadd04126e2
parent ee9b56d9
Loading
Loading
Loading
Loading
+4 −27
Original line number Diff line number Diff line
@@ -194,25 +194,6 @@ SkiaCanvas::PaintCoW&& SkiaRecordingCanvas::filterBitmap(PaintCoW&& paint) {
    return filterPaint(std::move(paint));
}

static BlurDrawLooper* get_looper(const Paint* paint) {
    return paint ? paint->getLooper() : nullptr;
}

template <typename Proc>
void applyLooper(BlurDrawLooper* looper, const SkPaint* paint, Proc proc) {
    if (looper) {
        SkPaint p;
        if (paint) {
            p = *paint;
        }
        looper->apply(p, [&](SkPoint offset, const SkPaint& modifiedPaint) {
            proc(offset.fX, offset.fY, &modifiedPaint);
        });
    } else {
        proc(0, 0, paint);
    }
}

static SkFilterMode Paint_to_filter(const SkPaint* paint) {
    return paint && paint->getFilterQuality() != kNone_SkFilterQuality ? SkFilterMode::kLinear
                                                                       : SkFilterMode::kNearest;
@@ -226,8 +207,7 @@ static SkSamplingOptions Paint_to_sampling(const SkPaint* paint) {
void SkiaRecordingCanvas::drawBitmap(Bitmap& bitmap, float left, float top, const Paint* paint) {
    sk_sp<SkImage> image = bitmap.makeImage();

    applyLooper(get_looper(paint), filterBitmap(paint), [&](SkScalar x, SkScalar y,
                const SkPaint* p) {
    applyLooper(paint, [&](SkScalar x, SkScalar y, const SkPaint* p) {
        mRecorder.drawImage(image, left + x, top + y, Paint_to_sampling(p), p, bitmap.palette());
    });

@@ -245,8 +225,7 @@ void SkiaRecordingCanvas::drawBitmap(Bitmap& bitmap, const SkMatrix& matrix, con

    sk_sp<SkImage> image = bitmap.makeImage();

    applyLooper(get_looper(paint), filterBitmap(paint), [&](SkScalar x, SkScalar y,
                const SkPaint* p) {
    applyLooper(paint, [&](SkScalar x, SkScalar y, const SkPaint* p) {
        mRecorder.drawImage(image, x, y, Paint_to_sampling(p), p, bitmap.palette());
    });

@@ -263,8 +242,7 @@ void SkiaRecordingCanvas::drawBitmap(Bitmap& bitmap, float srcLeft, float srcTop

    sk_sp<SkImage> image = bitmap.makeImage();

    applyLooper(get_looper(paint), filterBitmap(paint), [&](SkScalar x, SkScalar y,
                const SkPaint* p) {
    applyLooper(paint, [&](SkScalar x, SkScalar y, const SkPaint* p) {
        mRecorder.drawImageRect(image, srcRect, dstRect.makeOffset(x, y), Paint_to_sampling(p),
                                p, SkCanvas::kFast_SrcRectConstraint, bitmap.palette());
    });
@@ -303,8 +281,7 @@ void SkiaRecordingCanvas::drawNinePatch(Bitmap& bitmap, const Res_png_9patch& ch
    // HWUI always draws 9-patches with linear filtering, regardless of the Paint.
    const SkFilterMode filter = SkFilterMode::kLinear;

    applyLooper(get_looper(paint), filterBitmap(paint), [&](SkScalar x, SkScalar y,
                const SkPaint* p) {
    applyLooper(paint, [&](SkScalar x, SkScalar y, const SkPaint* p) {
        mRecorder.drawImageLattice(image, lattice, dst.makeOffset(x, y), filter, p,
                                   bitmap.palette());
    });
+17 −0
Original line number Diff line number Diff line
@@ -87,6 +87,23 @@ private:
    std::unique_ptr<SkiaDisplayList> mDisplayList;
    StartReorderBarrierDrawable* mCurrentBarrier;

    template <typename Proc>
    void applyLooper(const Paint* paint, Proc proc) {
        SkPaint skp;
        BlurDrawLooper* looper = nullptr;
        if (paint) {
            skp = *filterBitmap(paint);
            looper = paint->getLooper();
        }
        if (looper) {
            looper->apply(skp, [&](SkPoint offset, const SkPaint& modifiedPaint) {
                proc(offset.fX, offset.fY, &modifiedPaint);
            });
        } else {
            proc(0, 0, &skp);
        }
    }

    /**
     *  A new SkiaDisplayList is created or recycled if available.
     *