Optimization: SkDebugCanvas is capable of pausing and drawing incrementally instead of redrawing all commands.
Review URL: https://codereview.appspot.com/6458056
git-svn-id: http://skia.googlecode.com/svn/trunk@4891 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/debugger/SkDebugCanvas.cpp b/debugger/SkDebugCanvas.cpp
index 5fe1503..6070867 100644
--- a/debugger/SkDebugCanvas.cpp
+++ b/debugger/SkDebugCanvas.cpp
@@ -18,6 +18,9 @@
fBm.setConfig(SkBitmap::kNo_Config, fWidth, fHeight);
this->setBitmapDevice(fBm);
fFilter = false;
+ fIndex = 0;
+ fUserOffset.set(0,0);
+ fUserScale = 1.0;
}
SkDebugCanvas::~SkDebugCanvas() {}
@@ -34,21 +37,26 @@
}
}
}
+ fIndex = commandVector.size() - 1;
}
-int SkDebugCanvas::getCommandAtPoint(int x, int y, int index,
- SkIPoint transform, float scale) {
+void SkDebugCanvas::applyUserTransform(SkCanvas* canvas) {
+ canvas->translate(fUserOffset.fX, fUserOffset.fY);
+ if (fUserScale < 0) {
+ canvas->scale((1.0 / -fUserScale), (1.0 / -fUserScale));
+ } else if (fUserScale > 0) {
+ canvas->scale(fUserScale, fUserScale);
+ }
+}
+
+int SkDebugCanvas::getCommandAtPoint(int x, int y, int index) {
SkBitmap bitmap;
bitmap.setConfig(SkBitmap::kARGB_8888_Config, 1, 1);
bitmap.allocPixels();
SkCanvas canvas(bitmap);
- canvas.translate(transform.fX - x, transform.fY - y);
- if (scale < 0) {
- canvas.scale((1.0 / -scale), (1.0 / -scale));
- } else if (scale > 0) {
- canvas.scale(scale, scale);
- }
+ canvas.translate(-x, -y);
+ applyUserTransform(&canvas);
int layer = 0;
SkColor prev = bitmap.getColor(0,0);
@@ -68,7 +76,21 @@
int counter = 0;
SkASSERT(!commandVector.empty());
SkASSERT(index < (int)commandVector.size());
- for (int i = 0; i <= index; i++) {
+ int i;
+
+ // This only works assuming the canvas and device are the same ones that
+ // were previously drawn into because they need to preserve all saves
+ // and restores.
+ if (fIndex < index) {
+ i = fIndex + 1;
+ } else {
+ i = 0;
+ canvas->clear(0);
+ canvas->resetMatrix();
+ applyUserTransform(canvas);
+ }
+
+ for (; i <= index; i++) {
if (i == index && fFilter) {
SkPaint p;
p.setColor(0xAAFFFFFF);
@@ -87,6 +109,8 @@
commandVector[i]->execute(canvas);
}
}
+
+ fIndex = index;
}
SkDrawCommand* SkDebugCanvas::getDrawCommandAt(int index) {