Title: [231394] trunk/Source/WebCore
Revision
231394
Author
[email protected]
Date
2018-05-04 17:26:56 -0700 (Fri, 04 May 2018)

Log Message

Use IOSurfaces for CoreImage operations where possible
https://bugs.webkit.org/show_bug.cgi?id=185230
<rdar://problem/39926929>

Reviewed by Jon Lee.

On iOS hardware, we can use IOSurfaces as a rendering destination
for CoreImage, which means we're keeping data on the GPU
for rendering.

As a drive-by fix, I used a convenience method for Gaussian blurs.

* rendering/RenderThemeIOS.mm:
(WebCore::RenderThemeIOS::paintSystemPreviewBadge):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (231393 => 231394)


--- trunk/Source/WebCore/ChangeLog	2018-05-05 00:16:17 UTC (rev 231393)
+++ trunk/Source/WebCore/ChangeLog	2018-05-05 00:26:56 UTC (rev 231394)
@@ -1,3 +1,20 @@
+2018-05-02  Dean Jackson  <[email protected]>
+
+        Use IOSurfaces for CoreImage operations where possible
+        https://bugs.webkit.org/show_bug.cgi?id=185230
+        <rdar://problem/39926929>
+
+        Reviewed by Jon Lee.
+
+        On iOS hardware, we can use IOSurfaces as a rendering destination
+        for CoreImage, which means we're keeping data on the GPU
+        for rendering.
+
+        As a drive-by fix, I used a convenience method for Gaussian blurs.
+
+        * rendering/RenderThemeIOS.mm:
+        (WebCore::RenderThemeIOS::paintSystemPreviewBadge):
+
 2018-05-04  Tim Horton  <[email protected]>
 
         Shift to a lower-level framework for simplifying URLs

Modified: trunk/Source/WebCore/rendering/RenderThemeIOS.h (231393 => 231394)


--- trunk/Source/WebCore/rendering/RenderThemeIOS.h	2018-05-05 00:16:17 UTC (rev 231393)
+++ trunk/Source/WebCore/rendering/RenderThemeIOS.h	2018-05-05 00:26:56 UTC (rev 231394)
@@ -29,7 +29,12 @@
 
 #include "RenderThemeCocoa.h"
 
+#if USE(SYSTEM_PREVIEW)
+#if HAVE(IOSURFACE)
+#include "IOSurface.h"
+#endif
 #include <wtf/RetainPtr.h>
+#endif
 
 OBJC_CLASS CIContext;
 
@@ -154,7 +159,11 @@
 
 #if USE(SYSTEM_PREVIEW)
     RetainPtr<CIContext> m_ciContext;
+#if HAVE(IOSURFACE)
+    std::unique_ptr<IOSurface> m_largeBadgeSurface;
+    std::unique_ptr<IOSurface> m_smallBadgeSurface;
 #endif
+#endif
 
     bool m_shouldMockBoldSystemFontForAccessibility { false };
 };

Modified: trunk/Source/WebCore/rendering/RenderThemeIOS.mm (231393 => 231394)


--- trunk/Source/WebCore/rendering/RenderThemeIOS.mm	2018-05-05 00:16:17 UTC (rev 231393)
+++ trunk/Source/WebCore/rendering/RenderThemeIOS.mm	2018-05-05 00:26:56 UTC (rev 231394)
@@ -49,6 +49,7 @@
 #import "HTMLInputElement.h"
 #import "HTMLNames.h"
 #import "HTMLSelectElement.h"
+#import "IOSurface.h"
 #import "Icon.h"
 #import "LocalizedDateCache.h"
 #import "NodeRenderStyle.h"
