| Index: ui/gfx/color_transform.cc
|
| diff --git a/ui/gfx/color_transform.cc b/ui/gfx/color_transform.cc
|
| index 37818466d702e0214dbaf47e850f229e5d7d760f..fe0f661535bcb2e51ef3be25ee81efe84cc93a9f 100644
|
| --- a/ui/gfx/color_transform.cc
|
| +++ b/ui/gfx/color_transform.cc
|
| @@ -40,18 +40,18 @@ ColorTransform::TriStim Xy2xyz(float x, float y) {
|
| void GetPrimaries(ColorSpace::PrimaryID id,
|
| ColorTransform::TriStim primaries[4]) {
|
| switch (id) {
|
| - default:
|
| - // If we don't know, assume BT709
|
| + case ColorSpace::PrimaryID::CUSTOM:
|
| + NOTREACHED();
|
|
|
| + case ColorSpace::PrimaryID::RESERVED0:
|
| + case ColorSpace::PrimaryID::RESERVED:
|
| + case ColorSpace::PrimaryID::UNSPECIFIED:
|
| + case ColorSpace::PrimaryID::UNKNOWN:
|
| case ColorSpace::PrimaryID::BT709:
|
| - // Red
|
| - primaries[0] = Xy2xyz(0.640f, 0.330f);
|
| - // Green
|
| - primaries[1] = Xy2xyz(0.300f, 0.600f);
|
| - // Blue
|
| - primaries[2] = Xy2xyz(0.150f, 0.060f);
|
| - // Whitepoint (D65f)
|
| - primaries[3] = Xy2xyz(0.3127f, 0.3290f);
|
| + // BT709 is our default case. Put it after the switch just
|
| + // in case we somehow get an id which is not listed in the switch.
|
| + // (We don't want to use "default", because we want the compiler
|
| + // to tell us if we forgot some enum values.)
|
| break;
|
|
|
| case ColorSpace::PrimaryID::BT470M:
|
| @@ -63,7 +63,7 @@ void GetPrimaries(ColorSpace::PrimaryID id,
|
| primaries[2] = Xy2xyz(0.14f, 0.08f);
|
| // Whitepoint
|
| primaries[3] = Xy2xyz(0.31f, 0.316f);
|
| - break;
|
| + return;
|
|
|
| case ColorSpace::PrimaryID::BT470BG:
|
| // Red
|
| @@ -74,7 +74,7 @@ void GetPrimaries(ColorSpace::PrimaryID id,
|
| primaries[2] = Xy2xyz(0.15f, 0.06f);
|
| // Whitepoint (D65f)
|
| primaries[3] = Xy2xyz(0.3127f, 0.3290f);
|
| - break;
|
| + return;
|
|
|
| case ColorSpace::PrimaryID::SMPTE170M:
|
| case ColorSpace::PrimaryID::SMPTE240M:
|
| @@ -86,7 +86,7 @@ void GetPrimaries(ColorSpace::PrimaryID id,
|
| primaries[2] = Xy2xyz(0.155f, 0.070f);
|
| // Whitepoint (D65f)
|
| primaries[3] = Xy2xyz(0.3127f, 0.3290f);
|
| - break;
|
| + return;
|
|
|
| case ColorSpace::PrimaryID::FILM:
|
| // Red
|
| @@ -97,7 +97,7 @@ void GetPrimaries(ColorSpace::PrimaryID id,
|
| primaries[2] = Xy2xyz(0.145f, 0.049f);
|
| // Whitepoint (Cf)
|
| primaries[3] = Xy2xyz(0.310f, 0.136f);
|
| - break;
|
| + return;
|
|
|
| case ColorSpace::PrimaryID::BT2020:
|
| // Red
|
| @@ -108,7 +108,7 @@ void GetPrimaries(ColorSpace::PrimaryID id,
|
| primaries[2] = Xy2xyz(0.131f, 0.046f);
|
| // Whitepoint (D65f)
|
| primaries[3] = Xy2xyz(0.3127f, 0.3290f);
|
| - break;
|
| + return;
|
|
|
| case ColorSpace::PrimaryID::SMPTEST428_1:
|
| // X
|
| @@ -119,7 +119,7 @@ void GetPrimaries(ColorSpace::PrimaryID id,
|
| primaries[2] = Xy2xyz(0.0f, 0.0f);
|
| // Whitepoint (Ef)
|
| primaries[3] = Xy2xyz(1.0f / 3.0f, 1.0f / 3.0f);
|
| - break;
|
| + return;
|
|
|
| case ColorSpace::PrimaryID::SMPTEST431_2:
|
| // Red
|
| @@ -130,7 +130,7 @@ void GetPrimaries(ColorSpace::PrimaryID id,
|
| primaries[2] = Xy2xyz(0.150f, 0.060f);
|
| // Whitepoint
|
| primaries[3] = Xy2xyz(0.314f, 0.351f);
|
| - break;
|
| + return;
|
|
|
| case ColorSpace::PrimaryID::SMPTEST432_1:
|
| // Red
|
| @@ -141,7 +141,7 @@ void GetPrimaries(ColorSpace::PrimaryID id,
|
| primaries[2] = Xy2xyz(0.150f, 0.060f);
|
| // Whitepoint (D65f)
|
| primaries[3] = Xy2xyz(0.3127f, 0.3290f);
|
| - break;
|
| + return;
|
|
|
| case ColorSpace::PrimaryID::XYZ_D50:
|
| // X
|
| @@ -152,8 +152,17 @@ void GetPrimaries(ColorSpace::PrimaryID id,
|
| primaries[2] = Xy2xyz(0.0f, 0.0f);
|
| // D50
|
| primaries[3] = Xy2xyz(0.34567f, 0.35850f);
|
| - break;
|
| + return;
|
| }
|
| +
|
| + // Red
|
| + primaries[0] = Xy2xyz(0.640f, 0.330f);
|
| + // Green
|
| + primaries[1] = Xy2xyz(0.300f, 0.600f);
|
| + // Blue
|
| + primaries[2] = Xy2xyz(0.150f, 0.060f);
|
| + // Whitepoint (D65f)
|
| + primaries[3] = Xy2xyz(0.3127f, 0.3290f);
|
| }
|
|
|
| GFX_EXPORT Transform GetPrimaryMatrix(ColorSpace::PrimaryID id) {
|
| @@ -191,20 +200,24 @@ GFX_EXPORT Transform GetPrimaryMatrix(ColorSpace::PrimaryID id) {
|
|
|
| GFX_EXPORT float FromLinear(ColorSpace::TransferID id, float v) {
|
| switch (id) {
|
| - default:
|
| + case ColorSpace::TransferID::SMPTEST2084_NON_HDR:
|
| + // Should already be handled.
|
| + NOTREACHED();
|
| + case ColorSpace::TransferID::CUSTOM:
|
| + // TODO(hubbe): Actually implement custom transfer functions.
|
| + case ColorSpace::TransferID::RESERVED0:
|
| + case ColorSpace::TransferID::RESERVED:
|
| + case ColorSpace::TransferID::UNSPECIFIED:
|
| + case ColorSpace::TransferID::UNKNOWN:
|
| + // All unknown values default to BT709
|
| +
|
| case ColorSpace::TransferID::BT709:
|
| case ColorSpace::TransferID::SMPTE170M:
|
| case ColorSpace::TransferID::BT2020_10:
|
| - case ColorSpace::TransferID::BT2020_12: {
|
| - v = fmax(0.0f, v);
|
| - float a = 1.099296826809442f;
|
| - float b = 0.018053968510807f;
|
| - if (v <= b) {
|
| - return 4.5f * v;
|
| - } else {
|
| - return a * powf(v, 0.45f) - (a - 1.0f);
|
| - }
|
| - }
|
| + case ColorSpace::TransferID::BT2020_12:
|
| + // BT709 is our "default" cause, so put the code after the switch
|
| + // to avoid "control reaches end of non-void function" errors.
|
| + break;
|
|
|
| case ColorSpace::TransferID::GAMMA22:
|
| v = fmax(0.0f, v);
|
| @@ -305,24 +318,34 @@ GFX_EXPORT float FromLinear(ColorSpace::TransferID id, float v) {
|
| v = fmax(0.0f, v);
|
| return powf(v, 1.0f / 2.4f);
|
| }
|
| +
|
| + v = fmax(0.0f, v);
|
| + float a = 1.099296826809442f;
|
| + float b = 0.018053968510807f;
|
| + if (v <= b) {
|
| + return 4.5f * v;
|
| + } else {
|
| + return a * powf(v, 0.45f) - (a - 1.0f);
|
| + }
|
| }
|
|
|
| GFX_EXPORT float ToLinear(ColorSpace::TransferID id, float v) {
|
| switch (id) {
|
| - default:
|
| + case ColorSpace::TransferID::CUSTOM:
|
| + // TODO(hubbe): Actually implement custom transfer functions.
|
| + case ColorSpace::TransferID::RESERVED0:
|
| + case ColorSpace::TransferID::RESERVED:
|
| + case ColorSpace::TransferID::UNSPECIFIED:
|
| + case ColorSpace::TransferID::UNKNOWN:
|
| + // All unknown values default to BT709
|
| +
|
| case ColorSpace::TransferID::BT709:
|
| case ColorSpace::TransferID::SMPTE170M:
|
| case ColorSpace::TransferID::BT2020_10:
|
| - case ColorSpace::TransferID::BT2020_12: {
|
| - v = fmax(0.0f, v);
|
| - float a = 1.099296826809442f;
|
| - float b = 0.018053968510807f;
|
| - if (v < FromLinear(ColorSpace::TransferID::BT709, b)) {
|
| - return v / 4.5f;
|
| - } else {
|
| - return powf((v + a - 1.0f) / a, 1.0f / 0.45f);
|
| - }
|
| - }
|
| + case ColorSpace::TransferID::BT2020_12:
|
| + // BT709 is our "default" cause, so put the code after the switch
|
| + // to avoid "control reaches end of non-void function" errors.
|
| + break;
|
|
|
| case ColorSpace::TransferID::GAMMA22:
|
| v = fmax(0.0f, v);
|
| @@ -432,6 +455,15 @@ GFX_EXPORT float ToLinear(ColorSpace::TransferID id, float v) {
|
| return v_ / Lmax;
|
| }
|
| }
|
| +
|
| + v = fmax(0.0f, v);
|
| + float a = 1.099296826809442f;
|
| + float b = 0.018053968510807f;
|
| + if (v < FromLinear(ColorSpace::TransferID::BT709, b)) {
|
| + return v / 4.5f;
|
| + } else {
|
| + return powf((v + a - 1.0f) / a, 1.0f / 0.45f);
|
| + }
|
| }
|
|
|
| namespace {
|
| @@ -461,7 +493,9 @@ GFX_EXPORT ColorTransform::TriStim ToLinear(ColorSpace::TransferID id,
|
| }
|
|
|
| GFX_EXPORT Transform GetTransferMatrix(ColorSpace::MatrixID id) {
|
| - float Kr = 0.0f, Kb = 0.0f;
|
| + // Default values for BT709;
|
| + float Kr = 0.2126f;
|
| + float Kb = 0.0722f;
|
| switch (id) {
|
| case ColorSpace::MatrixID::RGB:
|
| return Transform();
|
| @@ -469,8 +503,8 @@ GFX_EXPORT Transform GetTransferMatrix(ColorSpace::MatrixID id) {
|
| case ColorSpace::MatrixID::BT709:
|
| case ColorSpace::MatrixID::UNSPECIFIED:
|
| case ColorSpace::MatrixID::RESERVED:
|
| - Kr = 0.2126f;
|
| - Kb = 0.0722f;
|
| + case ColorSpace::MatrixID::UNKNOWN:
|
| + // Default values are already set.
|
| break;
|
|
|
| case ColorSpace::MatrixID::FCC:
|
| @@ -544,6 +578,7 @@ Transform GetRangeAdjustMatrix(ColorSpace::RangeID range,
|
| case ColorSpace::MatrixID::BT2020_NCL:
|
| case ColorSpace::MatrixID::BT2020_CL:
|
| case ColorSpace::MatrixID::YDZDX:
|
| + case ColorSpace::MatrixID::UNKNOWN:
|
| return Transform(255.0f / 219.0f, 0.0f, 0.0f, -16.0f / 219.0f, // 1
|
| 0.0f, 255.0f / 224.0f, 0.0f, -15.5f / 224.0f, // 2
|
| 0.0f, 0.0f, 255.0f / 224.0f, -15.5f / 224.0f, // 3
|
|
|