diff options
| author | 2019-01-31 18:28:56 +0000 | |
|---|---|---|
| committer | 2019-01-31 18:28:56 +0000 | |
| commit | b39aaa494bd6f0dae88fc7fa7f52bee7b89bda9b (patch) | |
| tree | 19ee2c5793483e846791eb018535b3168dfc3d7e | |
| parent | 00c67e08d4d5ec704512251ae407e569fd7a16aa (diff) | |
| parent | 10e3b336bd16c5efec654de4b7d480d27b50f219 (diff) | |
Merge "SurfaceControl: Add a hidden API to get display color primaries"
| -rw-r--r-- | core/java/android/view/SurfaceControl.java | 69 | ||||
| -rw-r--r-- | core/jni/android_view_SurfaceControl.cpp | 102 |
2 files changed, 171 insertions, 0 deletions
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 6e76647f4b96..8061cc3bab74 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -155,6 +155,8 @@ public final class SurfaceControl implements Parcelable { private static native int nativeGetActiveConfig(IBinder displayToken); private static native boolean nativeSetActiveConfig(IBinder displayToken, int id); private static native int[] nativeGetDisplayColorModes(IBinder displayToken); + private static native SurfaceControl.DisplayPrimaries nativeGetDisplayNativePrimaries( + IBinder displayToken); private static native int[] nativeGetCompositionDataspaces(); private static native int nativeGetActiveColorMode(IBinder displayToken); private static native boolean nativeSetActiveColorMode(IBinder displayToken, @@ -1536,6 +1538,73 @@ public final class SurfaceControl implements Parcelable { } /** + * Color coordinates in CIE1931 XYZ color space + * + * @hide + */ + public static final class CieXyz { + /** + * @hide + */ + public float X; + + /** + * @hide + */ + public float Y; + + /** + * @hide + */ + public float Z; + } + + /** + * Contains a display's color primaries + * + * @hide + */ + public static final class DisplayPrimaries { + /** + * @hide + */ + public CieXyz red; + + /** + * @hide + */ + public CieXyz green; + + /** + * @hide + */ + public CieXyz blue; + + /** + * @hide + */ + public CieXyz white; + + /** + * @hide + */ + public DisplayPrimaries() { + } + } + + /** + * @hide + */ + public static SurfaceControl.DisplayPrimaries getDisplayNativePrimaries( + IBinder displayToken) { + if (displayToken == null) { + throw new IllegalArgumentException("displayToken must not be null"); + } + + return nativeGetDisplayNativePrimaries(displayToken); + } + + /** * @hide */ public static int getActiveColorMode(IBinder displayToken) { diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index f1b259e10cf5..fad2fe0d3845 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -36,6 +36,7 @@ #include <memory> #include <stdio.h> #include <system/graphics.h> +#include <ui/ConfigStoreTypes.h> #include <ui/DisplayInfo.h> #include <ui/DisplayedFrameStats.h> #include <ui/FrameStats.h> @@ -108,6 +109,23 @@ static struct { jmethodID ctor; } gDisplayedContentSamplingAttributesClassInfo; +static struct { + jclass clazz; + jmethodID ctor; + jfieldID X; + jfieldID Y; + jfieldID Z; +} gCieXyzClassInfo; + +static struct { + jclass clazz; + jmethodID ctor; + jfieldID red; + jfieldID green; + jfieldID blue; + jfieldID white; +} gDisplayPrimariesClassInfo; + // ---------------------------------------------------------------------------- static jlong nativeCreateTransaction(JNIEnv* env, jclass clazz) { @@ -688,6 +706,66 @@ static jintArray nativeGetDisplayColorModes(JNIEnv* env, jclass, jobject tokenOb return colorModesArray; } +static jobject nativeGetDisplayNativePrimaries(JNIEnv* env, jclass, jobject tokenObj) { + sp<IBinder> token(ibinderForJavaObject(env, tokenObj)); + if (token == NULL) return NULL; + + ui::DisplayPrimaries primaries; + if (SurfaceComposerClient::getDisplayNativePrimaries(token, primaries) != NO_ERROR) { + return NULL; + } + + jobject jred = env->NewObject(gCieXyzClassInfo.clazz, gCieXyzClassInfo.ctor); + if (jred == NULL) { + jniThrowException(env, "java/lang/OutOfMemoryError", NULL); + return NULL; + } + + jobject jgreen = env->NewObject(gCieXyzClassInfo.clazz, gCieXyzClassInfo.ctor); + if (jgreen == NULL) { + jniThrowException(env, "java/lang/OutOfMemoryError", NULL); + return NULL; + } + + jobject jblue = env->NewObject(gCieXyzClassInfo.clazz, gCieXyzClassInfo.ctor); + if (jblue == NULL) { + jniThrowException(env, "java/lang/OutOfMemoryError", NULL); + return NULL; + } + + jobject jwhite = env->NewObject(gCieXyzClassInfo.clazz, gCieXyzClassInfo.ctor); + if (jwhite == NULL) { + jniThrowException(env, "java/lang/OutOfMemoryError", NULL); + return NULL; + } + + jobject jprimaries = env->NewObject(gDisplayPrimariesClassInfo.clazz, + gDisplayPrimariesClassInfo.ctor); + if (jprimaries == NULL) { + jniThrowException(env, "java/lang/OutOfMemoryError", NULL); + return NULL; + } + + env->SetFloatField(jred, gCieXyzClassInfo.X, primaries.red.X); + env->SetFloatField(jred, gCieXyzClassInfo.Y, primaries.red.Y); + env->SetFloatField(jred, gCieXyzClassInfo.Z, primaries.red.Z); + env->SetFloatField(jgreen, gCieXyzClassInfo.X, primaries.green.X); + env->SetFloatField(jgreen, gCieXyzClassInfo.Y, primaries.green.Y); + env->SetFloatField(jgreen, gCieXyzClassInfo.Z, primaries.green.Z); + env->SetFloatField(jblue, gCieXyzClassInfo.X, primaries.blue.X); + env->SetFloatField(jblue, gCieXyzClassInfo.Y, primaries.blue.Y); + env->SetFloatField(jblue, gCieXyzClassInfo.Z, primaries.blue.Z); + env->SetFloatField(jwhite, gCieXyzClassInfo.X, primaries.white.X); + env->SetFloatField(jwhite, gCieXyzClassInfo.Y, primaries.white.Y); + env->SetFloatField(jwhite, gCieXyzClassInfo.Z, primaries.white.Z); + env->SetObjectField(jprimaries, gDisplayPrimariesClassInfo.red, jred); + env->SetObjectField(jprimaries, gDisplayPrimariesClassInfo.green, jgreen); + env->SetObjectField(jprimaries, gDisplayPrimariesClassInfo.blue, jblue); + env->SetObjectField(jprimaries, gDisplayPrimariesClassInfo.white, jwhite); + + return jprimaries; +} + static jint nativeGetActiveColorMode(JNIEnv* env, jclass, jobject tokenObj) { sp<IBinder> token(ibinderForJavaObject(env, tokenObj)); if (token == NULL) return -1; @@ -1089,6 +1167,8 @@ static const JNINativeMethod sSurfaceControlMethods[] = { (void*)nativeSetActiveConfig }, {"nativeGetDisplayColorModes", "(Landroid/os/IBinder;)[I", (void*)nativeGetDisplayColorModes}, + {"nativeGetDisplayNativePrimaries", "(Landroid/os/IBinder;)Landroid/view/SurfaceControl$DisplayPrimaries;", + (void*)nativeGetDisplayNativePrimaries }, {"nativeGetActiveColorMode", "(Landroid/os/IBinder;)I", (void*)nativeGetActiveColorMode}, {"nativeSetActiveColorMode", "(Landroid/os/IBinder;I)Z", @@ -1209,6 +1289,28 @@ int register_android_view_SurfaceControl(JNIEnv* env) displayedContentSamplingAttributesClazz); gDisplayedContentSamplingAttributesClassInfo.ctor = GetMethodIDOrDie(env, displayedContentSamplingAttributesClazz, "<init>", "(III)V"); + + jclass cieXyzClazz = FindClassOrDie(env, "android/view/SurfaceControl$CieXyz"); + gCieXyzClassInfo.clazz = MakeGlobalRefOrDie(env, cieXyzClazz); + gCieXyzClassInfo.ctor = GetMethodIDOrDie(env, gCieXyzClassInfo.clazz, "<init>", "()V"); + gCieXyzClassInfo.X = GetFieldIDOrDie(env, cieXyzClazz, "X", "F"); + gCieXyzClassInfo.Y = GetFieldIDOrDie(env, cieXyzClazz, "Y", "F"); + gCieXyzClassInfo.Z = GetFieldIDOrDie(env, cieXyzClazz, "Z", "F"); + + jclass displayPrimariesClazz = FindClassOrDie(env, + "android/view/SurfaceControl$DisplayPrimaries"); + gDisplayPrimariesClassInfo.clazz = MakeGlobalRefOrDie(env, displayPrimariesClazz); + gDisplayPrimariesClassInfo.ctor = GetMethodIDOrDie(env, gDisplayPrimariesClassInfo.clazz, + "<init>", "()V"); + gDisplayPrimariesClassInfo.red = GetFieldIDOrDie(env, displayPrimariesClazz, "red", + "Landroid/view/SurfaceControl$CieXyz;"); + gDisplayPrimariesClassInfo.green = GetFieldIDOrDie(env, displayPrimariesClazz, "green", + "Landroid/view/SurfaceControl$CieXyz;"); + gDisplayPrimariesClassInfo.blue = GetFieldIDOrDie(env, displayPrimariesClazz, "blue", + "Landroid/view/SurfaceControl$CieXyz;"); + gDisplayPrimariesClassInfo.white = GetFieldIDOrDie(env, displayPrimariesClazz, "white", + "Landroid/view/SurfaceControl$CieXyz;"); + return err; } |