Index: third_party/WebKit/Source/platform/graphics/GraphicsScreen.cpp |
diff --git a/third_party/WebKit/Source/platform/graphics/GraphicsScreen.cpp b/third_party/WebKit/Source/platform/graphics/GraphicsScreen.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a8cdc24751ad780aadf2f3b075d59bf4348b8454 |
--- /dev/null |
+++ b/third_party/WebKit/Source/platform/graphics/GraphicsScreen.cpp |
@@ -0,0 +1,155 @@ |
+// Copyright 2015 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. |
+ |
+#include "config.h" |
+#include "platform/graphics/GraphicsScreen.h" |
+ |
+#include "platform/PlatformExport.h" |
+#include "platform/RuntimeEnabledFeatures.h" |
+#include "platform/graphics/ColorSpaceProfile.h" |
+#include "wtf/HashMap.h" |
+#include "wtf/MainThread.h" |
+#include "wtf/text/WTFString.h" |
+ |
+namespace blink { |
+ |
+#if USE(QCMSLIB) |
+ |
+class ColorProfileCache { |
+public: |
+ ColorProfileCache() |
+ { |
+ qcms_profile* srgbColorProfile = qcms_profile_sRGB(); |
+ |
+ if (srgbColorProfile) |
+ qcms_profile_precache_output_transform(srgbColorProfile); |
+ |
+ RELEASE_ASSERT(srgbColorProfile); |
+ |
+ m_srgbColorProfile = ColorSpaceProfile::create(srgbColorProfile); |
+ } |
+ |
+ void set(int64_t id, PassRefPtr<ColorSpaceProfile> profile) |
+ { |
+ RELEASE_ASSERT(id && profile->profile()); |
+ |
+ m_colorProfiles.set(id, profile); |
+ } |
+ |
+ PassRefPtr<ColorSpaceProfile> find(int64_t id) const |
+ { |
+ if (!id) |
+ return m_srgbColorProfile; |
+ |
+ HashMap<int64_t, RefPtr<ColorSpaceProfile>>::const_iterator it = m_colorProfiles.find(id); |
+ return it != m_colorProfiles.end() ? it->value : nullptr; |
+ } |
+ |
+ void remove(int64_t id) |
+ { |
+ RELEASE_ASSERT(id); |
+ |
+ m_colorProfiles.remove(id); |
+ } |
+ |
+private: |
+ HashMap<int64_t, RefPtr<ColorSpaceProfile>> m_colorProfiles; |
+ |
+ RefPtr<ColorSpaceProfile> m_srgbColorProfile; |
+}; |
+ |
+static ColorProfileCache& screenColorProfileCache() |
+{ |
+ DEFINE_STATIC_LOCAL(ColorProfileCache, cache, ()); |
+ RELEASE_ASSERT(isMainThread()); |
+ return cache; |
+} |
+ |
+inline bool invalidRGBColorProfile(qcms_profile* deviceProfile) |
+{ |
+ return rgbData != qcms_profile_get_color_space(deviceProfile) || qcms_profile_is_bogus(deviceProfile); |
+} |
+ |
+void setScreenColorProfile(int64_t id, const char* profile, size_t size) |
+{ |
+ const size_t kMinimumColorProfileSize = 128; |
+ |
+ qcms_profile* deviceProfile = nullptr; |
+ |
+ if (profile && size > kMinimumColorProfileSize) |
+ deviceProfile = qcms_profile_from_memory(profile, size); |
+ |
+ if (deviceProfile && invalidRGBColorProfile(deviceProfile)) { |
+ qcms_profile_release(deviceProfile); |
+ deviceProfile = nullptr; |
+ } |
+ |
+ if (!deviceProfile) |
+ deviceProfile = qcms_profile_sRGB(); |
+ |
+ if (deviceProfile) |
+ qcms_profile_precache_output_transform(deviceProfile); |
+ |
+ fprintf(stderr, "setScreenColorProfile [%s] page %ld\n", deviceProfile ? qcms_profile_get_description(deviceProfile) : "(null profile)", (long int)id); |
+ |
+ screenColorProfileCache().set(id, ColorSpaceProfile::create(deviceProfile)); |
+} |
+ |
+PassRefPtr<ColorSpaceProfile> screenColorProfile(int64_t id) |
+{ |
+ if (!imageColorProfilesEnabled()) |
+ return nullptr; |
+ |
+ return screenColorProfileCache().find(id); |
+} |
+ |
+void removeScreenColorProfile(int64_t id) |
+{ |
+ screenColorProfileCache().remove(id); |
+ |
+ RELEASE_ASSERT(!screenColorProfile(id).get()); |
+} |
+ |
+bool imageColorProfilesEnabled() |
+{ |
+ return RuntimeEnabledFeatures::imageColorProfilesEnabled(); |
+} |
+ |
+#else |
+ |
+void setScreenColorProfile(int64_t, const char*, size_t) |
+{ |
+} |
+ |
+PassRefPtr<ColorSpaceProfile> screenColorProfile(int64_t) |
+{ |
+ return nullptr; |
+} |
+ |
+void removeScreenColorProfile(int64_t) |
+{ |
+} |
+ |
+bool imageColorProfilesEnabled() |
+{ |
+ return false; |
+} |
+ |
+#endif // USE(QCMSLIB) |
+ |
+static int64_t s_screenId; |
+ |
+int64_t setCurrentScreenId(int64_t id) |
+{ |
+ int64_t previous = s_screenId; |
+ s_screenId = id; |
+ return previous; |
+} |
+ |
+int64_t currentScreenId() |
+{ |
+ return s_screenId; |
+} |
+ |
+} // namespace blink |