Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(581)

Side by Side Diff: ui/gfx/color_transform.cc

Issue 2300813002: First cut at making HDR content viewable on SDR display with color management. (Closed)
Patch Set: comment update Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/gfx/color_space.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 1.0f / m1); 391 1.0f / m1);
392 } 392 }
393 393
394 case ColorSpace::TransferID::SMPTEST428_1: 394 case ColorSpace::TransferID::SMPTEST428_1:
395 return (powf(v, 2.6f) - 52.37f) / 48.0f; 395 return (powf(v, 2.6f) - 52.37f) / 48.0f;
396 396
397 // Chrome-specific values below 397 // Chrome-specific values below
398 case ColorSpace::TransferID::GAMMA24: 398 case ColorSpace::TransferID::GAMMA24:
399 v = fmax(0.0f, v); 399 v = fmax(0.0f, v);
400 return powf(v, 2.4f); 400 return powf(v, 2.4f);
401
402 case ColorSpace::TransferID::SMPTEST2084_NON_HDR:
403 v = fmax(0.0f, v);
404 return fmin(2.3f * pow(v, 2.8f), v / 5.0f + 0.8f);
401 } 405 }
402 } 406 }
403 407
408 namespace {
409 // Assumes bt2020
410 float Luma(const ColorTransform::TriStim& c) {
411 return c.x() * 0.2627f + c.y() * 0.6780f + c.z() * 0.0593f;
412 }
413 };
414
415 GFX_EXPORT ColorTransform::TriStim ToLinear(ColorSpace::TransferID id,
416 ColorTransform::TriStim color) {
417 ColorTransform::TriStim ret(ToLinear(id, color.x()), ToLinear(id, color.y()),
418 ToLinear(id, color.z()));
419
420 if (id == ColorSpace::TransferID::SMPTEST2084_NON_HDR) {
421 if (Luma(ret) > 0.0) {
422 ColorTransform::TriStim smpte2084(
423 ToLinear(ColorSpace::TransferID::SMPTEST2084, color.x()),
424 ToLinear(ColorSpace::TransferID::SMPTEST2084, color.y()),
425 ToLinear(ColorSpace::TransferID::SMPTEST2084, color.z()));
426 smpte2084.Scale(Luma(ret) / Luma(smpte2084));
427 ret = smpte2084;
428 }
429 }
430
431 return ret;
432 }
433
404 GFX_EXPORT Transform GetTransferMatrix(ColorSpace::MatrixID id) { 434 GFX_EXPORT Transform GetTransferMatrix(ColorSpace::MatrixID id) {
405 float Kr = 0.0f, Kb = 0.0f; 435 float Kr = 0.0f, Kb = 0.0f;
406 switch (id) { 436 switch (id) {
407 case ColorSpace::MatrixID::RGB: 437 case ColorSpace::MatrixID::RGB:
408 return Transform(); 438 return Transform();
409 439
410 case ColorSpace::MatrixID::BT709: 440 case ColorSpace::MatrixID::BT709:
411 case ColorSpace::MatrixID::UNSPECIFIED: 441 case ColorSpace::MatrixID::UNSPECIFIED:
412 case ColorSpace::MatrixID::RESERVED: 442 case ColorSpace::MatrixID::RESERVED:
413 Kr = 0.2126f; 443 Kr = 0.2126f;
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
502 : from_(from), to_(to) { 532 : from_(from), to_(to) {
503 if (intent == Intent::INTENT_PERCEPTUAL) { 533 if (intent == Intent::INTENT_PERCEPTUAL) {
504 switch (from_.transfer_) { 534 switch (from_.transfer_) {
505 case ColorSpace::TransferID::UNSPECIFIED: 535 case ColorSpace::TransferID::UNSPECIFIED:
506 case ColorSpace::TransferID::BT709: 536 case ColorSpace::TransferID::BT709:
507 case ColorSpace::TransferID::SMPTE170M: 537 case ColorSpace::TransferID::SMPTE170M:
508 // See SMPTE 1886 538 // See SMPTE 1886
509 from_.transfer_ = ColorSpace::TransferID::GAMMA24; 539 from_.transfer_ = ColorSpace::TransferID::GAMMA24;
510 break; 540 break;
511 541
542 case ColorSpace::TransferID::SMPTEST2084:
543 // We don't have an HDR display, so replace SMPTE 2084 with something
544 // that returns ranges more or less suitable for a normal display.
545 from_.transfer_ = ColorSpace::TransferID::SMPTEST2084_NON_HDR;
546 break;
547
512 default: // Do nothing 548 default: // Do nothing
513 break; 549 break;
514 } 550 }
515 551
516 // TODO(hubbe): shrink gamuts here (never stretch gamuts) 552 // TODO(hubbe): shrink gamuts here (never stretch gamuts)
517 } 553 }
518 554
519 Transform* from_transfer_matrix = 555 Transform* from_transfer_matrix =
520 from_.matrix_ == ColorSpace::MatrixID::BT2020_CL ? &b_ : &a_; 556 from_.matrix_ == ColorSpace::MatrixID::BT2020_CL ? &b_ : &a_;
521 Transform* to_transfer_matrix = 557 Transform* to_transfer_matrix =
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
663 std::unique_ptr<ColorTransform>( 699 std::unique_ptr<ColorTransform>(
664 new QCMSColorTransform(GetXYZD50Profile(), to_profile)))); 700 new QCMSColorTransform(GetXYZD50Profile(), to_profile))));
665 } else { 701 } else {
666 return std::unique_ptr<ColorTransform>( 702 return std::unique_ptr<ColorTransform>(
667 new ColorSpaceToColorSpaceTransform(from, to, intent)); 703 new ColorSpaceToColorSpaceTransform(from, to, intent));
668 } 704 }
669 } 705 }
670 } 706 }
671 707
672 } // namespace gfx 708 } // namespace gfx
OLDNEW
« no previous file with comments | « ui/gfx/color_space.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698