summaryrefslogtreecommitdiffstats
path: root/Source/WebKit
diff options
context:
space:
mode:
authorJohn Reck <jreck@google.com>2012-08-17 14:24:46 -0700
committerJohn Reck <jreck@google.com>2012-08-17 16:28:30 -0700
commitd38abfbac01ae23acad018d42382d604a45bc005 (patch)
tree3ab94c37f65d0a7d33b8a7d18aa9f50b67c1036e /Source/WebKit
parentacc2ae62ddaca4174333b8266a8baf9def87c53a (diff)
downloadexternal_webkit-d38abfbac01ae23acad018d42382d604a45bc005.zip
external_webkit-d38abfbac01ae23acad018d42382d604a45bc005.tar.gz
external_webkit-d38abfbac01ae23acad018d42382d604a45bc005.tar.bz2
Support partial invals on layers
Change-Id: Iab18e8b5e2f0e37c380c8a15e51255121c3b1966
Diffstat (limited to 'Source/WebKit')
-rw-r--r--Source/WebKit/android/jni/PicturePile.cpp38
-rw-r--r--Source/WebKit/android/jni/PicturePile.h2
2 files changed, 14 insertions, 26 deletions
diff --git a/Source/WebKit/android/jni/PicturePile.cpp b/Source/WebKit/android/jni/PicturePile.cpp
index 91f3e74..f995e92 100644
--- a/Source/WebKit/android/jni/PicturePile.cpp
+++ b/Source/WebKit/android/jni/PicturePile.cpp
@@ -55,16 +55,6 @@ static SkIRect toSkIRect(const IntRect& rect) {
return SkIRect::MakeXYWH(rect.x(), rect.y(), rect.width(), rect.height());
}
-static IntRect extractClipBounds(SkCanvas* canvas, const IntSize& size) {
- SkRect clip;
- if (!canvas->getClipBounds(&clip)) {
- ALOGW("Empty clip!");
- return IntRect();
- }
- clip.intersect(0, 0, size.width(), size.height());
- return enclosingIntRect(clip);
-}
-
PictureContainer::PictureContainer(const PictureContainer& other)
: picture(other.picture)
, area(other.area)
@@ -94,11 +84,10 @@ void PicturePile::draw(SkCanvas* canvas)
* the rect bounds of the SkRegion for the clip, so this still can't be
* used for translucent surfaces
*/
- IntRect clipBounds = extractClipBounds(canvas, m_size);
- if (clipBounds.isEmpty())
+ if (canvas->quickReject(SkRect::MakeWH(m_size.width(), m_size.height()),
+ SkCanvas::kBW_EdgeType))
return;
- SkRegion clipRegion(toSkIRect(clipBounds));
- drawWithClipRecursive(canvas, clipRegion, m_pile.size() - 1);
+ drawWithClipRecursive(canvas, m_pile.size() - 1);
}
void PicturePile::clearPrerenders()
@@ -107,24 +96,23 @@ void PicturePile::clearPrerenders()
m_pile[i].prerendered.clear();
}
-void PicturePile::drawWithClipRecursive(SkCanvas* canvas, SkRegion& clipRegion,
- int index)
+void PicturePile::drawWithClipRecursive(SkCanvas* canvas, int index)
{
// TODO: Add some debug visualizations of this
- if (index < 0 || clipRegion.isEmpty())
+ if (index < 0)
return;
PictureContainer& pc = m_pile[index];
- IntRect intersection = clipRegion.getBounds();
- intersection.intersect(pc.area);
- if (pc.picture && !intersection.isEmpty()) {
- clipRegion.op(intersection, SkRegion::kDifference_Op);
- drawWithClipRecursive(canvas, clipRegion, index - 1);
- int saved = canvas->save();
- if (canvas->clipRect(intersection))
+ if (pc.picture && !canvas->quickReject(pc.area, SkCanvas::kBW_EdgeType)) {
+ int saved = canvas->save(SkCanvas::kClip_SaveFlag);
+ if (canvas->clipRect(pc.area, SkRegion::kDifference_Op))
+ drawWithClipRecursive(canvas, index - 1);
+ canvas->restoreToCount(saved);
+ saved = canvas->save(SkCanvas::kClip_SaveFlag);
+ if (canvas->clipRect(pc.area))
drawPicture(canvas, pc);
canvas->restoreToCount(saved);
} else
- drawWithClipRecursive(canvas, clipRegion, index - 1);
+ drawWithClipRecursive(canvas, index - 1);
}
// Used by WebViewCore
diff --git a/Source/WebKit/android/jni/PicturePile.h b/Source/WebKit/android/jni/PicturePile.h
index 6e3e46d..1f99054 100644
--- a/Source/WebKit/android/jni/PicturePile.h
+++ b/Source/WebKit/android/jni/PicturePile.h
@@ -113,7 +113,7 @@ private:
void updatePicture(PicturePainter* painter, PictureContainer& container);
Picture* recordPicture(PicturePainter* painter, PictureContainer& container);
void appendToPile(const IntRect& inval, const IntRect& originalInval = IntRect());
- void drawWithClipRecursive(SkCanvas* canvas, SkRegion& clipRegion, int index);
+ void drawWithClipRecursive(SkCanvas* canvas, int index);
void drawPicture(SkCanvas* canvas, PictureContainer& pc);
IntSize m_size;