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

Commit 322cb9c4 authored by Nader Jawad's avatar Nader Jawad
Browse files

Added BlurShader API

Created BlurShader framework API along with
native implementation as an implementation of
the Shader wrapper that maps to either
SkShader or SkImageFilter

Bug: 143468037
Test: Added CTS test to verify BlurShader

Change-Id: I05fcf7ba79e9d552f8b0738f7382f7826cd94e21
parent fc42a99e
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -14250,6 +14250,10 @@ package android.graphics {
    enum_constant public static final android.graphics.BlurMaskFilter.Blur SOLID;
  }
  public final class BlurShader extends android.graphics.Shader {
    ctor public BlurShader(float, float, @Nullable android.graphics.Shader);
  }
  public class Camera {
    ctor public Camera();
    method public void applyToCanvas(android.graphics.Canvas);
+65 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.graphics;

import android.annotation.Nullable;

/**
 * A subclass of shader that blurs input from another {@link android.graphics.Shader} instance
 * or all the drawing commands with the {@link android.graphics.Paint} that this shader is
 * attached to.
 */
public final class BlurShader extends Shader {

    private final float mRadiusX;
    private final float mRadiusY;
    private final Shader mInputShader;

    private long mNativeInputShader = 0;

    /**
     * Create a {@link BlurShader} that blurs the contents of the optional input shader
     * with the specified radius along the x and y axis. If no input shader is provided
     * then all drawing commands issued with a {@link android.graphics.Paint} that this
     * shader is installed in will be blurred
     * @param radiusX Radius of blur along the X axis
     * @param radiusY Radius of blur along the Y axis
     * @param inputShader Input shader that provides the content to be blurred
     */
    public BlurShader(float radiusX, float radiusY, @Nullable Shader inputShader) {
        mRadiusX = radiusX;
        mRadiusY = radiusY;
        mInputShader = inputShader;
    }

    /** @hide **/
    @Override
    protected long createNativeInstance(long nativeMatrix) {
        mNativeInputShader = mInputShader != null ? mInputShader.getNativeInstance() : 0;
        return nativeCreate(nativeMatrix, mRadiusX, mRadiusY, mNativeInputShader);
    }

    /** @hide **/
    @Override
    protected boolean shouldDiscardNativeInstance() {
        long currentNativeInstance = mInputShader != null ? mInputShader.getNativeInstance() : 0;
        return mNativeInputShader != currentNativeInstance;
    }

    private static native long nativeCreate(long nativeMatrix, float radiusX, float radiusY,
            long inputShader);
}
+1 −0
Original line number Diff line number Diff line
@@ -464,6 +464,7 @@ cc_defaults {
        "RootRenderNode.cpp",
        "shader/Shader.cpp",
        "shader/BitmapShader.cpp",
        "shader/BlurShader.cpp",
        "shader/ComposeShader.cpp",
        "shader/LinearGradientShader.cpp",
        "shader/RadialGradientShader.cpp",
+23 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@
#include "include/effects/SkRuntimeEffect.h"
#include "shader/Shader.h"
#include "shader/BitmapShader.h"
#include "shader/BlurShader.h"
#include "shader/ComposeShader.h"
#include "shader/LinearGradientShader.h"
#include "shader/RadialGradientShader.h"
@@ -222,6 +223,22 @@ static jlong ComposeShader_create(JNIEnv* env, jobject o, jlong matrixPtr,

///////////////////////////////////////////////////////////////////////////////////////////////

static jlong BlurShader_create(JNIEnv* env , jobject o, jlong matrixPtr, jfloat sigmaX,
        jfloat sigmaY, jlong shaderHandle) {
    auto* matrix = reinterpret_cast<const SkMatrix*>(matrixPtr);
    auto* inputShader = reinterpret_cast<Shader*>(shaderHandle);

    auto* blurShader = new BlurShader(
                sigmaX,
                sigmaY,
                inputShader,
                matrix
            );
    return reinterpret_cast<jlong>(blurShader);
}

///////////////////////////////////////////////////////////////////////////////////////////////

static jlong RuntimeShader_create(JNIEnv* env, jobject, jlong shaderFactory, jlong matrixPtr,
        jbyteArray inputs, jlong colorSpaceHandle, jboolean isOpaque) {
    auto* effect = reinterpret_cast<SkRuntimeEffect*>(shaderFactory);
@@ -273,6 +290,10 @@ static const JNINativeMethod gBitmapShaderMethods[] = {
    { "nativeCreate",      "(JJII)J",  (void*)BitmapShader_constructor },
};

static const JNINativeMethod gBlurShaderMethods[] = {
    { "nativeCreate",      "(JFFJ)J", (void*)BlurShader_create }
};

static const JNINativeMethod gLinearGradientMethods[] = {
    { "nativeCreate",     "(JFFFF[J[FIJ)J",  (void*)LinearGradient_create     },
};
@@ -304,6 +325,8 @@ int register_android_graphics_Shader(JNIEnv* env)
                                  NELEM(gShaderMethods));
    android::RegisterMethodsOrDie(env, "android/graphics/BitmapShader", gBitmapShaderMethods,
                                  NELEM(gBitmapShaderMethods));
    android::RegisterMethodsOrDie(env, "android/graphics/BlurShader", gBlurShaderMethods,
                                  NELEM(gBlurShaderMethods));
    android::RegisterMethodsOrDie(env, "android/graphics/LinearGradient", gLinearGradientMethods,
                                  NELEM(gLinearGradientMethods));
    android::RegisterMethodsOrDie(env, "android/graphics/RadialGradient", gRadialGradientMethods,
+38 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "BlurShader.h"
#include "SkImageFilters.h"
#include "SkRefCnt.h"
#include "utils/Blur.h"

namespace android::uirenderer {
BlurShader::BlurShader(float radiusX, float radiusY, Shader* inputShader, const SkMatrix* matrix)
    : Shader(matrix)
    , skImageFilter(
            SkImageFilters::Blur(
                    Blur::convertRadiusToSigma(radiusX),
                    Blur::convertRadiusToSigma(radiusY),
                    inputShader ? inputShader->asSkImageFilter() : nullptr)
            ) { }

sk_sp<SkImageFilter> BlurShader::makeSkImageFilter() {
    return skImageFilter;
}

BlurShader::~BlurShader() {}

} // namespace android::uirenderer
 No newline at end of file
Loading