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

Unified Diff: src/core/SkRecordDraw.cpp

Issue 1828233003: wip playback splitup test Base URL: https://chromium.googlesource.com/skia.git@master
Patch Set: Created 4 years, 9 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
« no previous file with comments | « src/core/SkRecordDraw.h ('k') | src/utils/SkEventTracer.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkRecordDraw.cpp
diff --git a/src/core/SkRecordDraw.cpp b/src/core/SkRecordDraw.cpp
index 5ca9517d3f81cb7adef234596a3e1db9de5e87e5..c7e5e423a19c36e1d5c87f30149e9805870330f6 100644
--- a/src/core/SkRecordDraw.cpp
+++ b/src/core/SkRecordDraw.cpp
@@ -8,6 +8,119 @@
#include "SkLayerInfo.h"
#include "SkRecordDraw.h"
#include "SkPatchUtils.h"
+#include "SkTraceEvent.h"
+
+DrawData::DrawData(const SkRecord& r,
+ SkCanvas* c,
+ SkPicture const* const dp[],
+ SkDrawable* const dw[],
+ int dc,
+ const SkBBoxHierarchy* b,
+ SkPicture::AbortCallback* cb)
+ : record(r),
+ canvas(c),
+ drawablePicts(dp),
+ drawables(dw),
+ drawableCount(dc),
+ bbh(b),
+ callback(cb),
+ draw(c, dp, dw, dc),
+ ops_count(0),
+ record_count(0) {}
+
+void SkRecordDrawPrasInit(DrawData& data) {
+ TRACE_EVENT0("pras_skia", "SkRecordDrawPrasInit");
+ data.canvas->save();
+
+ if (data.bbh) {
+ // Draw only ops that affect pixels in the canvas's current clip.
+ // The SkRecord and BBH were recorded in identity space. This canvas
+ // is not necessarily in that same space. getClipBounds() returns us
+ // this canvas' clip bounds transformed back into identity space, which
+ // lets us query the BBH.
+ SkRect query;
+ if (!data.canvas->getClipBounds(&query)) {
+ query.setEmpty();
+ }
+
+ data.bbh->search(query, &data.ops);
+ }
+}
+
+bool SkRecordDrawPrasDo(DrawData& data) {
+ TRACE_EVENT0("pras_skia", "SkRecordDrawPrasDo");
+ if (data.bbh) {
+ if (data.ops_count >= data.ops.count())
+ return true;
+
+ if (data.callback && data.callback->abort()) {
+ return true;
+ }
+ data.record.visit<void>(data.ops[data.ops_count], data.draw);
+ data.ops_count++;
+ return false;
+ } else {
+ if (data.record_count >= data.record.count())
+ return true;
+
+ if (data.callback && data.callback->abort()) {
+ return true;
+ }
+ data.record.visit<void>(data.record_count, data.draw);
+ data.record_count++;
+ return false;
+ }
+}
+
+void SkRecordDrawPrasDeInit(DrawData& data) {
+ TRACE_EVENT0("pras_skia", "SkRecordDrawPrasDeInit");
+ data.canvas->restore();
+}
+
+void SkRecordDrawPras(DrawData& data) {
+ SkAutoCanvasRestore saveRestore(data.canvas,
+ true /*save now, restore at exit*/);
+ TRACE_EVENT0("skia", "SkRecordDrawPras");
+
+ if (data.bbh) {
+ // Draw only ops that affect pixels in the canvas's current clip.
+ // The SkRecord and BBH were recorded in identity space. This canvas
+ // is not necessarily in that same space. getClipBounds() returns us
+ // this canvas' clip bounds transformed back into identity space, which
+ // lets us query the BBH.
+ SkRect query;
+ if (!data.canvas->getClipBounds(&query)) {
+ query.setEmpty();
+ }
+
+ data.bbh->search(query, &data.ops);
+
+ SkRecords::Draw draw(data.canvas, data.drawablePicts, data.drawables,
+ data.drawableCount);
+ for (int i = 0; i < data.ops.count(); i++) {
+ if (data.callback && data.callback->abort()) {
+ return;
+ }
+ // This visit call uses the SkRecords::Draw::operator() to call
+ // methods on the |canvas|, wrapped by methods defined with the
+ // DRAW() macro.
+ data.record.visit<void>(data.ops[i], draw);
+ }
+ } else {
+ // Draw all ops.
+ SkRecords::Draw draw(data.canvas, data.drawablePicts, data.drawables,
+ data.drawableCount);
+ for (int i = 0; i < data.record.count(); i++) {
+ if (data.callback && data.callback->abort()) {
+ return;
+ }
+ // This visit call uses the SkRecords::Draw::operator() to call
+ // methods on the |canvas|, wrapped by methods defined with the
+ // DRAW() macro.
+ data.record.visit<void>(i, draw);
+ }
+ }
+}
void SkRecordDraw(const SkRecord& record,
SkCanvas* canvas,
@@ -17,6 +130,7 @@ void SkRecordDraw(const SkRecord& record,
const SkBBoxHierarchy* bbh,
SkPicture::AbortCallback* callback) {
SkAutoCanvasRestore saveRestore(canvas, true /*save now, restore at exit*/);
+ TRACE_EVENT0("pras", "SkRecordDraw");
if (bbh) {
// Draw only ops that affect pixels in the canvas's current clip.
« no previous file with comments | « src/core/SkRecordDraw.h ('k') | src/utils/SkEventTracer.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698