diff options
Diffstat (limited to 'Source')
-rw-r--r-- | Source/WebKit/android/jni/PictureSet.cpp | 34 |
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++) { |