summaryrefslogtreecommitdiff
path: root/native
diff options
context:
space:
mode:
Diffstat (limited to 'native')
-rw-r--r--native/android/Android.bp3
-rw-r--r--native/android/surface_texture.cpp70
-rw-r--r--native/graphics/jni/bitmap.cpp39
-rw-r--r--native/graphics/jni/imagedecoder.cpp69
-rw-r--r--native/graphics/jni/libjnigraphics.map.txt39
5 files changed, 111 insertions, 109 deletions
diff --git a/native/android/Android.bp b/native/android/Android.bp
index 9d93c9b7b605..0c6f507787d9 100644
--- a/native/android/Android.bp
+++ b/native/android/Android.bp
@@ -47,7 +47,6 @@ cc_library_shared {
"sensor.cpp",
"sharedmem.cpp",
"storage_manager.cpp",
- "surface_texture.cpp",
"surface_control.cpp",
"system_fonts.cpp",
"trace.cpp",
@@ -70,6 +69,8 @@ cc_library_shared {
"libnetd_client",
"libhwui",
"libxml2",
+ "libEGL",
+ "libGLESv2",
"android.hardware.configstore@1.0",
"android.hardware.configstore-utils",
],
diff --git a/native/android/surface_texture.cpp b/native/android/surface_texture.cpp
deleted file mode 100644
index 3049ec16e2d4..000000000000
--- a/native/android/surface_texture.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <android/surface_texture.h>
-#include <android/surface_texture_jni.h>
-
-#define LOG_TAG "ASurfaceTexture"
-
-#include <utils/Log.h>
-
-#include <gui/Surface.h>
-
-#include <gui/surfacetexture/surface_texture_platform.h>
-
-#include <android_runtime/android_graphics_SurfaceTexture.h>
-
-using namespace android;
-
-ASurfaceTexture* ASurfaceTexture_fromSurfaceTexture(JNIEnv* env, jobject surfacetexture) {
- if (!surfacetexture || !android_SurfaceTexture_isInstanceOf(env, surfacetexture)) {
- return nullptr;
- }
- auto consumer = SurfaceTexture_getSurfaceTexture(env, surfacetexture);
- auto producer = SurfaceTexture_getProducer(env, surfacetexture);
- return ASurfaceTexture_create(consumer, producer);
-}
-
-ANativeWindow* ASurfaceTexture_acquireANativeWindow(ASurfaceTexture* st) {
- sp<Surface> surface = new Surface(st->producer);
- ANativeWindow* win(surface.get());
- ANativeWindow_acquire(win);
- return win;
-}
-
-void ASurfaceTexture_release(ASurfaceTexture* st) {
- delete st;
-}
-
-int ASurfaceTexture_attachToGLContext(ASurfaceTexture* st, uint32_t tex) {
- return st->consumer->attachToContext(tex);
-}
-
-int ASurfaceTexture_detachFromGLContext(ASurfaceTexture* st) {
- return st->consumer->detachFromContext();
-}
-
-int ASurfaceTexture_updateTexImage(ASurfaceTexture* st) {
- return st->consumer->updateTexImage();
-}
-
-void ASurfaceTexture_getTransformMatrix(ASurfaceTexture* st, float mtx[16]) {
- st->consumer->getTransformMatrix(mtx);
-}
-
-int64_t ASurfaceTexture_getTimestamp(ASurfaceTexture* st) {
- return st->consumer->getTimestamp();
-}
diff --git a/native/graphics/jni/bitmap.cpp b/native/graphics/jni/bitmap.cpp
index 26c7f8d709e7..b8eb543ff835 100644
--- a/native/graphics/jni/bitmap.cpp
+++ b/native/graphics/jni/bitmap.cpp
@@ -15,6 +15,7 @@
*/
#include <android/bitmap.h>
+#include <android/data_space.h>
#include <android/graphics/bitmap.h>
#include <android/data_space.h>
@@ -32,10 +33,14 @@ int AndroidBitmap_getInfo(JNIEnv* env, jobject jbitmap,
int32_t AndroidBitmap_getDataSpace(JNIEnv* env, jobject jbitmap) {
if (NULL == env || NULL == jbitmap) {
- return ADATASPACE_UNKNOWN; // Or return a real error?
+ return ADATASPACE_UNKNOWN;
}
android::graphics::Bitmap bitmap(env, jbitmap);
+ if (!bitmap.isValid()) {
+ return ADATASPACE_UNKNOWN;
+ }
+
return bitmap.getDataSpace();
}
@@ -74,3 +79,35 @@ int AndroidBitmap_unlockPixels(JNIEnv* env, jobject jbitmap) {
ABitmap_releaseRef(bitmap.get());
return ANDROID_BITMAP_RESULT_SUCCESS;
}
+
+int AndroidBitmap_getHardwareBuffer(JNIEnv* env, jobject jbitmap, AHardwareBuffer** outBuffer) {
+ if (NULL == env || NULL == jbitmap || NULL == outBuffer) {
+ return ANDROID_BITMAP_RESULT_BAD_PARAMETER;
+ }
+
+ android::graphics::Bitmap bitmap(env, jbitmap);
+
+ if (!bitmap.isValid()) {
+ return ANDROID_BITMAP_RESULT_JNI_EXCEPTION;
+ }
+
+ *outBuffer = bitmap.getHardwareBuffer();
+ return *outBuffer == NULL ? ANDROID_BITMAP_RESULT_BAD_PARAMETER : ANDROID_BITMAP_RESULT_SUCCESS;
+}
+
+int AndroidBitmap_compress(const AndroidBitmapInfo* info,
+ int32_t dataSpace,
+ const void* pixels,
+ int32_t format, int32_t quality,
+ void* userContext,
+ AndroidBitmap_CompressWriteFunc fn) {
+ if (NULL == info || NULL == pixels || NULL == fn) {
+ return ANDROID_BITMAP_RESULT_BAD_PARAMETER;
+ }
+ if (quality < 0 || quality > 100) {
+ return ANDROID_BITMAP_RESULT_BAD_PARAMETER;
+ }
+
+ return ABitmap_compress(info, (ADataSpace) dataSpace, pixels,
+ (AndroidBitmapCompressFormat) format, quality, userContext, fn);
+}
diff --git a/native/graphics/jni/imagedecoder.cpp b/native/graphics/jni/imagedecoder.cpp
index 2ef203dd466f..1c45ea6aaecc 100644
--- a/native/graphics/jni/imagedecoder.cpp
+++ b/native/graphics/jni/imagedecoder.cpp
@@ -18,12 +18,14 @@
#include <android/asset_manager.h>
#include <android/bitmap.h>
+#include <android/data_space.h>
#include <android/imagedecoder.h>
#include <android/graphics/MimeType.h>
#include <android/rect.h>
#include <hwui/ImageDecoder.h>
#include <log/log.h>
#include <SkAndroidCodec.h>
+#include <utils/Color.h>
#include <fcntl.h>
#include <optional>
@@ -131,6 +133,10 @@ static ImageDecoder* toDecoder(AImageDecoder* d) {
return reinterpret_cast<ImageDecoder*>(d);
}
+static const ImageDecoder* toDecoder(const AImageDecoder* d) {
+ return reinterpret_cast<const ImageDecoder*>(d);
+}
+
// Note: This differs from the version in android_bitmap.cpp in that this
// version returns kGray_8_SkColorType for ANDROID_BITMAP_FORMAT_A_8. SkCodec
// allows decoding single channel images to gray, which Android then treats
@@ -161,6 +167,18 @@ int AImageDecoder_setAndroidBitmapFormat(AImageDecoder* decoder, int32_t format)
? ANDROID_IMAGE_DECODER_SUCCESS : ANDROID_IMAGE_DECODER_INVALID_CONVERSION;
}
+int AImageDecoder_setDataSpace(AImageDecoder* decoder, int32_t dataspace) {
+ sk_sp<SkColorSpace> cs = uirenderer::DataSpaceToColorSpace((android_dataspace)dataspace);
+ // 0 is ADATASPACE_UNKNOWN. We need an explicit request for an ADataSpace.
+ if (!decoder || !dataspace || !cs) {
+ return ANDROID_IMAGE_DECODER_BAD_PARAMETER;
+ }
+
+ ImageDecoder* imageDecoder = toDecoder(decoder);
+ imageDecoder->setOutColorSpace(std::move(cs));
+ return ANDROID_IMAGE_DECODER_SUCCESS;
+}
+
const AImageDecoderHeaderInfo* AImageDecoder_getHeaderInfo(const AImageDecoder* decoder) {
return reinterpret_cast<const AImageDecoderHeaderInfo*>(decoder);
}
@@ -197,6 +215,20 @@ bool AImageDecoderHeaderInfo_isAnimated(const AImageDecoderHeaderInfo* info) {
return toDecoder(info)->mCodec->codec()->getFrameCount() > 1;
}
+int32_t AImageDecoderHeaderInfo_getDataSpace(const AImageDecoderHeaderInfo* info) {
+ if (!info) {
+ return ANDROID_IMAGE_DECODER_BAD_PARAMETER;
+ }
+
+ // Note: This recomputes the data space because it's possible the client has
+ // changed the output color space, so we cannot rely on it. Alternatively,
+ // we could store the ADataSpace in the ImageDecoder.
+ const ImageDecoder* imageDecoder = toDecoder(info);
+ SkColorType colorType = imageDecoder->mCodec->computeOutputColorType(kN32_SkColorType);
+ sk_sp<SkColorSpace> colorSpace = imageDecoder->mCodec->computeOutputColorSpace(colorType);
+ return uirenderer::ColorSpaceToADataSpace(colorSpace.get(), colorType);
+}
+
// FIXME: Share with getFormat in android_bitmap.cpp?
static AndroidBitmapFormat getFormat(SkColorType colorType) {
switch (colorType) {
@@ -225,13 +257,12 @@ AndroidBitmapFormat AImageDecoderHeaderInfo_getAndroidBitmapFormat(
int AImageDecoderHeaderInfo_getAlphaFlags(const AImageDecoderHeaderInfo* info) {
if (!info) {
- // FIXME: Better invalid?
- return -1;
+ return ANDROID_IMAGE_DECODER_BAD_PARAMETER;
}
switch (toDecoder(info)->mCodec->getInfo().alphaType()) {
case kUnknown_SkAlphaType:
LOG_ALWAYS_FATAL("Invalid alpha type");
- return -1;
+ return ANDROID_IMAGE_DECODER_INTERNAL_ERROR;
case kUnpremul_SkAlphaType:
// fall through. premul is the default.
case kPremul_SkAlphaType:
@@ -241,26 +272,12 @@ int AImageDecoderHeaderInfo_getAlphaFlags(const AImageDecoderHeaderInfo* info) {
}
}
-SkAlphaType toAlphaType(int androidBitmapFlags) {
- switch (androidBitmapFlags) {
- case ANDROID_BITMAP_FLAGS_ALPHA_PREMUL:
- return kPremul_SkAlphaType;
- case ANDROID_BITMAP_FLAGS_ALPHA_UNPREMUL:
- return kUnpremul_SkAlphaType;
- case ANDROID_BITMAP_FLAGS_ALPHA_OPAQUE:
- return kOpaque_SkAlphaType;
- default:
- return kUnknown_SkAlphaType;
- }
-}
-
-int AImageDecoder_setAlphaFlags(AImageDecoder* decoder, int alphaFlag) {
- if (!decoder || alphaFlag < ANDROID_BITMAP_FLAGS_ALPHA_PREMUL
- || alphaFlag > ANDROID_BITMAP_FLAGS_ALPHA_UNPREMUL) {
+int AImageDecoder_setUnpremultipliedRequired(AImageDecoder* decoder, bool required) {
+ if (!decoder) {
return ANDROID_IMAGE_DECODER_BAD_PARAMETER;
}
- return toDecoder(decoder)->setOutAlphaType(toAlphaType(alphaFlag))
+ return toDecoder(decoder)->setUnpremultipliedRequired(required)
? ANDROID_IMAGE_DECODER_SUCCESS : ANDROID_IMAGE_DECODER_INVALID_CONVERSION;
}
@@ -273,6 +290,18 @@ int AImageDecoder_setTargetSize(AImageDecoder* decoder, int width, int height) {
? ANDROID_IMAGE_DECODER_SUCCESS : ANDROID_IMAGE_DECODER_INVALID_SCALE;
}
+int AImageDecoder_computeSampledSize(const AImageDecoder* decoder, int sampleSize,
+ int* width, int* height) {
+ if (!decoder || !width || !height || sampleSize < 1) {
+ return ANDROID_IMAGE_DECODER_BAD_PARAMETER;
+ }
+
+ SkISize size = toDecoder(decoder)->mCodec->getSampledDimensions(sampleSize);
+ *width = size.width();
+ *height = size.height();
+ return ANDROID_IMAGE_DECODER_SUCCESS;
+}
+
int AImageDecoder_setCrop(AImageDecoder* decoder, ARect crop) {
if (!decoder) {
return ANDROID_IMAGE_DECODER_BAD_PARAMETER;
diff --git a/native/graphics/jni/libjnigraphics.map.txt b/native/graphics/jni/libjnigraphics.map.txt
index 832770ffb97e..1b396b893f4e 100644
--- a/native/graphics/jni/libjnigraphics.map.txt
+++ b/native/graphics/jni/libjnigraphics.map.txt
@@ -1,26 +1,31 @@
LIBJNIGRAPHICS {
global:
- AImageDecoder_createFromAAsset;
- AImageDecoder_createFromFd;
- AImageDecoder_createFromBuffer;
- AImageDecoder_delete;
- AImageDecoder_setAndroidBitmapFormat;
- AImageDecoder_setAlphaFlags;
- AImageDecoder_getHeaderInfo;
- AImageDecoder_getMinimumStride;
- AImageDecoder_decodeImage;
- AImageDecoder_setTargetSize;
- AImageDecoder_setCrop;
- AImageDecoderHeaderInfo_getWidth;
- AImageDecoderHeaderInfo_getHeight;
- AImageDecoderHeaderInfo_getMimeType;
- AImageDecoderHeaderInfo_getAlphaFlags;
- AImageDecoderHeaderInfo_isAnimated;
- AImageDecoderHeaderInfo_getAndroidBitmapFormat;
+ AImageDecoder_createFromAAsset; # introduced=30
+ AImageDecoder_createFromFd; # introduced=30
+ AImageDecoder_createFromBuffer; # introduced=30
+ AImageDecoder_delete; # introduced=30
+ AImageDecoder_setAndroidBitmapFormat; # introduced=30
+ AImageDecoder_setUnpremultipliedRequired; # introduced=30
+ AImageDecoder_setDataSpace; # introduced=30
+ AImageDecoder_getHeaderInfo; # introduced=30
+ AImageDecoder_getMinimumStride; # introduced=30
+ AImageDecoder_decodeImage; # introduced=30
+ AImageDecoder_setTargetSize; # introduced=30
+ AImageDecoder_computeSampledSize; # introduced=30
+ AImageDecoder_setCrop; # introduced=30
+ AImageDecoderHeaderInfo_getWidth; # introduced=30
+ AImageDecoderHeaderInfo_getHeight; # introduced=30
+ AImageDecoderHeaderInfo_getMimeType; # introduced=30
+ AImageDecoderHeaderInfo_getAlphaFlags; # introduced=30
+ AImageDecoderHeaderInfo_isAnimated; # introduced=30
+ AImageDecoderHeaderInfo_getAndroidBitmapFormat; # introduced=30
+ AImageDecoderHeaderInfo_getDataSpace; # introduced=30
AndroidBitmap_getInfo;
AndroidBitmap_getDataSpace;
AndroidBitmap_lockPixels;
AndroidBitmap_unlockPixels;
+ AndroidBitmap_compress; # introduced=30
+ AndroidBitmap_getHardwareBuffer; #introduced=30
local:
*;
};