blob: 3b124ca4f9a876a50d82565ccf3bc0572e12932e [file] [log] [blame]
/*
* Copyright 2021 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
package org.skia.androidkit;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
public class ImageFilter {
private long mNativeInstance;
private ImageFilter(long native_instance) {
mNativeInstance = native_instance;
}
/**
* 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 x, y, z The direction to the distance light.
* @param c The color of the diffuse light source.
* @param surfaceScale Scale factor to transform from alpha values to physical height.
* @param kd Diffuse reflectance coefficient.
* @param input The input filter that defines surface normals (as alpha), or uses the
* source bitmap when null.
*/
public static ImageFilter distantLitDiffuse(float x, float y, float z, Color c,
float surfaceScale, float kd, @Nullable ImageFilter input) {
long nativeInput = 0;
if (input != null) {
nativeInput = input.getNativeInstance();
}
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));
}
/**
* Create a filter that draws a drop shadow under the input content. This filter produces an
* image that includes the inputs' content.
* @param dx The X offset of the shadow.
* @param dy The Y offset of the shadow.
* @param sigmaX The blur radius for the shadow, along the X axis.
* @param sigmaY The blur radius for the shadow, along the Y axis.
* @param c The color of the drop shadow.
* @param input The input filter, or will use the source bitmap if this is null.
*/
public static ImageFilter dropShadow(float dx, float dy,
float sigmaX, float sigmaY,
Color c, @Nullable ImageFilter input) {
long nativeInput = 0;
if (input != null) {
nativeInput = input.getNativeInstance();
}
return new ImageFilter(nDropShadow(dx, dy, sigmaX, sigmaY, c.r(), c.g(), c.b(), nativeInput));
}
public static ImageFilter blend(BlendMode blendMode, @Nullable ImageFilter background,
@Nullable ImageFilter foreground) {
long nativeBackground = 0;
long nativeForeground = 0;
if (background != null) {
nativeBackground = background.getNativeInstance();
}
if (foreground != null) {
nativeForeground = foreground.getNativeInstance();
}
return new ImageFilter(nBlend(blendMode.nativeInt, nativeBackground, nativeForeground));
}
public static ImageFilter image(@NonNull Image image) {
return new ImageFilter(nImage(image.getNativeInstance()));
}
/**
* Releases any resources associated with this Shader.
*/
public void release() {
nRelease(mNativeInstance);
mNativeInstance = 0;
}
@Override
protected void finalize() throws Throwable {
release();
}
// package private
long getNativeInstance() { return mNativeInstance; }
private static native void nRelease(long nativeInstance);
private static native long nDistantLitDiffuse(float x, float y, float z,
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);
private static native long nDropShadow(float dx, float dy, float sigmaX, float sigmaY,
float r, float g, float b, long native_input);
private static native long nBlend(int blendMode, long native_background, long native_foreground);
private static native long nImage(long native_image);
}