[androidkit] add gaussian blur filter to java ImageFilters
Change-Id: I63f3f3feaf590971633c88857105ed14dbab2bb8 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/420122 Commit-Queue: Jorge Betancourt <jmbetancourt@google.com> Reviewed-by: Florin Malita <fmalita@chromium.org>
This commit is contained in:
parent
60cc3e171c
commit
7280b36687
@ -10,6 +10,7 @@
|
||||
#include "include/core/SkImageFilter.h"
|
||||
#include "include/core/SkPoint3.h"
|
||||
#include "include/effects/SkImageFilters.h"
|
||||
#include "modules/androidkit/src/Utils.h"
|
||||
|
||||
namespace {
|
||||
|
||||
@ -30,12 +31,22 @@ static long ImageFilter_DistantLitDiffuse(JNIEnv* env, jobject, jfloat x, jfloat
|
||||
return reinterpret_cast<jlong>(filter.release());
|
||||
}
|
||||
|
||||
static long ImageFilter_Blur(JNIEnv* env, jobject, jfloat sigmaX, jfloat sigmaY,
|
||||
jint jTileMode, jlong native_input) {
|
||||
auto input = sk_ref_sp(reinterpret_cast<SkImageFilter*>(native_input));
|
||||
auto filter = SkImageFilters::Blur(sigmaX, sigmaY,
|
||||
androidkit::utils::TileMode(jTileMode),
|
||||
std::move(input));
|
||||
return reinterpret_cast<jlong>(filter.release());
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
int register_androidkit_ImageFilter(JNIEnv* env) {
|
||||
static const JNINativeMethod methods[] = {
|
||||
{"nRelease" , "(J)V" , reinterpret_cast<void*>(ImageFilter_Release)},
|
||||
{"nDistantLitDiffuse", "(FFFFFFFFJ)J", reinterpret_cast<void*>(ImageFilter_DistantLitDiffuse)},
|
||||
{"nBlur" , "(FFIJ)J" , reinterpret_cast<void*>(ImageFilter_Blur)},
|
||||
};
|
||||
|
||||
const auto clazz = env->FindClass("org/skia/androidkit/ImageFilter");
|
||||
|
@ -56,7 +56,7 @@ public class Image {
|
||||
public Shader makeShader(TileMode tmx, TileMode tmy, SamplingOptions sampling,
|
||||
@Nullable Matrix localMatrix) {
|
||||
long nativeMatrix = localMatrix != null ? localMatrix.getNativeInstance() : 0;
|
||||
return new Shader(nMakeShader(mNativeInstance, tmx.ordinal(), tmy.ordinal(),
|
||||
return new Shader(nMakeShader(mNativeInstance, tmx.nativeInt, tmy.nativeInt,
|
||||
sampling.getNativeDesc(),
|
||||
sampling.getCubicCoeffB(), sampling.getCubicCoeffC(),
|
||||
nativeMatrix));
|
||||
|
@ -36,6 +36,23 @@ public class ImageFilter {
|
||||
return new ImageFilter(nDistantLitDiffuse(x, y, z, c.r(), c.g(), c.b(),
|
||||
surfaceScale, kd, nativeInput));
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a filter that calculates the diffuse illumination from a distant light source,
|
||||
* interpreting the alpha channel of the input as the height profile of the surface (to
|
||||
* approximate normal vectors).
|
||||
* @param sigmaX The Gaussian sigma value for blurring along the X axis.
|
||||
* @param sigmaY The Gaussian sigma value for blurring along the Y axis.
|
||||
* @param tileMode The tile mode applied at edges
|
||||
* @param input The input filter that is blurred, uses source bitmap if this is null.
|
||||
*/
|
||||
public static ImageFilter blur(float sigmaX, float sigmaY, TileMode tileMode, @Nullable ImageFilter input) {
|
||||
long nativeInput = 0;
|
||||
if (input != null) {
|
||||
nativeInput = input.getNativeInstance();
|
||||
}
|
||||
return new ImageFilter(nBlur(sigmaX, sigmaY, tileMode.nativeInt, nativeInput));
|
||||
}
|
||||
/**
|
||||
* Releases any resources associated with this Shader.
|
||||
*/
|
||||
@ -57,4 +74,5 @@ public class ImageFilter {
|
||||
float r, float g, float b,
|
||||
float surfaceScale, float kd,
|
||||
long native_input);
|
||||
private static native long nBlur(float sigmaX, float sigmaY, int tileMode, long native_input);
|
||||
}
|
||||
|
@ -12,22 +12,27 @@ public enum TileMode {
|
||||
* Replicate the edge color if the shader draws outside of its
|
||||
* original bounds.
|
||||
*/
|
||||
CLAMP,
|
||||
CLAMP(0),
|
||||
|
||||
/**
|
||||
* Repeat the shader's image horizontally and vertically.
|
||||
*/
|
||||
REPEAT,
|
||||
REPEAT(1),
|
||||
|
||||
/**
|
||||
* Repeat the shader's image horizontally and vertically, alternating
|
||||
* mirror images so that adjacent images always seam.
|
||||
*/
|
||||
MIRROR,
|
||||
MIRROR(2),
|
||||
|
||||
|
||||
/**
|
||||
* Only draw within the original domain, return transparent-black everywhere else.
|
||||
*/
|
||||
DECAL,
|
||||
DECAL(3);
|
||||
|
||||
TileMode(int nativeInt) {
|
||||
this.nativeInt = nativeInt;
|
||||
}
|
||||
final int nativeInt;
|
||||
}
|
||||
|
@ -94,7 +94,8 @@ public class MainActivity extends Activity {
|
||||
threadedSurface = Surface.createThreadedSurface(holder.getSurface());
|
||||
Paint p = new Paint();
|
||||
p.setColor(new Color(1, 1, 0, 1));
|
||||
ImageFilter filter = ImageFilter.distantLitDiffuse(.5f, .5f, .5f, new Color(1, 0, 0, 1), 1, 1, null);
|
||||
//ImageFilter filter = ImageFilter.distantLitDiffuse(.5f, .5f, .5f, new Color(1, 0, 0, 1), 1, 1, null);
|
||||
ImageFilter filter = ImageFilter.blur(10, 10, TileMode.DECAL, null);
|
||||
p.setImageFilter(filter);
|
||||
PathBuilder pathBuilder = new PathBuilder();
|
||||
pathBuilder.moveTo(20, 20);
|
||||
|
Loading…
Reference in New Issue
Block a user