Zoomed-in scrolling is very slow when deviceScaleFactor > 1
authorbdakin@apple.com <bdakin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 13 Nov 2012 04:26:35 +0000 (04:26 +0000)
committerbdakin@apple.com <bdakin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 13 Nov 2012 04:26:35 +0000 (04:26 +0000)
https://bugs.webkit.org/show_bug.cgi?id=101787

Reviewed by Simon Fraser.

Source/WebCore:

This patch adds a new member to the GraphicsContextState that tracks
whether or not fonts should be subpixel-quantized. We want to default
to sibpixel-quantizing, but we'll turn it off if we're scrolling
content that cannot be scrolled on the scrolling thread.

State has a new bool shouldSubpixelQuantizeFonts. It defaults to true
since normally we do want to quantize.
* platform/graphics/GraphicsContext.cpp:
(WebCore::GraphicsContext::setShouldSubpixelQuantizeFonts):
(WebCore::GraphicsContext::shouldSubpixelQuantizeFonts):
* platform/graphics/GraphicsContext.h:
(WebCore::GraphicsContextState::GraphicsContextState):
(GraphicsContextState):
(GraphicsContext):

wkSetCGFontRenderingMode now takes a BOOL parameter which indicates
whether or not it should try to subpixel-quantize the fonts.
* platform/graphics/mac/FontMac.mm:
(WebCore::Font::drawGlyphs):
* platform/mac/WebCoreSystemInterface.h:
* platform/mac/WebCoreSystemInterface.mm:

Disable subpixel-quantization for overflow areas, subframes, and
content that is scrolling on the main thread.
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::paintLayerContents):

WebKitLibraries:

wkSetCGFontRenderingMode now takes a BOOL parameter.
* WebKitSystemInterface.h:
* libWebKitSystemInterfaceLion.a:
* libWebKitSystemInterfaceMountainLion.a:

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

Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/GraphicsContext.cpp
Source/WebCore/platform/graphics/GraphicsContext.h
Source/WebCore/platform/graphics/mac/FontMac.mm
Source/WebCore/platform/mac/WebCoreSystemInterface.h
Source/WebCore/platform/mac/WebCoreSystemInterface.mm
Source/WebCore/rendering/RenderLayer.cpp
WebKitLibraries/ChangeLog
WebKitLibraries/WebKitSystemInterface.h

index 71cfe36..09fcb04 100644 (file)
@@ -1,3 +1,37 @@
+2012-11-12  Beth Dakin  <bdakin@apple.com>
+
+        Zoomed-in scrolling is very slow when deviceScaleFactor > 1
+        https://bugs.webkit.org/show_bug.cgi?id=101787
+
+        Reviewed by Simon Fraser.
+
+        This patch adds a new member to the GraphicsContextState that tracks 
+        whether or not fonts should be subpixel-quantized. We want to default 
+        to sibpixel-quantizing, but we'll turn it off if we're scrolling 
+        content that cannot be scrolled on the scrolling thread.
+
+        State has a new bool shouldSubpixelQuantizeFonts. It defaults to true 
+        since normally we do want to quantize.
+        * platform/graphics/GraphicsContext.cpp:
+        (WebCore::GraphicsContext::setShouldSubpixelQuantizeFonts):
+        (WebCore::GraphicsContext::shouldSubpixelQuantizeFonts):
+        * platform/graphics/GraphicsContext.h:
+        (WebCore::GraphicsContextState::GraphicsContextState):
+        (GraphicsContextState):
+        (GraphicsContext):
+
+        wkSetCGFontRenderingMode now takes a BOOL parameter which indicates 
+        whether or not it should try to subpixel-quantize the fonts.
+        * platform/graphics/mac/FontMac.mm:
+        (WebCore::Font::drawGlyphs):
+        * platform/mac/WebCoreSystemInterface.h:
+        * platform/mac/WebCoreSystemInterface.mm:
+
+        Disable subpixel-quantization for overflow areas, subframes, and 
+        content that is scrolling on the main thread.
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::paintLayerContents):
+
 2012-11-12  Timothy Hatcher  <timothy@apple.com>
 
         Expose InspectorFrontendClientLocal::setAttachedWindow as public.
 2012-11-12  Timothy Hatcher  <timothy@apple.com>
 
         Expose InspectorFrontendClientLocal::setAttachedWindow as public.
