OLD | NEW |
1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/gfx/color_transform.h" | 5 #include "ui/gfx/color_transform.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "ui/gfx/color_space.h" | 10 #include "ui/gfx/color_space.h" |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 float c1 = 3424.0f / 4096.0f; | 280 float c1 = 3424.0f / 4096.0f; |
281 float c2 = (2413.0f / 4096.0f) * 32.0f; | 281 float c2 = (2413.0f / 4096.0f) * 32.0f; |
282 float c3 = (2392.0f / 4096.0f) * 32.0f; | 282 float c3 = (2392.0f / 4096.0f) * 32.0f; |
283 return powf((c1 + c2 * powf(v, m1)) / (1.0f + c3 * powf(v, m1)), m2); | 283 return powf((c1 + c2 * powf(v, m1)) / (1.0f + c3 * powf(v, m1)), m2); |
284 } | 284 } |
285 | 285 |
286 case ColorSpace::TransferID::SMPTEST428_1: | 286 case ColorSpace::TransferID::SMPTEST428_1: |
287 v = fmax(0.0f, v); | 287 v = fmax(0.0f, v); |
288 return powf(48.0f * v + 52.37f, 1.0f / 2.6f); | 288 return powf(48.0f * v + 52.37f, 1.0f / 2.6f); |
289 | 289 |
| 290 // Spec: http://www.arib.or.jp/english/html/overview/doc/2-STD-B67v1_0.pdf |
| 291 case ColorSpace::TransferID::ARIB_STD_B67: { |
| 292 const float a = 0.17883277f; |
| 293 const float b = 0.28466892f; |
| 294 const float c = 0.55991073f; |
| 295 const float Lmax = 12.0f; |
| 296 v = Lmax * fmax(0.0f, v); |
| 297 if (v <= 1) |
| 298 return 0.5f * sqrtf(v); |
| 299 else |
| 300 return a * log(v - b) + c; |
| 301 } |
| 302 |
290 // Chrome-specific values below | 303 // Chrome-specific values below |
291 case ColorSpace::TransferID::GAMMA24: | 304 case ColorSpace::TransferID::GAMMA24: |
292 v = fmax(0.0f, v); | 305 v = fmax(0.0f, v); |
293 return powf(v, 1.0f / 2.4f); | 306 return powf(v, 1.0f / 2.4f); |
294 } | 307 } |
295 } | 308 } |
296 | 309 |
297 GFX_EXPORT float ToLinear(ColorSpace::TransferID id, float v) { | 310 GFX_EXPORT float ToLinear(ColorSpace::TransferID id, float v) { |
298 switch (id) { | 311 switch (id) { |
299 default: | 312 default: |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
395 return (powf(v, 2.6f) - 52.37f) / 48.0f; | 408 return (powf(v, 2.6f) - 52.37f) / 48.0f; |
396 | 409 |
397 // Chrome-specific values below | 410 // Chrome-specific values below |
398 case ColorSpace::TransferID::GAMMA24: | 411 case ColorSpace::TransferID::GAMMA24: |
399 v = fmax(0.0f, v); | 412 v = fmax(0.0f, v); |
400 return powf(v, 2.4f); | 413 return powf(v, 2.4f); |
401 | 414 |
402 case ColorSpace::TransferID::SMPTEST2084_NON_HDR: | 415 case ColorSpace::TransferID::SMPTEST2084_NON_HDR: |
403 v = fmax(0.0f, v); | 416 v = fmax(0.0f, v); |
404 return fmin(2.3f * pow(v, 2.8f), v / 5.0f + 0.8f); | 417 return fmin(2.3f * pow(v, 2.8f), v / 5.0f + 0.8f); |
| 418 |
| 419 // Spec: http://www.arib.or.jp/english/html/overview/doc/2-STD-B67v1_0.pdf |
| 420 case ColorSpace::TransferID::ARIB_STD_B67: { |
| 421 v = fmax(0.0f, v); |
| 422 const float a = 0.17883277f; |
| 423 const float b = 0.28466892f; |
| 424 const float c = 0.55991073f; |
| 425 const float Lmax = 12.0f; |
| 426 float v_ = 0.0f; |
| 427 if (v <= 0.5f) { |
| 428 v_ = (v * 2.0f) * (v * 2.0f); |
| 429 } else { |
| 430 v_ = exp((v - c) / a) + b; |
| 431 } |
| 432 return v_ / Lmax; |
| 433 } |
405 } | 434 } |
406 } | 435 } |
407 | 436 |
408 namespace { | 437 namespace { |
409 // Assumes bt2020 | 438 // Assumes bt2020 |
410 float Luma(const ColorTransform::TriStim& c) { | 439 float Luma(const ColorTransform::TriStim& c) { |
411 return c.x() * 0.2627f + c.y() * 0.6780f + c.z() * 0.0593f; | 440 return c.x() * 0.2627f + c.y() * 0.6780f + c.z() * 0.0593f; |
412 } | 441 } |
413 }; | 442 }; |
414 | 443 |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
699 std::unique_ptr<ColorTransform>( | 728 std::unique_ptr<ColorTransform>( |
700 new QCMSColorTransform(GetXYZD50Profile(), to_profile)))); | 729 new QCMSColorTransform(GetXYZD50Profile(), to_profile)))); |
701 } else { | 730 } else { |
702 return std::unique_ptr<ColorTransform>( | 731 return std::unique_ptr<ColorTransform>( |
703 new ColorSpaceToColorSpaceTransform(from, to, intent)); | 732 new ColorSpaceToColorSpaceTransform(from, to, intent)); |
704 } | 733 } |
705 } | 734 } |
706 } | 735 } |
707 | 736 |
708 } // namespace gfx | 737 } // namespace gfx |
OLD | NEW |