Optimized hit testing feature, refactored into seperate function from canvas draw calls
Review URL: https://codereview.appspot.com/6443068
git-svn-id: http://skia.googlecode.com/svn/trunk@4867 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/debugger/SkDebugCanvas.cpp b/debugger/SkDebugCanvas.cpp
index 12d7127..9819858 100644
--- a/debugger/SkDebugCanvas.cpp
+++ b/debugger/SkDebugCanvas.cpp
@@ -29,47 +29,62 @@
void SkDebugCanvas::draw(SkCanvas* canvas) {
if(!commandVector.empty()) {
for(it = commandVector.begin(); it != commandVector.end(); ++it) {
- if ((*it)->getVisibility()) {
+ if ((*it)->isVisible()) {
(*it)->execute(canvas);
}
}
}
}
-void SkDebugCanvas::drawTo(SkCanvas* canvas, int index, SkBitmap* bitmap) {
- int counter = 0;
- if(!commandVector.empty()) {
- for(it = commandVector.begin(); it != commandVector.end(); ++it) {
- if (counter != (index-1)) {
- if ((*it)->getVisibility()) {
- (*it)->execute(canvas);
- }
- } else {
- if (fFilter) {
- SkPaint* p = new SkPaint();
- p->setColor(0xAAFFFFFF);
- canvas->save();
- canvas->resetMatrix();
- SkRect dump;
- // TODO(chudy): Replace with a call to QtWidget to get dimensions.
- dump.set(SkIntToScalar(0), SkIntToScalar(0), SkIntToScalar(fWidth), SkIntToScalar(fHeight));
- canvas->clipRect(dump, SkRegion::kReplace_Op, false );
- canvas->drawRectCoords(SkIntToScalar(0),SkIntToScalar(0),SkIntToScalar(fWidth),SkIntToScalar(fHeight), *p);
- canvas->restore();
- }
- if ((*it)->getVisibility()) {
- (*it)->execute(canvas);
- }
- }
- if (fCalculateHits == true && bitmap != NULL) {
- fHitBox.updateHitPoint(bitmap, counter);
- }
+int SkDebugCanvas::getCommandAtPoint(int x, int y, int index,
+ SkIPoint transform, float scale) {
+ SkBitmap bitmap;
+ bitmap.setConfig(SkBitmap::kARGB_8888_Config, 1, 1);
+ bitmap.allocPixels();
- /* TODO(chudy): Implement a bitmap wide function that will take
- * ~50 out of each R,G,B. This will make everything but the last
- * command brighter.
- */
- if (++counter == index) return;
+ 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);
+ }
+
+ int layer = 0;
+ int prev = bitmap.getColor(0,0);
+ for (int i = 0; i < index; i++) {
+ if (commandVector[i]->isVisible()) {
+ commandVector[i]->execute(&canvas);
+ }
+ if (prev != bitmap.getColor(0,0)) {
+ layer = i;
+ }
+ prev = bitmap.getColor(0,0);
+ }
+ return layer;
+}
+
+void SkDebugCanvas::drawTo(SkCanvas* canvas, int index) {
+ int counter = 0;
+ SkASSERT(!commandVector.empty());
+ SkASSERT(index < commandVector.size());
+ for (int i = 0; i <= index; i++) {
+ if (i == index && fFilter) {
+ SkPaint p;
+ p.setColor(0xAAFFFFFF);
+ canvas->save();
+ canvas->resetMatrix();
+ SkRect mask;
+ mask.set(SkIntToScalar(0), SkIntToScalar(0),
+ SkIntToScalar(fWidth), SkIntToScalar(fHeight));
+ canvas->clipRect(mask, SkRegion::kReplace_Op, false);
+ canvas->drawRectCoords(SkIntToScalar(0), SkIntToScalar(0),
+ SkIntToScalar(fWidth), SkIntToScalar(fHeight), p);
+ canvas->restore();
+ }
+
+ if (commandVector[i]->isVisible()) {
+ commandVector[i]->execute(canvas);
}
}
}
@@ -86,7 +101,7 @@
bool SkDebugCanvas::getDrawCommandVisibilityAt(int index) {
SkASSERT(index < commandVector.size());
- return commandVector[index]->getVisibility();
+ return commandVector[index]->isVisible();
}
std::vector<SkDrawCommand*> SkDebugCanvas::getDrawCommands() {
@@ -252,5 +267,5 @@
void SkDebugCanvas::toggleCommand(int index, bool toggle) {
SkASSERT(index < commandVector.size());
- commandVector[index]->setVisibility(toggle);
+ commandVector[index]->setVisible(toggle);
}