From 025ac4e283bb4b48f580d48541224e3996dc6f84 Mon Sep 17 00:00:00 2001 From: Cary Clark Date: Mon, 9 Nov 2009 12:12:40 -0500 Subject: capture offscreen invalidates in webkit The latest update of webkit changed the way drawing invalidates are captured. ScrollView::repaintContentRectangle now includes an intersect test that short-circuits if rect to repaint is outside the visible content. FrameView::repaintContentRectangle had logic to capture offscreen drawing, but only if the repaint rect was entirely clipped out. This changes both FrameView and ScrollView to send partial repaints to the offscreen code, up to four rects per draw. fixes http://b/issue?id=2207086 --- WebCore/platform/ScrollView.cpp | 8 +++++++- WebCore/platform/ScrollView.h | 4 +++- WebCore/platform/android/ScrollViewAndroid.cpp | 16 ++++++++++++++-- 3 files changed, 24 insertions(+), 4 deletions(-) (limited to 'WebCore/platform') diff --git a/WebCore/platform/ScrollView.cpp b/WebCore/platform/ScrollView.cpp index 8c4b115..d59d10a 100644 --- a/WebCore/platform/ScrollView.cpp +++ b/WebCore/platform/ScrollView.cpp @@ -713,10 +713,16 @@ void ScrollView::frameRectsChanged() void ScrollView::repaintContentRectangle(const IntRect& rect, bool now) { IntRect visibleContent = visibleContentRect(); +#ifdef ANDROID_CAPTURE_OFFSCREEN_PAINTS + IntRect fullVis = visibleContent; +#endif visibleContent.intersect(rect); +#ifdef ANDROID_CAPTURE_OFFSCREEN_PAINTS + if (rect != visibleContent) + platformOffscreenContentRectangle(fullVis, rect); +#endif if (visibleContent.isEmpty()) return; - if (platformWidget()) { platformRepaintContentRectangle(visibleContent, now); return; diff --git a/WebCore/platform/ScrollView.h b/WebCore/platform/ScrollView.h index ef3d03d..2da6829 100644 --- a/WebCore/platform/ScrollView.h +++ b/WebCore/platform/ScrollView.h @@ -334,7 +334,9 @@ private: public: bool platformProhibitsScrolling(); #ifdef ANDROID_CAPTURE_OFFSCREEN_PAINTS - void platformOffscreenContentRectangle(const IntRect& ); + // capture parts of rect not contained by vis + void platformOffscreenContentRectangle(const IntRect& vis, + const IntRect& rect); #endif #endif }; // class ScrollView diff --git a/WebCore/platform/android/ScrollViewAndroid.cpp b/WebCore/platform/android/ScrollViewAndroid.cpp index 274c04f..9149deb 100644 --- a/WebCore/platform/android/ScrollViewAndroid.cpp +++ b/WebCore/platform/android/ScrollViewAndroid.cpp @@ -30,6 +30,7 @@ #include "FloatRect.h" #include "FrameView.h" #include "IntRect.h" +#include "SkRegion.h" #include "WebCoreFrameBridge.h" #include "WebCoreViewBridge.h" #include "WebViewCore.h" @@ -96,9 +97,20 @@ void ScrollView::platformRepaintContentRectangle(const IntRect &rect, bool now) } #ifdef ANDROID_CAPTURE_OFFSCREEN_PAINTS -void ScrollView::platformOffscreenContentRectangle(const IntRect& rect) +/* + Compute the offscreen parts of the drawn rectangle by subtracting + vis from rect. This can compute up to four rectangular slices. +*/ +void ScrollView::platformOffscreenContentRectangle(const IntRect& vis, + const IntRect& rect) { - android::WebViewCore::getWebViewCore(this)->offInvalidate(rect); + SkRegion rectRgn = SkRegion(rect); + rectRgn.op(vis, SkRegion::kDifference_Op); + SkRegion::Iterator iter(rectRgn); + for (; !iter.done(); iter.next()) { + const SkIRect& diff = iter.rect(); + android::WebViewCore::getWebViewCore(this)->offInvalidate(diff); + } } #endif -- cgit v1.1