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