blob: eb0e19dde4abbe21b40122f7efe2eb377f1cd04b [file] [log] [blame]
#ifndef EXPERIMENTAL_PDFVIEWER_SKTRACKDEVICE_H_
#define EXPERIMENTAL_PDFVIEWER_SKTRACKDEVICE_H_
#include "SkDevice.h"
#include "SkTracker.h"
class SkTrackDevice : public SkDevice {
public:
SK_DECLARE_INST_COUNT(SkTrackDevice)
SkTrackDevice(const SkBitmap& bitmap) : SkDevice(bitmap)
, fTracker(NULL) {}
SkTrackDevice(const SkBitmap& bitmap, const SkDeviceProperties& deviceProperties)
: SkDevice(bitmap, deviceProperties)
, fTracker(NULL) {}
SkTrackDevice(SkBitmap::Config config, int width, int height, bool isOpaque = false)
: SkDevice(config, width, height, isOpaque)
, fTracker(NULL) {}
SkTrackDevice(SkBitmap::Config config, int width, int height, bool isOpaque,
const SkDeviceProperties& deviceProperties)
: SkDevice(config, width, height, isOpaque, deviceProperties)
, fTracker(NULL) {}
virtual ~SkTrackDevice() {}
void installTracker(SkTracker* tracker) {
fTracker = tracker;
fTracker->newFrame();
}
protected:
virtual void clear(SkColor color) {
before();
INHERITED::clear(color);
after();
}
virtual void drawPaint(const SkDraw& dummy1, const SkPaint& paint) {
before();
INHERITED::drawPaint(dummy1, paint);
after();
}
virtual void drawPoints(const SkDraw& dummy1, SkCanvas::PointMode mode, size_t count,
const SkPoint dummy2[], const SkPaint& paint) {
before();
INHERITED::drawPoints(dummy1, mode, count, dummy2, paint);
after();
}
virtual void drawRect(const SkDraw& dummy1, const SkRect& r,
const SkPaint& paint) {
before();
INHERITED::drawRect(dummy1, r, paint);
after();
}
virtual void drawOval(const SkDraw& dummy1, const SkRect& oval,
const SkPaint& paint) {
before();
INHERITED::drawOval(dummy1, oval, paint);
after();
}
virtual void drawRRect(const SkDraw& dummy1, const SkRRect& rr,
const SkPaint& paint) {
before();
INHERITED::drawRRect(dummy1, rr, paint);
after();
}
virtual void drawPath(const SkDraw& dummy1, const SkPath& path,
const SkPaint& paint,
const SkMatrix* prePathMatrix = NULL,
bool pathIsMutable = false) {
before();
INHERITED::drawPath(dummy1, path, paint, prePathMatrix, pathIsMutable);
after();
}
virtual void drawBitmap(const SkDraw& dummy1, const SkBitmap& bitmap,
const SkIRect* srcRectOrNull,
const SkMatrix& matrix, const SkPaint& paint) {
before();
INHERITED::drawBitmap(dummy1, bitmap, srcRectOrNull, matrix, paint);
after();
}
virtual void drawSprite(const SkDraw& dummy1, const SkBitmap& bitmap,
int x, int y, const SkPaint& paint) {
before();
INHERITED::drawSprite(dummy1, bitmap, x, y, paint);
after();
}
virtual void drawBitmapRect(const SkDraw& dummy1, const SkBitmap& dummy2,
const SkRect* srcOrNull, const SkRect& dst,
const SkPaint& paint) {
before();
INHERITED::drawBitmapRect(dummy1, dummy2, srcOrNull, dst, paint);
after();
}
virtual void drawText(const SkDraw& dummy1, const void* text, size_t len,
SkScalar x, SkScalar y, const SkPaint& paint) {
before();
INHERITED::drawText(dummy1, text, len, x, y, paint);
after();
}
virtual void drawPosText(const SkDraw& dummy1, const void* text, size_t len,
const SkScalar pos[], SkScalar constY,
int scalarsPerPos, const SkPaint& paint) {
before();
INHERITED::drawPosText(dummy1, text, len, pos, constY, scalarsPerPos, paint);
after();
}
virtual void drawTextOnPath(const SkDraw& dummy1, const void* text, size_t len,
const SkPath& path, const SkMatrix* matrix,
const SkPaint& paint) {
before();
INHERITED::drawTextOnPath(dummy1, text, len, path, matrix, paint);
after();
}
#ifdef SK_BUILD_FOR_ANDROID
virtual void drawPosTextOnPath(const SkDraw& draw, const void* text, size_t len,
const SkPoint pos[], const SkPaint& paint,
const SkPath& path, const SkMatrix* matrix) {
before();
INHERITED::drawPosTextOnPath(draw, text, len, pos, paint, path, matrix);
after();
}
#endif
virtual void drawVertices(const SkDraw& dummy1, SkCanvas::VertexMode dummy2, int vertexCount,
const SkPoint verts[], const SkPoint texs[],
const SkColor colors[], SkXfermode* xmode,
const uint16_t indices[], int indexCount,
const SkPaint& paint) {
before();
INHERITED::drawVertices(dummy1, dummy2, vertexCount,verts, texs,colors, xmode, indices, indexCount, paint);
after();
}
virtual void drawDevice(const SkDraw& dummy1, SkDevice* dummy2, int x, int y,
const SkPaint& dummy3) {
before();
INHERITED::drawDevice(dummy1, dummy2, x, y, dummy3);
after();
}
private:
void before() {
if (fTracker) {
fTracker->before(accessBitmap(false));
}
}
// any/all of the expected touched has to be changed, and all expected untouched must be intact
void after() {
if (fTracker) {
fTracker->after(accessBitmap(false));
}
}
private:
SkTracker* fTracker;
typedef SkDevice INHERITED;
};
#endif // EXPERIMENTAL_PDFVIEWER_SKTRACKDEVICE_H_