Index: src/core/SkCanvas.cpp |
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp |
index e3451cde77fc12a3ce5700a755a841af5a88db29..d8399717fe353908a5e364047b64a4cd08362b62 100644 |
--- a/src/core/SkCanvas.cpp |
+++ b/src/core/SkCanvas.cpp |
@@ -91,10 +91,32 @@ |
}; |
#endif |
+class AutoCheckNoSetContext { |
+public: |
+ AutoCheckNoSetContext(const SkPaint& paint) : fPaint(paint) { |
+ this->assertNoSetContext(fPaint); |
+ } |
+ ~AutoCheckNoSetContext() { |
+ this->assertNoSetContext(fPaint); |
+ } |
+ |
+private: |
+ const SkPaint& fPaint; |
+ |
+ void assertNoSetContext(const SkPaint& paint) { |
+ SkShader* s = paint.getShader(); |
+ if (s) { |
+ SkASSERT(!s->setContextHasBeenCalled()); |
+ } |
+ } |
+}; |
+ |
#define CHECK_LOCKCOUNT_BALANCE(bitmap) AutoCheckLockCountBalance clcb(bitmap) |
+#define CHECK_SHADER_NOSETCONTEXT(paint) AutoCheckNoSetContext cshsc(paint) |
#else |
#define CHECK_LOCKCOUNT_BALANCE(bitmap) |
+ #define CHECK_SHADER_NOSETCONTEXT(paint) |
#endif |
typedef SkTLazy<SkPaint> SkLazyPaint; |
@@ -1918,6 +1940,8 @@ |
} |
void SkCanvas::internalDrawPaint(const SkPaint& paint) { |
+ CHECK_SHADER_NOSETCONTEXT(paint); |
+ |
LOOPER_BEGIN(paint, SkDrawFilter::kPaint_Type, NULL) |
while (iter.next()) { |
@@ -1932,6 +1956,8 @@ |
if ((long)count <= 0) { |
return; |
} |
+ |
+ CHECK_SHADER_NOSETCONTEXT(paint); |
SkRect r, storage; |
const SkRect* bounds = NULL; |
@@ -1960,6 +1986,8 @@ |
} |
void SkCanvas::drawRect(const SkRect& r, const SkPaint& paint) { |
+ CHECK_SHADER_NOSETCONTEXT(paint); |
+ |
SkRect storage; |
const SkRect* bounds = NULL; |
if (paint.canComputeFastBounds()) { |
@@ -1979,6 +2007,8 @@ |
} |
void SkCanvas::drawOval(const SkRect& oval, const SkPaint& paint) { |
+ CHECK_SHADER_NOSETCONTEXT(paint); |
+ |
SkRect storage; |
const SkRect* bounds = NULL; |
if (paint.canComputeFastBounds()) { |
@@ -1998,6 +2028,8 @@ |
} |
void SkCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) { |
+ CHECK_SHADER_NOSETCONTEXT(paint); |
+ |
SkRect storage; |
const SkRect* bounds = NULL; |
if (paint.canComputeFastBounds()) { |
@@ -2028,6 +2060,8 @@ |
void SkCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, |
const SkPaint& paint) { |
+ CHECK_SHADER_NOSETCONTEXT(paint); |
+ |
SkRect storage; |
const SkRect* bounds = NULL; |
if (paint.canComputeFastBounds()) { |
@@ -2047,6 +2081,8 @@ |
} |
void SkCanvas::drawPath(const SkPath& path, const SkPaint& paint) { |
+ CHECK_SHADER_NOSETCONTEXT(paint); |
+ |
if (!path.isFinite()) { |
return; |
} |
@@ -2322,6 +2358,8 @@ |
void SkCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, |
const SkPaint& paint) { |
+ CHECK_SHADER_NOSETCONTEXT(paint); |
+ |
LOOPER_BEGIN(paint, SkDrawFilter::kText_Type, NULL) |
while (iter.next()) { |
@@ -2336,8 +2374,10 @@ |
void SkCanvas::onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[], |
const SkPaint& paint) { |
+ CHECK_SHADER_NOSETCONTEXT(paint); |
+ |
LOOPER_BEGIN(paint, SkDrawFilter::kText_Type, NULL) |
- |
+ |
while (iter.next()) { |
SkDeviceFilteredPaint dfp(iter.fDevice, looper.paint()); |
iter.fDevice->drawPosText(iter, text, byteLength, &pos->fX, 0, 2, |
@@ -2349,8 +2389,10 @@ |
void SkCanvas::onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], |
SkScalar constY, const SkPaint& paint) { |
+ CHECK_SHADER_NOSETCONTEXT(paint); |
+ |
LOOPER_BEGIN(paint, SkDrawFilter::kText_Type, NULL) |
- |
+ |
while (iter.next()) { |
SkDeviceFilteredPaint dfp(iter.fDevice, looper.paint()); |
iter.fDevice->drawPosText(iter, text, byteLength, xpos, constY, 1, |
@@ -2362,8 +2404,10 @@ |
void SkCanvas::onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path, |
const SkMatrix* matrix, const SkPaint& paint) { |
+ CHECK_SHADER_NOSETCONTEXT(paint); |
+ |
LOOPER_BEGIN(paint, SkDrawFilter::kText_Type, NULL) |
- |
+ |
while (iter.next()) { |
iter.fDevice->drawTextOnPath(iter, text, byteLength, path, |
matrix, looper.paint()); |
@@ -2395,6 +2439,8 @@ |
const SkColor colors[], SkXfermode* xmode, |
const uint16_t indices[], int indexCount, |
const SkPaint& paint) { |
+ CHECK_SHADER_NOSETCONTEXT(paint); |
+ |
LOOPER_BEGIN(paint, SkDrawFilter::kPath_Type, NULL) |
while (iter.next()) { |