xref: /aosp_15_r20/frameworks/base/native/graphics/jni/bitmap.cpp (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2009 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker  *
4*d57664e9SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker  *
8*d57664e9SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker  *
10*d57664e9SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker  * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker  */
16*d57664e9SAndroid Build Coastguard Worker 
17*d57664e9SAndroid Build Coastguard Worker #include <android/bitmap.h>
18*d57664e9SAndroid Build Coastguard Worker #include <android/data_space.h>
19*d57664e9SAndroid Build Coastguard Worker #include <android/graphics/bitmap.h>
20*d57664e9SAndroid Build Coastguard Worker #include <android/data_space.h>
21*d57664e9SAndroid Build Coastguard Worker 
AndroidBitmap_getInfo(JNIEnv * env,jobject jbitmap,AndroidBitmapInfo * info)22*d57664e9SAndroid Build Coastguard Worker int AndroidBitmap_getInfo(JNIEnv* env, jobject jbitmap,
23*d57664e9SAndroid Build Coastguard Worker                           AndroidBitmapInfo* info) {
24*d57664e9SAndroid Build Coastguard Worker     if (NULL == env || NULL == jbitmap) {
25*d57664e9SAndroid Build Coastguard Worker         return ANDROID_BITMAP_RESULT_BAD_PARAMETER;
26*d57664e9SAndroid Build Coastguard Worker     }
27*d57664e9SAndroid Build Coastguard Worker 
28*d57664e9SAndroid Build Coastguard Worker     if (info) {
29*d57664e9SAndroid Build Coastguard Worker         *info = ABitmap_getInfoFromJava(env, jbitmap);
30*d57664e9SAndroid Build Coastguard Worker     }
31*d57664e9SAndroid Build Coastguard Worker     return ANDROID_BITMAP_RESULT_SUCCESS;
32*d57664e9SAndroid Build Coastguard Worker }
33*d57664e9SAndroid Build Coastguard Worker 
AndroidBitmap_getDataSpace(JNIEnv * env,jobject jbitmap)34*d57664e9SAndroid Build Coastguard Worker int32_t AndroidBitmap_getDataSpace(JNIEnv* env, jobject jbitmap) {
35*d57664e9SAndroid Build Coastguard Worker     if (NULL == env || NULL == jbitmap) {
36*d57664e9SAndroid Build Coastguard Worker         return ADATASPACE_UNKNOWN;
37*d57664e9SAndroid Build Coastguard Worker     }
38*d57664e9SAndroid Build Coastguard Worker 
39*d57664e9SAndroid Build Coastguard Worker     android::graphics::Bitmap bitmap(env, jbitmap);
40*d57664e9SAndroid Build Coastguard Worker     if (!bitmap.isValid()) {
41*d57664e9SAndroid Build Coastguard Worker         return ADATASPACE_UNKNOWN;
42*d57664e9SAndroid Build Coastguard Worker     }
43*d57664e9SAndroid Build Coastguard Worker 
44*d57664e9SAndroid Build Coastguard Worker     return bitmap.getDataSpace();
45*d57664e9SAndroid Build Coastguard Worker }
46*d57664e9SAndroid Build Coastguard Worker 
AndroidBitmap_lockPixels(JNIEnv * env,jobject jbitmap,void ** addrPtr)47*d57664e9SAndroid Build Coastguard Worker int AndroidBitmap_lockPixels(JNIEnv* env, jobject jbitmap, void** addrPtr) {
48*d57664e9SAndroid Build Coastguard Worker     if (NULL == env || NULL == jbitmap) {
49*d57664e9SAndroid Build Coastguard Worker         return ANDROID_BITMAP_RESULT_BAD_PARAMETER;
50*d57664e9SAndroid Build Coastguard Worker     }
51*d57664e9SAndroid Build Coastguard Worker 
52*d57664e9SAndroid Build Coastguard Worker     android::graphics::Bitmap bitmap(env, jbitmap);
53*d57664e9SAndroid Build Coastguard Worker     void* addr = bitmap.isValid() ? bitmap.getPixels() : nullptr;
54*d57664e9SAndroid Build Coastguard Worker 
55*d57664e9SAndroid Build Coastguard Worker     if (!addr) {
56*d57664e9SAndroid Build Coastguard Worker         return ANDROID_BITMAP_RESULT_JNI_EXCEPTION;
57*d57664e9SAndroid Build Coastguard Worker     }
58*d57664e9SAndroid Build Coastguard Worker 
59*d57664e9SAndroid Build Coastguard Worker     ABitmap_acquireRef(bitmap.get());
60*d57664e9SAndroid Build Coastguard Worker 
61*d57664e9SAndroid Build Coastguard Worker     if (addrPtr) {
62*d57664e9SAndroid Build Coastguard Worker         *addrPtr = addr;
63*d57664e9SAndroid Build Coastguard Worker     }
64*d57664e9SAndroid Build Coastguard Worker     return ANDROID_BITMAP_RESULT_SUCCESS;
65*d57664e9SAndroid Build Coastguard Worker }
66*d57664e9SAndroid Build Coastguard Worker 
AndroidBitmap_unlockPixels(JNIEnv * env,jobject jbitmap)67*d57664e9SAndroid Build Coastguard Worker int AndroidBitmap_unlockPixels(JNIEnv* env, jobject jbitmap) {
68*d57664e9SAndroid Build Coastguard Worker     if (NULL == env || NULL == jbitmap) {
69*d57664e9SAndroid Build Coastguard Worker         return ANDROID_BITMAP_RESULT_BAD_PARAMETER;
70*d57664e9SAndroid Build Coastguard Worker     }
71*d57664e9SAndroid Build Coastguard Worker 
72*d57664e9SAndroid Build Coastguard Worker     android::graphics::Bitmap bitmap(env, jbitmap);
73*d57664e9SAndroid Build Coastguard Worker 
74*d57664e9SAndroid Build Coastguard Worker     if (!bitmap.isValid()) {
75*d57664e9SAndroid Build Coastguard Worker         return ANDROID_BITMAP_RESULT_JNI_EXCEPTION;
76*d57664e9SAndroid Build Coastguard Worker     }
77*d57664e9SAndroid Build Coastguard Worker 
78*d57664e9SAndroid Build Coastguard Worker     bitmap.notifyPixelsChanged();
79*d57664e9SAndroid Build Coastguard Worker     ABitmap_releaseRef(bitmap.get());
80*d57664e9SAndroid Build Coastguard Worker     return ANDROID_BITMAP_RESULT_SUCCESS;
81*d57664e9SAndroid Build Coastguard Worker }
82*d57664e9SAndroid Build Coastguard Worker 
AndroidBitmap_getHardwareBuffer(JNIEnv * env,jobject jbitmap,AHardwareBuffer ** outBuffer)83*d57664e9SAndroid Build Coastguard Worker int AndroidBitmap_getHardwareBuffer(JNIEnv* env, jobject jbitmap, AHardwareBuffer** outBuffer) {
84*d57664e9SAndroid Build Coastguard Worker     if (NULL == env || NULL == jbitmap || NULL == outBuffer) {
85*d57664e9SAndroid Build Coastguard Worker         return ANDROID_BITMAP_RESULT_BAD_PARAMETER;
86*d57664e9SAndroid Build Coastguard Worker     }
87*d57664e9SAndroid Build Coastguard Worker 
88*d57664e9SAndroid Build Coastguard Worker     android::graphics::Bitmap bitmap(env, jbitmap);
89*d57664e9SAndroid Build Coastguard Worker 
90*d57664e9SAndroid Build Coastguard Worker     if (!bitmap.isValid()) {
91*d57664e9SAndroid Build Coastguard Worker         return ANDROID_BITMAP_RESULT_JNI_EXCEPTION;
92*d57664e9SAndroid Build Coastguard Worker     }
93*d57664e9SAndroid Build Coastguard Worker 
94*d57664e9SAndroid Build Coastguard Worker     *outBuffer = bitmap.getHardwareBuffer();
95*d57664e9SAndroid Build Coastguard Worker     return *outBuffer == NULL ? ANDROID_BITMAP_RESULT_BAD_PARAMETER : ANDROID_BITMAP_RESULT_SUCCESS;
96*d57664e9SAndroid Build Coastguard Worker }
97*d57664e9SAndroid Build Coastguard Worker 
AndroidBitmap_compress(const AndroidBitmapInfo * info,int32_t dataSpace,const void * pixels,int32_t format,int32_t quality,void * userContext,AndroidBitmap_CompressWriteFunc fn)98*d57664e9SAndroid Build Coastguard Worker int AndroidBitmap_compress(const AndroidBitmapInfo* info,
99*d57664e9SAndroid Build Coastguard Worker                            int32_t dataSpace,
100*d57664e9SAndroid Build Coastguard Worker                            const void* pixels,
101*d57664e9SAndroid Build Coastguard Worker                            int32_t format, int32_t quality,
102*d57664e9SAndroid Build Coastguard Worker                            void* userContext,
103*d57664e9SAndroid Build Coastguard Worker                            AndroidBitmap_CompressWriteFunc fn) {
104*d57664e9SAndroid Build Coastguard Worker     if (NULL == info || NULL == pixels || NULL == fn) {
105*d57664e9SAndroid Build Coastguard Worker         return ANDROID_BITMAP_RESULT_BAD_PARAMETER;
106*d57664e9SAndroid Build Coastguard Worker     }
107*d57664e9SAndroid Build Coastguard Worker     if (quality < 0 || quality > 100) {
108*d57664e9SAndroid Build Coastguard Worker         return ANDROID_BITMAP_RESULT_BAD_PARAMETER;
109*d57664e9SAndroid Build Coastguard Worker     }
110*d57664e9SAndroid Build Coastguard Worker 
111*d57664e9SAndroid Build Coastguard Worker     return ABitmap_compress(info, (ADataSpace) dataSpace, pixels,
112*d57664e9SAndroid Build Coastguard Worker             (AndroidBitmapCompressFormat) format, quality, userContext, fn);
113*d57664e9SAndroid Build Coastguard Worker }
114