Index: ui/gfx/color_transform.cc |
diff --git a/ui/gfx/color_transform.cc b/ui/gfx/color_transform.cc |
index 4cbb325e3d15d83d751f0a18f403ab4fd08b154d..aeddd4cdb7d1d08cfbfc17a8aaebdd8508844dd6 100644 |
--- a/ui/gfx/color_transform.cc |
+++ b/ui/gfx/color_transform.cc |
@@ -398,9 +398,39 @@ GFX_EXPORT float ToLinear(ColorSpace::TransferID id, float v) { |
case ColorSpace::TransferID::GAMMA24: |
v = fmax(0.0f, v); |
return powf(v, 2.4f); |
+ |
+ case ColorSpace::TransferID::SMPTEST2084_NON_HDR: |
+ v = fmax(0.0f, v); |
+ return fmin(2.3f * pow(v, 2.8f), v / 5.0f + 0.8f); |
} |
} |
+namespace { |
+// Assumes bt2020 |
+float Luma(const ColorTransform::TriStim& c) { |
+ return c.x() * 0.2627f + c.y() * 0.6780f + c.z() * 0.0593f; |
+} |
+}; |
+ |
+GFX_EXPORT ColorTransform::TriStim ToLinear(ColorSpace::TransferID id, |
+ ColorTransform::TriStim color) { |
+ ColorTransform::TriStim ret(ToLinear(id, color.x()), ToLinear(id, color.y()), |
+ ToLinear(id, color.z())); |
+ |
+ if (id == ColorSpace::TransferID::SMPTEST2084_NON_HDR) { |
+ if (Luma(ret) > 0.0) { |
+ ColorTransform::TriStim smpte2084( |
+ ToLinear(ColorSpace::TransferID::SMPTEST2084, color.x()), |
+ ToLinear(ColorSpace::TransferID::SMPTEST2084, color.y()), |
+ ToLinear(ColorSpace::TransferID::SMPTEST2084, color.z())); |
+ smpte2084.Scale(Luma(ret) / Luma(smpte2084)); |
+ ret = smpte2084; |
+ } |
+ } |
+ |
+ return ret; |
+} |
+ |
GFX_EXPORT Transform GetTransferMatrix(ColorSpace::MatrixID id) { |
float Kr = 0.0f, Kb = 0.0f; |
switch (id) { |
@@ -509,6 +539,12 @@ class ColorSpaceToColorSpaceTransform : public ColorTransform { |
from_.transfer_ = ColorSpace::TransferID::GAMMA24; |
break; |
+ case ColorSpace::TransferID::SMPTEST2084: |
+ // We don't have an HDR display, so replace SMPTE 2084 with something |
+ // that returns ranges more or less suitable for a normal display. |
+ from_.transfer_ = ColorSpace::TransferID::SMPTEST2084_NON_HDR; |
+ break; |
+ |
default: // Do nothing |
break; |
} |