aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkPicturePlayback.cpp
diff options
context:
space:
mode:
authorGravatar rileya@google.com <rileya@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-09-13 21:41:51 +0000
committerGravatar rileya@google.com <rileya@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-09-13 21:41:51 +0000
commit8515e79a7699922e0f95f93e8cc11d4c88657c58 (patch)
treedc78b3eeb9dea5e7efcb7b619171dc6526c7f39a /src/core/SkPicturePlayback.cpp
parentad0c5d248c5a33388f5b814f160266175b7771b1 (diff)
Add R-Tree record flag to SkPicture, plus some cleanup/fixes in associated classes.
Review URL: https://codereview.appspot.com/6506103 git-svn-id: http://skia.googlecode.com/svn/trunk@5537 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/core/SkPicturePlayback.cpp')
-rw-r--r--src/core/SkPicturePlayback.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/core/SkPicturePlayback.cpp b/src/core/SkPicturePlayback.cpp
index cf3484b028..3df113ca26 100644
--- a/src/core/SkPicturePlayback.cpp
+++ b/src/core/SkPicturePlayback.cpp
@@ -11,6 +11,9 @@
#include "SkOrderedReadBuffer.h"
#include "SkOrderedWriteBuffer.h"
#include <new>
+#include "SkBBoxHierarchy.h"
+#include "SkPictureStateTree.h"
+#include "SkTSort.h"
template <typename T> int SafeCount(const T* obj) {
return obj ? obj->count() : 0;
@@ -69,6 +72,16 @@ SkPicturePlayback::SkPicturePlayback(const SkPictureRecord& record, bool deepCop
if (writer.size() == 0)
return;
+ fBoundingHierarchy = record.fBoundingHierarchy;
+ fStateTree = record.fStateTree;
+
+ SkSafeRef(fBoundingHierarchy);
+ SkSafeRef(fStateTree);
+
+ if (NULL != fBoundingHierarchy) {
+ fBoundingHierarchy->flushDeferredInserts();
+ }
+
{
size_t size = writer.size();
void* buffer = sk_malloc_throw(size);
@@ -140,6 +153,12 @@ SkPicturePlayback::SkPicturePlayback(const SkPicturePlayback& src, SkPictCopyInf
fMatrices = SkSafeRef(src.fMatrices);
fRegions = SkSafeRef(src.fRegions);
fOpData = SkSafeRef(src.fOpData);
+
+ fBoundingHierarchy = src.fBoundingHierarchy;
+ fStateTree = src.fStateTree;
+
+ SkSafeRef(fBoundingHierarchy);
+ SkSafeRef(fStateTree);
if (deepCopyInfo) {
@@ -203,6 +222,8 @@ void SkPicturePlayback::init() {
fPictureCount = 0;
fOpData = NULL;
fFactoryPlayback = NULL;
+ fBoundingHierarchy = NULL;
+ fStateTree = NULL;
}
SkPicturePlayback::~SkPicturePlayback() {
@@ -212,6 +233,8 @@ SkPicturePlayback::~SkPicturePlayback() {
SkSafeUnref(fMatrices);
SkSafeUnref(fPaints);
SkSafeUnref(fRegions);
+ SkSafeUnref(fBoundingHierarchy);
+ SkSafeUnref(fStateTree);
for (int i = 0; i < fPictureCount; i++) {
fPictureRefs[i]->unref();
@@ -560,6 +583,30 @@ void SkPicturePlayback::draw(SkCanvas& canvas) {
SkReader32 reader(fOpData->bytes(), fOpData->size());
TextContainer text;
+ SkTDArray<void*> results;
+
+ if (fStateTree && fBoundingHierarchy) {
+ SkRect clipBounds;
+ if (canvas.getClipBounds(&clipBounds)) {
+ SkIRect query;
+ clipBounds.roundOut(&query);
+ fBoundingHierarchy->search(query, &results);
+ if (results.count() == 0) { return; }
+ SkTQSort<SkPictureStateTree::Draw>(
+ reinterpret_cast<SkPictureStateTree::Draw**>(results.begin()),
+ reinterpret_cast<SkPictureStateTree::Draw**>(results.end()-1));
+ }
+ }
+
+ SkPictureStateTree::Iterator it = (NULL == fStateTree) ?
+ SkPictureStateTree::Iterator() :
+ fStateTree->getIterator(results, &canvas);
+
+ if (it.isValid()) {
+ uint32_t off = it.draw();
+ if (off == SK_MaxU32) { return; }
+ reader.setOffset(off);
+ }
// Record this, so we can concat w/ it if we encounter a setMatrix()
SkMatrix initialMatrix = canvas.getTotalMatrix();
@@ -807,6 +854,12 @@ void SkPicturePlayback::draw(SkCanvas& canvas) {
default:
SkASSERT(0);
}
+
+ if (it.isValid()) {
+ uint32_t off = it.draw();
+ if (off == SK_MaxU32) { break; }
+ reader.setOffset(off);
+ }
}
#ifdef SPEW_CLIP_SKIPPING