Merge "Color API to create/store wide-gamut colors in a long"

This commit is contained in:
TreeHugger Robot
2017-01-18 04:17:43 +00:00
committed by Android (Google) Code Review
5 changed files with 1424 additions and 76 deletions

View File

@@ -12121,15 +12121,57 @@ package android.graphics {
method public static int HSVToColor(float[]);
method public static int HSVToColor(int, float[]);
method public static void RGBToHSV(int, int, int, float[]);
method public float alpha();
method public static float alpha(long);
method public static int alpha(int);
method public static int argb(int, int, int, int);
method public static int argb(float, float, float, float);
method public float blue();
method public static float blue(long);
method public static int blue(int);
method public static android.graphics.ColorSpace colorSpace(long);
method public static void colorToHSV(int, float[]);
method public android.graphics.Color convert(android.graphics.ColorSpace);
method public static long convert(int, android.graphics.ColorSpace);
method public static long convert(long, android.graphics.ColorSpace);
method public static long convert(float, float, float, float, android.graphics.ColorSpace, android.graphics.ColorSpace);
method public static long convert(long, android.graphics.ColorSpace.Connector);
method public static long convert(float, float, float, float, android.graphics.ColorSpace.Connector);
method public android.graphics.ColorSpace getColorSpace();
method public float getComponent(int);
method public int getComponentCount();
method public float[] getComponents();
method public android.graphics.ColorSpace.Model getModel();
method public float green();
method public static float green(long);
method public static int green(int);
method public static boolean isInColorSpace(long, android.graphics.ColorSpace);
method public boolean isSrgb();
method public static boolean isSrgb(long);
method public boolean isWideGamut();
method public static boolean isWideGamut(long);
method public float luminance();
method public static float luminance(long);
method public static float luminance(int);
method public long pack();
method public static long pack(int);
method public static long pack(float, float, float);
method public static long pack(float, float, float, float);
method public static long pack(float, float, float, float, android.graphics.ColorSpace);
method public static int parseColor(java.lang.String);
method public float red();
method public static float red(long);
method public static int red(int);
method public static int rgb(int, int, int);
method public static int rgb(float, float, float);
method public int toArgb();
method public static int toArgb(long);
method public static android.graphics.Color valueOf(int);
method public static android.graphics.Color valueOf(long);
method public static android.graphics.Color valueOf(float, float, float);
method public static android.graphics.Color valueOf(float, float, float, float);
method public static android.graphics.Color valueOf(float, float, float, float, android.graphics.ColorSpace);
method public static android.graphics.Color valueOf(float[], android.graphics.ColorSpace);
field public static final int BLACK = -16777216; // 0xff000000
field public static final int BLUE = -16776961; // 0xff0000ff
field public static final int CYAN = -16711681; // 0xff00ffff
@@ -12201,7 +12243,7 @@ package android.graphics {
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 MAX_ID = 63; // 0x3f
field public static final int MIN_ID = -1; // 0xffffffff
}

View File

@@ -12636,15 +12636,57 @@ package android.graphics {
method public static int HSVToColor(float[]);
method public static int HSVToColor(int, float[]);
method public static void RGBToHSV(int, int, int, float[]);
method public float alpha();
method public static float alpha(long);
method public static int alpha(int);
method public static int argb(int, int, int, int);
method public static int argb(float, float, float, float);
method public float blue();
method public static float blue(long);
method public static int blue(int);
method public static android.graphics.ColorSpace colorSpace(long);
method public static void colorToHSV(int, float[]);
method public android.graphics.Color convert(android.graphics.ColorSpace);
method public static long convert(int, android.graphics.ColorSpace);
method public static long convert(long, android.graphics.ColorSpace);
method public static long convert(float, float, float, float, android.graphics.ColorSpace, android.graphics.ColorSpace);
method public static long convert(long, android.graphics.ColorSpace.Connector);
method public static long convert(float, float, float, float, android.graphics.ColorSpace.Connector);
method public android.graphics.ColorSpace getColorSpace();
method public float getComponent(int);
method public int getComponentCount();
method public float[] getComponents();
method public android.graphics.ColorSpace.Model getModel();
method public float green();
method public static float green(long);
method public static int green(int);
method public static boolean isInColorSpace(long, android.graphics.ColorSpace);
method public boolean isSrgb();
method public static boolean isSrgb(long);
method public boolean isWideGamut();
method public static boolean isWideGamut(long);
method public float luminance();
method public static float luminance(long);
method public static float luminance(int);
method public long pack();
method public static long pack(int);
method public static long pack(float, float, float);
method public static long pack(float, float, float, float);
method public static long pack(float, float, float, float, android.graphics.ColorSpace);
method public static int parseColor(java.lang.String);
method public float red();
method public static float red(long);
method public static int red(int);
method public static int rgb(int, int, int);
method public static int rgb(float, float, float);
method public int toArgb();
method public static int toArgb(long);
method public static android.graphics.Color valueOf(int);
method public static android.graphics.Color valueOf(long);
method public static android.graphics.Color valueOf(float, float, float);
method public static android.graphics.Color valueOf(float, float, float, float);
method public static android.graphics.Color valueOf(float, float, float, float, android.graphics.ColorSpace);
method public static android.graphics.Color valueOf(float[], android.graphics.ColorSpace);
field public static final int BLACK = -16777216; // 0xff000000
field public static final int BLUE = -16776961; // 0xff0000ff
field public static final int CYAN = -16711681; // 0xff00ffff
@@ -12716,7 +12758,7 @@ package android.graphics {
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 MAX_ID = 63; // 0x3f
field public static final int MIN_ID = -1; // 0xffffffff
}

View File

@@ -12153,15 +12153,57 @@ package android.graphics {
method public static int HSVToColor(float[]);
method public static int HSVToColor(int, float[]);
method public static void RGBToHSV(int, int, int, float[]);
method public float alpha();
method public static float alpha(long);
method public static int alpha(int);
method public static int argb(int, int, int, int);
method public static int argb(float, float, float, float);
method public float blue();
method public static float blue(long);
method public static int blue(int);
method public static android.graphics.ColorSpace colorSpace(long);
method public static void colorToHSV(int, float[]);
method public android.graphics.Color convert(android.graphics.ColorSpace);
method public static long convert(int, android.graphics.ColorSpace);
method public static long convert(long, android.graphics.ColorSpace);
method public static long convert(float, float, float, float, android.graphics.ColorSpace, android.graphics.ColorSpace);
method public static long convert(long, android.graphics.ColorSpace.Connector);
method public static long convert(float, float, float, float, android.graphics.ColorSpace.Connector);
method public android.graphics.ColorSpace getColorSpace();
method public float getComponent(int);
method public int getComponentCount();
method public float[] getComponents();
method public android.graphics.ColorSpace.Model getModel();
method public float green();
method public static float green(long);
method public static int green(int);
method public static boolean isInColorSpace(long, android.graphics.ColorSpace);
method public boolean isSrgb();
method public static boolean isSrgb(long);
method public boolean isWideGamut();
method public static boolean isWideGamut(long);
method public float luminance();
method public static float luminance(long);
method public static float luminance(int);
method public long pack();
method public static long pack(int);
method public static long pack(float, float, float);
method public static long pack(float, float, float, float);
method public static long pack(float, float, float, float, android.graphics.ColorSpace);
method public static int parseColor(java.lang.String);
method public float red();
method public static float red(long);
method public static int red(int);
method public static int rgb(int, int, int);
method public static int rgb(float, float, float);
method public int toArgb();
method public static int toArgb(long);
method public static android.graphics.Color valueOf(int);
method public static android.graphics.Color valueOf(long);
method public static android.graphics.Color valueOf(float, float, float);
method public static android.graphics.Color valueOf(float, float, float, float);
method public static android.graphics.Color valueOf(float, float, float, float, android.graphics.ColorSpace);
method public static android.graphics.Color valueOf(float[], android.graphics.ColorSpace);
field public static final int BLACK = -16777216; // 0xff000000
field public static final int BLUE = -16776961; // 0xff0000ff
field public static final int CYAN = -16711681; // 0xff00ffff
@@ -12233,7 +12275,7 @@ package android.graphics {
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 MAX_ID = 63; // 0x3f
field public static final int MIN_ID = -1; // 0xffffffff
}

File diff suppressed because it is too large Load Diff

View File

@@ -16,6 +16,7 @@
package android.graphics;
import android.annotation.AnyThread;
import android.annotation.ColorInt;
import android.annotation.IntRange;
import android.annotation.NonNull;
@@ -126,7 +127,8 @@ import java.util.function.DoubleUnaryOperator;
*
* <p>To visualize and debug color spaces, you can call {@link #createRenderer()}.
* The {@link Renderer} created by calling this method can be used to compare
* color spaces and locate specific colors on a CIE 1931 chromaticity diagram.</p>
* color spaces and locate specific colors on a CIE 1931 or CIE 1976 UCS
* chromaticity diagram.</p>
*
* <p>The following code snippet shows how to render a bitmap that compares
* the color gamuts and white points of {@link Named#DCI_P3} and
@@ -155,6 +157,7 @@ import java.util.function.DoubleUnaryOperator;
* @see Adaptation
* @see Renderer
*/
@AnyThread
@SuppressWarnings("StaticInitializerReferencesSubClass")
public abstract class ColorSpace {
/**
@@ -216,7 +219,7 @@ public abstract class ColorSpace {
*
* @see #getId()
*/
public static final int MAX_ID = 64; // Do not change, used to encode in longs
public static final int MAX_ID = 63; // Do not change, used to encode in longs
private static final float[] SRGB_PRIMARIES = { 0.640f, 0.330f, 0.300f, 0.600f, 0.150f, 0.060f };
private static final float[] NTSC_1953_PRIMARIES = { 0.67f, 0.33f, 0.21f, 0.71f, 0.14f, 0.08f };
@@ -341,11 +344,11 @@ public abstract class ColorSpace {
* \end{equation}\)
* </td>
* </tr>
* <tr><td>Range</td><td colspan="4">\([-0.5..7.5[\)</td></tr>
* <tr><td>Range</td><td colspan="4">\([-0.799..2.399[\)</td></tr>
* </table>
* <p>
* <img src="{@docRoot}reference/android/images/graphics/colorspace_scrgb.png" />
* <figcaption style="text-align: center;">Extended RGB (orange) vs sRGB (white)</figcaption>
* <figcaption style="text-align: center;">Extended sRGB (orange) vs sRGB (white)</figcaption>
* </p>
*/
EXTENDED_SRGB,
@@ -368,11 +371,11 @@ public abstract class ColorSpace {
* <td>Electro-optical transfer function</td>
* <td colspan="4">\(C_{linear} = C_{scRGB}\)</td>
* </tr>
* <tr><td>Range</td><td colspan="4">\([-0.5..7.5[\)</td></tr>
* <tr><td>Range</td><td colspan="4">\([-0.5..7.499[\)</td></tr>
* </table>
* <p>
* <img src="{@docRoot}reference/android/images/graphics/colorspace_scrgb.png" />
* <figcaption style="text-align: center;">Extended RGB (orange) vs sRGB (white)</figcaption>
* <figcaption style="text-align: center;">Extended sRGB (orange) vs sRGB (white)</figcaption>
* </p>
*/
LINEAR_EXTENDED_SRGB,
@@ -1090,7 +1093,7 @@ public abstract class ColorSpace {
* space's color model. The resulting value is passed back in the specified
* array.</p>
*
* <p class="note>The specified array's length must be at least equal to
* <p class="note">The specified array's length must be at least equal to
* to the number of color components as returned by
* {@link Model#getComponentCount()}, and its first 3 values must
* be the XYZ components to convert from.</p>
@@ -1125,6 +1128,7 @@ public abstract class ColorSpace {
* @return A string representation of the object
*/
@Override
@NonNull
public String toString() {
return mName + " (id=" + mId + ", model=" + mModel + ")";
}
@@ -1403,7 +1407,7 @@ public abstract class ColorSpace {
ILLUMINANT_D65,
x -> absRcpResponse(x, 2.4, 1 / 1.055, 0.055 / 1.055, 1 / 12.92, 0.04045),
x -> absResponse(x, 2.4, 1 / 1.055, 0.055 / 1.055, 1 / 12.92, 0.04045),
-0.5f, 7.5f,
-0.799f, 2.399f,
Named.EXTENDED_SRGB.ordinal()
);
sNamedColorSpaces[Named.LINEAR_EXTENDED_SRGB.ordinal()] = new ColorSpace.Rgb(
@@ -1412,7 +1416,7 @@ public abstract class ColorSpace {
ILLUMINANT_D65,
DoubleUnaryOperator.identity(),
DoubleUnaryOperator.identity(),
-0.5f, 7.5f,
-0.5f, 7.499f,
Named.LINEAR_EXTENDED_SRGB.ordinal()
);
sNamedColorSpaces[Named.BT709.ordinal()] = new ColorSpace.Rgb(
@@ -1437,8 +1441,8 @@ public abstract class ColorSpace {
"SMPTE RP 431-2-2007 DCI (P3)",
new float[] { 0.680f, 0.320f, 0.265f, 0.690f, 0.150f, 0.060f },
new float[] { 0.314f, 0.351f },
x -> Math.pow(x, 1 / 2.6),
x -> Math.pow(x, 2.6),
x -> Math.pow(x < 0.0f ? 0.0f : x, 1 / 2.6),
x -> Math.pow(x < 0.0f ? 0.0f : x, 2.6),
0.0f, 1.0f,
Named.DCI_P3.ordinal()
);
@@ -1473,8 +1477,8 @@ public abstract class ColorSpace {
"Adobe RGB (1998)",
new float[] { 0.64f, 0.33f, 0.21f, 0.71f, 0.15f, 0.06f },
ILLUMINANT_D65,
x -> Math.pow(x, 1 / 2.2),
x -> Math.pow(x, 2.2),
x -> Math.pow(x < 0.0f ? 0.0f : x, 1 / 2.2),
x -> Math.pow(x < 0.0f ? 0.0f : x, 2.2),
0.0f, 1.0f,
Named.ADOBE_RGB.ordinal()
);
@@ -1720,6 +1724,7 @@ public abstract class ColorSpace {
/**
* Implementation of the CIE XYZ color space. Assumes the white point is D50.
*/
@AnyThread
private static final class Xyz extends ColorSpace {
private Xyz(@NonNull String name, @IntRange(from = MIN_ID, to = MAX_ID) int id) {
super(name, Model.XYZ, id);
@@ -1765,6 +1770,7 @@ public abstract class ColorSpace {
* Implementation of the CIE L*a*b* color space. Its PCS is CIE XYZ
* with a white point of D50.
*/
@AnyThread
private static final class Lab extends ColorSpace {
private static final float A = 216.0f / 24389.0f;
private static final float B = 841.0f / 108.0f;
@@ -1949,6 +1955,7 @@ public abstract class ColorSpace {
* <p>To learn more about the white point adaptation process, refer to the
* documentation of {@link Adaptation}.</p>
*/
@AnyThread
public static class Rgb extends ColorSpace {
@NonNull private final float[] mWhitePoint;
@NonNull private final float[] mPrimaries;
@@ -2337,7 +2344,7 @@ public abstract class ColorSpace {
* to "gamma space" (gamma encoded). The terms gamma space and gamma encoded
* are frequently used because many OETFs can be closely approximated using
* a simple power function of the form \(x^{\frac{1}{\gamma}}\) (the
* approximation of the {@link Named#SRGB sRGB} EOTF uses \(\gamma=2.2\)
* approximation of the {@link Named#SRGB sRGB} OETF uses \(\gamma=2.2\)
* for instance).</p>
*
* @return A transfer function that converts from linear space to "gamma space"
@@ -2346,7 +2353,7 @@ public abstract class ColorSpace {
*/
@NonNull
public DoubleUnaryOperator getOetf() {
return mOetf;
return mClampedOetf;
}
/**
@@ -2369,7 +2376,7 @@ public abstract class ColorSpace {
*/
@NonNull
public DoubleUnaryOperator getEotf() {
return mEotf;
return mClampedEotf;
}
@Override
@@ -2924,6 +2931,7 @@ public abstract class ColorSpace {
* @see ColorSpace#connect(ColorSpace, RenderIntent)
* @see ColorSpace#connect(ColorSpace)
*/
@AnyThread
public static class Connector {
@NonNull private final ColorSpace mSource;
@NonNull private final ColorSpace mDestination;