blob: b8eb543ff83521c580766fe7d59b7aa541c54cf7 [file] [log] [blame]
Dima Zavin32276312010-02-04 12:15:09 -08001/*
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>
Leon Scroggins III9010e8b2019-08-20 11:27:17 -040018#include <android/data_space.h>
Derek Sollenberger6c41ab12019-11-08 08:50:58 -050019#include <android/graphics/bitmap.h>
Leon Scroggins III1994fcb2020-01-10 13:40:07 -050020#include <android/data_space.h>
Dima Zavin32276312010-02-04 12:15:09 -080021
22int AndroidBitmap_getInfo(JNIEnv* env, jobject jbitmap,
23 AndroidBitmapInfo* info) {
24 if (NULL == env || NULL == jbitmap) {
25 return ANDROID_BITMAP_RESULT_BAD_PARAMETER;
26 }
27
Dima Zavin32276312010-02-04 12:15:09 -080028 if (info) {
Derek Sollenberger6c41ab12019-11-08 08:50:58 -050029 *info = ABitmap_getInfoFromJava(env, jbitmap);
Dima Zavin32276312010-02-04 12:15:09 -080030 }
Andrew Hsieheba82542012-12-12 11:27:44 +080031 return ANDROID_BITMAP_RESULT_SUCCESS;
Dima Zavin32276312010-02-04 12:15:09 -080032}
33
Leon Scroggins III1994fcb2020-01-10 13:40:07 -050034int32_t AndroidBitmap_getDataSpace(JNIEnv* env, jobject jbitmap) {
35 if (NULL == env || NULL == jbitmap) {
Leon Scroggins IIIf8e41c52020-01-19 19:32:43 -050036 return ADATASPACE_UNKNOWN;
Leon Scroggins III1994fcb2020-01-10 13:40:07 -050037 }
38
39 android::graphics::Bitmap bitmap(env, jbitmap);
Leon Scroggins IIIf8e41c52020-01-19 19:32:43 -050040 if (!bitmap.isValid()) {
41 return ADATASPACE_UNKNOWN;
42 }
43
Leon Scroggins III1994fcb2020-01-10 13:40:07 -050044 return bitmap.getDataSpace();
45}
46
Dima Zavin32276312010-02-04 12:15:09 -080047int AndroidBitmap_lockPixels(JNIEnv* env, jobject jbitmap, void** addrPtr) {
48 if (NULL == env || NULL == jbitmap) {
49 return ANDROID_BITMAP_RESULT_BAD_PARAMETER;
50 }
51
Derek Sollenberger6c41ab12019-11-08 08:50:58 -050052 android::graphics::Bitmap bitmap(env, jbitmap);
53 void* addr = bitmap.isValid() ? bitmap.getPixels() : nullptr;
54
John Reck00799f72017-03-01 18:05:41 -080055 if (!addr) {
Dima Zavin32276312010-02-04 12:15:09 -080056 return ANDROID_BITMAP_RESULT_JNI_EXCEPTION;
57 }
58
Derek Sollenberger6c41ab12019-11-08 08:50:58 -050059 ABitmap_acquireRef(bitmap.get());
60
Dima Zavin32276312010-02-04 12:15:09 -080061 if (addrPtr) {
62 *addrPtr = addr;
63 }
Andrew Hsieheba82542012-12-12 11:27:44 +080064 return ANDROID_BITMAP_RESULT_SUCCESS;
Dima Zavin32276312010-02-04 12:15:09 -080065}
66
67int AndroidBitmap_unlockPixels(JNIEnv* env, jobject jbitmap) {
68 if (NULL == env || NULL == jbitmap) {
69 return ANDROID_BITMAP_RESULT_BAD_PARAMETER;
70 }
71
Derek Sollenberger6c41ab12019-11-08 08:50:58 -050072 android::graphics::Bitmap bitmap(env, jbitmap);
73
74 if (!bitmap.isValid()) {
Dima Zavin32276312010-02-04 12:15:09 -080075 return ANDROID_BITMAP_RESULT_JNI_EXCEPTION;
76 }
Derek Sollenberger6c41ab12019-11-08 08:50:58 -050077
78 bitmap.notifyPixelsChanged();
79 ABitmap_releaseRef(bitmap.get());
Andrew Hsieheba82542012-12-12 11:27:44 +080080 return ANDROID_BITMAP_RESULT_SUCCESS;
Dima Zavin32276312010-02-04 12:15:09 -080081}
Leon Scroggins III9010e8b2019-08-20 11:27:17 -040082
Leon Scroggins III84a2afc2020-01-19 19:27:16 -050083int 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
Leon Scroggins III9010e8b2019-08-20 11:27:17 -040098int AndroidBitmap_compress(const AndroidBitmapInfo* info,
99 int32_t dataSpace,
100 const void* pixels,
101 int32_t format, int32_t quality,
102 void* userContext,
Leon Scroggins III7871f492020-01-22 11:57:19 -0500103 AndroidBitmap_CompressWriteFunc fn) {
Leon Scroggins III9010e8b2019-08-20 11:27:17 -0400104 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}