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

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

Issue 2342963003: Support ARIB STD B67, aka hybrid-log gamma (HLG) transfer function. (Closed)
Patch Set: nit 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') | ui/gfx/color_transform_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) 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
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
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
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
OLDNEW
« no previous file with comments | « ui/gfx/color_space.h ('k') | ui/gfx/color_transform_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698