@@ -1826,19 +1827,19 @@
 #if USE(SYSTEM_PREVIEW)
 void RenderThemeIOS::paintSystemPreviewBadge(Image& image, const PaintInfo& paintInfo, const FloatRect& rect)
 {
-    static const float largeBadgeDimension = 70;
-    static const float largeBadgeOffset = 20;
+    static const int largeBadgeDimension = 70;
+    static const int largeBadgeOffset = 20;
 
-    static const float smallBadgeDimension = 35;
-    static const float smallBadgeOffset = 8;
+    static const int smallBadgeDimension = 35;
+    static const int smallBadgeOffset = 8;
 
-    static const float minimumSizeForLargeBadge = 240;
+    static const int minimumSizeForLargeBadge = 240;
 
     bool useSmallBadge = rect.width() < minimumSizeForLargeBadge || rect.height() < minimumSizeForLargeBadge;
-    float badgeOffset = useSmallBadge ? smallBadgeOffset : largeBadgeOffset;
-    float badgeDimension = useSmallBadge ? smallBadgeDimension : largeBadgeDimension;
+    int badgeOffset = useSmallBadge ? smallBadgeOffset : largeBadgeOffset;
+    int badgeDimension = useSmallBadge ? smallBadgeDimension : largeBadgeDimension;
 
-    float minimumDimension = badgeDimension + 2 * badgeOffset;
+    int minimumDimension = badgeDimension + 2 * badgeOffset;
     if (rect.width() < minimumDimension || rect.height() < minimumDimension)
         return;
 
@@ -1860,14 +1861,11 @@
     CIImage *clampedImage = [scaledImage imageByClampingToRect:flippedInsetBadgeRect];
 
     // Blur.
-    CIFilter *blurFilter = [CIFilter filterWithName:@"CIGaussianBlur"];
-    [blurFilter setDefaults];
-    [blurFilter setValue:@(10) forKey:kCIInputRadiusKey];
-    [blurFilter setValue:clampedImage forKey:kCIInputImageKey];
+    CIImage *blurredImage = [clampedImage imageByApplyingGaussianBlurWithSigma:10];
 
     // Saturate.
     CIFilter *saturationFilter = [CIFilter filterWithName:@"CIColorControls"];
-    [saturationFilter setValue:blurFilter.outputImage forKey:kCIInputImageKey];
+    [saturationFilter setValue:blurredImage forKey:kCIInputImageKey];
     [saturationFilter setValue:@1.8 forKey:kCIInputSaturationKey];
 
     // Tint.
@@ -1892,8 +1890,28 @@
 
     if (!m_ciContext)
         m_ciContext = [CIContext context];
-    RetainPtr<CGImageRef> cgImage = adoptCF([m_ciContext.get() createCGImage:sourceOverFilter.outputImage fromRect:flippedInsetBadgeRect]);
 
+    RetainPtr<CGImageRef> cgImage;
+#if HAVE(IOSURFACE)
+    // Crop the result to the badge location.
+    CIImage *croppedImage = [sourceOverFilter.outputImage imageByCroppingToRect:flippedInsetBadgeRect];
+    CIImage *translatedImage = [croppedImage imageByApplyingTransform:CGAffineTransformMakeTranslation(-flippedInsetBadgeRect.origin.x, -flippedInsetBadgeRect.origin.y)];
+    IOSurfaceRef surface;
+    if (useSmallBadge) {
+        if (!m_smallBadgeSurface)
+            m_smallBadgeSurface = IOSurface::create({ smallBadgeDimension, smallBadgeDimension }, sRGBColorSpaceRef());
+        surface = m_smallBadgeSurface->surface();
+    } else {
+        if (!m_largeBadgeSurface)
+            m_largeBadgeSurface = IOSurface::create({ largeBadgeDimension, largeBadgeDimension }, sRGBColorSpaceRef());
+        surface = m_largeBadgeSurface->surface();
+    }
+    [m_ciContext.get() render:translatedImage toIOSurface:surface bounds:badgeRect colorSpace:sRGBColorSpaceRef()];
+    cgImage = useSmallBadge ? m_smallBadgeSurface->createImage() : m_largeBadgeSurface->createImage();
+#else
+    cgImage = adoptCF([m_ciContext.get() createCGImage:sourceOverFilter.outputImage fromRect:flippedInsetBadgeRect]);
+#endif
+
     CGContextSaveGState(ctx);
     CGContextTranslateCTM(ctx, absoluteBadgeRect.origin.x, absoluteBadgeRect.origin.y);
     CGContextTranslateCTM(ctx, 0, badgeDimension);
@@ -1913,6 +1931,7 @@
     }
 #endif
 
+    CGContextFlush(ctx);
     CGContextRestoreGState(ctx);
 }
 #endif
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to