Remove ColorSpaceDeviceRGB and most users of the obsolete deviceRGB colorspace
authorsimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 14 Dec 2017 19:33:09 +0000 (19:33 +0000)
committersimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 14 Dec 2017 19:33:09 +0000 (19:33 +0000)
https://bugs.webkit.org/show_bug.cgi?id=180689

Reviewed by Darin Adler.

Address issues noted by Darin in r225797:

Existing and new code mistakenly allocated colorspaces on every call, because
they didn't initialize the static variable on the first call. Avoid this mistake
by using dispatch_once() in these functions.

Fix a case where the extendedSRGBColorSpaceRef() fallback was returning deviceRGB
instead of sRGB.

* platform/graphics/cg/GraphicsContextCG.cpp:
(WebCore::sRGBColorSpaceRef):
(WebCore::linearRGBColorSpaceRef):
(WebCore::extendedSRGBColorSpaceRef):
(WebCore::displayP3ColorSpaceRef):
* platform/graphics/cocoa/GraphicsContextCocoa.mm:
(WebCore::linearRGBColorSpaceRef):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@225915 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/cg/GraphicsContextCG.cpp
Source/WebCore/platform/graphics/cocoa/GraphicsContextCocoa.mm

index 8aca287..0161264 100644 (file)
@@ -1,3 +1,27 @@
+2017-12-14  Simon Fraser  <simon.fraser@apple.com>
+
+        Remove ColorSpaceDeviceRGB and most users of the obsolete deviceRGB colorspace
+        https://bugs.webkit.org/show_bug.cgi?id=180689
+
+        Reviewed by Darin Adler.
+        
+        Address issues noted by Darin in r225797:
+        
+        Existing and new code mistakenly allocated colorspaces on every call, because
+        they didn't initialize the static variable on the first call. Avoid this mistake
+        by using dispatch_once() in these functions.
+
+        Fix a case where the extendedSRGBColorSpaceRef() fallback was returning deviceRGB
+        instead of sRGB.
+
+        * platform/graphics/cg/GraphicsContextCG.cpp:
+        (WebCore::sRGBColorSpaceRef):
+        (WebCore::linearRGBColorSpaceRef):
+        (WebCore::extendedSRGBColorSpaceRef):
+        (WebCore::displayP3ColorSpaceRef):
+        * platform/graphics/cocoa/GraphicsContextCocoa.mm:
+        (WebCore::linearRGBColorSpaceRef):
+
 2017-12-13  Keith Miller  <keith_miller@apple.com>
 
         JSObjects should have a mask for loading indexed properties
index 75be03c..7e46e30 100644 (file)
@@ -74,53 +74,68 @@ static void setCGStrokeColor(CGContextRef context, const Color& color)
 
 CGColorSpaceRef sRGBColorSpaceRef()
 {
-    static CGColorSpaceRef sRGBSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB);
+    static CGColorSpaceRef sRGBColorSpace;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        sRGBColorSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB);
 #if PLATFORM(WIN)
-    // Out-of-date CG installations will not honor kCGColorSpaceSRGB. This logic avoids
-    // causing a crash under those conditions. Since the default color space in Windows
-    // is sRGB, this all works out nicely.
-    if (!sRGBSpace)
-        sRGBSpace = CGColorSpaceCreateDeviceRGB();
+        // Out-of-date CG installations will not honor kCGColorSpaceSRGB. This logic avoids
+        // causing a crash under those conditions. Since the default color space in Windows
+        // is sRGB, this all works out nicely.
+        // FIXME: Is this still needed? rdar://problem/15213515 was fixed.
+        if (!sRGBColorSpace)
+            sRGBColorSpace = CGColorSpaceCreateDeviceRGB();
 #endif // PLATFORM(WIN)
