Index: ui/gfx/color_transform.cc |
diff --git a/ui/gfx/color_transform.cc b/ui/gfx/color_transform.cc |
index aeddd4cdb7d1d08cfbfc17a8aaebdd8508844dd6..6db577ab5c64da8deb16771f32977b3b76aea95a 100644 |
--- a/ui/gfx/color_transform.cc |
+++ b/ui/gfx/color_transform.cc |
@@ -287,6 +287,19 @@ GFX_EXPORT float FromLinear(ColorSpace::TransferID id, float v) { |
v = fmax(0.0f, v); |
return powf(48.0f * v + 52.37f, 1.0f / 2.6f); |
+ // Spec: http://www.arib.or.jp/english/html/overview/doc/2-STD-B67v1_0.pdf |
+ case ColorSpace::TransferID::ARIB_STD_B67: { |
+ const float a = 0.17883277f; |
+ const float b = 0.28466892f; |
+ const float c = 0.55991073f; |
+ const float Lmax = 12.0f; |
+ v = Lmax * fmax(0.0f, v); |
+ if (v <= 1) |
+ return 0.5f * sqrtf(v); |
+ else |
+ return a * log(v - b) + c; |
+ } |
+ |
// Chrome-specific values below |
case ColorSpace::TransferID::GAMMA24: |
v = fmax(0.0f, v); |
@@ -402,6 +415,22 @@ GFX_EXPORT float ToLinear(ColorSpace::TransferID id, float v) { |
case ColorSpace::TransferID::SMPTEST2084_NON_HDR: |
v = fmax(0.0f, v); |
return fmin(2.3f * pow(v, 2.8f), v / 5.0f + 0.8f); |
+ |
+ // Spec: http://www.arib.or.jp/english/html/overview/doc/2-STD-B67v1_0.pdf |
+ case ColorSpace::TransferID::ARIB_STD_B67: { |
+ v = fmax(0.0f, v); |
+ const float a = 0.17883277f; |
+ const float b = 0.28466892f; |
+ const float c = 0.55991073f; |
+ const float Lmax = 12.0f; |
+ float v_ = 0.0f; |
+ if (v <= 0.5f) { |
+ v_ = (v * 2.0f) * (v * 2.0f); |
+ } else { |
+ v_ = exp((v - c) / a) + b; |
+ } |
+ return v_ / Lmax; |
+ } |
} |
} |