| 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 22 matching lines...) Expand all Loading... |
| 33 return color; | 33 return color; |
| 34 } | 34 } |
| 35 | 35 |
| 36 ColorTransform::TriStim Xy2xyz(float x, float y) { | 36 ColorTransform::TriStim Xy2xyz(float x, float y) { |
| 37 return ColorTransform::TriStim(x, y, 1.0f - x - y); | 37 return ColorTransform::TriStim(x, y, 1.0f - x - y); |
| 38 } | 38 } |
| 39 | 39 |
| 40 void GetPrimaries(ColorSpace::PrimaryID id, | 40 void GetPrimaries(ColorSpace::PrimaryID id, |
| 41 ColorTransform::TriStim primaries[4]) { | 41 ColorTransform::TriStim primaries[4]) { |
| 42 switch (id) { | 42 switch (id) { |
| 43 default: | 43 case ColorSpace::PrimaryID::CUSTOM: |
| 44 // If we don't know, assume BT709 | 44 NOTREACHED(); |
| 45 | 45 |
| 46 case ColorSpace::PrimaryID::RESERVED0: |
| 47 case ColorSpace::PrimaryID::RESERVED: |
| 48 case ColorSpace::PrimaryID::UNSPECIFIED: |
| 49 case ColorSpace::PrimaryID::UNKNOWN: |
| 46 case ColorSpace::PrimaryID::BT709: | 50 case ColorSpace::PrimaryID::BT709: |
| 47 // Red | 51 // BT709 is our default case. Put it after the switch just |
| 48 primaries[0] = Xy2xyz(0.640f, 0.330f); | 52 // in case we somehow get an id which is not listed in the switch. |
| 49 // Green | 53 // (We don't want to use "default", because we want the compiler |
| 50 primaries[1] = Xy2xyz(0.300f, 0.600f); | 54 // to tell us if we forgot some enum values.) |
| 51 // Blue | 55 return; |
| 52 primaries[2] = Xy2xyz(0.150f, 0.060f); | |
| 53 // Whitepoint (D65f) | |
| 54 primaries[3] = Xy2xyz(0.3127f, 0.3290f); | |
| 55 break; | |
| 56 | 56 |
| 57 case ColorSpace::PrimaryID::BT470M: | 57 case ColorSpace::PrimaryID::BT470M: |
| 58 // Red | 58 // Red |
| 59 primaries[0] = Xy2xyz(0.67f, 0.33f); | 59 primaries[0] = Xy2xyz(0.67f, 0.33f); |
| 60 // Green | 60 // Green |
| 61 primaries[1] = Xy2xyz(0.21f, 0.71f); | 61 primaries[1] = Xy2xyz(0.21f, 0.71f); |
| 62 // Blue | 62 // Blue |
| 63 primaries[2] = Xy2xyz(0.14f, 0.08f); | 63 primaries[2] = Xy2xyz(0.14f, 0.08f); |
| 64 // Whitepoint | 64 // Whitepoint |
| 65 primaries[3] = Xy2xyz(0.31f, 0.316f); | 65 primaries[3] = Xy2xyz(0.31f, 0.316f); |
| 66 break; | 66 return; |
| 67 | 67 |
| 68 case ColorSpace::PrimaryID::BT470BG: | 68 case ColorSpace::PrimaryID::BT470BG: |
| 69 // Red | 69 // Red |
| 70 primaries[0] = Xy2xyz(0.64f, 0.33f); | 70 primaries[0] = Xy2xyz(0.64f, 0.33f); |
| 71 // Green | 71 // Green |
| 72 primaries[1] = Xy2xyz(0.29f, 0.60f); | 72 primaries[1] = Xy2xyz(0.29f, 0.60f); |
| 73 // Blue | 73 // Blue |
| 74 primaries[2] = Xy2xyz(0.15f, 0.06f); | 74 primaries[2] = Xy2xyz(0.15f, 0.06f); |
| 75 // Whitepoint (D65f) | 75 // Whitepoint (D65f) |
| 76 primaries[3] = Xy2xyz(0.3127f, 0.3290f); | 76 primaries[3] = Xy2xyz(0.3127f, 0.3290f); |
| 77 break; | 77 return; |
| 78 | 78 |
| 79 case ColorSpace::PrimaryID::SMPTE170M: | 79 case ColorSpace::PrimaryID::SMPTE170M: |
| 80 case ColorSpace::PrimaryID::SMPTE240M: | 80 case ColorSpace::PrimaryID::SMPTE240M: |
| 81 // Red | 81 // Red |
| 82 primaries[0] = Xy2xyz(0.630f, 0.340f); | 82 primaries[0] = Xy2xyz(0.630f, 0.340f); |
| 83 // Green | 83 // Green |
| 84 primaries[1] = Xy2xyz(0.310f, 0.595f); | 84 primaries[1] = Xy2xyz(0.310f, 0.595f); |
| 85 // Blue | 85 // Blue |
| 86 primaries[2] = Xy2xyz(0.155f, 0.070f); | 86 primaries[2] = Xy2xyz(0.155f, 0.070f); |
| 87 // Whitepoint (D65f) | 87 // Whitepoint (D65f) |
| 88 primaries[3] = Xy2xyz(0.3127f, 0.3290f); | 88 primaries[3] = Xy2xyz(0.3127f, 0.3290f); |
| 89 break; | 89 return; |
| 90 | 90 |
| 91 case ColorSpace::PrimaryID::FILM: | 91 case ColorSpace::PrimaryID::FILM: |
| 92 // Red | 92 // Red |
| 93 primaries[0] = Xy2xyz(0.681f, 0.319f); | 93 primaries[0] = Xy2xyz(0.681f, 0.319f); |
| 94 // Green | 94 // Green |
| 95 primaries[1] = Xy2xyz(0.243f, 0.692f); | 95 primaries[1] = Xy2xyz(0.243f, 0.692f); |
| 96 // Blue | 96 // Blue |
| 97 primaries[2] = Xy2xyz(0.145f, 0.049f); | 97 primaries[2] = Xy2xyz(0.145f, 0.049f); |
| 98 // Whitepoint (Cf) | 98 // Whitepoint (Cf) |
| 99 primaries[3] = Xy2xyz(0.310f, 0.136f); | 99 primaries[3] = Xy2xyz(0.310f, 0.136f); |
| 100 break; | 100 return; |
| 101 | 101 |
| 102 case ColorSpace::PrimaryID::BT2020: | 102 case ColorSpace::PrimaryID::BT2020: |
| 103 // Red | 103 // Red |
| 104 primaries[0] = Xy2xyz(0.708f, 0.292f); | 104 primaries[0] = Xy2xyz(0.708f, 0.292f); |
| 105 // Green | 105 // Green |
| 106 primaries[1] = Xy2xyz(0.170f, 0.797f); | 106 primaries[1] = Xy2xyz(0.170f, 0.797f); |
| 107 // Blue | 107 // Blue |
| 108 primaries[2] = Xy2xyz(0.131f, 0.046f); | 108 primaries[2] = Xy2xyz(0.131f, 0.046f); |
| 109 // Whitepoint (D65f) | 109 // Whitepoint (D65f) |
| 110 primaries[3] = Xy2xyz(0.3127f, 0.3290f); | 110 primaries[3] = Xy2xyz(0.3127f, 0.3290f); |
| 111 break; | 111 return; |
| 112 | 112 |
| 113 case ColorSpace::PrimaryID::SMPTEST428_1: | 113 case ColorSpace::PrimaryID::SMPTEST428_1: |
| 114 // X | 114 // X |
| 115 primaries[0] = Xy2xyz(1.0f, 0.0f); | 115 primaries[0] = Xy2xyz(1.0f, 0.0f); |
| 116 // Y | 116 // Y |
| 117 primaries[1] = Xy2xyz(0.0f, 1.0f); | 117 primaries[1] = Xy2xyz(0.0f, 1.0f); |
| 118 // Z | 118 // Z |
| 119 primaries[2] = Xy2xyz(0.0f, 0.0f); | 119 primaries[2] = Xy2xyz(0.0f, 0.0f); |
| 120 // Whitepoint (Ef) | 120 // Whitepoint (Ef) |
| 121 primaries[3] = Xy2xyz(1.0f / 3.0f, 1.0f / 3.0f); | 121 primaries[3] = Xy2xyz(1.0f / 3.0f, 1.0f / 3.0f); |
| 122 break; | 122 return; |
| 123 | 123 |
| 124 case ColorSpace::PrimaryID::SMPTEST431_2: | 124 case ColorSpace::PrimaryID::SMPTEST431_2: |
| 125 // Red | 125 // Red |
| 126 primaries[0] = Xy2xyz(0.680f, 0.320f); | 126 primaries[0] = Xy2xyz(0.680f, 0.320f); |
| 127 // Green | 127 // Green |
| 128 primaries[1] = Xy2xyz(0.265f, 0.690f); | 128 primaries[1] = Xy2xyz(0.265f, 0.690f); |
| 129 // Blue | 129 // Blue |
| 130 primaries[2] = Xy2xyz(0.150f, 0.060f); | 130 primaries[2] = Xy2xyz(0.150f, 0.060f); |
| 131 // Whitepoint | 131 // Whitepoint |
| 132 primaries[3] = Xy2xyz(0.314f, 0.351f); | 132 primaries[3] = Xy2xyz(0.314f, 0.351f); |
| 133 break; | 133 return; |
| 134 | 134 |
| 135 case ColorSpace::PrimaryID::SMPTEST432_1: | 135 case ColorSpace::PrimaryID::SMPTEST432_1: |
| 136 // Red | 136 // Red |
| 137 primaries[0] = Xy2xyz(0.680f, 0.320f); | 137 primaries[0] = Xy2xyz(0.680f, 0.320f); |
| 138 // Green | 138 // Green |
| 139 primaries[1] = Xy2xyz(0.265f, 0.690f); | 139 primaries[1] = Xy2xyz(0.265f, 0.690f); |
| 140 // Blue | 140 // Blue |
| 141 primaries[2] = Xy2xyz(0.150f, 0.060f); | 141 primaries[2] = Xy2xyz(0.150f, 0.060f); |
| 142 // Whitepoint (D65f) | 142 // Whitepoint (D65f) |
| 143 primaries[3] = Xy2xyz(0.3127f, 0.3290f); | 143 primaries[3] = Xy2xyz(0.3127f, 0.3290f); |
| 144 break; | 144 return; |
| 145 | 145 |
| 146 case ColorSpace::PrimaryID::XYZ_D50: | 146 case ColorSpace::PrimaryID::XYZ_D50: |
| 147 // X | 147 // X |
| 148 primaries[0] = Xy2xyz(1.0f, 0.0f); | 148 primaries[0] = Xy2xyz(1.0f, 0.0f); |
| 149 // Y | 149 // Y |
| 150 primaries[1] = Xy2xyz(0.0f, 1.0f); | 150 primaries[1] = Xy2xyz(0.0f, 1.0f); |
| 151 // Z | 151 // Z |
| 152 primaries[2] = Xy2xyz(0.0f, 0.0f); | 152 primaries[2] = Xy2xyz(0.0f, 0.0f); |
| 153 // D50 | 153 // D50 |
| 154 primaries[3] = Xy2xyz(0.34567f, 0.35850f); | 154 primaries[3] = Xy2xyz(0.34567f, 0.35850f); |
| 155 break; | 155 return; |
| 156 } | 156 } |
| 157 |
| 158 // Red |
| 159 primaries[0] = Xy2xyz(0.640f, 0.330f); |
| 160 // Green |
| 161 primaries[1] = Xy2xyz(0.300f, 0.600f); |
| 162 // Blue |
| 163 primaries[2] = Xy2xyz(0.150f, 0.060f); |
| 164 // Whitepoint (D65f) |
| 165 primaries[3] = Xy2xyz(0.3127f, 0.3290f); |
| 157 } | 166 } |
| 158 | 167 |
| 159 GFX_EXPORT Transform GetPrimaryMatrix(ColorSpace::PrimaryID id) { | 168 GFX_EXPORT Transform GetPrimaryMatrix(ColorSpace::PrimaryID id) { |
| 160 ColorTransform::TriStim primaries[4]; | 169 ColorTransform::TriStim primaries[4]; |
| 161 GetPrimaries(id, primaries); | 170 GetPrimaries(id, primaries); |
| 162 ColorTransform::TriStim WXYZ(primaries[3].x() / primaries[3].y(), 1.0f, | 171 ColorTransform::TriStim WXYZ(primaries[3].x() / primaries[3].y(), 1.0f, |
| 163 primaries[3].z() / primaries[3].y()); | 172 primaries[3].z() / primaries[3].y()); |
| 164 | 173 |
| 165 Transform ret( | 174 Transform ret( |
| 166 primaries[0].x(), primaries[1].x(), primaries[2].x(), 0.0f, // 1 | 175 primaries[0].x(), primaries[1].x(), primaries[2].x(), 0.0f, // 1 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 184 Transform adapter; | 193 Transform adapter; |
| 185 adapter.Scale3d(dest_response.x() / source_response.x(), | 194 adapter.Scale3d(dest_response.x() / source_response.x(), |
| 186 dest_response.y() / source_response.y(), | 195 dest_response.y() / source_response.y(), |
| 187 dest_response.z() / source_response.z()); | 196 dest_response.z() / source_response.z()); |
| 188 | 197 |
| 189 return Invert(bradford) * adapter * bradford * ret; | 198 return Invert(bradford) * adapter * bradford * ret; |
| 190 } | 199 } |
| 191 | 200 |
| 192 GFX_EXPORT float FromLinear(ColorSpace::TransferID id, float v) { | 201 GFX_EXPORT float FromLinear(ColorSpace::TransferID id, float v) { |
| 193 switch (id) { | 202 switch (id) { |
| 194 default: | 203 case ColorSpace::TransferID::SMPTEST2084_NON_HDR: |
| 204 // Should already be handled. |
| 205 NOTREACHED(); |
| 206 case ColorSpace::TransferID::CUSTOM: |
| 207 // TODO(hubbe): Actually implement custom transfer functions. |
| 208 case ColorSpace::TransferID::RESERVED0: |
| 209 case ColorSpace::TransferID::RESERVED: |
| 210 case ColorSpace::TransferID::UNSPECIFIED: |
| 211 case ColorSpace::TransferID::UNKNOWN: |
| 212 // All unknown values default to BT709 |
| 213 |
| 195 case ColorSpace::TransferID::BT709: | 214 case ColorSpace::TransferID::BT709: |
| 196 case ColorSpace::TransferID::SMPTE170M: | 215 case ColorSpace::TransferID::SMPTE170M: |
| 197 case ColorSpace::TransferID::BT2020_10: | 216 case ColorSpace::TransferID::BT2020_10: |
| 198 case ColorSpace::TransferID::BT2020_12: { | 217 case ColorSpace::TransferID::BT2020_12: |
| 199 v = fmax(0.0f, v); | 218 // BT709 is our "default" cause, so put the code after the switch |
| 200 float a = 1.099296826809442f; | 219 // to avoid "control reaches end of non-void function" errors. |
| 201 float b = 0.018053968510807f; | 220 break; |
| 202 if (v <= b) { | |
| 203 return 4.5f * v; | |
| 204 } else { | |
| 205 return a * powf(v, 0.45f) - (a - 1.0f); | |
| 206 } | |
| 207 } | |
| 208 | 221 |
| 209 case ColorSpace::TransferID::GAMMA22: | 222 case ColorSpace::TransferID::GAMMA22: |
| 210 v = fmax(0.0f, v); | 223 v = fmax(0.0f, v); |
| 211 return powf(v, 1.0f / 2.2f); | 224 return powf(v, 1.0f / 2.2f); |
| 212 | 225 |
| 213 case ColorSpace::TransferID::GAMMA28: | 226 case ColorSpace::TransferID::GAMMA28: |
| 214 v = fmax(0.0f, v); | 227 v = fmax(0.0f, v); |
| 215 return powf(v, 1.0f / 2.8f); | 228 return powf(v, 1.0f / 2.8f); |
| 216 | 229 |
| 217 case ColorSpace::TransferID::SMPTE240M: { | 230 case ColorSpace::TransferID::SMPTE240M: { |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 | 298 |
| 286 case ColorSpace::TransferID::SMPTEST428_1: | 299 case ColorSpace::TransferID::SMPTEST428_1: |
| 287 v = fmax(0.0f, v); | 300 v = fmax(0.0f, v); |
| 288 return powf(48.0f * v + 52.37f, 1.0f / 2.6f); | 301 return powf(48.0f * v + 52.37f, 1.0f / 2.6f); |
| 289 | 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 } |
| 308 |
| 309 v = fmax(0.0f, v); |
| 310 float a = 1.099296826809442f; |
| 311 float b = 0.018053968510807f; |
| 312 if (v <= b) { |
| 313 return 4.5f * v; |
| 314 } else { |
| 315 return a * powf(v, 0.45f) - (a - 1.0f); |
| 316 } |
| 295 } | 317 } |
| 296 | 318 |
| 297 GFX_EXPORT float ToLinear(ColorSpace::TransferID id, float v) { | 319 GFX_EXPORT float ToLinear(ColorSpace::TransferID id, float v) { |
| 298 switch (id) { | 320 switch (id) { |
| 299 default: | 321 case ColorSpace::TransferID::CUSTOM: |
| 322 // TODO(hubbe): Actually implement custom transfer functions. |
| 323 case ColorSpace::TransferID::RESERVED0: |
| 324 case ColorSpace::TransferID::RESERVED: |
| 325 case ColorSpace::TransferID::UNSPECIFIED: |
| 326 case ColorSpace::TransferID::UNKNOWN: |
| 327 // All unknown values default to BT709 |
| 328 |
| 300 case ColorSpace::TransferID::BT709: | 329 case ColorSpace::TransferID::BT709: |
| 301 case ColorSpace::TransferID::SMPTE170M: | 330 case ColorSpace::TransferID::SMPTE170M: |
| 302 case ColorSpace::TransferID::BT2020_10: | 331 case ColorSpace::TransferID::BT2020_10: |
| 303 case ColorSpace::TransferID::BT2020_12: { | 332 case ColorSpace::TransferID::BT2020_12: |
| 304 v = fmax(0.0f, v); | 333 // BT709 is our "default" cause, so put the code after the switch |
| 305 float a = 1.099296826809442f; | 334 // to avoid "control reaches end of non-void function" errors. |
| 306 float b = 0.018053968510807f; | 335 break; |
| 307 if (v < FromLinear(ColorSpace::TransferID::BT709, b)) { | |
| 308 return v / 4.5f; | |
| 309 } else { | |
| 310 return powf((v + a - 1.0f) / a, 1.0f / 0.45f); | |
| 311 } | |
| 312 } | |
| 313 | 336 |
| 314 case ColorSpace::TransferID::GAMMA22: | 337 case ColorSpace::TransferID::GAMMA22: |
| 315 v = fmax(0.0f, v); | 338 v = fmax(0.0f, v); |
| 316 return powf(v, 2.2f); | 339 return powf(v, 2.2f); |
| 317 | 340 |
| 318 case ColorSpace::TransferID::GAMMA28: | 341 case ColorSpace::TransferID::GAMMA28: |
| 319 v = fmax(0.0f, v); | 342 v = fmax(0.0f, v); |
| 320 return powf(v, 2.8f); | 343 return powf(v, 2.8f); |
| 321 | 344 |
| 322 case ColorSpace::TransferID::SMPTE240M: { | 345 case ColorSpace::TransferID::SMPTE240M: { |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 396 | 419 |
| 397 // Chrome-specific values below | 420 // Chrome-specific values below |
| 398 case ColorSpace::TransferID::GAMMA24: | 421 case ColorSpace::TransferID::GAMMA24: |
| 399 v = fmax(0.0f, v); | 422 v = fmax(0.0f, v); |
| 400 return powf(v, 2.4f); | 423 return powf(v, 2.4f); |
| 401 | 424 |
| 402 case ColorSpace::TransferID::SMPTEST2084_NON_HDR: | 425 case ColorSpace::TransferID::SMPTEST2084_NON_HDR: |
| 403 v = fmax(0.0f, v); | 426 v = fmax(0.0f, v); |
| 404 return fmin(2.3f * pow(v, 2.8f), v / 5.0f + 0.8f); | 427 return fmin(2.3f * pow(v, 2.8f), v / 5.0f + 0.8f); |
| 405 } | 428 } |
| 429 |
| 430 v = fmax(0.0f, v); |
| 431 float a = 1.099296826809442f; |
| 432 float b = 0.018053968510807f; |
| 433 if (v < FromLinear(ColorSpace::TransferID::BT709, b)) { |
| 434 return v / 4.5f; |
| 435 } else { |
| 436 return powf((v + a - 1.0f) / a, 1.0f / 0.45f); |
| 437 } |
| 406 } | 438 } |
| 407 | 439 |
| 408 namespace { | 440 namespace { |
| 409 // Assumes bt2020 | 441 // Assumes bt2020 |
| 410 float Luma(const ColorTransform::TriStim& c) { | 442 float Luma(const ColorTransform::TriStim& c) { |
| 411 return c.x() * 0.2627f + c.y() * 0.6780f + c.z() * 0.0593f; | 443 return c.x() * 0.2627f + c.y() * 0.6780f + c.z() * 0.0593f; |
| 412 } | 444 } |
| 413 }; | 445 }; |
| 414 | 446 |
| 415 GFX_EXPORT ColorTransform::TriStim ToLinear(ColorSpace::TransferID id, | 447 GFX_EXPORT ColorTransform::TriStim ToLinear(ColorSpace::TransferID id, |
| 416 ColorTransform::TriStim color) { | 448 ColorTransform::TriStim color) { |
| 417 ColorTransform::TriStim ret(ToLinear(id, color.x()), ToLinear(id, color.y()), | 449 ColorTransform::TriStim ret(ToLinear(id, color.x()), ToLinear(id, color.y()), |
| 418 ToLinear(id, color.z())); | 450 ToLinear(id, color.z())); |
| 419 | 451 |
| 420 if (id == ColorSpace::TransferID::SMPTEST2084_NON_HDR) { | 452 if (id == ColorSpace::TransferID::SMPTEST2084_NON_HDR) { |
| 421 if (Luma(ret) > 0.0) { | 453 if (Luma(ret) > 0.0) { |
| 422 ColorTransform::TriStim smpte2084( | 454 ColorTransform::TriStim smpte2084( |
| 423 ToLinear(ColorSpace::TransferID::SMPTEST2084, color.x()), | 455 ToLinear(ColorSpace::TransferID::SMPTEST2084, color.x()), |
| 424 ToLinear(ColorSpace::TransferID::SMPTEST2084, color.y()), | 456 ToLinear(ColorSpace::TransferID::SMPTEST2084, color.y()), |
| 425 ToLinear(ColorSpace::TransferID::SMPTEST2084, color.z())); | 457 ToLinear(ColorSpace::TransferID::SMPTEST2084, color.z())); |
| 426 smpte2084.Scale(Luma(ret) / Luma(smpte2084)); | 458 smpte2084.Scale(Luma(ret) / Luma(smpte2084)); |
| 427 ret = smpte2084; | 459 ret = smpte2084; |
| 428 } | 460 } |
| 429 } | 461 } |
| 430 | 462 |
| 431 return ret; | 463 return ret; |
| 432 } | 464 } |
| 433 | 465 |
| 434 GFX_EXPORT Transform GetTransferMatrix(ColorSpace::MatrixID id) { | 466 GFX_EXPORT Transform GetTransferMatrix(ColorSpace::MatrixID id) { |
| 435 float Kr = 0.0f, Kb = 0.0f; | 467 // Default values for BT709; |
| 468 float Kr = 0.2126f; |
| 469 float Kb = 0.0722f; |
| 436 switch (id) { | 470 switch (id) { |
| 437 case ColorSpace::MatrixID::RGB: | 471 case ColorSpace::MatrixID::RGB: |
| 438 return Transform(); | 472 return Transform(); |
| 439 | 473 |
| 440 case ColorSpace::MatrixID::BT709: | 474 case ColorSpace::MatrixID::BT709: |
| 441 case ColorSpace::MatrixID::UNSPECIFIED: | 475 case ColorSpace::MatrixID::UNSPECIFIED: |
| 442 case ColorSpace::MatrixID::RESERVED: | 476 case ColorSpace::MatrixID::RESERVED: |
| 443 Kr = 0.2126f; | 477 case ColorSpace::MatrixID::UNKNOWN: |
| 444 Kb = 0.0722f; | 478 // Default values are already set. |
| 445 break; | 479 break; |
| 446 | 480 |
| 447 case ColorSpace::MatrixID::FCC: | 481 case ColorSpace::MatrixID::FCC: |
| 448 Kr = 0.30f; | 482 Kr = 0.30f; |
| 449 Kb = 0.11f; | 483 Kb = 0.11f; |
| 450 break; | 484 break; |
| 451 | 485 |
| 452 case ColorSpace::MatrixID::BT470BG: | 486 case ColorSpace::MatrixID::BT470BG: |
| 453 case ColorSpace::MatrixID::SMPTE170M: | 487 case ColorSpace::MatrixID::SMPTE170M: |
| 454 Kr = 0.299f; | 488 Kr = 0.299f; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 508 case ColorSpace::MatrixID::BT709: | 542 case ColorSpace::MatrixID::BT709: |
| 509 case ColorSpace::MatrixID::UNSPECIFIED: | 543 case ColorSpace::MatrixID::UNSPECIFIED: |
| 510 case ColorSpace::MatrixID::RESERVED: | 544 case ColorSpace::MatrixID::RESERVED: |
| 511 case ColorSpace::MatrixID::FCC: | 545 case ColorSpace::MatrixID::FCC: |
| 512 case ColorSpace::MatrixID::BT470BG: | 546 case ColorSpace::MatrixID::BT470BG: |
| 513 case ColorSpace::MatrixID::SMPTE170M: | 547 case ColorSpace::MatrixID::SMPTE170M: |
| 514 case ColorSpace::MatrixID::SMPTE240M: | 548 case ColorSpace::MatrixID::SMPTE240M: |
| 515 case ColorSpace::MatrixID::BT2020_NCL: | 549 case ColorSpace::MatrixID::BT2020_NCL: |
| 516 case ColorSpace::MatrixID::BT2020_CL: | 550 case ColorSpace::MatrixID::BT2020_CL: |
| 517 case ColorSpace::MatrixID::YDZDX: | 551 case ColorSpace::MatrixID::YDZDX: |
| 552 case ColorSpace::MatrixID::UNKNOWN: |
| 518 return Transform(255.0f / 219.0f, 0.0f, 0.0f, -16.0f / 219.0f, // 1 | 553 return Transform(255.0f / 219.0f, 0.0f, 0.0f, -16.0f / 219.0f, // 1 |
| 519 0.0f, 255.0f / 224.0f, 0.0f, -15.5f / 224.0f, // 2 | 554 0.0f, 255.0f / 224.0f, 0.0f, -15.5f / 224.0f, // 2 |
| 520 0.0f, 0.0f, 255.0f / 224.0f, -15.5f / 224.0f, // 3 | 555 0.0f, 0.0f, 255.0f / 224.0f, -15.5f / 224.0f, // 3 |
| 521 0.0f, 0.0f, 0.0f, 1.0f); // 4 | 556 0.0f, 0.0f, 0.0f, 1.0f); // 4 |
| 522 } | 557 } |
| 523 NOTREACHED(); | 558 NOTREACHED(); |
| 524 return Transform(); | 559 return Transform(); |
| 525 } | 560 } |
| 526 | 561 |
| 527 class ColorSpaceToColorSpaceTransform : public ColorTransform { | 562 class ColorSpaceToColorSpaceTransform : public ColorTransform { |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 699 std::unique_ptr<ColorTransform>( | 734 std::unique_ptr<ColorTransform>( |
| 700 new QCMSColorTransform(GetXYZD50Profile(), to_profile)))); | 735 new QCMSColorTransform(GetXYZD50Profile(), to_profile)))); |
| 701 } else { | 736 } else { |
| 702 return std::unique_ptr<ColorTransform>( | 737 return std::unique_ptr<ColorTransform>( |
| 703 new ColorSpaceToColorSpaceTransform(from, to, intent)); | 738 new ColorSpaceToColorSpaceTransform(from, to, intent)); |
| 704 } | 739 } |
| 705 } | 740 } |
| 706 } | 741 } |
| 707 | 742 |
| 708 } // namespace gfx | 743 } // namespace gfx |
| OLD | NEW |