index 2ca0e65..55f31f4 100644 (file)
@@ -256,6 +256,16 @@ bool GraphicsContext::shouldSmoothFonts() const
     return m_state.shouldSmoothFonts;
 }
 
     return m_state.shouldSmoothFonts;
 }
 
+void GraphicsContext::setShouldSubpixelQuantizeFonts(bool b)
+{
+    m_state.shouldSubpixelQuantizeFonts = b;
+}
+
+bool GraphicsContext::shouldSubpixelQuantizeFonts() const
+{
+    return m_state.shouldSubpixelQuantizeFonts;
+}
+
 const GraphicsContextState& GraphicsContext::state() const
 {
     return m_state;
 const GraphicsContextState& GraphicsContext::state() const
 {
     return m_state;
index fe65f88..85cff99 100644 (file)
@@ -167,6 +167,7 @@ namespace WebCore {
             , compositeOperator(CompositeSourceOver)
             , shouldAntialias(true)
             , shouldSmoothFonts(true)
             , compositeOperator(CompositeSourceOver)
             , shouldAntialias(true)
             , shouldSmoothFonts(true)
+            , shouldSubpixelQuantizeFonts(true)
             , paintingDisabled(false)
             , shadowsIgnoreTransforms(false)
 #if USE(CG)
             , paintingDisabled(false)
             , shadowsIgnoreTransforms(false)
 #if USE(CG)
@@ -205,6 +206,7 @@ namespace WebCore {
 
         bool shouldAntialias : 1;
         bool shouldSmoothFonts : 1;
 
         bool shouldAntialias : 1;
         bool shouldSmoothFonts : 1;
+        bool shouldSubpixelQuantizeFonts : 1;
         bool paintingDisabled : 1;
         bool shadowsIgnoreTransforms : 1;
 #if USE(CG)
         bool paintingDisabled : 1;
         bool shadowsIgnoreTransforms : 1;
 #if USE(CG)
@@ -257,6 +259,11 @@ namespace WebCore {
         void setShouldSmoothFonts(bool);
         bool shouldSmoothFonts() const;
 
         void setShouldSmoothFonts(bool);
         bool shouldSmoothFonts() const;
 
+        // Normally CG enables subpixel-quantization because it improves the performance of aligning glyphs.
+        // In some cases we have to disable to to ensure a high-quality output of the glyphs.
+        void setShouldSubpixelQuantizeFonts(bool);
+        bool shouldSubpixelQuantizeFonts() const;
+
         const GraphicsContextState& state() const;
 
 #if USE(CG)
         const GraphicsContextState& state() const;
 
 #if USE(CG)
index b7c0861..7df4b29 100644 (file)
@@ -211,7 +211,7 @@ void Font::drawGlyphs(GraphicsContext* context, const SimpleFontData* font, cons
         matrix = CGAffineTransformConcat(matrix, CGAffineTransformMake(1, 0, -tanf(SYNTHETIC_OBLIQUE_ANGLE * acosf(0) / 90), 1, 0, 0)); 
     CGContextSetTextMatrix(cgContext, matrix);
 
         matrix = CGAffineTransformConcat(matrix, CGAffineTransformMake(1, 0, -tanf(SYNTHETIC_OBLIQUE_ANGLE * acosf(0) / 90), 1, 0, 0)); 
     CGContextSetTextMatrix(cgContext, matrix);
 
-    wkSetCGFontRenderingMode(cgContext, drawFont);
+    wkSetCGFontRenderingMode(cgContext, drawFont, context->shouldSubpixelQuantizeFonts());
     if (drawFont)
         CGContextSetFontSize(cgContext, 1.0f);
     else
     if (drawFont)
         CGContextSetFontSize(cgContext, 1.0f);
     else
index 78e2ef0..c5e6be3 100644 (file)
@@ -192,7 +192,7 @@ extern void (*wkQTMovieViewSetDrawSynchronously)(QTMovieView*, BOOL);
 extern NSArray *(*wkQTGetSitesInMediaDownloadCache)();
 extern void (*wkQTClearMediaDownloadCacheForSite)(NSString *site);
 extern void (*wkQTClearMediaDownloadCache)();
 extern NSArray *(*wkQTGetSitesInMediaDownloadCache)();
 extern void (*wkQTClearMediaDownloadCacheForSite)(NSString *site);
 extern void (*wkQTClearMediaDownloadCache)();
-extern void (*wkSetCGFontRenderingMode)(CGContextRef, NSFont*);
+extern void (*wkSetCGFontRenderingMode)(CGContextRef, NSFont*, BOOL);
 extern void (*wkSetDragImage)(NSImage*, NSPoint offset);
 extern void (*wkSetNSURLConnectionDefersCallbacks)(NSURLConnection *, BOOL);
 extern void (*wkSetNSURLRequestShouldContentSniff)(NSMutableURLRequest *, BOOL);
 extern void (*wkSetDragImage)(NSImage*, NSPoint offset);
 extern void (*wkSetNSURLConnectionDefersCallbacks)(NSURLConnection *, BOOL);
 extern void (*wkSetNSURLRequestShouldContentSniff)(NSMutableURLRequest *, BOOL);
index 7bc6c3b..98504e9 100644 (file)
@@ -85,7 +85,7 @@ NSArray *(*wkQTGetSitesInMediaDownloadCache)();
 void (*wkQTClearMediaDownloadCacheForSite)(NSString *site);
 void (*wkQTClearMediaDownloadCache)();
 
 void (*wkQTClearMediaDownloadCacheForSite)(NSString *site);
 void (*wkQTClearMediaDownloadCache)();
 
-void (*wkSetCGFontRenderingMode)(CGContextRef, NSFont*);
+void (*wkSetCGFontRenderingMode)(CGContextRef, NSFont*, BOOL);
 void (*wkSetDragImage)(NSImage*, NSPoint offset);
 void (*wkSetBaseCTM)(CGContextRef, CGAffineTransform);
 void (*wkSetPatternPhaseInUserSpace)(CGContextRef, CGPoint point);
 void (*wkSetDragImage)(NSImage*, NSPoint offset);
 void (*wkSetBaseCTM)(CGContextRef, CGAffineTransform);
 void (*wkSetPatternPhaseInUserSpace)(CGContextRef, CGPoint point);
index dd4615c..9d72d7a 100644 (file)
@@ -90,6 +90,7 @@
 #include "ScrollAnimator.h"
 #include "Scrollbar.h"
 #include "ScrollbarTheme.h"
 #include "ScrollAnimator.h"
 #include "Scrollbar.h"
 #include "ScrollbarTheme.h"
+#include "ScrollingCoordinator.h"
 #include "Settings.h"
 #include "SourceGraphic.h"
 #include "StylePropertySet.h"
 #include "Settings.h"
 #include "SourceGraphic.h"
 #include "StylePropertySet.h"
@@ -3183,6 +3184,26 @@ void RenderLayer::paintLayerContents(GraphicsContext* context, const LayerPainti
     // Ensure our lists are up-to-date.
     updateLayerListsIfNeeded();
 
     // Ensure our lists are up-to-date.
     updateLayerListsIfNeeded();
 
+    bool didQuantizeFonts = true;
+    bool scrollingOnMainThread = true;
+    Frame* frame = renderer()->frame();
+#if ENABLE(THREADED_SCROLLING)
+    if (frame) {
+        if (Page* page = frame->page()) {
+            if (ScrollingCoordinator* scrollingCoordinator = page->scrollingCoordinator())
+                scrollingOnMainThread = scrollingCoordinator->shouldUpdateScrollLayerPositionOnMainThread();
+        }
+    }
+#endif
+
+    // FIXME: We shouldn't have to disable subpixel quantization for overflow clips or subframes once we scroll those
+    // things on the scrolling thread.
+    bool needToAdjustSubpixelQuantization = scrollingOnMainThread || (renderer()->hasOverflowClip() && !usesCompositedScrolling()) || (frame && frame->ownerElement());
+    if (needToAdjustSubpixelQuantization) {
+        didQuantizeFonts = context->shouldSubpixelQuantizeFonts();
+        context->setShouldSubpixelQuantizeFonts(false);
+    }
+
     // Apply clip-path to context.
     bool hasClipPath = false;
     RenderStyle* style = renderer()->style();
     // Apply clip-path to context.
     bool hasClipPath = false;
     RenderStyle* style = renderer()->style();
@@ -3376,6 +3397,10 @@ void RenderLayer::paintLayerContents(GraphicsContext* context, const LayerPainti
         m_usedTransparency = false;
     }
 
         m_usedTransparency = false;
     }
 
+    // Re-set this to whatever it was before we painted the layer.
+    if (needToAdjustSubpixelQuantization)
+        context->setShouldSubpixelQuantizeFonts(didQuantizeFonts);
+
     if (hasClipPath)
         context->restore();
 }
     if (hasClipPath)
         context->restore();
 }
index ffa53e5..cbebfd1 100644 (file)
@@ -1,3 +1,15 @@
+2012-11-12  Beth Dakin  <bdakin@apple.com>
+
+        Zoomed-in scrolling is very slow when deviceScaleFactor > 1
+        https://bugs.webkit.org/show_bug.cgi?id=101787
+
+        Reviewed by Simon Fraser.
+
+        wkSetCGFontRenderingMode now takes a BOOL parameter.
+        * WebKitSystemInterface.h:
+        * libWebKitSystemInterfaceLion.a:
+        * libWebKitSystemInterfaceMountainLion.a:
+
 2012-11-08  Anders Carlsson  <andersca@apple.com>
 
         Roll WebKitSystemInterface DEPS.
 2012-11-08  Anders Carlsson  <andersca@apple.com>
 
         Roll WebKitSystemInterface DEPS.
index 1ee5833..4b01bf8 100644 (file)
@@ -140,7 +140,7 @@ void WKCallDrawingNotification(CGrafPtr port, Rect *bounds);
 BOOL WKGetGlyphTransformedAdvances(CGFontRef, NSFont*, CGAffineTransform *m, ATSGlyphRef *glyph, CGSize *advance);
 NSFont *WKGetFontInLanguageForRange(NSFont *font, NSString *string, NSRange range);
 NSFont *WKGetFontInLanguageForCharacter(NSFont *font, UniChar ch);
 BOOL WKGetGlyphTransformedAdvances(CGFontRef, NSFont*, CGAffineTransform *m, ATSGlyphRef *glyph, CGSize *advance);
 NSFont *WKGetFontInLanguageForRange(NSFont *font, NSString *string, NSRange range);
 NSFont *WKGetFontInLanguageForCharacter(NSFont *font, UniChar ch);
-void WKSetCGFontRenderingMode(CGContextRef cgContext, NSFont *font);
+void WKSetCGFontRenderingMode(CGContextRef cgContext, NSFont *font, BOOL shouldSubpixelQuantize);
 BOOL WKCGContextGetShouldSmoothFonts(CGContextRef cgContext);
 
 
 BOOL WKCGContextGetShouldSmoothFonts(CGContextRef cgContext);