summaryrefslogtreecommitdiffstats
path: root/Source/WebKit/android
diff options
context:
space:
mode:
authorNicolas Roard <nicolasroard@google.com>2011-09-30 18:24:04 -0700
committerNicolas Roard <nicolasroard@google.com>2011-09-30 18:24:04 -0700
commite813876665227fbf67a696b7da98a0eeaf1064de (patch)
tree4daf434e289d9847992f85345b2991f5458d4aca /Source/WebKit/android
parent70766d2b423da8555553b35dba98bad79529b97c (diff)
downloadexternal_webkit-e813876665227fbf67a696b7da98a0eeaf1064de.zip
external_webkit-e813876665227fbf67a696b7da98a0eeaf1064de.tar.gz
external_webkit-e813876665227fbf67a696b7da98a0eeaf1064de.tar.bz2
Fine-tune the number of buckets in PictureSet
add some clearing logic as well bug:5145259 bug:5255262 Change-Id: I764e2b67ff15893e853e36185cd610e7293d0129
Diffstat (limited to 'Source/WebKit/android')
-rw-r--r--Source/WebKit/android/jni/PictureSet.cpp34
1 files changed, 33 insertions, 1 deletions
diff --git a/Source/WebKit/android/jni/PictureSet.cpp b/Source/WebKit/android/jni/PictureSet.cpp
index 3f40174..dfcf9ab 100644
--- a/Source/WebKit/android/jni/PictureSet.cpp
+++ b/Source/WebKit/android/jni/PictureSet.cpp
@@ -43,7 +43,7 @@
#define MAX_ADDITIONAL_AREA 0.65
#define MAX_ADDITIONAL_PICTURES 32
-#define BUCKET_SIZE 256
+#define BUCKET_SIZE 1024
#define MAX_BUCKET_COUNT_X 16
#define MAX_BUCKET_COUNT_Y 64
@@ -282,6 +282,38 @@ void PictureSet::addToBucket(Bucket* bucket, int dx, int dy, SkIRect& rect)
first = bucket->begin();
last = bucket->end();
+ bool clearUp = false;
+ if (last - first > MAX_ADDITIONAL_PICTURES) {
+ // too many pictures in the bucket, let's collapse
+ clearUp = true;
+ }
+
+ float bucketBaseArea = 0;
+ float bucketAdditionalArea = 0;
+ for (BucketPicture* current = first; current != last; current++) {
+ float area = current->mArea.width() * current->mArea.height();
+ if (current->mBase)
+ bucketBaseArea += area;
+ else
+ bucketAdditionalArea += area;
+ }
+
+ if (bucketBaseArea > 0 && bucketBaseArea * MAX_ADDITIONAL_AREA <= bucketAdditionalArea) {
+ // additional area too large, not worth maintaining
+ clearUp = true;
+ }
+
+ // To clear things up, we just need to mark the pictures' area as empty
+ // We only keep the base surface.
+ if (clearUp) {
+ for (BucketPicture* current = first; current != last; current++) {
+ if (!current->mBase)
+ current->mArea.setEmpty();
+ SkSafeUnref(current->mPicture);
+ current->mPicture = 0;
+ }
+ }
+
// let's do a pass to collapse out empty areas
BucketPicture* writer = first;
for (BucketPicture* current = first; current != last; current++) {