Add BT2020_HLG, BT2020_PQ to ColorSpace.Named enum

- Reuse transferParameters class to initialize non ICC curve ColorSpace,
  e.g., BT2020_HLG, BT2020_PQ.
- Add back-compactability between skia and java side for HLG/PQ.
- lift up the restriction that BitmapFactory#isPreferredColorSpace is
  ICC parametric curve.

Bug: 241284309
Test: android.graphics.cts.ColorSpaceTest,
android.graphics.cts.BitmapTest

Change-Id: Ib8d0f53fa4dc71cbd0f4eb239564c8d21f1e2ba7
diff --git a/libs/hwui/jni/Graphics.cpp b/libs/hwui/jni/Graphics.cpp
index 6a3bc8f..c835849 100644
--- a/libs/hwui/jni/Graphics.cpp
+++ b/libs/hwui/jni/Graphics.cpp
@@ -576,14 +576,22 @@
     LOG_ALWAYS_FATAL_IF(!decodeColorSpace->toXYZD50(&xyzMatrix));
 
     skcms_TransferFunction transferParams;
-    // We can only handle numerical transfer functions at the moment
-    LOG_ALWAYS_FATAL_IF(!decodeColorSpace->isNumericalTransferFn(&transferParams));
+    decodeColorSpace->transferFn(&transferParams);
+    auto res = skcms_TransferFunction_getType(&transferParams);
+    LOG_ALWAYS_FATAL_IF(res == skcms_TFType_HLGinvish || res == skcms_TFType_Invalid);
 
-    jobject params = env->NewObject(gTransferParameters_class,
-            gTransferParameters_constructorMethodID,
-            transferParams.a, transferParams.b, transferParams.c,
-            transferParams.d, transferParams.e, transferParams.f,
-            transferParams.g);
+    jobject params;
+    if (res == skcms_TFType_PQish || res == skcms_TFType_HLGish) {
+        params = env->NewObject(gTransferParameters_class, gTransferParameters_constructorMethodID,
+                                transferParams.a, transferParams.b, transferParams.c,
+                                transferParams.d, transferParams.e, transferParams.f,
+                                transferParams.g, true);
+    } else {
+        params = env->NewObject(gTransferParameters_class, gTransferParameters_constructorMethodID,
+                                transferParams.a, transferParams.b, transferParams.c,
+                                transferParams.d, transferParams.e, transferParams.f,
+                                transferParams.g, false);
+    }
 
     jfloatArray xyzArray = env->NewFloatArray(9);
     jfloat xyz[9] = {
@@ -808,8 +816,8 @@
 
     gTransferParameters_class = MakeGlobalRefOrDie(env, FindClassOrDie(env,
             "android/graphics/ColorSpace$Rgb$TransferParameters"));
-    gTransferParameters_constructorMethodID = GetMethodIDOrDie(env, gTransferParameters_class,
-            "<init>", "(DDDDDDD)V");
+    gTransferParameters_constructorMethodID =
+            GetMethodIDOrDie(env, gTransferParameters_class, "<init>", "(DDDDDDDZ)V");
 
     gFontMetrics_class = FindClassOrDie(env, "android/graphics/Paint$FontMetrics");
     gFontMetrics_class = MakeGlobalRefOrDie(env, gFontMetrics_class);