diff options
author | John Reck <jreck@google.com> | 2012-08-17 14:24:46 -0700 |
---|---|---|
committer | John Reck <jreck@google.com> | 2012-08-17 16:28:30 -0700 |
commit | d38abfbac01ae23acad018d42382d604a45bc005 (patch) | |
tree | 3ab94c37f65d0a7d33b8a7d18aa9f50b67c1036e /Source/WebKit | |
parent | acc2ae62ddaca4174333b8266a8baf9def87c53a (diff) | |
download | external_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.cpp | 38 | ||||
-rw-r--r-- | Source/WebKit/android/jni/PicturePile.h | 2 |
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; |