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