summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Daniel Solomon <solomondaniel@google.com> 2019-01-31 18:28:56 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2019-01-31 18:28:56 +0000
commitb39aaa494bd6f0dae88fc7fa7f52bee7b89bda9b (patch)
tree19ee2c5793483e846791eb018535b3168dfc3d7e
parent00c67e08d4d5ec704512251ae407e569fd7a16aa (diff)
parent10e3b336bd16c5efec654de4b7d480d27b50f219 (diff)
Merge "SurfaceControl: Add a hidden API to get display color primaries"
-rw-r--r--core/java/android/view/SurfaceControl.java69
-rw-r--r--core/jni/android_view_SurfaceControl.cpp102
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;
}