From 6310160c4ee85f1d1b7935c82b29e9589247981d Mon Sep 17 00:00:00 2001 From: Daniel Solomon Date: Tue, 27 Nov 2018 13:15:10 -0800 Subject: [PATCH] Add a public chromatic adaptation API to ColorSpace This change adds a public version of ColorSpace.chromaticAdaptation(), so that chromatic adaptation can be done on independent CIE xyY or XYZ coordinates without the involvement of ColorSpace.Rgb. Test: cts-tradefed run singleCommand cts-dev --module CtsGraphicsTestCases --test android.graphics.cts.ColorSpaceTest Bug 116516917 Change-Id: I73c33750c343301bed4bb018c351d87c5043b59b --- api/current.txt | 1 + .../java/android/graphics/ColorSpace.java | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/api/current.txt b/api/current.txt index abd3c312e7e6e..6bb899d04bf4f 100644 --- a/api/current.txt +++ b/api/current.txt @@ -13687,6 +13687,7 @@ package android.graphics { public abstract class ColorSpace { method public static android.graphics.ColorSpace adapt(android.graphics.ColorSpace, float[]); method public static android.graphics.ColorSpace adapt(android.graphics.ColorSpace, float[], android.graphics.ColorSpace.Adaptation); + method public static float[] chromaticAdaptation(android.graphics.ColorSpace.Adaptation, float[], float[]); method public static android.graphics.ColorSpace.Connector connect(android.graphics.ColorSpace, android.graphics.ColorSpace); method public static android.graphics.ColorSpace.Connector connect(android.graphics.ColorSpace, android.graphics.ColorSpace, android.graphics.ColorSpace.RenderIntent); method public static android.graphics.ColorSpace.Connector connect(android.graphics.ColorSpace); diff --git a/graphics/java/android/graphics/ColorSpace.java b/graphics/java/android/graphics/ColorSpace.java index 2e1d81a294e9a..bf114b969b674 100644 --- a/graphics/java/android/graphics/ColorSpace.java +++ b/graphics/java/android/graphics/ColorSpace.java @@ -1778,6 +1778,40 @@ public abstract class ColorSpace { return mul3x3(inverse3x3(matrix), mul3x3Diag(LMS, matrix)); } + /** + *

Computes the chromatic adaptation transform from the specified + * source white point to the specified destination white point.

+ * + *

The transform is computed using the von Kries method, described + * in more details in the documentation of {@link Adaptation}. The + * {@link Adaptation} enum provides different matrices that can be + * used to perform the adaptation.

+ * + * @param adaptation The adaptation method + * @param srcWhitePoint The white point to adapt from + * @param dstWhitePoint The white point to adapt to + * @return A 3x3 matrix as a non-null array of 9 floats + */ + @NonNull + @Size(9) + public static float[] chromaticAdaptation(@NonNull Adaptation adaptation, + @NonNull @Size(min = 2, max = 3) float[] srcWhitePoint, + @NonNull @Size(min = 2, max = 3) float[] dstWhitePoint) { + float[] srcXyz = srcWhitePoint.length == 3 ? + Arrays.copyOf(srcWhitePoint, 3) : xyYToXyz(srcWhitePoint); + float[] dstXyz = dstWhitePoint.length == 3 ? + Arrays.copyOf(dstWhitePoint, 3) : xyYToXyz(dstWhitePoint); + + if (compare(srcXyz, dstXyz)) { + return new float[] { + 1.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 1.0f + }; + } + return chromaticAdaptation(adaptation.mTransform, srcXyz, dstXyz); + } + /** * Implementation of the CIE XYZ color space. Assumes the white point is D50. */