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

Commit 2e98ade4 authored by Robin Lee's avatar Robin Lee
Browse files

Clean up KawaseBlurFilter

The clamp() calls aren't necessary with the current design and since
x/y are treated the same any duplicated code around stepX/stepY can
also be deleted.

This makes the shader a little simpler and reduces the number of
intermediate const variables that are passed in twice for x and y.

The reason for doing this is to prepare to use this code as a base
for other implementations of blur.

Bug: 185365391
Test: atest BlurTests
Change-Id: I6c75d89dd10d568651f6a6183d25b170ab8526ad
parent 026680a7
Loading
Loading
Loading
Loading
+7 −21
Original line number Original line Diff line number Diff line
@@ -35,20 +35,14 @@ namespace skia {
KawaseBlurFilter::KawaseBlurFilter(): BlurFilter() {
KawaseBlurFilter::KawaseBlurFilter(): BlurFilter() {
    SkString blurString(R"(
    SkString blurString(R"(
        uniform shader child;
        uniform shader child;
        uniform float2 in_blurOffset;
        uniform float in_blurOffset;
        uniform float2 in_maxSizeXY;


        half4 main(float2 xy) {
        half4 main(float2 xy) {
            half4 c = child.eval(xy);
            half4 c = child.eval(xy);
            c += child.eval(float2(clamp( in_blurOffset.x + xy.x, 0, in_maxSizeXY.x),
            c += child.eval(xy + float2(+in_blurOffset, +in_blurOffset));
                                   clamp( in_blurOffset.y + xy.y, 0, in_maxSizeXY.y)));
            c += child.eval(xy + float2(+in_blurOffset, -in_blurOffset));
            c += child.eval(float2(clamp( in_blurOffset.x + xy.x, 0, in_maxSizeXY.x),
            c += child.eval(xy + float2(-in_blurOffset, -in_blurOffset));
                                   clamp(-in_blurOffset.y + xy.y, 0, in_maxSizeXY.y)));
            c += child.eval(xy + float2(-in_blurOffset, +in_blurOffset));
            c += child.eval(float2(clamp(-in_blurOffset.x + xy.x, 0, in_maxSizeXY.x),
                                   clamp( in_blurOffset.y + xy.y, 0, in_maxSizeXY.y)));
            c += child.eval(float2(clamp(-in_blurOffset.x + xy.x, 0, in_maxSizeXY.x),
                                   clamp(-in_blurOffset.y + xy.y, 0, in_maxSizeXY.y)));

            return half4(c.rgb * 0.2, 1.0);
            return half4(c.rgb * 0.2, 1.0);
        }
        }
    )");
    )");
@@ -90,9 +84,6 @@ sk_sp<SkImage> KawaseBlurFilter::generate(GrRecordingContext* context, const uin
    SkImageInfo scaledInfo = input->imageInfo().makeWH(std::ceil(blurRect.width() * kInputScale),
    SkImageInfo scaledInfo = input->imageInfo().makeWH(std::ceil(blurRect.width() * kInputScale),
                                                       std::ceil(blurRect.height() * kInputScale));
                                                       std::ceil(blurRect.height() * kInputScale));


    const float stepX = radiusByPasses;
    const float stepY = radiusByPasses;

    // For sampling Skia's API expects the inverse of what logically seems appropriate. In this
    // For sampling Skia's API expects the inverse of what logically seems appropriate. In this
    // case you might expect Translate(blurRect.fLeft, blurRect.fTop) X Scale(kInverseInputScale)
    // case you might expect Translate(blurRect.fLeft, blurRect.fTop) X Scale(kInverseInputScale)
    // but instead we must do the inverse.
    // but instead we must do the inverse.
@@ -104,20 +95,15 @@ sk_sp<SkImage> KawaseBlurFilter::generate(GrRecordingContext* context, const uin
    SkRuntimeShaderBuilder blurBuilder(mBlurEffect);
    SkRuntimeShaderBuilder blurBuilder(mBlurEffect);
    blurBuilder.child("child") =
    blurBuilder.child("child") =
            input->makeShader(SkTileMode::kClamp, SkTileMode::kClamp, linear, blurMatrix);
            input->makeShader(SkTileMode::kClamp, SkTileMode::kClamp, linear, blurMatrix);
    blurBuilder.uniform("in_blurOffset") = SkV2{stepX * kInputScale, stepY * kInputScale};
    blurBuilder.uniform("in_blurOffset") = radiusByPasses * kInputScale;
    blurBuilder.uniform("in_maxSizeXY") =
            SkV2{blurRect.width() * kInputScale, blurRect.height() * kInputScale};


    sk_sp<SkImage> tmpBlur(blurBuilder.makeImage(context, nullptr, scaledInfo, false));
    sk_sp<SkImage> tmpBlur(blurBuilder.makeImage(context, nullptr, scaledInfo, false));


    // And now we'll build our chain of scaled blur stages
    // And now we'll build our chain of scaled blur stages
    for (auto i = 1; i < numberOfPasses; i++) {
    for (auto i = 1; i < numberOfPasses; i++) {
        const float stepScale = (float)i * kInputScale;
        blurBuilder.child("child") =
        blurBuilder.child("child") =
                tmpBlur->makeShader(SkTileMode::kClamp, SkTileMode::kClamp, linear);
                tmpBlur->makeShader(SkTileMode::kClamp, SkTileMode::kClamp, linear);
        blurBuilder.uniform("in_blurOffset") = SkV2{stepX * stepScale, stepY * stepScale};
        blurBuilder.uniform("in_blurOffset") = (float) i * radiusByPasses * kInputScale;
        blurBuilder.uniform("in_maxSizeXY") =
                SkV2{blurRect.width() * kInputScale, blurRect.height() * kInputScale};
        tmpBlur = blurBuilder.makeImage(context, nullptr, scaledInfo, false);
        tmpBlur = blurBuilder.makeImage(context, nullptr, scaledInfo, false);
    }
    }