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 SkTrackDevice(const SkBitmap& bitmap, const SkDeviceProperties& deviceProperties) 331f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com : SkBitmapDevice(bitmap, deviceProperties) 34ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com , fTracker(NULL) {} 35ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 36ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual ~SkTrackDevice() {} 37ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 38d03c2c732e2e914f8429cfc8b077a7b9b853dd8eedisonn@google.com // Install a tracker - we can reuse the tracker between multiple devices, and the state of the 39d03c2c732e2e914f8429cfc8b077a7b9b853dd8eedisonn@google.com // tracker is preserved - number and location of poinbts, ... 40ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com void installTracker(SkTracker* tracker) { 41ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com fTracker = tracker; 42ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com fTracker->newFrame(); 43ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 44ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 45ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.comprotected: 46ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void clear(SkColor color) { 47ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 48ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com INHERITED::clear(color); 49ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 50ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 51ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 52ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawPaint(const SkDraw& dummy1, const SkPaint& paint) { 53ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 54ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com INHERITED::drawPaint(dummy1, paint); 55ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 56ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 57ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 58ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawPoints(const SkDraw& dummy1, SkCanvas::PointMode mode, size_t count, 59ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkPoint dummy2[], const SkPaint& paint) { 60ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 61ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com INHERITED::drawPoints(dummy1, mode, count, dummy2, paint); 62ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 63ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 64ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 65ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawRect(const SkDraw& dummy1, const SkRect& r, 66ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkPaint& paint) { 67ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 68ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com INHERITED::drawRect(dummy1, r, paint); 69ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 70ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 71ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 72ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 73ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawOval(const SkDraw& dummy1, const SkRect& oval, 74ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkPaint& paint) { 75ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 76ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com INHERITED::drawOval(dummy1, oval, paint); 77ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 78ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 79ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 80ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawRRect(const SkDraw& dummy1, const SkRRect& rr, 81ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkPaint& paint) { 82ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 83ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com INHERITED::drawRRect(dummy1, rr, paint); 84ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 85ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 86ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 87ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawPath(const SkDraw& dummy1, const SkPath& path, 88ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkPaint& paint, 89ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkMatrix* prePathMatrix = NULL, 90ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com bool pathIsMutable = false) { 91ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 92ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com INHERITED::drawPath(dummy1, path, paint, prePathMatrix, pathIsMutable); 93ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 94ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 95ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 96ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawBitmap(const SkDraw& dummy1, const SkBitmap& bitmap, 97ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkMatrix& matrix, const SkPaint& paint) { 98ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 9950bbdb4f3edc5005a71c438651732f53c00a5331edisonn@google.com INHERITED::drawBitmap(dummy1, bitmap, matrix, paint); 100ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 101ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 102ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 103ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawSprite(const SkDraw& dummy1, const SkBitmap& bitmap, 104ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com int x, int y, const SkPaint& paint) { 105ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 106ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com INHERITED::drawSprite(dummy1, bitmap, x, y, paint); 107ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 108ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 109ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 110ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawBitmapRect(const SkDraw& dummy1, const SkBitmap& dummy2, 111ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkRect* srcOrNull, const SkRect& dst, 1122c8177767a4b3b6c27c6ac071c8619b557472521edisonn@google.com const SkPaint& paint, 1132c8177767a4b3b6c27c6ac071c8619b557472521edisonn@google.com SkCanvas::DrawBitmapRectFlags flags) { 114ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 1152c8177767a4b3b6c27c6ac071c8619b557472521edisonn@google.com INHERITED::drawBitmapRect(dummy1, dummy2, srcOrNull, dst, paint, flags); 116ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 117ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 118ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 119ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawText(const SkDraw& dummy1, const void* text, size_t len, 120ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com SkScalar x, SkScalar y, const SkPaint& paint) { 121ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 122ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com INHERITED::drawText(dummy1, text, len, x, y, paint); 123ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 124ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 125ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 126ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawPosText(const SkDraw& dummy1, const void* text, size_t len, 127ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkScalar pos[], SkScalar constY, 128ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com int scalarsPerPos, const SkPaint& paint) { 129ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 130ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com INHERITED::drawPosText(dummy1, text, len, pos, constY, scalarsPerPos, paint); 131ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 132ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 133ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 134ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawTextOnPath(const SkDraw& dummy1, const void* text, size_t len, 135ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkPath& path, const SkMatrix* matrix, 136ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkPaint& paint) { 137ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 138ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com INHERITED::drawTextOnPath(dummy1, text, len, path, matrix, paint); 139ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 140ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 141ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 142ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com virtual void drawVertices(const SkDraw& dummy1, SkCanvas::VertexMode dummy2, int vertexCount, 143ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkPoint verts[], const SkPoint texs[], 144ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkColor colors[], SkXfermode* xmode, 145ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const uint16_t indices[], int indexCount, 146ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkPaint& paint) { 147ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 148e50d9a1fcd9c4298079ff54f9a40c9708d30f8c6edisonn@google.com INHERITED::drawVertices(dummy1, dummy2, vertexCount,verts, texs,colors, xmode, indices, 149e50d9a1fcd9c4298079ff54f9a40c9708d30f8c6edisonn@google.com indexCount, paint); 150ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 151ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 152ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 1531f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com virtual void drawDevice(const SkDraw& dummy1, SkBaseDevice* dummy2, int x, int y, 154ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com const SkPaint& dummy3) { 155ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com before(); 156ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com INHERITED::drawDevice(dummy1, dummy2, x, y, dummy3); 157ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com after(); 158ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 159ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 160ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.comprivate: 161ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com void before() { 162ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com if (fTracker) { 163ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com fTracker->before(accessBitmap(false)); 164ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 165ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 166ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 167ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com // any/all of the expected touched has to be changed, and all expected untouched must be intact 168ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com void after() { 169ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com if (fTracker) { 170ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com fTracker->after(accessBitmap(false)); 171ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 172ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com } 173ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 174ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.comprivate: 175ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com SkTracker* fTracker; 176ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 1771f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com typedef SkBitmapDevice INHERITED; 178ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com}; 179ac03d91ee03599eab946a8ad25e33f9fc5f3166eedisonn@google.com 180cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com#endif // SkTrackDevice_DEFINED 181