WebKit Bugzilla
Attachment 339614 Details for
Bug 185230
: Use IOSurfaces for CoreImage operations where possible
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-185230-20180504165909.patch (text/plain), 6.19 KB, created by
Dean Jackson
on 2018-05-04 16:59:10 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Dean Jackson
Created:
2018-05-04 16:59:10 PDT
Size:
6.19 KB
patch
obsolete
>Subversion Revision: 231310 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 9842893d862ff5adcd77a16cdf10816d9c581b3d..789923f576e18d9c263908b916b37826c8f82af4 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,20 @@ >+2018-05-02 Dean Jackson <dino@apple.com> >+ >+ Use IOSurfaces for CoreImage operations where possible >+ https://bugs.webkit.org/show_bug.cgi?id=185230 >+ <rdar://problem/39926929> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ 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-03 Commit Queue <commit-queue@webkit.org> > > Unreviewed, rolling out r231223 and r231288. >diff --git a/Source/WebCore/rendering/RenderThemeIOS.h b/Source/WebCore/rendering/RenderThemeIOS.h >index aaa77fd021f1296b02b369d911625be0029933c1..7b7ceef7448e9205bd1870a44c30fa984e41dd1e 100644 >--- a/Source/WebCore/rendering/RenderThemeIOS.h >+++ b/Source/WebCore/rendering/RenderThemeIOS.h >@@ -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,6 +159,10 @@ private: > > #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 }; >diff --git a/Source/WebCore/rendering/RenderThemeIOS.mm b/Source/WebCore/rendering/RenderThemeIOS.mm >index d819b0022c8b45407a86ce02b2ce1cdb0904b2d0..97a388d3ceeb22daf4bdf646c90a7c9f3eac8bb5 100644 >--- a/Source/WebCore/rendering/RenderThemeIOS.mm >+++ b/Source/WebCore/rendering/RenderThemeIOS.mm >@@ -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 @@ String RenderThemeIOS::extraDefaultStyleSheet() > #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 @@ void RenderThemeIOS::paintSystemPreviewBadge(Image& image, const PaintInfo& pain > 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,7 +1890,27 @@ void RenderThemeIOS::paintSystemPreviewBadge(Image& image, const PaintInfo& pain > > 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); >@@ -1913,6 +1931,7 @@ void RenderThemeIOS::paintSystemPreviewBadge(Image& image, const PaintInfo& pain > } > #endif > >+ CGContextFlush(ctx); > CGContextRestoreGState(ctx); > } > #endif
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
jonlee
:
review+
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 185230
:
339371
|
339613
| 339614