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