-    return sRGBSpace;
+    });
+    return sRGBColorSpace;
 }
 
 #if PLATFORM(WIN) || PLATFORM(IOS) || (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101200)
 // See GraphicsContextCocoa for the pre-10.12 implementation.
 CGColorSpaceRef linearRGBColorSpaceRef()
 {
+    static CGColorSpaceRef linearRGBColorSpace;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
 #if PLATFORM(WIN)
-    // FIXME: Windows should be able to use linear sRGB, this is tracked by http://webkit.org/b/80000.
-    return CGColorSpaceCreateDeviceRGB();
+        // FIXME: Windows should be able to use linear sRGB, this is tracked by http://webkit.org/b/80000.
+        linearRGBColorSpace = sRGBColorSpaceRef();
 #else
-    static CGColorSpaceRef linearRGBSpace;
-    linearRGBSpace = CGColorSpaceCreateWithName(kCGColorSpaceLinearSRGB);
-    return linearRGBSpace;
+        linearRGBColorSpace = CGColorSpaceCreateWithName(kCGColorSpaceLinearSRGB);
 #endif
+    });
+
+    return linearRGBColorSpace;
 }
 #endif
 
 CGColorSpaceRef extendedSRGBColorSpaceRef()
 {
-    static CGColorSpaceRef extendedSRGBSpace;
+    static CGColorSpaceRef extendedSRGBColorSpace;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
 #if PLATFORM(IOS) || (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101200)
-    extendedSRGBSpace = CGColorSpaceCreateWithName(kCGColorSpaceExtendedSRGB);
+        extendedSRGBColorSpace = CGColorSpaceCreateWithName(kCGColorSpaceExtendedSRGB);
 #endif
-    // If there is no support for exteneded sRGB, fall back to sRGB.
-    if (!extendedSRGBSpace)
-        extendedSRGBSpace = CGColorSpaceCreateDeviceRGB();
-    return extendedSRGBSpace;
+        // If there is no support for extended sRGB, fall back to sRGB.
+        if (!extendedSRGBColorSpace)
+            extendedSRGBColorSpace = sRGBColorSpaceRef();
+    });
+    return extendedSRGBColorSpace;
 }
 
 CGColorSpaceRef displayP3ColorSpaceRef()
 {
-    static CGColorSpaceRef displayP3Space;
+    static CGColorSpaceRef displayP3ColorSpace;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
 #if PLATFORM(IOS) || (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED > 101100)
-    displayP3Space = CGColorSpaceCreateWithName(kCGColorSpaceDisplayP3);
+        displayP3ColorSpace = CGColorSpaceCreateWithName(kCGColorSpaceDisplayP3);
 #else
-    displayP3Space = sRGBColorSpaceRef();
+        displayP3ColorSpace = sRGBColorSpaceRef();
 #endif
-    return displayP3Space;
+    });
+    return displayP3ColorSpace;
 }
 
 static InterpolationQuality convertInterpolationQuality(CGInterpolationQuality quality)
index 34c63cd..5aee2f9 100644 (file)
@@ -368,25 +368,22 @@ void GraphicsContext::drawLineForDocumentMarker(const FloatPoint& point, float w
 #if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101200
 CGColorSpaceRef linearRGBColorSpaceRef()
 {
-    static CGColorSpaceRef linearSRGBSpace = nullptr;
-
-    if (linearSRGBSpace)
-        return linearSRGBSpace;
-
-    RetainPtr<NSString> iccProfilePath = [[NSBundle bundleWithIdentifier:@"com.apple.WebCore"] pathForResource:@"linearSRGB" ofType:@"icc"];
-    RetainPtr<NSData> iccProfileData = adoptNS([[NSData alloc] initWithContentsOfFile:iccProfilePath.get()]);
-
-    if (iccProfileData)
+    static CGColorSpaceRef linearSRGBColorSpace;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        RetainPtr<NSString> iccProfilePath = [[NSBundle bundleWithIdentifier:@"com.apple.WebCore"] pathForResource:@"linearSRGB" ofType:@"icc"];
+        RetainPtr<NSData> iccProfileData = adoptNS([[NSData alloc] initWithContentsOfFile:iccProfilePath.get()]);
+        if (iccProfileData)
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
-        linearSRGBSpace = CGColorSpaceCreateWithICCProfile((CFDataRef)iccProfileData.get());
+            linearSRGBColorSpace = CGColorSpaceCreateWithICCProfile((CFDataRef)iccProfileData.get());
 #pragma clang diagnostic pop
 
-    // If we fail to load the linearized sRGB ICC profile, fall back to sRGB.
-    if (!linearSRGBSpace)
-        return sRGBColorSpaceRef();
-
-    return linearSRGBSpace;
+        // If we fail to load the linearized sRGB ICC profile, fall back to sRGB.
+        if (!linearSRGBColorSpace)
+            linearSRGBColorSpace = sRGBColorSpaceRef();
+    });
+    return linearSRGBColorSpace;
 }
 #endif