From 68bd5fdd1ad3cf0b74c225b31adf1f68393bfbb6 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Mon, 14 Nov 2016 18:53:40 -0800 Subject: [PATCH] Introduce android.graphics.ColorSpace This class can be used to define color spaces. A color space has a color model and a profile connection space (CIE XYZ D50). This implementation can be used to query various properties of RGB color spaces or perform conversions between various color spaces (RGB, XYZ and Lab). Refer to the documentation for more details. Test: cts-tradefed run singleCommand cts-dev --module CtsGraphicsTestCases --test android.graphics.cts.ColorSpaceTest Bug: 32984164 Change-Id: Ie2117c1212c1375a7d403d3c1afaf73d7c2e0b47 --- api/current.txt | 112 + api/system-current.txt | 112 + api/test-current.txt | 112 + core/java/android/annotation/ColorLong.java | 48 + core/java/android/util/Half.java | 6 +- graphics/java/android/graphics/Color.java | 19 +- .../java/android/graphics/ColorSpace.java | 3045 +++++++++++++++++ 7 files changed, 3441 insertions(+), 13 deletions(-) create mode 100644 core/java/android/annotation/ColorLong.java create mode 100644 graphics/java/android/graphics/ColorSpace.java diff --git a/api/current.txt b/api/current.txt index a38ff53577b42..6785d28c5c337 100644 --- a/api/current.txt +++ b/api/current.txt @@ -11972,6 +11972,118 @@ package android.graphics { ctor public ColorMatrixColorFilter(float[]); } + 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 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); + method public static android.graphics.ColorSpace.Connector connect(android.graphics.ColorSpace, android.graphics.ColorSpace.RenderIntent); + method public float[] fromXyz(float, float, float); + method public abstract float[] fromXyz(float[]); + method public static android.graphics.ColorSpace get(android.graphics.ColorSpace.Named); + method public int getComponentCount(); + method public int getId(); + method public abstract float getMaxValue(int); + method public abstract float getMinValue(int); + method public android.graphics.ColorSpace.Model getModel(); + method public java.lang.String getName(); + method public boolean isSrgb(); + method public abstract boolean isWideGamut(); + method public float[] toXyz(float, float, float); + method public abstract float[] toXyz(float[]); + field public static final float[] ILLUMINANT_A; + field public static final float[] ILLUMINANT_B; + field public static final float[] ILLUMINANT_C; + field public static final float[] ILLUMINANT_D50; + field public static final float[] ILLUMINANT_D55; + field public static final float[] ILLUMINANT_D60; + field public static final float[] ILLUMINANT_D65; + field public static final float[] ILLUMINANT_D75; + field public static final float[] ILLUMINANT_E; + field public static final int MAX_ID = 64; // 0x40 + field public static final int MIN_ID = -1; // 0xffffffff + } + + public static final class ColorSpace.Adaptation extends java.lang.Enum { + method public static android.graphics.ColorSpace.Adaptation valueOf(java.lang.String); + method public static final android.graphics.ColorSpace.Adaptation[] values(); + enum_constant public static final android.graphics.ColorSpace.Adaptation BRADFORD; + enum_constant public static final android.graphics.ColorSpace.Adaptation VON_KRIES; + } + + public static class ColorSpace.Connector { + method public android.graphics.ColorSpace getDestination(); + method public android.graphics.ColorSpace.RenderIntent getIntent(); + method public android.graphics.ColorSpace getSource(); + method public float[] transform(float, float, float); + method public float[] transform(float[]); + } + + public static final class ColorSpace.Model extends java.lang.Enum { + method public int getComponentCount(); + method public static android.graphics.ColorSpace.Model valueOf(java.lang.String); + method public static final android.graphics.ColorSpace.Model[] values(); + enum_constant public static final android.graphics.ColorSpace.Model CMYK; + enum_constant public static final android.graphics.ColorSpace.Model LAB; + enum_constant public static final android.graphics.ColorSpace.Model RGB; + enum_constant public static final android.graphics.ColorSpace.Model XYZ; + } + + public static final class ColorSpace.Named extends java.lang.Enum { + method public static android.graphics.ColorSpace.Named valueOf(java.lang.String); + method public static final android.graphics.ColorSpace.Named[] values(); + enum_constant public static final android.graphics.ColorSpace.Named ACES; + enum_constant public static final android.graphics.ColorSpace.Named ACESCG; + enum_constant public static final android.graphics.ColorSpace.Named ADOBE_RGB; + enum_constant public static final android.graphics.ColorSpace.Named BT2020; + enum_constant public static final android.graphics.ColorSpace.Named BT709; + enum_constant public static final android.graphics.ColorSpace.Named CIE_LAB; + enum_constant public static final android.graphics.ColorSpace.Named CIE_XYZ; + enum_constant public static final android.graphics.ColorSpace.Named DCI_P3; + enum_constant public static final android.graphics.ColorSpace.Named DISPLAY_P3; + enum_constant public static final android.graphics.ColorSpace.Named EXTENDED_SRGB; + enum_constant public static final android.graphics.ColorSpace.Named LINEAR_EXTENDED_SRGB; + enum_constant public static final android.graphics.ColorSpace.Named LINEAR_SRGB; + enum_constant public static final android.graphics.ColorSpace.Named NTSC_1953; + enum_constant public static final android.graphics.ColorSpace.Named PRO_PHOTO_RGB; + enum_constant public static final android.graphics.ColorSpace.Named SMPTE_C; + enum_constant public static final android.graphics.ColorSpace.Named SRGB; + } + + public static final class ColorSpace.RenderIntent extends java.lang.Enum { + method public static android.graphics.ColorSpace.RenderIntent valueOf(java.lang.String); + method public static final android.graphics.ColorSpace.RenderIntent[] values(); + enum_constant public static final android.graphics.ColorSpace.RenderIntent ABSOLUTE; + enum_constant public static final android.graphics.ColorSpace.RenderIntent PERCEPTUAL; + enum_constant public static final android.graphics.ColorSpace.RenderIntent RELATIVE; + enum_constant public static final android.graphics.ColorSpace.RenderIntent SATURATION; + } + + public static class ColorSpace.Rgb extends android.graphics.ColorSpace { + ctor public ColorSpace.Rgb(java.lang.String, float[], java.util.function.DoubleUnaryOperator, java.util.function.DoubleUnaryOperator); + ctor public ColorSpace.Rgb(java.lang.String, float[], float[], java.util.function.DoubleUnaryOperator, java.util.function.DoubleUnaryOperator, float, float); + method public float[] fromLinear(float, float, float); + method public float[] fromLinear(float[]); + method public float[] fromXyz(float[]); + method public java.util.function.DoubleUnaryOperator getEotf(); + method public float[] getInverseTransform(float[]); + method public float[] getInverseTransform(); + method public float getMaxValue(int); + method public float getMinValue(int); + method public java.util.function.DoubleUnaryOperator getOetf(); + method public float[] getPrimaries(float[]); + method public float[] getPrimaries(); + method public float[] getTransform(float[]); + method public float[] getTransform(); + method public float[] getWhitePoint(float[]); + method public float[] getWhitePoint(); + method public boolean isWideGamut(); + method public float[] toLinear(float, float, float); + method public float[] toLinear(float[]); + method public float[] toXyz(float[]); + } + public class ComposePathEffect extends android.graphics.PathEffect { ctor public ComposePathEffect(android.graphics.PathEffect, android.graphics.PathEffect); } diff --git a/api/system-current.txt b/api/system-current.txt index bcf4897c86615..517fe256b929e 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -12455,6 +12455,118 @@ package android.graphics { ctor public ColorMatrixColorFilter(float[]); } + 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 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); + method public static android.graphics.ColorSpace.Connector connect(android.graphics.ColorSpace, android.graphics.ColorSpace.RenderIntent); + method public float[] fromXyz(float, float, float); + method public abstract float[] fromXyz(float[]); + method public static android.graphics.ColorSpace get(android.graphics.ColorSpace.Named); + method public int getComponentCount(); + method public int getId(); + method public abstract float getMaxValue(int); + method public abstract float getMinValue(int); + method public android.graphics.ColorSpace.Model getModel(); + method public java.lang.String getName(); + method public boolean isSrgb(); + method public abstract boolean isWideGamut(); + method public float[] toXyz(float, float, float); + method public abstract float[] toXyz(float[]); + field public static final float[] ILLUMINANT_A; + field public static final float[] ILLUMINANT_B; + field public static final float[] ILLUMINANT_C; + field public static final float[] ILLUMINANT_D50; + field public static final float[] ILLUMINANT_D55; + field public static final float[] ILLUMINANT_D60; + field public static final float[] ILLUMINANT_D65; + field public static final float[] ILLUMINANT_D75; + field public static final float[] ILLUMINANT_E; + field public static final int MAX_ID = 64; // 0x40 + field public static final int MIN_ID = -1; // 0xffffffff + } + + public static final class ColorSpace.Adaptation extends java.lang.Enum { + method public static android.graphics.ColorSpace.Adaptation valueOf(java.lang.String); + method public static final android.graphics.ColorSpace.Adaptation[] values(); + enum_constant public static final android.graphics.ColorSpace.Adaptation BRADFORD; + enum_constant public static final android.graphics.ColorSpace.Adaptation VON_KRIES; + } + + public static class ColorSpace.Connector { + method public android.graphics.ColorSpace getDestination(); + method public android.graphics.ColorSpace.RenderIntent getIntent(); + method public android.graphics.ColorSpace getSource(); + method public float[] transform(float, float, float); + method public float[] transform(float[]); + } + + public static final class ColorSpace.Model extends java.lang.Enum { + method public int getComponentCount(); + method public static android.graphics.ColorSpace.Model valueOf(java.lang.String); + method public static final android.graphics.ColorSpace.Model[] values(); + enum_constant public static final android.graphics.ColorSpace.Model CMYK; + enum_constant public static final android.graphics.ColorSpace.Model LAB; + enum_constant public static final android.graphics.ColorSpace.Model RGB; + enum_constant public static final android.graphics.ColorSpace.Model XYZ; + } + + public static final class ColorSpace.Named extends java.lang.Enum { + method public static android.graphics.ColorSpace.Named valueOf(java.lang.String); + method public static final android.graphics.ColorSpace.Named[] values(); + enum_constant public static final android.graphics.ColorSpace.Named ACES; + enum_constant public static final android.graphics.ColorSpace.Named ACESCG; + enum_constant public static final android.graphics.ColorSpace.Named ADOBE_RGB; + enum_constant public static final android.graphics.ColorSpace.Named BT2020; + enum_constant public static final android.graphics.ColorSpace.Named BT709; + enum_constant public static final android.graphics.ColorSpace.Named CIE_LAB; + enum_constant public static final android.graphics.ColorSpace.Named CIE_XYZ; + enum_constant public static final android.graphics.ColorSpace.Named DCI_P3; + enum_constant public static final android.graphics.ColorSpace.Named DISPLAY_P3; + enum_constant public static final android.graphics.ColorSpace.Named EXTENDED_SRGB; + enum_constant public static final android.graphics.ColorSpace.Named LINEAR_EXTENDED_SRGB; + enum_constant public static final android.graphics.ColorSpace.Named LINEAR_SRGB; + enum_constant public static final android.graphics.ColorSpace.Named NTSC_1953; + enum_constant public static final android.graphics.ColorSpace.Named PRO_PHOTO_RGB; + enum_constant public static final android.graphics.ColorSpace.Named SMPTE_C; + enum_constant public static final android.graphics.ColorSpace.Named SRGB; + } + + public static final class ColorSpace.RenderIntent extends java.lang.Enum { + method public static android.graphics.ColorSpace.RenderIntent valueOf(java.lang.String); + method public static final android.graphics.ColorSpace.RenderIntent[] values(); + enum_constant public static final android.graphics.ColorSpace.RenderIntent ABSOLUTE; + enum_constant public static final android.graphics.ColorSpace.RenderIntent PERCEPTUAL; + enum_constant public static final android.graphics.ColorSpace.RenderIntent RELATIVE; + enum_constant public static final android.graphics.ColorSpace.RenderIntent SATURATION; + } + + public static class ColorSpace.Rgb extends android.graphics.ColorSpace { + ctor public ColorSpace.Rgb(java.lang.String, float[], java.util.function.DoubleUnaryOperator, java.util.function.DoubleUnaryOperator); + ctor public ColorSpace.Rgb(java.lang.String, float[], float[], java.util.function.DoubleUnaryOperator, java.util.function.DoubleUnaryOperator, float, float); + method public float[] fromLinear(float, float, float); + method public float[] fromLinear(float[]); + method public float[] fromXyz(float[]); + method public java.util.function.DoubleUnaryOperator getEotf(); + method public float[] getInverseTransform(float[]); + method public float[] getInverseTransform(); + method public float getMaxValue(int); + method public float getMinValue(int); + method public java.util.function.DoubleUnaryOperator getOetf(); + method public float[] getPrimaries(float[]); + method public float[] getPrimaries(); + method public float[] getTransform(float[]); + method public float[] getTransform(); + method public float[] getWhitePoint(float[]); + method public float[] getWhitePoint(); + method public boolean isWideGamut(); + method public float[] toLinear(float, float, float); + method public float[] toLinear(float[]); + method public float[] toXyz(float[]); + } + public class ComposePathEffect extends android.graphics.PathEffect { ctor public ComposePathEffect(android.graphics.PathEffect, android.graphics.PathEffect); } diff --git a/api/test-current.txt b/api/test-current.txt index fa75e9b4d0a5e..baebeb2bf5869 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -11997,6 +11997,118 @@ package android.graphics { ctor public ColorMatrixColorFilter(float[]); } + 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 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); + method public static android.graphics.ColorSpace.Connector connect(android.graphics.ColorSpace, android.graphics.ColorSpace.RenderIntent); + method public float[] fromXyz(float, float, float); + method public abstract float[] fromXyz(float[]); + method public static android.graphics.ColorSpace get(android.graphics.ColorSpace.Named); + method public int getComponentCount(); + method public int getId(); + method public abstract float getMaxValue(int); + method public abstract float getMinValue(int); + method public android.graphics.ColorSpace.Model getModel(); + method public java.lang.String getName(); + method public boolean isSrgb(); + method public abstract boolean isWideGamut(); + method public float[] toXyz(float, float, float); + method public abstract float[] toXyz(float[]); + field public static final float[] ILLUMINANT_A; + field public static final float[] ILLUMINANT_B; + field public static final float[] ILLUMINANT_C; + field public static final float[] ILLUMINANT_D50; + field public static final float[] ILLUMINANT_D55; + field public static final float[] ILLUMINANT_D60; + field public static final float[] ILLUMINANT_D65; + field public static final float[] ILLUMINANT_D75; + field public static final float[] ILLUMINANT_E; + field public static final int MAX_ID = 64; // 0x40 + field public static final int MIN_ID = -1; // 0xffffffff + } + + public static final class ColorSpace.Adaptation extends java.lang.Enum { + method public static android.graphics.ColorSpace.Adaptation valueOf(java.lang.String); + method public static final android.graphics.ColorSpace.Adaptation[] values(); + enum_constant public static final android.graphics.ColorSpace.Adaptation BRADFORD; + enum_constant public static final android.graphics.ColorSpace.Adaptation VON_KRIES; + } + + public static class ColorSpace.Connector { + method public android.graphics.ColorSpace getDestination(); + method public android.graphics.ColorSpace.RenderIntent getIntent(); + method public android.graphics.ColorSpace getSource(); + method public float[] transform(float, float, float); + method public float[] transform(float[]); + } + + public static final class ColorSpace.Model extends java.lang.Enum { + method public int getComponentCount(); + method public static android.graphics.ColorSpace.Model valueOf(java.lang.String); + method public static final android.graphics.ColorSpace.Model[] values(); + enum_constant public static final android.graphics.ColorSpace.Model CMYK; + enum_constant public static final android.graphics.ColorSpace.Model LAB; + enum_constant public static final android.graphics.ColorSpace.Model RGB; + enum_constant public static final android.graphics.ColorSpace.Model XYZ; + } + + public static final class ColorSpace.Named extends java.lang.Enum { + method public static android.graphics.ColorSpace.Named valueOf(java.lang.String); + method public static final android.graphics.ColorSpace.Named[] values(); + enum_constant public static final android.graphics.ColorSpace.Named ACES; + enum_constant public static final android.graphics.ColorSpace.Named ACESCG; + enum_constant public static final android.graphics.ColorSpace.Named ADOBE_RGB; + enum_constant public static final android.graphics.ColorSpace.Named BT2020; + enum_constant public static final android.graphics.ColorSpace.Named BT709; + enum_constant public static final android.graphics.ColorSpace.Named CIE_LAB; + enum_constant public static final android.graphics.ColorSpace.Named CIE_XYZ; + enum_constant public static final android.graphics.ColorSpace.Named DCI_P3; + enum_constant public static final android.graphics.ColorSpace.Named DISPLAY_P3; + enum_constant public static final android.graphics.ColorSpace.Named EXTENDED_SRGB; + enum_constant public static final android.graphics.ColorSpace.Named LINEAR_EXTENDED_SRGB; + enum_constant public static final android.graphics.ColorSpace.Named LINEAR_SRGB; + enum_constant public static final android.graphics.ColorSpace.Named NTSC_1953; + enum_constant public static final android.graphics.ColorSpace.Named PRO_PHOTO_RGB; + enum_constant public static final android.graphics.ColorSpace.Named SMPTE_C; + enum_constant public static final android.graphics.ColorSpace.Named SRGB; + } + + public static final class ColorSpace.RenderIntent extends java.lang.Enum { + method public static android.graphics.ColorSpace.RenderIntent valueOf(java.lang.String); + method public static final android.graphics.ColorSpace.RenderIntent[] values(); + enum_constant public static final android.graphics.ColorSpace.RenderIntent ABSOLUTE; + enum_constant public static final android.graphics.ColorSpace.RenderIntent PERCEPTUAL; + enum_constant public static final android.graphics.ColorSpace.RenderIntent RELATIVE; + enum_constant public static final android.graphics.ColorSpace.RenderIntent SATURATION; + } + + public static class ColorSpace.Rgb extends android.graphics.ColorSpace { + ctor public ColorSpace.Rgb(java.lang.String, float[], java.util.function.DoubleUnaryOperator, java.util.function.DoubleUnaryOperator); + ctor public ColorSpace.Rgb(java.lang.String, float[], float[], java.util.function.DoubleUnaryOperator, java.util.function.DoubleUnaryOperator, float, float); + method public float[] fromLinear(float, float, float); + method public float[] fromLinear(float[]); + method public float[] fromXyz(float[]); + method public java.util.function.DoubleUnaryOperator getEotf(); + method public float[] getInverseTransform(float[]); + method public float[] getInverseTransform(); + method public float getMaxValue(int); + method public float getMinValue(int); + method public java.util.function.DoubleUnaryOperator getOetf(); + method public float[] getPrimaries(float[]); + method public float[] getPrimaries(); + method public float[] getTransform(float[]); + method public float[] getTransform(); + method public float[] getWhitePoint(float[]); + method public float[] getWhitePoint(); + method public boolean isWideGamut(); + method public float[] toLinear(float, float, float); + method public float[] toLinear(float[]); + method public float[] toXyz(float[]); + } + public class ComposePathEffect extends android.graphics.PathEffect { ctor public ComposePathEffect(android.graphics.PathEffect, android.graphics.PathEffect); } diff --git a/core/java/android/annotation/ColorLong.java b/core/java/android/annotation/ColorLong.java new file mode 100644 index 0000000000000..9b19c76802c9f --- /dev/null +++ b/core/java/android/annotation/ColorLong.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2016 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. + */ + +package android.annotation; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.LOCAL_VARIABLE; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.RetentionPolicy.SOURCE; + +/** + *

Denotes that the annotated element represents a packed color + * long. If applied to a long array, every element in the array + * represents a color long. For more information on how colors + * are packed in a long, please refer to the documentation of + * the {@link android.graphics.Color} class.

+ * + *

Example:

+ * + *
{@code
+ *  public void setFillColor(@ColorLong long color);
+ * }
+ * + * @see android.graphics.Color + * + * @hide + */ +@Retention(SOURCE) +@Target({PARAMETER,METHOD,LOCAL_VARIABLE,FIELD}) +public @interface ColorLong { +} diff --git a/core/java/android/util/Half.java b/core/java/android/util/Half.java index 1abc10d63509c..e4f8dd1b12b83 100644 --- a/core/java/android/util/Half.java +++ b/core/java/android/util/Half.java @@ -543,9 +543,9 @@ public final class Half { /** *

Converts the specified half-precision float value into a - * single-precision float value with the following special cases:

+ * single-precision float value. The following special cases are handled:

*