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

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

Issue 2697863003: color: Clarify default behaviors (Closed)
Patch Set: 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
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 <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 #include <list> 9 #include <list>
10 #include <memory> 10 #include <memory>
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
266 step->Transform(colors, num); 266 step->Transform(colors, num);
267 } 267 }
268 size_t NumberOfStepsForTesting() const override { return steps_.size(); } 268 size_t NumberOfStepsForTesting() const override { return steps_.size(); }
269 269
270 private: 270 private:
271 void AppendColorSpaceToColorSpaceTransform(ColorSpace from, 271 void AppendColorSpaceToColorSpaceTransform(ColorSpace from,
272 const ColorSpace& to, 272 const ColorSpace& to,
273 ColorTransform::Intent intent); 273 ColorTransform::Intent intent);
274 void Simplify(); 274 void Simplify();
275 275
276 // Retrieve the ICC profile from which |color_space| was created, only if that
277 // is a more precise representation of the color space than the primaries and
278 // transfer function in |color_space|.
279 ScopedQcmsProfile GetQCMSProfileIfNecessary(const ColorSpace& color_space);
280
276 std::list<std::unique_ptr<ColorTransformStep>> steps_; 281 std::list<std::unique_ptr<ColorTransformStep>> steps_;
277 }; 282 };
278 283
279 class ColorTransformNull : public ColorTransformStep { 284 class ColorTransformNull : public ColorTransformStep {
280 public: 285 public:
281 ColorTransformNull* GetNull() override { return this; } 286 ColorTransformNull* GetNull() override { return this; }
282 bool IsNull() override { return true; } 287 bool IsNull() override { return true; }
283 void Transform(ColorTransform::TriStim* color, size_t num) override {} 288 void Transform(ColorTransform::TriStim* color, size_t num) override {}
284 }; 289 };
285 290
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after
643 qcms_chain_transform(from_.get(), to_.get(), 648 qcms_chain_transform(from_.get(), to_.get(),
644 reinterpret_cast<float*>(colors), 649 reinterpret_cast<float*>(colors),
645 reinterpret_cast<float*>(colors), num * 3); 650 reinterpret_cast<float*>(colors), num * 3);
646 } 651 }
647 652
648 private: 653 private:
649 ScopedQcmsProfile from_; 654 ScopedQcmsProfile from_;
650 ScopedQcmsProfile to_; 655 ScopedQcmsProfile to_;
651 }; 656 };
652 657
653 ScopedQcmsProfile GetQCMSProfileIfAvailable(const ColorSpace& color_space) { 658 ScopedQcmsProfile ColorTransformInternal::GetQCMSProfileIfNecessary(
654 ICCProfile icc_profile = ICCProfile::FromColorSpace(color_space); 659 const ColorSpace& color_space) {
655 if (icc_profile.GetData().empty()) 660 ICCProfile icc_profile;
661 if (!ICCProfile::FromId(color_space.icc_profile_id_, true, &icc_profile))
656 return nullptr; 662 return nullptr;
657 return ScopedQcmsProfile(qcms_profile_from_memory( 663 return ScopedQcmsProfile(qcms_profile_from_memory(
658 icc_profile.GetData().data(), icc_profile.GetData().size())); 664 icc_profile.GetData().data(), icc_profile.GetData().size()));
659 } 665 }
660 666
661 ScopedQcmsProfile GetXYZD50Profile() { 667 ScopedQcmsProfile GetXYZD50Profile() {
662 // QCMS is trixy, it has a datatype called qcms_CIE_xyY, but what it expects 668 // QCMS is trixy, it has a datatype called qcms_CIE_xyY, but what it expects
663 // is in fact not xyY color coordinates, it just wants the x/y values of the 669 // is in fact not xyY color coordinates, it just wants the x/y values of the
664 // primaries with Y equal to 1.0. 670 // primaries with Y equal to 1.0.
665 qcms_CIE_xyYTRIPLE xyz; 671 qcms_CIE_xyYTRIPLE xyz;
666 qcms_CIE_xyY w; 672 qcms_CIE_xyY w;
667 xyz.red.x = 1.0f; 673 xyz.red.x = 1.0f;
668 xyz.red.y = 0.0f; 674 xyz.red.y = 0.0f;
669 xyz.red.Y = 1.0f; 675 xyz.red.Y = 1.0f;
670 xyz.green.x = 0.0f; 676 xyz.green.x = 0.0f;
671 xyz.green.y = 1.0f; 677 xyz.green.y = 1.0f;
672 xyz.green.Y = 1.0f; 678 xyz.green.Y = 1.0f;
673 xyz.blue.x = 0.0f; 679 xyz.blue.x = 0.0f;
674 xyz.blue.y = 0.0f; 680 xyz.blue.y = 0.0f;
675 xyz.blue.Y = 1.0f; 681 xyz.blue.Y = 1.0f;
676 w.x = 0.34567f; 682 w.x = 0.34567f;
677 w.y = 0.35850f; 683 w.y = 0.35850f;
678 w.Y = 1.0f; 684 w.Y = 1.0f;
679 return ScopedQcmsProfile(qcms_profile_create_rgb_with_gamma(w, xyz, 1.0f)); 685 return ScopedQcmsProfile(qcms_profile_create_rgb_with_gamma(w, xyz, 1.0f));
680 } 686 }
681 687
682 ColorTransformInternal::ColorTransformInternal(const ColorSpace& from, 688 ColorTransformInternal::ColorTransformInternal(const ColorSpace& from,
683 const ColorSpace& to, 689 const ColorSpace& to,
684 Intent intent) { 690 Intent intent) {
685 ScopedQcmsProfile from_profile = GetQCMSProfileIfAvailable(from); 691 ScopedQcmsProfile from_profile = GetQCMSProfileIfNecessary(from);
686 ScopedQcmsProfile to_profile = GetQCMSProfileIfAvailable(to); 692 ScopedQcmsProfile to_profile = GetQCMSProfileIfNecessary(to);
687 bool has_from_profile = !!from_profile; 693 bool has_from_profile = !!from_profile;
688 bool has_to_profile = !!to_profile; 694 bool has_to_profile = !!to_profile;
689 695
690 if (from_profile) { 696 if (from_profile) {
691 steps_.push_back(base::MakeUnique<QCMSColorTransform>( 697 steps_.push_back(base::MakeUnique<QCMSColorTransform>(
692 std::move(from_profile), GetXYZD50Profile())); 698 std::move(from_profile), GetXYZD50Profile()));
693 } 699 }
694 700
695 AppendColorSpaceToColorSpaceTransform( 701 AppendColorSpaceToColorSpaceTransform(
696 has_from_profile ? ColorSpace::CreateXYZD50() : from, 702 has_from_profile ? ColorSpace::CreateXYZD50() : from,
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 // static 745 // static
740 std::unique_ptr<ColorTransform> ColorTransform::NewColorTransform( 746 std::unique_ptr<ColorTransform> ColorTransform::NewColorTransform(
741 const ColorSpace& from, 747 const ColorSpace& from,
742 const ColorSpace& to, 748 const ColorSpace& to,
743 Intent intent) { 749 Intent intent) {
744 return std::unique_ptr<ColorTransform>( 750 return std::unique_ptr<ColorTransform>(
745 new ColorTransformInternal(from, to, intent)); 751 new ColorTransformInternal(from, to, intent));
746 } 752 }
747 753
748 } // namespace gfx 754 } // namespace gfx
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698