diff options
author | 2012-09-13 21:41:51 +0000 | |
---|---|---|
committer | 2012-09-13 21:41:51 +0000 | |
commit | 8515e79a7699922e0f95f93e8cc11d4c88657c58 (patch) | |
tree | dc78b3eeb9dea5e7efcb7b619171dc6526c7f39a /src/core/SkPicturePlayback.cpp | |
parent | ad0c5d248c5a33388f5b814f160266175b7771b1 (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.cpp | 53 |
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 |