1*32afb93cSXin Li /*
2*32afb93cSXin Li  * Copyright (C) 2021 The Android Open Source Project
3*32afb93cSXin Li  *
4*32afb93cSXin Li  * Licensed under the Apache License, Version 2.0 (the "License");
5*32afb93cSXin Li  * you may not use this file except in compliance with the License.
6*32afb93cSXin Li  * You may obtain a copy of the License at
7*32afb93cSXin Li  *
8*32afb93cSXin Li  *      http://www.apache.org/licenses/LICENSE-2.0
9*32afb93cSXin Li  *
10*32afb93cSXin Li  * Unless required by applicable law or agreed to in writing, software
11*32afb93cSXin Li  * distributed under the License is distributed on an "AS IS" BASIS,
12*32afb93cSXin Li  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*32afb93cSXin Li  * See the License for the specific language governing permissions and
14*32afb93cSXin Li  * limitations under the License.
15*32afb93cSXin Li  */
16*32afb93cSXin Li 
17*32afb93cSXin Li #include <android/bitmap.h>
18*32afb93cSXin Li #include <cassert>
19*32afb93cSXin Li #include <jni.h>
20*32afb93cSXin Li 
21*32afb93cSXin Li #include "RenderScriptToolkit.h"
22*32afb93cSXin Li #include "Utils.h"
23*32afb93cSXin Li 
24*32afb93cSXin Li #define LOG_TAG "renderscript.toolkit.JniEntryPoints"
25*32afb93cSXin Li 
26*32afb93cSXin Li using namespace renderscript;
27*32afb93cSXin Li 
28*32afb93cSXin Li /**
29*32afb93cSXin Li  * I compared using env->GetPrimitiveArrayCritical vs. env->GetByteArrayElements to get access
30*32afb93cSXin Li  * to the underlying data. On Pixel 4, it's actually faster to not use critical. The code is left
31*32afb93cSXin Li  * here if you want to experiment. Note that USE_CRITICAL could block the garbage collector.
32*32afb93cSXin Li  */
33*32afb93cSXin Li // #define USE_CRITICAL
34*32afb93cSXin Li 
35*32afb93cSXin Li class ByteArrayGuard {
36*32afb93cSXin Li    private:
37*32afb93cSXin Li     JNIEnv* env;
38*32afb93cSXin Li     jbyteArray array;
39*32afb93cSXin Li     jbyte* data;
40*32afb93cSXin Li 
41*32afb93cSXin Li    public:
ByteArrayGuard(JNIEnv * env,jbyteArray array)42*32afb93cSXin Li     ByteArrayGuard(JNIEnv* env, jbyteArray array) : env{env}, array{array} {
43*32afb93cSXin Li #ifdef USE_CRITICAL
44*32afb93cSXin Li         data = reinterpret_cast<jbyte*>(env->GetPrimitiveArrayCritical(array, nullptr));
45*32afb93cSXin Li #else
46*32afb93cSXin Li         data = env->GetByteArrayElements(array, nullptr);
47*32afb93cSXin Li #endif
48*32afb93cSXin Li     }
~ByteArrayGuard()49*32afb93cSXin Li     ~ByteArrayGuard() {
50*32afb93cSXin Li #ifdef USE_CRITICAL
51*32afb93cSXin Li         env->ReleasePrimitiveArrayCritical(array, data, 0);
52*32afb93cSXin Li #else
53*32afb93cSXin Li         env->ReleaseByteArrayElements(array, data, 0);
54*32afb93cSXin Li #endif
55*32afb93cSXin Li     }
get()56*32afb93cSXin Li     uint8_t* get() { return reinterpret_cast<uint8_t*>(data); }
57*32afb93cSXin Li };
58*32afb93cSXin Li 
59*32afb93cSXin Li class IntArrayGuard {
60*32afb93cSXin Li    private:
61*32afb93cSXin Li     JNIEnv* env;
62*32afb93cSXin Li     jintArray array;
63*32afb93cSXin Li     jint* data;
64*32afb93cSXin Li 
65*32afb93cSXin Li    public:
IntArrayGuard(JNIEnv * env,jintArray array)66*32afb93cSXin Li     IntArrayGuard(JNIEnv* env, jintArray array) : env{env}, array{array} {
67*32afb93cSXin Li #ifdef USE_CRITICAL
68*32afb93cSXin Li         data = reinterpret_cast<jint*>(env->GetPrimitiveArrayCritical(array, nullptr));
69*32afb93cSXin Li #else
70*32afb93cSXin Li         data = env->GetIntArrayElements(array, nullptr);
71*32afb93cSXin Li #endif
72*32afb93cSXin Li     }
~IntArrayGuard()73*32afb93cSXin Li     ~IntArrayGuard() {
74*32afb93cSXin Li #ifdef USE_CRITICAL
75*32afb93cSXin Li         env->ReleasePrimitiveArrayCritical(array, data, 0);
76*32afb93cSXin Li #else
77*32afb93cSXin Li         env->ReleaseIntArrayElements(array, data, 0);
78*32afb93cSXin Li #endif
79*32afb93cSXin Li     }
get()80*32afb93cSXin Li     int* get() { return reinterpret_cast<int*>(data); }
81*32afb93cSXin Li };
82*32afb93cSXin Li 
83*32afb93cSXin Li class FloatArrayGuard {
84*32afb93cSXin Li    private:
85*32afb93cSXin Li     JNIEnv* env;
86*32afb93cSXin Li     jfloatArray array;
87*32afb93cSXin Li     jfloat* data;
88*32afb93cSXin Li 
89*32afb93cSXin Li    public:
FloatArrayGuard(JNIEnv * env,jfloatArray array)90*32afb93cSXin Li     FloatArrayGuard(JNIEnv* env, jfloatArray array) : env{env}, array{array} {
91*32afb93cSXin Li #ifdef USE_CRITICAL
92*32afb93cSXin Li         data = reinterpret_cast<jfloat*>(env->GetPrimitiveArrayCritical(array, nullptr));
93*32afb93cSXin Li #else
94*32afb93cSXin Li         data = env->GetFloatArrayElements(array, nullptr);
95*32afb93cSXin Li #endif
96*32afb93cSXin Li     }
~FloatArrayGuard()97*32afb93cSXin Li     ~FloatArrayGuard() {
98*32afb93cSXin Li #ifdef USE_CRITICAL
99*32afb93cSXin Li         env->ReleasePrimitiveArrayCritical(array, data, 0);
100*32afb93cSXin Li #else
101*32afb93cSXin Li         env->ReleaseFloatArrayElements(array, data, 0);
102*32afb93cSXin Li #endif
103*32afb93cSXin Li     }
get()104*32afb93cSXin Li     float* get() { return reinterpret_cast<float*>(data); }
105*32afb93cSXin Li };
106*32afb93cSXin Li 
107*32afb93cSXin Li class BitmapGuard {
108*32afb93cSXin Li    private:
109*32afb93cSXin Li     JNIEnv* env;
110*32afb93cSXin Li     jobject bitmap;
111*32afb93cSXin Li     AndroidBitmapInfo info;
112*32afb93cSXin Li     int bytesPerPixel;
113*32afb93cSXin Li     void* bytes;
114*32afb93cSXin Li     bool valid;
115*32afb93cSXin Li 
116*32afb93cSXin Li    public:
BitmapGuard(JNIEnv * env,jobject jBitmap)117*32afb93cSXin Li     BitmapGuard(JNIEnv* env, jobject jBitmap) : env{env}, bitmap{jBitmap}, bytes{nullptr} {
118*32afb93cSXin Li         valid = false;
119*32afb93cSXin Li         if (AndroidBitmap_getInfo(env, bitmap, &info) != ANDROID_BITMAP_RESULT_SUCCESS) {
120*32afb93cSXin Li             ALOGE("AndroidBitmap_getInfo failed");
121*32afb93cSXin Li             return;
122*32afb93cSXin Li         }
123*32afb93cSXin Li         if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888 &&
124*32afb93cSXin Li             info.format != ANDROID_BITMAP_FORMAT_A_8) {
125*32afb93cSXin Li             ALOGE("AndroidBitmap in the wrong format");
126*32afb93cSXin Li             return;
127*32afb93cSXin Li         }
128*32afb93cSXin Li         bytesPerPixel = info.stride / info.width;
129*32afb93cSXin Li         if (bytesPerPixel != 1 && bytesPerPixel != 4) {
130*32afb93cSXin Li             ALOGE("Expected a vector size of 1 or 4. Got %d. Extra padding per line not currently "
131*32afb93cSXin Li                   "supported",
132*32afb93cSXin Li                   bytesPerPixel);
133*32afb93cSXin Li             return;
134*32afb93cSXin Li         }
135*32afb93cSXin Li         if (AndroidBitmap_lockPixels(env, bitmap, &bytes) != ANDROID_BITMAP_RESULT_SUCCESS) {
136*32afb93cSXin Li             ALOGE("AndroidBitmap_lockPixels failed");
137*32afb93cSXin Li             return;
138*32afb93cSXin Li         }
139*32afb93cSXin Li         valid = true;
140*32afb93cSXin Li     }
~BitmapGuard()141*32afb93cSXin Li     ~BitmapGuard() {
142*32afb93cSXin Li         if (valid) {
143*32afb93cSXin Li             AndroidBitmap_unlockPixels(env, bitmap);
144*32afb93cSXin Li         }
145*32afb93cSXin Li     }
get() const146*32afb93cSXin Li     uint8_t* get() const {
147*32afb93cSXin Li         assert(valid);
148*32afb93cSXin Li         return reinterpret_cast<uint8_t*>(bytes);
149*32afb93cSXin Li     }
width() const150*32afb93cSXin Li     int width() const { return info.width; }
height() const151*32afb93cSXin Li     int height() const { return info.height; }
vectorSize() const152*32afb93cSXin Li     int vectorSize() const { return bytesPerPixel; }
153*32afb93cSXin Li };
154*32afb93cSXin Li 
155*32afb93cSXin Li /**
156*32afb93cSXin Li  * Copies the content of Kotlin Range2d object into the equivalent C++ struct.
157*32afb93cSXin Li  */
158*32afb93cSXin Li class RestrictionParameter {
159*32afb93cSXin Li    private:
160*32afb93cSXin Li     bool isNull;
161*32afb93cSXin Li     Restriction restriction;
162*32afb93cSXin Li 
163*32afb93cSXin Li    public:
RestrictionParameter(JNIEnv * env,jobject jRestriction)164*32afb93cSXin Li     RestrictionParameter(JNIEnv* env, jobject jRestriction) : isNull{jRestriction == nullptr} {
165*32afb93cSXin Li         if (isNull) {
166*32afb93cSXin Li             return;
167*32afb93cSXin Li         }
168*32afb93cSXin Li         /* TODO Measure how long FindClass and related functions take. Consider passing the
169*32afb93cSXin Li          * four values instead. This would also require setting the default when Range2D is null.
170*32afb93cSXin Li          */
171*32afb93cSXin Li         jclass restrictionClass = env->FindClass("com/google/android/renderscript/Range2d");
172*32afb93cSXin Li         if (restrictionClass == nullptr) {
173*32afb93cSXin Li             ALOGE("RenderScriptToolit. Internal error. Could not find the Kotlin Range2d class.");
174*32afb93cSXin Li             isNull = true;
175*32afb93cSXin Li             return;
176*32afb93cSXin Li         }
177*32afb93cSXin Li         jfieldID startXId = env->GetFieldID(restrictionClass, "startX", "I");
178*32afb93cSXin Li         jfieldID startYId = env->GetFieldID(restrictionClass, "startY", "I");
179*32afb93cSXin Li         jfieldID endXId = env->GetFieldID(restrictionClass, "endX", "I");
180*32afb93cSXin Li         jfieldID endYId = env->GetFieldID(restrictionClass, "endY", "I");
181*32afb93cSXin Li         restriction.startX = env->GetIntField(jRestriction, startXId);
182*32afb93cSXin Li         restriction.startY = env->GetIntField(jRestriction, startYId);
183*32afb93cSXin Li         restriction.endX = env->GetIntField(jRestriction, endXId);
184*32afb93cSXin Li         restriction.endY = env->GetIntField(jRestriction, endYId);
185*32afb93cSXin Li     }
get()186*32afb93cSXin Li     Restriction* get() { return isNull ? nullptr : &restriction; }
187*32afb93cSXin Li };
188*32afb93cSXin Li 
189*32afb93cSXin Li extern "C" JNIEXPORT jlong JNICALL
Java_com_google_android_renderscript_Toolkit_createNative(JNIEnv *,jobject)190*32afb93cSXin Li Java_com_google_android_renderscript_Toolkit_createNative(JNIEnv* /*env*/, jobject /*thiz*/) {
191*32afb93cSXin Li     return reinterpret_cast<jlong>(new RenderScriptToolkit());
192*32afb93cSXin Li }
193*32afb93cSXin Li 
Java_com_google_android_renderscript_Toolkit_destroyNative(JNIEnv *,jobject,jlong native_handle)194*32afb93cSXin Li extern "C" JNIEXPORT void JNICALL Java_com_google_android_renderscript_Toolkit_destroyNative(
195*32afb93cSXin Li         JNIEnv* /*env*/, jobject /*thiz*/, jlong native_handle) {
196*32afb93cSXin Li     RenderScriptToolkit* toolkit = reinterpret_cast<RenderScriptToolkit*>(native_handle);
197*32afb93cSXin Li     delete toolkit;
198*32afb93cSXin Li }
199*32afb93cSXin Li 
Java_com_google_android_renderscript_Toolkit_nativeBlend(JNIEnv * env,jobject,jlong native_handle,jint jmode,jbyteArray source_array,jbyteArray dest_array,jint size_x,jint size_y,jobject restriction)200*32afb93cSXin Li extern "C" JNIEXPORT void JNICALL Java_com_google_android_renderscript_Toolkit_nativeBlend(
201*32afb93cSXin Li         JNIEnv* env, jobject /*thiz*/, jlong native_handle, jint jmode, jbyteArray source_array,
202*32afb93cSXin Li         jbyteArray dest_array, jint size_x, jint size_y, jobject restriction) {
203*32afb93cSXin Li     auto toolkit = reinterpret_cast<RenderScriptToolkit*>(native_handle);
204*32afb93cSXin Li     auto mode = static_cast<RenderScriptToolkit::BlendingMode>(jmode);
205*32afb93cSXin Li     RestrictionParameter restrict {env, restriction};
206*32afb93cSXin Li     ByteArrayGuard source{env, source_array};
207*32afb93cSXin Li     ByteArrayGuard dest{env, dest_array};
208*32afb93cSXin Li 
209*32afb93cSXin Li     toolkit->blend(mode, source.get(), dest.get(), size_x, size_y, restrict.get());
210*32afb93cSXin Li }
211*32afb93cSXin Li 
Java_com_google_android_renderscript_Toolkit_nativeBlendBitmap(JNIEnv * env,jobject,jlong native_handle,jint jmode,jobject source_bitmap,jobject dest_bitmap,jobject restriction)212*32afb93cSXin Li extern "C" JNIEXPORT void JNICALL Java_com_google_android_renderscript_Toolkit_nativeBlendBitmap(
213*32afb93cSXin Li         JNIEnv* env, jobject /*thiz*/, jlong native_handle, jint jmode, jobject source_bitmap,
214*32afb93cSXin Li         jobject dest_bitmap, jobject restriction) {
215*32afb93cSXin Li     auto toolkit = reinterpret_cast<RenderScriptToolkit*>(native_handle);
216*32afb93cSXin Li     auto mode = static_cast<RenderScriptToolkit::BlendingMode>(jmode);
217*32afb93cSXin Li     RestrictionParameter restrict {env, restriction};
218*32afb93cSXin Li     BitmapGuard source{env, source_bitmap};
219*32afb93cSXin Li     BitmapGuard dest{env, dest_bitmap};
220*32afb93cSXin Li 
221*32afb93cSXin Li     toolkit->blend(mode, source.get(), dest.get(), source.width(), source.height(), restrict.get());
222*32afb93cSXin Li }
223*32afb93cSXin Li 
Java_com_google_android_renderscript_Toolkit_nativeBlur(JNIEnv * env,jobject,jlong native_handle,jbyteArray input_array,jint vectorSize,jint size_x,jint size_y,jint radius,jbyteArray output_array,jobject restriction)224*32afb93cSXin Li extern "C" JNIEXPORT void JNICALL Java_com_google_android_renderscript_Toolkit_nativeBlur(
225*32afb93cSXin Li         JNIEnv* env, jobject /*thiz*/, jlong native_handle, jbyteArray input_array, jint vectorSize,
226*32afb93cSXin Li         jint size_x, jint size_y, jint radius, jbyteArray output_array, jobject restriction) {
227*32afb93cSXin Li     RenderScriptToolkit* toolkit = reinterpret_cast<RenderScriptToolkit*>(native_handle);
228*32afb93cSXin Li     RestrictionParameter restrict {env, restriction};
229*32afb93cSXin Li     ByteArrayGuard input{env, input_array};
230*32afb93cSXin Li     ByteArrayGuard output{env, output_array};
231*32afb93cSXin Li 
232*32afb93cSXin Li     toolkit->blur(input.get(), output.get(), size_x, size_y, vectorSize, radius, restrict.get());
233*32afb93cSXin Li }
234*32afb93cSXin Li 
Java_com_google_android_renderscript_Toolkit_nativeBlurBitmap(JNIEnv * env,jobject,jlong native_handle,jobject input_bitmap,jobject output_bitmap,jint radius,jobject restriction)235*32afb93cSXin Li extern "C" JNIEXPORT void JNICALL Java_com_google_android_renderscript_Toolkit_nativeBlurBitmap(
236*32afb93cSXin Li         JNIEnv* env, jobject /*thiz*/, jlong native_handle, jobject input_bitmap,
237*32afb93cSXin Li         jobject output_bitmap, jint radius, jobject restriction) {
238*32afb93cSXin Li     RenderScriptToolkit* toolkit = reinterpret_cast<RenderScriptToolkit*>(native_handle);
239*32afb93cSXin Li     RestrictionParameter restrict {env, restriction};
240*32afb93cSXin Li     BitmapGuard input{env, input_bitmap};
241*32afb93cSXin Li     BitmapGuard output{env, output_bitmap};
242*32afb93cSXin Li 
243*32afb93cSXin Li     toolkit->blur(input.get(), output.get(), input.width(), input.height(), input.vectorSize(),
244*32afb93cSXin Li                   radius, restrict.get());
245*32afb93cSXin Li }
246*32afb93cSXin Li 
Java_com_google_android_renderscript_Toolkit_nativeColorMatrix(JNIEnv * env,jobject,jlong native_handle,jbyteArray input_array,jint input_vector_size,jint size_x,jint size_y,jbyteArray output_array,jint output_vector_size,jfloatArray jmatrix,jfloatArray add_vector,jobject restriction)247*32afb93cSXin Li extern "C" JNIEXPORT void JNICALL Java_com_google_android_renderscript_Toolkit_nativeColorMatrix(
248*32afb93cSXin Li         JNIEnv* env, jobject /*thiz*/, jlong native_handle, jbyteArray input_array,
249*32afb93cSXin Li         jint input_vector_size, jint size_x, jint size_y, jbyteArray output_array,
250*32afb93cSXin Li         jint output_vector_size, jfloatArray jmatrix, jfloatArray add_vector, jobject restriction) {
251*32afb93cSXin Li     RenderScriptToolkit* toolkit = reinterpret_cast<RenderScriptToolkit*>(native_handle);
252*32afb93cSXin Li     RestrictionParameter restrict {env, restriction};
253*32afb93cSXin Li     ByteArrayGuard input{env, input_array};
254*32afb93cSXin Li     ByteArrayGuard output{env, output_array};
255*32afb93cSXin Li     FloatArrayGuard matrix{env, jmatrix};
256*32afb93cSXin Li     FloatArrayGuard add{env, add_vector};
257*32afb93cSXin Li 
258*32afb93cSXin Li     toolkit->colorMatrix(input.get(), output.get(), input_vector_size, output_vector_size, size_x,
259*32afb93cSXin Li                          size_y, matrix.get(), add.get(), restrict.get());
260*32afb93cSXin Li }
261*32afb93cSXin Li 
Java_com_google_android_renderscript_Toolkit_nativeColorMatrixBitmap(JNIEnv * env,jobject,jlong native_handle,jobject input_bitmap,jobject output_bitmap,jfloatArray jmatrix,jfloatArray add_vector,jobject restriction)262*32afb93cSXin Li extern "C" JNIEXPORT void JNICALL Java_com_google_android_renderscript_Toolkit_nativeColorMatrixBitmap(
263*32afb93cSXin Li         JNIEnv* env, jobject /*thiz*/, jlong native_handle, jobject input_bitmap,
264*32afb93cSXin Li         jobject output_bitmap, jfloatArray jmatrix, jfloatArray add_vector, jobject restriction) {
265*32afb93cSXin Li     RenderScriptToolkit* toolkit = reinterpret_cast<RenderScriptToolkit*>(native_handle);
266*32afb93cSXin Li     RestrictionParameter restrict {env, restriction};
267*32afb93cSXin Li     BitmapGuard input{env, input_bitmap};
268*32afb93cSXin Li     BitmapGuard output{env, output_bitmap};
269*32afb93cSXin Li     FloatArrayGuard matrix{env, jmatrix};
270*32afb93cSXin Li     FloatArrayGuard add{env, add_vector};
271*32afb93cSXin Li 
272*32afb93cSXin Li     toolkit->colorMatrix(input.get(), output.get(), input.vectorSize(), output.vectorSize(),
273*32afb93cSXin Li                          input.width(), input.height(), matrix.get(), add.get(), restrict.get());
274*32afb93cSXin Li }
275*32afb93cSXin Li 
Java_com_google_android_renderscript_Toolkit_nativeConvolve(JNIEnv * env,jobject,jlong native_handle,jbyteArray input_array,jint vectorSize,jint size_x,jint size_y,jbyteArray output_array,jfloatArray coefficients,jobject restriction)276*32afb93cSXin Li extern "C" JNIEXPORT void JNICALL Java_com_google_android_renderscript_Toolkit_nativeConvolve(
277*32afb93cSXin Li         JNIEnv* env, jobject /*thiz*/, jlong native_handle, jbyteArray input_array, jint vectorSize,
278*32afb93cSXin Li         jint size_x, jint size_y, jbyteArray output_array, jfloatArray coefficients,
279*32afb93cSXin Li         jobject restriction) {
280*32afb93cSXin Li     RenderScriptToolkit* toolkit = reinterpret_cast<RenderScriptToolkit*>(native_handle);
281*32afb93cSXin Li     RestrictionParameter restrict {env, restriction};
282*32afb93cSXin Li     ByteArrayGuard input{env, input_array};
283*32afb93cSXin Li     ByteArrayGuard output{env, output_array};
284*32afb93cSXin Li     FloatArrayGuard coeffs{env, coefficients};
285*32afb93cSXin Li 
286*32afb93cSXin Li     switch (env->GetArrayLength(coefficients)) {
287*32afb93cSXin Li         case 9:
288*32afb93cSXin Li             toolkit->convolve3x3(input.get(), output.get(), vectorSize, size_x, size_y,
289*32afb93cSXin Li                                  coeffs.get(), restrict.get());
290*32afb93cSXin Li             break;
291*32afb93cSXin Li         case 25:
292*32afb93cSXin Li             toolkit->convolve5x5(input.get(), output.get(), vectorSize, size_x, size_y,
293*32afb93cSXin Li                                  coeffs.get(), restrict.get());
294*32afb93cSXin Li             break;
295*32afb93cSXin Li     }
296*32afb93cSXin Li }
297*32afb93cSXin Li 
Java_com_google_android_renderscript_Toolkit_nativeConvolveBitmap(JNIEnv * env,jobject,jlong native_handle,jobject input_bitmap,jobject output_bitmap,jfloatArray coefficients,jobject restriction)298*32afb93cSXin Li extern "C" JNIEXPORT void JNICALL Java_com_google_android_renderscript_Toolkit_nativeConvolveBitmap(
299*32afb93cSXin Li         JNIEnv* env, jobject /*thiz*/, jlong native_handle, jobject input_bitmap,
300*32afb93cSXin Li         jobject output_bitmap, jfloatArray coefficients, jobject restriction) {
301*32afb93cSXin Li     RenderScriptToolkit* toolkit = reinterpret_cast<RenderScriptToolkit*>(native_handle);
302*32afb93cSXin Li     RestrictionParameter restrict {env, restriction};
303*32afb93cSXin Li     BitmapGuard input{env, input_bitmap};
304*32afb93cSXin Li     BitmapGuard output{env, output_bitmap};
305*32afb93cSXin Li     FloatArrayGuard coeffs{env, coefficients};
306*32afb93cSXin Li 
307*32afb93cSXin Li     switch (env->GetArrayLength(coefficients)) {
308*32afb93cSXin Li         case 9:
309*32afb93cSXin Li             toolkit->convolve3x3(input.get(), output.get(), input.vectorSize(), input.width(),
310*32afb93cSXin Li                                  input.height(), coeffs.get(), restrict.get());
311*32afb93cSXin Li             break;
312*32afb93cSXin Li         case 25:
313*32afb93cSXin Li             toolkit->convolve5x5(input.get(), output.get(), input.vectorSize(), input.width(),
314*32afb93cSXin Li                                  input.height(), coeffs.get(), restrict.get());
315*32afb93cSXin Li             break;
316*32afb93cSXin Li     }
317*32afb93cSXin Li }
318*32afb93cSXin Li 
Java_com_google_android_renderscript_Toolkit_nativeHistogram(JNIEnv * env,jobject,jlong native_handle,jbyteArray input_array,jint vector_size,jint size_x,jint size_y,jintArray output_array,jobject restriction)319*32afb93cSXin Li extern "C" JNIEXPORT void JNICALL Java_com_google_android_renderscript_Toolkit_nativeHistogram(
320*32afb93cSXin Li         JNIEnv* env, jobject /*thiz*/, jlong native_handle, jbyteArray input_array,
321*32afb93cSXin Li         jint vector_size, jint size_x, jint size_y, jintArray output_array, jobject restriction) {
322*32afb93cSXin Li     RenderScriptToolkit* toolkit = reinterpret_cast<RenderScriptToolkit*>(native_handle);
323*32afb93cSXin Li     RestrictionParameter restrict {env, restriction};
324*32afb93cSXin Li     ByteArrayGuard input{env, input_array};
325*32afb93cSXin Li     IntArrayGuard output{env, output_array};
326*32afb93cSXin Li 
327*32afb93cSXin Li     toolkit->histogram(input.get(), output.get(), size_x, size_y, vector_size, restrict.get());
328*32afb93cSXin Li }
329*32afb93cSXin Li 
Java_com_google_android_renderscript_Toolkit_nativeHistogramBitmap(JNIEnv * env,jobject,jlong native_handle,jobject input_bitmap,jintArray output_array,jobject restriction)330*32afb93cSXin Li extern "C" JNIEXPORT void JNICALL Java_com_google_android_renderscript_Toolkit_nativeHistogramBitmap(
331*32afb93cSXin Li         JNIEnv* env, jobject /*thiz*/, jlong native_handle, jobject input_bitmap,
332*32afb93cSXin Li         jintArray output_array, jobject restriction) {
333*32afb93cSXin Li     RenderScriptToolkit* toolkit = reinterpret_cast<RenderScriptToolkit*>(native_handle);
334*32afb93cSXin Li     RestrictionParameter restrict {env, restriction};
335*32afb93cSXin Li     BitmapGuard input{env, input_bitmap};
336*32afb93cSXin Li     IntArrayGuard output{env, output_array};
337*32afb93cSXin Li 
338*32afb93cSXin Li     toolkit->histogram(input.get(), output.get(), input.width(), input.height(), input.vectorSize(),
339*32afb93cSXin Li                        restrict.get());
340*32afb93cSXin Li }
341*32afb93cSXin Li 
Java_com_google_android_renderscript_Toolkit_nativeHistogramDot(JNIEnv * env,jobject,jlong native_handle,jbyteArray input_array,jint vector_size,jint size_x,jint size_y,jintArray output_array,jfloatArray coefficients,jobject restriction)342*32afb93cSXin Li extern "C" JNIEXPORT void JNICALL Java_com_google_android_renderscript_Toolkit_nativeHistogramDot(
343*32afb93cSXin Li         JNIEnv* env, jobject /*thiz*/, jlong native_handle, jbyteArray input_array,
344*32afb93cSXin Li         jint vector_size, jint size_x, jint size_y, jintArray output_array,
345*32afb93cSXin Li         jfloatArray coefficients, jobject restriction) {
346*32afb93cSXin Li     RenderScriptToolkit* toolkit = reinterpret_cast<RenderScriptToolkit*>(native_handle);
347*32afb93cSXin Li     RestrictionParameter restrict {env, restriction};
348*32afb93cSXin Li     ByteArrayGuard input{env, input_array};
349*32afb93cSXin Li     IntArrayGuard output{env, output_array};
350*32afb93cSXin Li     FloatArrayGuard coeffs{env, coefficients};
351*32afb93cSXin Li 
352*32afb93cSXin Li     toolkit->histogramDot(input.get(), output.get(), size_x, size_y, vector_size, coeffs.get(),
353*32afb93cSXin Li                           restrict.get());
354*32afb93cSXin Li }
355*32afb93cSXin Li 
356*32afb93cSXin Li extern "C" JNIEXPORT
Java_com_google_android_renderscript_Toolkit_nativeHistogramDotBitmap(JNIEnv * env,jobject,jlong native_handle,jobject input_bitmap,jintArray output_array,jfloatArray coefficients,jobject restriction)357*32afb93cSXin Li void JNICALL Java_com_google_android_renderscript_Toolkit_nativeHistogramDotBitmap(
358*32afb93cSXin Li         JNIEnv* env, jobject /*thiz*/, jlong native_handle, jobject input_bitmap,
359*32afb93cSXin Li         jintArray output_array, jfloatArray coefficients, jobject restriction) {
360*32afb93cSXin Li     RenderScriptToolkit* toolkit = reinterpret_cast<RenderScriptToolkit*>(native_handle);
361*32afb93cSXin Li     RestrictionParameter restrict {env, restriction};
362*32afb93cSXin Li     BitmapGuard input{env, input_bitmap};
363*32afb93cSXin Li     IntArrayGuard output{env, output_array};
364*32afb93cSXin Li     FloatArrayGuard coeffs{env, coefficients};
365*32afb93cSXin Li 
366*32afb93cSXin Li     toolkit->histogramDot(input.get(), output.get(), input.width(), input.height(),
367*32afb93cSXin Li                           input.vectorSize(), coeffs.get(), restrict.get());
368*32afb93cSXin Li }
369*32afb93cSXin Li 
Java_com_google_android_renderscript_Toolkit_nativeLut(JNIEnv * env,jobject,jlong native_handle,jbyteArray input_array,jbyteArray output_array,jint size_x,jint size_y,jbyteArray red_table,jbyteArray green_table,jbyteArray blue_table,jbyteArray alpha_table,jobject restriction)370*32afb93cSXin Li extern "C" JNIEXPORT void JNICALL Java_com_google_android_renderscript_Toolkit_nativeLut(
371*32afb93cSXin Li         JNIEnv* env, jobject /*thiz*/, jlong native_handle, jbyteArray input_array,
372*32afb93cSXin Li         jbyteArray output_array, jint size_x, jint size_y, jbyteArray red_table,
373*32afb93cSXin Li         jbyteArray green_table, jbyteArray blue_table, jbyteArray alpha_table,
374*32afb93cSXin Li         jobject restriction) {
375*32afb93cSXin Li     RenderScriptToolkit* toolkit = reinterpret_cast<RenderScriptToolkit*>(native_handle);
376*32afb93cSXin Li     RestrictionParameter restrict {env, restriction};
377*32afb93cSXin Li 
378*32afb93cSXin Li     ByteArrayGuard input{env, input_array};
379*32afb93cSXin Li     ByteArrayGuard output{env, output_array};
380*32afb93cSXin Li     ByteArrayGuard red{env, red_table};
381*32afb93cSXin Li     ByteArrayGuard green{env, green_table};
382*32afb93cSXin Li     ByteArrayGuard blue{env, blue_table};
383*32afb93cSXin Li     ByteArrayGuard alpha{env, alpha_table};
384*32afb93cSXin Li 
385*32afb93cSXin Li     toolkit->lut(input.get(), output.get(), size_x, size_y, red.get(), green.get(), blue.get(),
386*32afb93cSXin Li                  alpha.get(), restrict.get());
387*32afb93cSXin Li }
388*32afb93cSXin Li 
Java_com_google_android_renderscript_Toolkit_nativeLutBitmap(JNIEnv * env,jobject,jlong native_handle,jobject input_bitmap,jobject output_bitmap,jbyteArray red_table,jbyteArray green_table,jbyteArray blue_table,jbyteArray alpha_table,jobject restriction)389*32afb93cSXin Li extern "C" JNIEXPORT void JNICALL Java_com_google_android_renderscript_Toolkit_nativeLutBitmap(
390*32afb93cSXin Li         JNIEnv* env, jobject /*thiz*/, jlong native_handle, jobject input_bitmap,
391*32afb93cSXin Li         jobject output_bitmap, jbyteArray red_table, jbyteArray green_table, jbyteArray blue_table,
392*32afb93cSXin Li         jbyteArray alpha_table, jobject restriction) {
393*32afb93cSXin Li     RenderScriptToolkit* toolkit = reinterpret_cast<RenderScriptToolkit*>(native_handle);
394*32afb93cSXin Li     RestrictionParameter restrict {env, restriction};
395*32afb93cSXin Li 
396*32afb93cSXin Li     BitmapGuard input{env, input_bitmap};
397*32afb93cSXin Li     BitmapGuard output{env, output_bitmap};
398*32afb93cSXin Li     ByteArrayGuard red{env, red_table};
399*32afb93cSXin Li     ByteArrayGuard green{env, green_table};
400*32afb93cSXin Li     ByteArrayGuard blue{env, blue_table};
401*32afb93cSXin Li     ByteArrayGuard alpha{env, alpha_table};
402*32afb93cSXin Li 
403*32afb93cSXin Li     toolkit->lut(input.get(), output.get(), input.width(), input.height(), red.get(), green.get(),
404*32afb93cSXin Li                  blue.get(), alpha.get(), restrict.get());
405*32afb93cSXin Li }
406*32afb93cSXin Li 
Java_com_google_android_renderscript_Toolkit_nativeLut3d(JNIEnv * env,jobject,jlong native_handle,jbyteArray input_array,jbyteArray output_array,jint size_x,jint size_y,jbyteArray cube_values,jint cubeSizeX,jint cubeSizeY,jint cubeSizeZ,jobject restriction)407*32afb93cSXin Li extern "C" JNIEXPORT void JNICALL Java_com_google_android_renderscript_Toolkit_nativeLut3d(
408*32afb93cSXin Li         JNIEnv* env, jobject /*thiz*/, jlong native_handle, jbyteArray input_array,
409*32afb93cSXin Li         jbyteArray output_array, jint size_x, jint size_y, jbyteArray cube_values, jint cubeSizeX,
410*32afb93cSXin Li         jint cubeSizeY, jint cubeSizeZ, jobject restriction) {
411*32afb93cSXin Li     RenderScriptToolkit* toolkit = reinterpret_cast<RenderScriptToolkit*>(native_handle);
412*32afb93cSXin Li     RestrictionParameter restrict {env, restriction};
413*32afb93cSXin Li     ByteArrayGuard input{env, input_array};
414*32afb93cSXin Li     ByteArrayGuard output{env, output_array};
415*32afb93cSXin Li     ByteArrayGuard cube{env, cube_values};
416*32afb93cSXin Li 
417*32afb93cSXin Li     toolkit->lut3d(input.get(), output.get(), size_x, size_y, cube.get(), cubeSizeX, cubeSizeY,
418*32afb93cSXin Li                    cubeSizeZ, restrict.get());
419*32afb93cSXin Li }
420*32afb93cSXin Li 
Java_com_google_android_renderscript_Toolkit_nativeLut3dBitmap(JNIEnv * env,jobject,jlong native_handle,jobject input_bitmap,jobject output_bitmap,jbyteArray cube_values,jint cubeSizeX,jint cubeSizeY,jint cubeSizeZ,jobject restriction)421*32afb93cSXin Li extern "C" JNIEXPORT void JNICALL Java_com_google_android_renderscript_Toolkit_nativeLut3dBitmap(
422*32afb93cSXin Li         JNIEnv* env, jobject /*thiz*/, jlong native_handle, jobject input_bitmap,
423*32afb93cSXin Li         jobject output_bitmap, jbyteArray cube_values, jint cubeSizeX, jint cubeSizeY,
424*32afb93cSXin Li         jint cubeSizeZ, jobject restriction) {
425*32afb93cSXin Li     RenderScriptToolkit* toolkit = reinterpret_cast<RenderScriptToolkit*>(native_handle);
426*32afb93cSXin Li     RestrictionParameter restrict {env, restriction};
427*32afb93cSXin Li     BitmapGuard input{env, input_bitmap};
428*32afb93cSXin Li     BitmapGuard output{env, output_bitmap};
429*32afb93cSXin Li     ByteArrayGuard cube{env, cube_values};
430*32afb93cSXin Li 
431*32afb93cSXin Li     toolkit->lut3d(input.get(), output.get(), input.width(), input.height(), cube.get(), cubeSizeX,
432*32afb93cSXin Li                    cubeSizeY, cubeSizeZ, restrict.get());
433*32afb93cSXin Li }
434*32afb93cSXin Li 
Java_com_google_android_renderscript_Toolkit_nativeResize(JNIEnv * env,jobject,jlong native_handle,jbyteArray input_array,jint vector_size,jint input_size_x,jint input_size_y,jbyteArray output_array,jint output_size_x,jint output_size_y,jobject restriction)435*32afb93cSXin Li extern "C" JNIEXPORT void JNICALL Java_com_google_android_renderscript_Toolkit_nativeResize(
436*32afb93cSXin Li         JNIEnv* env, jobject /*thiz*/, jlong native_handle, jbyteArray input_array,
437*32afb93cSXin Li         jint vector_size, jint input_size_x, jint input_size_y, jbyteArray output_array,
438*32afb93cSXin Li         jint output_size_x, jint output_size_y, jobject restriction) {
439*32afb93cSXin Li     RenderScriptToolkit* toolkit = reinterpret_cast<RenderScriptToolkit*>(native_handle);
440*32afb93cSXin Li     RestrictionParameter restrict {env, restriction};
441*32afb93cSXin Li     ByteArrayGuard input{env, input_array};
442*32afb93cSXin Li     ByteArrayGuard output{env, output_array};
443*32afb93cSXin Li 
444*32afb93cSXin Li     toolkit->resize(input.get(), output.get(), input_size_x, input_size_y, vector_size,
445*32afb93cSXin Li                     output_size_x, output_size_y, restrict.get());
446*32afb93cSXin Li }
447*32afb93cSXin Li 
Java_com_google_android_renderscript_Toolkit_nativeResizeBitmap(JNIEnv * env,jobject,jlong native_handle,jobject input_bitmap,jobject output_bitmap,jobject restriction)448*32afb93cSXin Li extern "C" JNIEXPORT void JNICALL Java_com_google_android_renderscript_Toolkit_nativeResizeBitmap(
449*32afb93cSXin Li         JNIEnv* env, jobject /*thiz*/, jlong native_handle, jobject input_bitmap,
450*32afb93cSXin Li         jobject output_bitmap, jobject restriction) {
451*32afb93cSXin Li     RenderScriptToolkit* toolkit = reinterpret_cast<RenderScriptToolkit*>(native_handle);
452*32afb93cSXin Li     RestrictionParameter restrict {env, restriction};
453*32afb93cSXin Li     BitmapGuard input{env, input_bitmap};
454*32afb93cSXin Li     BitmapGuard output{env, output_bitmap};
455*32afb93cSXin Li 
456*32afb93cSXin Li     toolkit->resize(input.get(), output.get(), input.width(), input.height(), input.vectorSize(),
457*32afb93cSXin Li                     output.width(), output.height(), restrict.get());
458*32afb93cSXin Li }
459*32afb93cSXin Li 
Java_com_google_android_renderscript_Toolkit_nativeYuvToRgb(JNIEnv * env,jobject,jlong native_handle,jbyteArray input_array,jbyteArray output_array,jint size_x,jint size_y,jint format)460*32afb93cSXin Li extern "C" JNIEXPORT void JNICALL Java_com_google_android_renderscript_Toolkit_nativeYuvToRgb(
461*32afb93cSXin Li         JNIEnv* env, jobject /*thiz*/, jlong native_handle, jbyteArray input_array,
462*32afb93cSXin Li         jbyteArray output_array, jint size_x, jint size_y, jint format) {
463*32afb93cSXin Li     RenderScriptToolkit* toolkit = reinterpret_cast<RenderScriptToolkit*>(native_handle);
464*32afb93cSXin Li     ByteArrayGuard input{env, input_array};
465*32afb93cSXin Li     ByteArrayGuard output{env, output_array};
466*32afb93cSXin Li 
467*32afb93cSXin Li     toolkit->yuvToRgb(input.get(), output.get(), size_x, size_y,
468*32afb93cSXin Li                       static_cast<RenderScriptToolkit::YuvFormat>(format));
469*32afb93cSXin Li }
470*32afb93cSXin Li 
Java_com_google_android_renderscript_Toolkit_nativeYuvToRgbBitmap(JNIEnv * env,jobject,jlong native_handle,jbyteArray input_array,jint size_x,jint size_y,jobject output_bitmap,jint format)471*32afb93cSXin Li extern "C" JNIEXPORT void JNICALL Java_com_google_android_renderscript_Toolkit_nativeYuvToRgbBitmap(
472*32afb93cSXin Li         JNIEnv* env, jobject /*thiz*/, jlong native_handle, jbyteArray input_array, jint size_x,
473*32afb93cSXin Li         jint size_y, jobject output_bitmap, jint format) {
474*32afb93cSXin Li     RenderScriptToolkit* toolkit = reinterpret_cast<RenderScriptToolkit*>(native_handle);
475*32afb93cSXin Li     BitmapGuard output{env, output_bitmap};
476*32afb93cSXin Li     ByteArrayGuard input{env, input_array};
477*32afb93cSXin Li 
478*32afb93cSXin Li     toolkit->yuvToRgb(input.get(), output.get(), size_x, size_y,
479*32afb93cSXin Li                       static_cast<RenderScriptToolkit::YuvFormat>(format));
480*32afb93cSXin Li }
481