Merge "Support Skia's gray SkColorSpaces" into rvc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
b86e5a77a1
@@ -199,6 +199,11 @@ public abstract class ColorSpace {
|
||||
|
||||
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 };
|
||||
/**
|
||||
* A gray color space does not have meaningful primaries, so we use this arbitrary set.
|
||||
*/
|
||||
private static final float[] GRAY_PRIMARIES = { 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f };
|
||||
|
||||
private static final float[] ILLUMINANT_D50_XYZ = { 0.964212f, 1.0f, 0.825188f };
|
||||
|
||||
private static final Rgb.TransferParameters SRGB_TRANSFER_PARAMETERS =
|
||||
@@ -1457,6 +1462,7 @@ public abstract class ColorSpace {
|
||||
"sRGB IEC61966-2.1",
|
||||
SRGB_PRIMARIES,
|
||||
ILLUMINANT_D65,
|
||||
null,
|
||||
SRGB_TRANSFER_PARAMETERS,
|
||||
Named.SRGB.ordinal()
|
||||
);
|
||||
@@ -1491,6 +1497,7 @@ public abstract class ColorSpace {
|
||||
"Rec. ITU-R BT.709-5",
|
||||
new float[] { 0.640f, 0.330f, 0.300f, 0.600f, 0.150f, 0.060f },
|
||||
ILLUMINANT_D65,
|
||||
null,
|
||||
new Rgb.TransferParameters(1 / 1.099, 0.099 / 1.099, 1 / 4.5, 0.081, 1 / 0.45),
|
||||
Named.BT709.ordinal()
|
||||
);
|
||||
@@ -1498,6 +1505,7 @@ public abstract class ColorSpace {
|
||||
"Rec. ITU-R BT.2020-1",
|
||||
new float[] { 0.708f, 0.292f, 0.170f, 0.797f, 0.131f, 0.046f },
|
||||
ILLUMINANT_D65,
|
||||
null,
|
||||
new Rgb.TransferParameters(1 / 1.0993, 0.0993 / 1.0993, 1 / 4.5, 0.08145, 1 / 0.45),
|
||||
Named.BT2020.ordinal()
|
||||
);
|
||||
@@ -1513,6 +1521,7 @@ public abstract class ColorSpace {
|
||||
"Display P3",
|
||||
new float[] { 0.680f, 0.320f, 0.265f, 0.690f, 0.150f, 0.060f },
|
||||
ILLUMINANT_D65,
|
||||
null,
|
||||
SRGB_TRANSFER_PARAMETERS,
|
||||
Named.DISPLAY_P3.ordinal()
|
||||
);
|
||||
@@ -1520,6 +1529,7 @@ public abstract class ColorSpace {
|
||||
"NTSC (1953)",
|
||||
NTSC_1953_PRIMARIES,
|
||||
ILLUMINANT_C,
|
||||
null,
|
||||
new Rgb.TransferParameters(1 / 1.099, 0.099 / 1.099, 1 / 4.5, 0.081, 1 / 0.45),
|
||||
Named.NTSC_1953.ordinal()
|
||||
);
|
||||
@@ -1527,6 +1537,7 @@ public abstract class ColorSpace {
|
||||
"SMPTE-C RGB",
|
||||
new float[] { 0.630f, 0.340f, 0.310f, 0.595f, 0.155f, 0.070f },
|
||||
ILLUMINANT_D65,
|
||||
null,
|
||||
new Rgb.TransferParameters(1 / 1.099, 0.099 / 1.099, 1 / 4.5, 0.081, 1 / 0.45),
|
||||
Named.SMPTE_C.ordinal()
|
||||
);
|
||||
@@ -1542,6 +1553,7 @@ public abstract class ColorSpace {
|
||||
"ROMM RGB ISO 22028-2:2013",
|
||||
new float[] { 0.7347f, 0.2653f, 0.1596f, 0.8404f, 0.0366f, 0.0001f },
|
||||
ILLUMINANT_D50,
|
||||
null,
|
||||
new Rgb.TransferParameters(1.0, 0.0, 1 / 16.0, 0.031248, 1.8),
|
||||
Named.PRO_PHOTO_RGB.ordinal()
|
||||
);
|
||||
@@ -2471,7 +2483,11 @@ public abstract class ColorSpace {
|
||||
@NonNull @Size(min = 1) String name,
|
||||
@NonNull @Size(9) float[] toXYZ,
|
||||
@NonNull TransferParameters function) {
|
||||
this(name, computePrimaries(toXYZ), computeWhitePoint(toXYZ), function, MIN_ID);
|
||||
// Note: when isGray() returns false, this passes null for the transform for
|
||||
// consistency with other constructors, which compute the transform from the primaries
|
||||
// and white point.
|
||||
this(name, isGray(toXYZ) ? GRAY_PRIMARIES : computePrimaries(toXYZ),
|
||||
computeWhitePoint(toXYZ), isGray(toXYZ) ? toXYZ : null, function, MIN_ID);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2511,7 +2527,7 @@ public abstract class ColorSpace {
|
||||
@NonNull @Size(min = 6, max = 9) float[] primaries,
|
||||
@NonNull @Size(min = 2, max = 3) float[] whitePoint,
|
||||
@NonNull TransferParameters function) {
|
||||
this(name, primaries, whitePoint, function, MIN_ID);
|
||||
this(name, primaries, whitePoint, null, function, MIN_ID);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2534,6 +2550,8 @@ public abstract class ColorSpace {
|
||||
* @param name Name of the color space, cannot be null, its length must be >= 1
|
||||
* @param primaries RGB primaries as an array of 6 (xy) or 9 (XYZ) floats
|
||||
* @param whitePoint Reference white as an array of 2 (xy) or 3 (XYZ) floats
|
||||
* @param transform Computed transform matrix that converts from RGB to XYZ, or
|
||||
* {@code null} to compute it from {@code primaries} and {@code whitePoint}.
|
||||
* @param function Parameters for the transfer functions
|
||||
* @param id ID of this color space as an integer between {@link #MIN_ID} and {@link #MAX_ID}
|
||||
*
|
||||
@@ -2552,9 +2570,10 @@ public abstract class ColorSpace {
|
||||
@NonNull @Size(min = 1) String name,
|
||||
@NonNull @Size(min = 6, max = 9) float[] primaries,
|
||||
@NonNull @Size(min = 2, max = 3) float[] whitePoint,
|
||||
@Nullable @Size(9) float[] transform,
|
||||
@NonNull TransferParameters function,
|
||||
@IntRange(from = MIN_ID, to = MAX_ID) int id) {
|
||||
this(name, primaries, whitePoint, null,
|
||||
this(name, primaries, whitePoint, transform,
|
||||
function.e == 0.0 && function.f == 0.0 ?
|
||||
x -> rcpResponse(x, function.a, function.b,
|
||||
function.c, function.d, function.g) :
|
||||
@@ -2846,7 +2865,7 @@ public abstract class ColorSpace {
|
||||
*
|
||||
* @return The destination array passed as a parameter
|
||||
*
|
||||
* @see #getWhitePoint(float[])
|
||||
* @see #getWhitePoint()
|
||||
*/
|
||||
@NonNull
|
||||
@Size(min = 2)
|
||||
@@ -2864,7 +2883,7 @@ public abstract class ColorSpace {
|
||||
*
|
||||
* @return A new non-null array of 2 floats
|
||||
*
|
||||
* @see #getWhitePoint()
|
||||
* @see #getWhitePoint(float[])
|
||||
*/
|
||||
@NonNull
|
||||
@Size(2)
|
||||
@@ -2878,12 +2897,16 @@ public abstract class ColorSpace {
|
||||
* destination. The x and y components of the first primary are written
|
||||
* in the array at positions 0 and 1 respectively.
|
||||
*
|
||||
* <p>Note: Some ColorSpaces represent gray profiles. The concept of
|
||||
* primaries for such a ColorSpace does not make sense, so we use a special
|
||||
* set of primaries that are all 1s.</p>
|
||||
*
|
||||
* @param primaries The destination array, cannot be null, its length
|
||||
* must be >= 6
|
||||
*
|
||||
* @return The destination array passed as a parameter
|
||||
*
|
||||
* @see #getPrimaries(float[])
|
||||
* @see #getPrimaries()
|
||||
*/
|
||||
@NonNull
|
||||
@Size(min = 6)
|
||||
@@ -2898,9 +2921,13 @@ public abstract class ColorSpace {
|
||||
* the destination. The x and y components of the first primary are
|
||||
* written in the array at positions 0 and 1 respectively.
|
||||
*
|
||||
* <p>Note: Some ColorSpaces represent gray profiles. The concept of
|
||||
* primaries for such a ColorSpace does not make sense, so we use a special
|
||||
* set of primaries that are all 1s.</p>
|
||||
*
|
||||
* @return A new non-null array of 2 floats
|
||||
*
|
||||
* @see #getWhitePoint()
|
||||
* @see #getPrimaries(float[])
|
||||
*/
|
||||
@NonNull
|
||||
@Size(6)
|
||||
@@ -2922,7 +2949,7 @@ public abstract class ColorSpace {
|
||||
*
|
||||
* @return The destination array passed as a parameter
|
||||
*
|
||||
* @see #getInverseTransform()
|
||||
* @see #getTransform()
|
||||
*/
|
||||
@NonNull
|
||||
@Size(min = 9)
|
||||
@@ -2942,7 +2969,7 @@ public abstract class ColorSpace {
|
||||
*
|
||||
* @return A new array of 9 floats
|
||||
*
|
||||
* @see #getInverseTransform(float[])
|
||||
* @see #getTransform(float[])
|
||||
*/
|
||||
@NonNull
|
||||
@Size(9)
|
||||
@@ -2964,7 +2991,7 @@ public abstract class ColorSpace {
|
||||
*
|
||||
* @return The destination array passed as a parameter
|
||||
*
|
||||
* @see #getTransform()
|
||||
* @see #getInverseTransform()
|
||||
*/
|
||||
@NonNull
|
||||
@Size(min = 9)
|
||||
@@ -2984,7 +3011,7 @@ public abstract class ColorSpace {
|
||||
*
|
||||
* @return A new array of 9 floats
|
||||
*
|
||||
* @see #getTransform(float[])
|
||||
* @see #getInverseTransform(float[])
|
||||
*/
|
||||
@NonNull
|
||||
@Size(9)
|
||||
@@ -3287,6 +3314,16 @@ public abstract class ColorSpace {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Report whether this matrix is a special gray matrix.
|
||||
* @param toXYZ A XYZD50 matrix. Skia uses a special form for a gray profile.
|
||||
* @return true if this is a special gray matrix.
|
||||
*/
|
||||
private static boolean isGray(@NonNull @Size(9) float[] toXYZ) {
|
||||
return toXYZ.length == 9 && toXYZ[1] == 0 && toXYZ[2] == 0 && toXYZ[3] == 0
|
||||
&& toXYZ[5] == 0 && toXYZ[6] == 0 && toXYZ[7] == 0;
|
||||
}
|
||||
|
||||
private static boolean compare(double point, @NonNull DoubleUnaryOperator a,
|
||||
@NonNull DoubleUnaryOperator b) {
|
||||
double rA = a.applyAsDouble(point);
|
||||
|
||||
Reference in New Issue
Block a user