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

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

Issue 2670773002: Towards deleting YUV to RGB computation redundancy (Closed)
Patch Set: Explicitly mark constants as float Created 3 years, 10 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') | ui/gfx/color_space_unittest.cc » ('j') | 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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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_space.h" 5 #include "ui/gfx/color_space.h"
6 6
7 #include <map> 7 #include <map>
8 8
9 #include "base/lazy_instance.h" 9 #include "base/lazy_instance.h"
10 #include "base/synchronization/lock.h" 10 #include "base/synchronization/lock.h"
11 #include "third_party/skia/include/core/SkColorSpace.h" 11 #include "third_party/skia/include/core/SkColorSpace.h"
12 #include "ui/gfx/icc_profile.h" 12 #include "ui/gfx/icc_profile.h"
13 #include "ui/gfx/transform.h"
13 14
14 namespace gfx { 15 namespace gfx {
15 16
16 namespace { 17 namespace {
17 18
18 SkColorSpaceTransferFn InvertTransferFn(SkColorSpaceTransferFn fn) { 19 SkColorSpaceTransferFn InvertTransferFn(SkColorSpaceTransferFn fn) {
19 SkColorSpaceTransferFn fn_inv = {0}; 20 SkColorSpaceTransferFn fn_inv = {0};
20 if (fn.fA > 0 && fn.fG > 0) { 21 if (fn.fA > 0 && fn.fG > 0) {
21 double a_to_the_g = pow(fn.fA, fn.fG); 22 double a_to_the_g = pow(fn.fA, fn.fG);
22 fn_inv.fA = 1.f / a_to_the_g; 23 fn_inv.fA = 1.f / a_to_the_g;
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 } 110 }
110 111
111 // Static 112 // Static
112 ColorSpace ColorSpace::CreateXYZD50() { 113 ColorSpace ColorSpace::CreateXYZD50() {
113 return ColorSpace(PrimaryID::XYZ_D50, TransferID::LINEAR, MatrixID::RGB, 114 return ColorSpace(PrimaryID::XYZ_D50, TransferID::LINEAR, MatrixID::RGB,
114 RangeID::FULL); 115 RangeID::FULL);
115 } 116 }
116 117
117 // static 118 // static
118 ColorSpace ColorSpace::CreateJpeg() { 119 ColorSpace ColorSpace::CreateJpeg() {
119 return ColorSpace(PrimaryID::BT709, TransferID::IEC61966_2_1, MatrixID::BT709, 120 // TODO(ccameron): Determine which primaries and transfer function were
120 RangeID::FULL); 121 // intended here.
122 return ColorSpace(PrimaryID::BT709, TransferID::IEC61966_2_1,
123 MatrixID::SMPTE170M, RangeID::FULL);
121 } 124 }
122 125
123 // static 126 // static
124 ColorSpace ColorSpace::CreateREC601() { 127 ColorSpace ColorSpace::CreateREC601() {
125 return ColorSpace(PrimaryID::SMPTE170M, TransferID::SMPTE170M, 128 return ColorSpace(PrimaryID::SMPTE170M, TransferID::SMPTE170M,
126 MatrixID::SMPTE170M, RangeID::LIMITED); 129 MatrixID::SMPTE170M, RangeID::LIMITED);
127 } 130 }
128 131
129 // static 132 // static
130 ColorSpace ColorSpace::CreateREC709() { 133 ColorSpace ColorSpace::CreateREC709() {
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after
473 return false; 476 return false;
474 } 477 }
475 478
476 bool ColorSpace::GetInverseTransferFunction(SkColorSpaceTransferFn* fn) const { 479 bool ColorSpace::GetInverseTransferFunction(SkColorSpaceTransferFn* fn) const {
477 if (!GetTransferFunction(fn)) 480 if (!GetTransferFunction(fn))
478 return false; 481 return false;
479 *fn = InvertTransferFn(*fn); 482 *fn = InvertTransferFn(*fn);
480 return true; 483 return true;
481 } 484 }
482 485
486 void ColorSpace::GetTransferMatrix(SkMatrix44* matrix) const {
487 float Kr = 0;
488 float Kb = 0;
489 switch (matrix_) {
490 case ColorSpace::MatrixID::RGB:
491 matrix->setIdentity();
492 return;
493
494 case ColorSpace::MatrixID::BT709:
495 case ColorSpace::MatrixID::UNSPECIFIED:
496 case ColorSpace::MatrixID::RESERVED:
497 case ColorSpace::MatrixID::UNKNOWN:
498 Kr = 0.2126f;
499 Kb = 0.0722f;
500 break;
501
502 case ColorSpace::MatrixID::FCC:
503 Kr = 0.30f;
504 Kb = 0.11f;
505 break;
506
507 case ColorSpace::MatrixID::BT470BG:
508 case ColorSpace::MatrixID::SMPTE170M:
509 Kr = 0.299f;
510 Kb = 0.114f;
511 break;
512
513 case ColorSpace::MatrixID::SMPTE240M:
514 Kr = 0.212f;
515 Kb = 0.087f;
516 break;
517
518 case ColorSpace::MatrixID::YCOCG: {
519 float data[16] = {
520 0.25f, 0.5f, 0.25f, 0.5f, // Y
521 -0.25f, 0.5f, -0.25f, 0.5f, // Cg
522 0.5f, 0.0f, -0.5f, 0.0f, // Co
523 0.0f, 0.0f, 0.0f, 1.0f
524 };
525 matrix->setRowMajorf(data);
526 return;
527 }
528
529 // BT2020_CL is a special case.
530 // Basically we return a matrix that transforms RGB values
531 // to RYB values. (We replace the green component with the
532 // the luminance.) Later steps will compute the Cb & Cr values.
533 case ColorSpace::MatrixID::BT2020_CL: {
534 Kr = 0.2627f;
535 Kb = 0.0593f;
536 float data[16] = {
537 1.0f, 0.0f, 0.0f, 0.0f, // R
538 Kr, 1.0f - Kr - Kb, Kb, 0.0f, // Y
539 0.0f, 0.0f, 1.0f, 0.0f, // B
540 0.0f, 0.0f, 0.0f, 1.0f
541 };
542 matrix->setRowMajorf(data);
543 return;
544 }
545
546 case ColorSpace::MatrixID::BT2020_NCL:
547 Kr = 0.2627f;
548 Kb = 0.0593f;
549 break;
550
551 case ColorSpace::MatrixID::YDZDX: {
552 float data[16] = {
553 0.0f, 1.0f, 0.0f, 0.0f, // Y
554 0.0f, -0.5f, 0.986566f / 2.0f, 0.5f, // DX or DZ
555 0.5f, -0.991902f / 2.0f, 0.0f, 0.5f, // DZ or DX
556 0.0f, 0.0f, 0.0f, 1.0f,
557 };
558 matrix->setRowMajorf(data);
559 return;
560 }
561 }
562 float Kg = 1.0f - Kr - Kb;
563 float u_m = 0.5f / (1.0f - Kb);
564 float v_m = 0.5f / (1.0f - Kr);
565 float data[16] = {
566 Kr, Kg, Kb, 0.0f, // Y
567 u_m * -Kr, u_m * -Kg, u_m * (1.0f - Kb), 0.5f, // U
568 v_m * (1.0f - Kr), v_m * -Kg, v_m * -Kb, 0.5f, // V
569 0.0f, 0.0f, 0.0f, 1.0f,
570 };
571 matrix->setRowMajorf(data);
572 }
573
574 void ColorSpace::GetRangeAdjustMatrix(SkMatrix44* matrix) const {
575 switch (range_) {
576 case RangeID::FULL:
577 case RangeID::UNSPECIFIED:
578 matrix->setIdentity();
579 return;
580
581 case RangeID::DERIVED:
582 case RangeID::LIMITED:
583 break;
584 }
585 switch (matrix_) {
586 case MatrixID::RGB:
587 case MatrixID::YCOCG:
588 matrix->setScale(255.0f/219.0f, 255.0f/219.0f, 255.0f/219.0f);
589 matrix->postTranslate(-16.0f/219.0f, -16.0f/219.0f, -16.0f/219.0f);
590 break;
591
592 case MatrixID::BT709:
593 case MatrixID::UNSPECIFIED:
594 case MatrixID::RESERVED:
595 case MatrixID::FCC:
596 case MatrixID::BT470BG:
597 case MatrixID::SMPTE170M:
598 case MatrixID::SMPTE240M:
599 case MatrixID::BT2020_NCL:
600 case MatrixID::BT2020_CL:
601 case MatrixID::YDZDX:
602 case MatrixID::UNKNOWN:
603 matrix->setScale(255.0f/219.0f, 255.0f/224.0f, 255.0f/224.0f);
604 matrix->postTranslate(-16.0f/219.0f, -15.5f/224.0f, -15.5f/224.0f);
605 break;
606 }
607 }
608
483 } // namespace gfx 609 } // namespace gfx
OLDNEW
« no previous file with comments | « ui/gfx/color_space.h ('k') | ui/gfx/color_space_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698