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

Unified Diff: third_party/WebKit/Source/platform/graphics/GraphicsScreen.cpp

Issue 1331533002: [poc] curve-filter Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fix CanvasRenderingContext2D::createPattern crash for #40 Created 4 years, 11 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 side-by-side diff with in-line comments
Download patch
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..78fbc38ff4969218b5c3074a257f2f0ac901d4f3
--- /dev/null
+++ b/third_party/WebKit/Source/platform/graphics/GraphicsScreen.cpp
@@ -0,0 +1,174 @@
+// 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 "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);
+ }
+
+ PassRefPtr<ColorSpaceProfile> sRGBColorProfile() const
+ {
+ return m_srgbColorProfile;
+ }
+
+ void set(uintptr_t id, PassRefPtr<ColorSpaceProfile> profile)
+ {
+ RELEASE_ASSERT(!ScreenDevice::isDefaultDeviceId(id)); // You cannot reset default profiles.
+
+ RELEASE_ASSERT(profile->profile());
+
+ m_colorProfiles.set(id, profile);
+ }
+
+ PassRefPtr<ColorSpaceProfile> find(uintptr_t id) const
+ {
+ if (ScreenDevice::isSRGBDeviceId(id))
+ return sRGBColorProfile();
+
+ HashMap<uintptr_t, RefPtr<ColorSpaceProfile>>::const_iterator it = m_colorProfiles.find(id);
+ return it != m_colorProfiles.end() ? it->value : nullptr;
+ }
+
+ void remove(uintptr_t id)
+ {
+ RELEASE_ASSERT(!ScreenDevice::isDefaultDeviceId(id)); // You cannot remove default profiles.
+
+ m_colorProfiles.remove(id);
+ }
+
+private:
+ HashMap<uintptr_t, RefPtr<ColorSpaceProfile>> m_colorProfiles;
+
+ RefPtr<ColorSpaceProfile> m_srgbColorProfile;
+};
+
+static ColorProfileCache& screenColorProfileCache()
+{
+ DEFINE_STATIC_LOCAL(ColorProfileCache, cache, ());
+ RELEASE_ASSERT(isMainThread());
+ return cache;
+}
+
+static bool invalidRGBColorProfile(qcms_profile* deviceProfile)
+{
+ if (rgbData != qcms_profile_get_color_space(deviceProfile))
+ return true;
+
+ if (qcms_profile_is_bogus(deviceProfile))
+ return true;
+
+ RefPtr<ColorSpaceProfile> source = screenColorProfileCache().sRGBColorProfile();
+
+ qcms_transform* transform = qcms_transform_create(source->profile(), QCMS_DATA_RGBA_8, deviceProfile, QCMS_DATA_RGBA_8, QCMS_INTENT_PERCEPTUAL);
+ if (!transform)
+ return true;
+
+ bool usable = qcms_transform_is_matrix(transform);
+ qcms_transform_release(transform);
+
+ return !usable;
+}
+
+void setScreenColorProfile(uintptr_t id, const char* profile, size_t size)
+{
+ const size_t minimumColorProfileSize = 128;
+
+ qcms_profile* deviceProfile = nullptr;
+
+ if (profile && size > minimumColorProfileSize)
+ 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(uintptr_t id)
+{
+ if (!imageColorProfilesEnabled())
+ return nullptr;
+
+ return screenColorProfileCache().find(id);
+}
+
+void removeScreenColorProfile(uintptr_t id)
+{
+ screenColorProfileCache().remove(id);
+}
+
+bool imageColorProfilesEnabled()
+{
+ return RuntimeEnabledFeatures::imageColorProfilesEnabled();
+}
+
+#else
+
+void setScreenColorProfile(uintptr_t, const char*, size_t)
+{
+}
+
+PassRefPtr<ColorSpaceProfile> screenColorProfile(uintptr_t)
+{
+ return nullptr;
+}
+
+void removeScreenColorProfile(uintptr_t)
+{
+}
+
+bool imageColorProfilesEnabled()
+{
+ return false;
+}
+
+#endif // USE(QCMSLIB)
+
+static uintptr_t s_screenId;
+
+uintptr_t setCurrentScreenId(uintptr_t id)
+{
+ uintptr_t previous = s_screenId;
+ s_screenId = id;
+ return previous;
+}
+
+uintptr_t currentScreenId()
+{
+ return s_screenId;
+}
+
+} // namespace blink
« no previous file with comments | « third_party/WebKit/Source/platform/graphics/GraphicsScreen.h ('k') | third_party/WebKit/Source/platform/graphics/Image.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698