Index: ui/gfx/color_space.cc |
diff --git a/ui/gfx/color_space.cc b/ui/gfx/color_space.cc |
index 62ddbe0679d8e94430fa73e9213fbce48c6e8f26..36db0ed95cfd8ab7e91230ce609c195d35c788c2 100644 |
--- a/ui/gfx/color_space.cc |
+++ b/ui/gfx/color_space.cc |
@@ -10,6 +10,7 @@ |
#include "base/synchronization/lock.h" |
#include "third_party/skia/include/core/SkColorSpace.h" |
#include "ui/gfx/icc_profile.h" |
+#include "ui/gfx/transform.h" |
namespace gfx { |
@@ -116,8 +117,10 @@ ColorSpace ColorSpace::CreateXYZD50() { |
// static |
ColorSpace ColorSpace::CreateJpeg() { |
- return ColorSpace(PrimaryID::BT709, TransferID::IEC61966_2_1, MatrixID::BT709, |
- RangeID::FULL); |
+ // TODO(ccameron): Determine which primaries and transfer function were |
+ // intended here. |
+ return ColorSpace(PrimaryID::BT709, TransferID::IEC61966_2_1, |
+ MatrixID::SMPTE170M, RangeID::FULL); |
} |
// static |
@@ -480,4 +483,127 @@ bool ColorSpace::GetInverseTransferFunction(SkColorSpaceTransferFn* fn) const { |
return true; |
} |
+void ColorSpace::GetTransferMatrix(SkMatrix44* matrix) const { |
+ float Kr = 0; |
+ float Kb = 0; |
+ switch (matrix_) { |
+ case ColorSpace::MatrixID::RGB: |
+ matrix->setIdentity(); |
+ return; |
+ |
+ case ColorSpace::MatrixID::BT709: |
+ case ColorSpace::MatrixID::UNSPECIFIED: |
+ case ColorSpace::MatrixID::RESERVED: |
+ case ColorSpace::MatrixID::UNKNOWN: |
+ Kr = 0.2126f; |
+ Kb = 0.0722f; |
+ break; |
+ |
+ case ColorSpace::MatrixID::FCC: |
+ Kr = 0.30f; |
+ Kb = 0.11f; |
+ break; |
+ |
+ case ColorSpace::MatrixID::BT470BG: |
+ case ColorSpace::MatrixID::SMPTE170M: |
+ Kr = 0.299f; |
+ Kb = 0.114f; |
+ break; |
+ |
+ case ColorSpace::MatrixID::SMPTE240M: |
+ Kr = 0.212f; |
+ Kb = 0.087f; |
+ break; |
+ |
+ case ColorSpace::MatrixID::YCOCG: { |
+ float data[16] = { |
+ 0.25f, 0.5f, 0.25f, 0.5f, // Y |
+ -0.25f, 0.5f, -0.25f, 0.5f, // Cg |
+ 0.5f, 0.0f, -0.5f, 0.0f, // Co |
+ 0.0f, 0.0f, 0.0f, 1.0f |
+ }; |
+ matrix->setRowMajorf(data); |
+ return; |
+ } |
+ |
+ // BT2020_CL is a special case. |
+ // Basically we return a matrix that transforms RGB values |
+ // to RYB values. (We replace the green component with the |
+ // the luminance.) Later steps will compute the Cb & Cr values. |
+ case ColorSpace::MatrixID::BT2020_CL: { |
+ Kr = 0.2627f; |
+ Kb = 0.0593f; |
+ float data[16] = { |
+ 1.0f, 0.0f, 0.0f, 0.0f, // R |
+ Kr, 1.0f - Kr - Kb, Kb, 0.0f, // Y |
+ 0.0f, 0.0f, 1.0f, 0.0f, // B |
+ 0.0f, 0.0f, 0.0f, 1.0f |
+ }; |
+ matrix->setRowMajorf(data); |
+ return; |
+ } |
+ |
+ case ColorSpace::MatrixID::BT2020_NCL: |
+ Kr = 0.2627f; |
+ Kb = 0.0593f; |
+ break; |
+ |
+ case ColorSpace::MatrixID::YDZDX: { |
+ float data[16] = { |
+ 0.0f, 1.0f, 0.0f, 0.0f, // Y |
+ 0.0f, -0.5f, 0.986566f / 2.0f, 0.5f, // DX or DZ |
+ 0.5f, -0.991902f / 2.0f, 0.0f, 0.5f, // DZ or DX |
+ 0.0f, 0.0f, 0.0f, 1.0f, |
+ }; |
+ matrix->setRowMajorf(data); |
+ return; |
+ } |
+ } |
+ float Kg = 1.0f - Kr - Kb; |
+ float u_m = 0.5f / (1.0f - Kb); |
+ float v_m = 0.5f / (1.0f - Kr); |
+ float data[16] = { |
+ Kr, Kg, Kb, 0.0f, // Y |
+ u_m * -Kr, u_m * -Kg, u_m * (1.0f - Kb), 0.5f, // U |
+ v_m * (1.0f - Kr), v_m * -Kg, v_m * -Kb, 0.5f, // V |
+ 0.0f, 0.0f, 0.0f, 1.0f, |
+ }; |
+ matrix->setRowMajorf(data); |
+} |
+ |
+void ColorSpace::GetRangeAdjustMatrix(SkMatrix44* matrix) const { |
+ switch (range_) { |
+ case RangeID::FULL: |
+ case RangeID::UNSPECIFIED: |
+ matrix->setIdentity(); |
+ return; |
+ |
+ case RangeID::DERIVED: |
+ case RangeID::LIMITED: |
+ break; |
+ } |
+ switch (matrix_) { |
+ case MatrixID::RGB: |
+ case MatrixID::YCOCG: |
+ matrix->setScale(255.0f/219.0f, 255.0f/219.0f, 255.0f/219.0f); |
+ matrix->postTranslate(-16.0f/219.0f, -16.0f/219.0f, -16.0f/219.0f); |
+ break; |
+ |
+ case MatrixID::BT709: |
+ case MatrixID::UNSPECIFIED: |
+ case MatrixID::RESERVED: |
+ case MatrixID::FCC: |
+ case MatrixID::BT470BG: |
+ case MatrixID::SMPTE170M: |
+ case MatrixID::SMPTE240M: |
+ case MatrixID::BT2020_NCL: |
+ case MatrixID::BT2020_CL: |
+ case MatrixID::YDZDX: |
+ case MatrixID::UNKNOWN: |
+ matrix->setScale(255.0f/219.0f, 255.0f/224.0f, 255.0f/224.0f); |
+ matrix->postTranslate(-16.0f/219.0f, -15.5f/224.0f, -15.5f/224.0f); |
+ break; |
+ } |
+} |
+ |
} // namespace gfx |