Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(141)

Unified Diff: src/core/SkPicturePlayback.cpp

Issue 187833003: First version of bitmap use tracking in SkPictureRecord (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/core/SkPicturePlayback.cpp
===================================================================
--- src/core/SkPicturePlayback.cpp (revision 13658)
+++ src/core/SkPicturePlayback.cpp (working copy)
@@ -101,6 +101,8 @@
fBitmapHeap.reset(SkSafeRef(record.fBitmapHeap));
fPathHeap.reset(SkSafeRef(record.fPathHeap));
+ fBitmapUseOffsets.reset(SkSafeRef(record.fBitmapUseOffsets));
+
// ensure that the paths bounds are pre-computed
if (fPathHeap.get()) {
for (int i = 0; i < fPathHeap->count(); i++) {
@@ -686,6 +688,47 @@
return (DrawType) op;
}
+void SkPicturePlayback::preLoadBitmaps(const SkTDArray<void*> &results) {
mtklein 2014/03/06 16:20:38 Can you add a note about the true type of the poin
robertphillips 2014/03/06 20:18:26 Done?
+ if (0 == results.count() || NULL == fBitmapUseOffsets) {
+ return;
+ }
+
+ SkTDArray<int> active;
+
+ SkAutoTDeleteArray<bool> needToCheck(new bool[fBitmapUseOffsets->numIDs()]);
+ for (int i = 0; i < fBitmapUseOffsets->numIDs(); ++i) {
+ needToCheck.get()[i] = true;
+ }
+
+ uint32_t max = ((SkPictureStateTree::Draw*)results[results.count()-1])->fOffset;
+
+ for (int i = 0; i < results.count(); ++i) {
+ SkPictureStateTree::Draw* draw = (SkPictureStateTree::Draw*) results[i];
+
+ for (int j = 0; j < fBitmapUseOffsets->numIDs(); ++j) {
+ if (!needToCheck.get()[j]) {
+ continue;
+ }
+
+ if (!fBitmapUseOffsets->overlap(j, draw->fOffset, max)) {
+ needToCheck.get()[j] = false;
+ continue;
+ }
+
+ if (!fBitmapUseOffsets->includes(j, draw->fOffset)) {
+ continue;
+ }
+
+ *active.append() = j;
+ needToCheck.get()[j] = false;
+ }
+ }
+
+ for (int i = 0; i < active.count(); ++i) {
+ SkDebugf("preload texture %d\n", active[i]);
+ }
+}
+
void SkPicturePlayback::draw(SkCanvas& canvas, SkDrawPictureCallback* callback) {
#ifdef ENABLE_TIME_DRAW
SkAutoTime at("SkPicture::draw", 50);
@@ -735,6 +778,8 @@
reader.setOffset(skipTo);
}
+ this->preLoadBitmaps(results);
+
// Record this, so we can concat w/ it if we encounter a setMatrix()
SkMatrix initialMatrix = canvas.getTotalMatrix();
int originalSaveCount = canvas.getSaveCount();

Powered by Google App Engine
This is Rietveld 408576698