1cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com/* 2cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com * Copyright 2013 Google Inc. 3cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com * 4cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com * Use of this source code is governed by a BSD-style license that can be 5cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com * found in the LICENSE file. 6cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com */ 7cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com 8cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com#ifndef SkTrackDevice_DEFINED 9cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com#define SkTrackDevice_DEFINED 10ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 11e91260c3e75d9d26e391be6823ea37373b27d1ffedisonn@google.com#include "SkBitmapDevice.h" 12ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com#include "SkTracker.h" 13ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 142af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com/** \class SkTrackDevice 152af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com * 162af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com * A Track Device is used to track that callstack of an operation that affected some pixels. 172af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com * It can be used with SampleApp to investigate bugs (CL not checked in yet). 182af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com * 19d03c2c732e2e914f8429cfc8b077a7b9b853dd8eedisonn@google.com * every drawFoo is implemented as such: 20d03c2c732e2e914f8429cfc8b077a7b9b853dd8eedisonn@google.com * before(); // - collects state of interesting pixels 21d03c2c732e2e914f8429cfc8b077a7b9b853dd8eedisonn@google.com * INHERITED::drawFoo(...); 22d03c2c732e2e914f8429cfc8b077a7b9b853dd8eedisonn@google.com * after(); // - checks if pixels of interest, and issue a breakpoint. 23d03c2c732e2e914f8429cfc8b077a7b9b853dd8eedisonn@google.com * 242af2ad9cc0b2c7d911aed2e8d2ac77c0b7d3b5dfedisonn@google.com */ 251f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.comclass SkTrackDevice : public SkBitmapDevice { 26ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.compublic: 27ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com SK_DECLARE_INST_COUNT(SkTrackDevice) 28ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 291f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com SkTrackDevice(const SkBitmap& bitmap) : SkBitmapDevice(bitmap) 30ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com , fTracker(NULL) {} 31ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 32ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual ~SkTrackDevice() {} 33ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 34d03c2c732e2e914f8429cfc8b077a7b9b853dd8eedisonn@google.com // Install a tracker - we can reuse the tracker between multiple devices, and the state of the 35d03c2c732e2e914f8429cfc8b077a7b9b853dd8eedisonn@google.com // tracker is preserved - number and location of poinbts, ... 36ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com void installTracker(SkTracker* tracker) { 37ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com fTracker = tracker; 38ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com fTracker->newFrame(); 39ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 40ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 41ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.comprotected: 42ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void clear(SkColor color) { 43ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 44ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com INHERITED::clear(color); 45ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 46ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 47ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 48ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawPaint(const SkDraw& dummy1, const SkPaint& paint) { 49ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 50ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com INHERITED::drawPaint(dummy1, paint); 51ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 52ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 53ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 54ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawPoints(const SkDraw& dummy1, SkCanvas::PointMode mode, size_t count, 55ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkPoint dummy2[], const SkPaint& paint) { 56ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 57ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com INHERITED::drawPoints(dummy1, mode, count, dummy2, paint); 58ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 59ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 60ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 61ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawRect(const SkDraw& dummy1, const SkRect& r, 62ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkPaint& paint) { 63ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 64ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com INHERITED::drawRect(dummy1, r, paint); 65ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 66ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 67ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 68ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 69ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawOval(const SkDraw& dummy1, const SkRect& oval, 70ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkPaint& paint) { 71ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 72ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com INHERITED::drawOval(dummy1, oval, paint); 73ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 74ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 75ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 76ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawRRect(const SkDraw& dummy1, const SkRRect& rr, 77ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkPaint& paint) { 78ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 79ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com INHERITED::drawRRect(dummy1, rr, paint); 80ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 81ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 82ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 83ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawPath(const SkDraw& dummy1, const SkPath& path, 84ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkPaint& paint, 85ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkMatrix* prePathMatrix = NULL, 86ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com bool pathIsMutable = false) { 87ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 88ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com INHERITED::drawPath(dummy1, path, paint, prePathMatrix, pathIsMutable); 89ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 90ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 91ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 92ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawBitmap(const SkDraw& dummy1, const SkBitmap& bitmap, 93ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkMatrix& matrix, const SkPaint& paint) { 94ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 9550bbdb4f3edc5005a71c438651732f53c00a5331edisonn@google.com INHERITED::drawBitmap(dummy1, bitmap, matrix, paint); 96ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 97ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 98ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 99ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawSprite(const SkDraw& dummy1, const SkBitmap& bitmap, 100ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com int x, int y, const SkPaint& paint) { 101ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 102ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com INHERITED::drawSprite(dummy1, bitmap, x, y, paint); 103ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 104ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 105ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 106ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawBitmapRect(const SkDraw& dummy1, const SkBitmap& dummy2, 107ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkRect* srcOrNull, const SkRect& dst, 1082c8177767a4b3b6c27c6ac071c8619b557472521edisonn@google.com const SkPaint& paint, 1092c8177767a4b3b6c27c6ac071c8619b557472521edisonn@google.com SkCanvas::DrawBitmapRectFlags flags) { 110ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 1112c8177767a4b3b6c27c6ac071c8619b557472521edisonn@google.com INHERITED::drawBitmapRect(dummy1, dummy2, srcOrNull, dst, paint, flags); 112ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 113ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 114ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 115ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawText(const SkDraw& dummy1, const void* text, size_t len, 116ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com SkScalar x, SkScalar y, const SkPaint& paint) { 117ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 118ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com INHERITED::drawText(dummy1, text, len, x, y, paint); 119ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 120ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 121ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 122ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawPosText(const SkDraw& dummy1, const void* text, size_t len, 123ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkScalar pos[], SkScalar constY, 124ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com int scalarsPerPos, const SkPaint& paint) { 125ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 126ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com INHERITED::drawPosText(dummy1, text, len, pos, constY, scalarsPerPos, paint); 127ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 128ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 129ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 130ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawTextOnPath(const SkDraw& dummy1, const void* text, size_t len, 131ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkPath& path, const SkMatrix* matrix, 132ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkPaint& paint) { 133ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 134ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com INHERITED::drawTextOnPath(dummy1, text, len, path, matrix, paint); 135ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 136ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 137ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 138ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawVertices(const SkDraw& dummy1, SkCanvas::VertexMode dummy2, int vertexCount, 139ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkPoint verts[], const SkPoint texs[], 140ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkColor colors[], SkXfermode* xmode, 141ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const uint16_t indices[], int indexCount, 142ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkPaint& paint) { 143ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 144e50d9a1fcd9c4298079ff54f9a40c9708d30f8c6edisonn@google.com INHERITED::drawVertices(dummy1, dummy2, vertexCount,verts, texs,colors, xmode, indices, 145e50d9a1fcd9c4298079ff54f9a40c9708d30f8c6edisonn@google.com indexCount, paint); 146ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 147ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 148ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 1491f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com virtual void drawDevice(const SkDraw& dummy1, SkBaseDevice* dummy2, int x, int y, 150ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkPaint& dummy3) { 151ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 152ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com INHERITED::drawDevice(dummy1, dummy2, x, y, dummy3); 153ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 154ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 155ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 156ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.comprivate: 157ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com void before() { 158ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com if (fTracker) { 159ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com fTracker->before(accessBitmap(false)); 160ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 161ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 162ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 163ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com // any/all of the expected touched has to be changed, and all expected untouched must be intact 164ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com void after() { 165ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com if (fTracker) { 166ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com fTracker->after(accessBitmap(false)); 167ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 168ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 169ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 170ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.comprivate: 171ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com SkTracker* fTracker; 172ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 1731f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com typedef SkBitmapDevice INHERITED; 174ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com}; 175ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 176cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com#endif // SkTrackDevice_DEFINED 177