| Index: experimental/PdfViewer/SkTracker.h
|
| ===================================================================
|
| --- experimental/PdfViewer/SkTracker.h (revision 0)
|
| +++ experimental/PdfViewer/SkTracker.h (revision 0)
|
| @@ -0,0 +1,174 @@
|
| +#ifndef EXPERIMENTAL_PDFVIEWER_SKTRACKER_H_
|
| +#define EXPERIMENTAL_PDFVIEWER_SKTRACKER_H_
|
| +
|
| +#include "SkBitmap.h"
|
| +#include "SkPoint.h"
|
| +
|
| +#define MAX_TRACKING_POINTS 100
|
| +
|
| +class SkTracker {
|
| +public:
|
| + SkTracker() : fEnabled(false)
|
| + , fBreakOnAny(false)
|
| + , fCntExpectedTouched(0)
|
| + , fCntExpectedUntouched(0)
|
| + , fHits(0) {}
|
| +
|
| + virtual ~SkTracker() {}
|
| +
|
| + void clearPoints() {
|
| + fCntExpectedTouched = 0;
|
| + fCntExpectedUntouched = 0;
|
| + }
|
| +
|
| + void enableTracking(bool b) {
|
| + fEnabled = b;
|
| + }
|
| +
|
| + bool trackingEnabled() {
|
| + return fEnabled;
|
| + }
|
| +
|
| + void any() {
|
| + fBreakOnAny = true;
|
| + }
|
| +
|
| + void all() {
|
| + fBreakOnAny = false;
|
| + }
|
| +
|
| + bool requireAllExpectedTouched() {
|
| + return !fBreakOnAny;
|
| + }
|
| +
|
| + int cntExpectedTouched() {
|
| + return fCntExpectedTouched;
|
| + }
|
| +
|
| + const SkIPoint* expectedTouched() {
|
| + return fExpectedTouched;
|
| + }
|
| +
|
| + int cntExpectedUntouched() {
|
| + return fCntExpectedUntouched;
|
| + }
|
| +
|
| + const SkIPoint* expectedUntouched() {
|
| + return fExpectedUntouched;
|
| + }
|
| +
|
| + bool addExpectTouch(int x, int y) {
|
| + if (fCntExpectedTouched >= MAX_TRACKING_POINTS) {
|
| + return false;
|
| + }
|
| + if (found(x, y)) {
|
| + return false;
|
| + }
|
| + fExpectedTouched[fCntExpectedTouched] = SkIPoint::Make(x, y);
|
| + fCntExpectedTouched++;
|
| + return true;
|
| + }
|
| +
|
| + bool addExpectUntouch(int x, int y) {
|
| + if (fCntExpectedUntouched >= MAX_TRACKING_POINTS) {
|
| + return false;
|
| + }
|
| + if (found(x, y)) {
|
| + return false;
|
| + }
|
| + fExpectedUntouched[fCntExpectedUntouched] = SkIPoint::Make(x, y);
|
| + fCntExpectedUntouched++;
|
| + return true;
|
| + }
|
| +
|
| + void newFrame() {
|
| + fHits = 0;
|
| + }
|
| +
|
| + int hits() {
|
| + return fHits;
|
| + }
|
| +
|
| + void before(const SkBitmap& bitmap) {
|
| + if (fCntExpectedTouched == 0) {
|
| + return;
|
| + }
|
| +
|
| + for (int i = 0 ; i < fCntExpectedTouched; i++) {
|
| + fBeforeTouched[i] = pickColor(bitmap, fExpectedTouched[i].x(), fExpectedTouched[i].y());
|
| + }
|
| + for (int i = 0 ; i < fCntExpectedUntouched; i++) {
|
| + fBeforeUntouched[i] = pickColor(bitmap, fExpectedUntouched[i].x(), fExpectedUntouched[i].y());
|
| + }
|
| + }
|
| +
|
| + // any/all of the expected touched has to be changed, and all expected untouched must be intact
|
| + void after(const SkBitmap& bitmap) {
|
| + if (fCntExpectedTouched == 0) {
|
| + return;
|
| + }
|
| +
|
| + bool doBreak;
|
| + if (fBreakOnAny) {
|
| + doBreak = false;
|
| + for (int i = 0 ; i < fCntExpectedTouched; i++) {
|
| + doBreak = doBreak || fBeforeTouched[i] != pickColor(bitmap, fExpectedTouched[i].x(), fExpectedTouched[i].y());
|
| + }
|
| + } else {
|
| + doBreak = true;
|
| + for (int i = 0 ; i < fCntExpectedTouched; i++) {
|
| + doBreak = doBreak && fBeforeTouched[i] != pickColor(bitmap, fExpectedTouched[i].x(), fExpectedTouched[i].y());
|
| + }
|
| + }
|
| +
|
| + for (int i = 0 ; i < fCntExpectedUntouched; i++) {
|
| + doBreak = doBreak && fBeforeUntouched[i] == pickColor(bitmap, fExpectedUntouched[i].x(), fExpectedUntouched[i].y());
|
| + }
|
| +
|
| + if (doBreak) {
|
| + fHits++;
|
| + if (fEnabled) {
|
| + breakExecution();
|
| + }
|
| + }
|
| + }
|
| +
|
| +private:
|
| + inline SkColor pickColor(const SkBitmap& bitmap, int x, int y) {
|
| + return bitmap.getColor(x, y);
|
| + }
|
| +
|
| + void breakExecution() {
|
| + printf("break;\n");
|
| + }
|
| +
|
| + inline bool found(int x, int y) {
|
| + for (int i = 0 ; i < fCntExpectedTouched; i++) {
|
| + if (x == fExpectedTouched[i].x() && y == fExpectedTouched[i].y()) {
|
| + return true;
|
| + }
|
| + }
|
| + for (int i = 0 ; i < fCntExpectedUntouched; i++) {
|
| + if (x == fExpectedUntouched[i].x() && y == fExpectedUntouched[i].y()) {
|
| + return true;
|
| + }
|
| + }
|
| + return false;
|
| + }
|
| +
|
| +
|
| + bool fEnabled;
|
| + // break on any change on expected touched or all.
|
| + bool fBreakOnAny;
|
| + SkIPoint fExpectedTouched[MAX_TRACKING_POINTS];
|
| + SkColor fBeforeTouched[MAX_TRACKING_POINTS];
|
| + int fCntExpectedTouched;
|
| +
|
| + SkIPoint fExpectedUntouched[MAX_TRACKING_POINTS];
|
| + SkColor fBeforeUntouched[MAX_TRACKING_POINTS];
|
| + int fCntExpectedUntouched;
|
| +
|
| + int fHits;
|
| +};
|
| +
|
| +#endif // EXPERIMENTAL_PDFVIEWER_SKTRACKER_H_
|
|
|