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