| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef UI_GFX_MAC_DISPLAY_ICC_PROFILES_H_ |
| #define UI_GFX_MAC_DISPLAY_ICC_PROFILES_H_ |
| |
| #include <CoreGraphics/CoreGraphics.h> |
| |
| #include "base/containers/flat_map.h" |
| #include "base/mac/scoped_cftyperef.h" |
| #include "base/macros.h" |
| #include "base/no_destructor.h" |
| #include "ui/gfx/color_space.h" |
| #include "ui/gfx/color_space_export.h" |
| |
| namespace gfx { |
| |
| // A map from ColorSpace objects to the display ICC profile data from which the |
| // ColorSpace was derived. |
| // - The color space for an IOSurface, when composited by CoreAnimation, is |
| // specified via ICC profile metadata. |
| // - The power cost of compositing an IOSurface that has the same color space |
| // as the display it is being composited to is substantially less (~0.5 W for |
| // fullscreen updates at 60fps) than the cost of compositing an IOSurface |
| // that has a different color space than the display is being composited to. |
| // - This power savings is realized only if the ICC profile metadata on the |
| // IOSurface matches, byte-for-byte, the profile of the CGDirectDisplayID it |
| // is being displayed on. |
| // - This structure maintains a map from ColorSpace objects to ICC profile data |
| // for all displays in the system (and auto-updates as displays change). |
| class COLOR_SPACE_EXPORT DisplayICCProfiles { |
| public: |
| static DisplayICCProfiles* GetInstance(); |
| |
| DisplayICCProfiles(const DisplayICCProfiles&) = delete; |
| DisplayICCProfiles& operator=(const DisplayICCProfiles&) = delete; |
| |
| // This will return null if |color_space| does not correspond to a display. |
| base::ScopedCFTypeRef<CFDataRef> GetDataForColorSpace( |
| const ColorSpace& color_space); |
| |
| private: |
| friend class base::NoDestructor<DisplayICCProfiles>; |
| |
| static void DisplayReconfigurationCallBack(CGDirectDisplayID display, |
| CGDisplayChangeSummaryFlags flags, |
| void* user_info); |
| |
| DisplayICCProfiles(); |
| ~DisplayICCProfiles(); |
| |
| void UpdateIfNeeded(); |
| |
| base::flat_map<ColorSpace, base::ScopedCFTypeRef<CFDataRef>> map_; |
| bool needs_update_ = true; |
| }; |
| |
| } // namespace gfx |
| |
| #endif // UI_GFX_MAC_DISPLAY_ICC_PROFILES_H_ |