Index: src/core/SkPictureShader.cpp |
diff --git a/src/core/SkPictureShader.cpp b/src/core/SkPictureShader.cpp |
index 1e9507190c60a4ac4e8b16785c9dc06948f13e55..15df3a37a587f253f0634558517a09e141bce63a 100644 |
--- a/src/core/SkPictureShader.cpp |
+++ b/src/core/SkPictureShader.cpp |
@@ -55,9 +55,9 @@ |
} |
} |
-SkShader* SkPictureShader::buildBitmapShader(const SkMatrix& matrix) const { |
+bool SkPictureShader::buildBitmapShader(const SkMatrix& matrix) const { |
if (!fPicture || (0 == fPicture->width() && 0 == fPicture->height())) { |
- return NULL; |
+ return false; |
} |
SkMatrix m; |
@@ -78,20 +78,17 @@ |
SkISize tileSize = scaledSize.toRound(); |
if (tileSize.isEmpty()) { |
- return NULL; |
+ return false; |
} |
// The actual scale, compensating for rounding. |
SkSize tileScale = SkSize::Make(SkIntToScalar(tileSize.width()) / fPicture->width(), |
SkIntToScalar(tileSize.height()) / fPicture->height()); |
- SkAutoMutexAcquire ama(fCachedBitmapShaderMutex); |
- |
- if (!fCachedBitmapShader || tileScale != fCachedTileScale || |
- this->getLocalMatrix() != fCachedLocalMatrix) { |
+ if (!fCachedShader || tileScale != fCachedTileScale) { |
SkBitmap bm; |
if (!bm.allocN32Pixels(tileSize.width(), tileSize.height())) { |
- return NULL; |
+ return false; |
} |
bm.eraseColor(SK_ColorTRANSPARENT); |
@@ -99,96 +96,66 @@ |
canvas.scale(tileScale.width(), tileScale.height()); |
canvas.drawPicture(*fPicture); |
- fCachedBitmapShader.reset(CreateBitmapShader(bm, fTmx, fTmy)); |
+ fCachedShader.reset(CreateBitmapShader(bm, fTmx, fTmy)); |
fCachedTileScale = tileScale; |
- fCachedLocalMatrix = this->getLocalMatrix(); |
- |
- SkMatrix shaderMatrix = this->getLocalMatrix(); |
- shaderMatrix.preScale(1 / tileScale.width(), 1 / tileScale.height()); |
- fCachedBitmapShader->setLocalMatrix(shaderMatrix); |
} |
- // Increment the ref counter inside the mutex to ensure the returned pointer is still valid. |
- // Otherwise, the pointer may have been overwritten on a different thread before the object's |
- // ref count was incremented. |
- fCachedBitmapShader.get()->ref(); |
- return fCachedBitmapShader; |
+ SkMatrix shaderMatrix = this->getLocalMatrix(); |
+ shaderMatrix.preScale(1 / tileScale.width(), 1 / tileScale.height()); |
+ fCachedShader->setLocalMatrix(shaderMatrix); |
+ |
+ return true; |
} |
-SkShader* SkPictureShader::validInternal(const SkBitmap& device, const SkPaint& paint, |
- const SkMatrix& matrix, SkMatrix* totalInverse) const { |
- if (!this->INHERITED::validContext(device, paint, matrix, totalInverse)) { |
- return NULL; |
+bool SkPictureShader::setContext(const SkBitmap& device, |
+ const SkPaint& paint, |
+ const SkMatrix& matrix) { |
+ if (!this->buildBitmapShader(matrix)) { |
+ return false; |
} |
- SkShader* bitmapShader = this->buildBitmapShader(matrix); |
- if (!bitmapShader) { |
- return NULL; |
+ if (!this->INHERITED::setContext(device, paint, matrix)) { |
+ return false; |
} |
- if (!bitmapShader->validContext(device, paint, matrix)) { |
- bitmapShader->unref(); |
- return NULL; |
+ SkASSERT(fCachedShader); |
+ if (!fCachedShader->setContext(device, paint, matrix)) { |
+ this->INHERITED::endContext(); |
+ return false; |
} |
- return bitmapShader; |
+ return true; |
} |
-bool SkPictureShader::validContext(const SkBitmap& device, const SkPaint& paint, |
- const SkMatrix& matrix, SkMatrix* totalInverse) const { |
- SkAutoTUnref<SkShader> shader(this->validInternal(device, paint, matrix, totalInverse)); |
- return shader != NULL; |
+void SkPictureShader::endContext() { |
+ SkASSERT(fCachedShader); |
+ fCachedShader->endContext(); |
+ |
+ this->INHERITED::endContext(); |
} |
-SkShader::Context* SkPictureShader::createContext(const SkBitmap& device, const SkPaint& paint, |
- const SkMatrix& matrix, void* storage) const { |
- SkShader* bitmapShader = this->validInternal(device, paint, matrix, NULL); |
- if (!bitmapShader) { |
- return NULL; |
+uint32_t SkPictureShader::getFlags() { |
+ if (NULL != fCachedShader) { |
+ return fCachedShader->getFlags(); |
} |
- |
- return SkNEW_PLACEMENT_ARGS(storage, PictureShaderContext, |
- (*this, device, paint, matrix, bitmapShader)); |
+ return 0; |
} |
-size_t SkPictureShader::contextSize() const { |
- return sizeof(PictureShaderContext); |
+SkShader::ShadeProc SkPictureShader::asAShadeProc(void** ctx) { |
+ if (fCachedShader) { |
+ return fCachedShader->asAShadeProc(ctx); |
+ } |
+ return NULL; |
} |
-SkPictureShader::PictureShaderContext::PictureShaderContext( |
- const SkPictureShader& shader, const SkBitmap& device, |
- const SkPaint& paint, const SkMatrix& matrix, SkShader* bitmapShader) |
- : INHERITED(shader, device, paint, matrix) |
- , fBitmapShader(bitmapShader) |
-{ |
- SkASSERT(fBitmapShader); |
- fBitmapShaderContextStorage = sk_malloc_throw(fBitmapShader->contextSize()); |
- fBitmapShaderContext = fBitmapShader->createContext( |
- device, paint, matrix, fBitmapShaderContextStorage); |
- SkASSERT(fBitmapShaderContext); |
+void SkPictureShader::shadeSpan(int x, int y, SkPMColor dstC[], int count) { |
+ SkASSERT(fCachedShader); |
+ fCachedShader->shadeSpan(x, y, dstC, count); |
} |
-SkPictureShader::PictureShaderContext::~PictureShaderContext() { |
- fBitmapShaderContext->SkShader::Context::~Context(); |
- sk_free(fBitmapShaderContextStorage); |
-} |
- |
-uint32_t SkPictureShader::PictureShaderContext::getFlags() const { |
- return fBitmapShaderContext->getFlags(); |
-} |
- |
-SkShader::Context::ShadeProc SkPictureShader::PictureShaderContext::asAShadeProc(void** ctx) { |
- return fBitmapShaderContext->asAShadeProc(ctx); |
-} |
- |
-void SkPictureShader::PictureShaderContext::shadeSpan(int x, int y, SkPMColor dstC[], int count) { |
- SkASSERT(fBitmapShaderContext); |
- fBitmapShaderContext->shadeSpan(x, y, dstC, count); |
-} |
- |
-void SkPictureShader::PictureShaderContext::shadeSpan16(int x, int y, uint16_t dstC[], int count) { |
- SkASSERT(fBitmapShaderContext); |
- fBitmapShaderContext->shadeSpan16(x, y, dstC, count); |
+void SkPictureShader::shadeSpan16(int x, int y, uint16_t dstC[], int count) { |
+ SkASSERT(fCachedShader); |
+ fCachedShader->shadeSpan16(x, y, dstC, count); |
} |
#ifndef SK_IGNORE_TO_STRING |
@@ -209,10 +176,10 @@ |
#if SK_SUPPORT_GPU |
GrEffectRef* SkPictureShader::asNewEffect(GrContext* context, const SkPaint& paint) const { |
- SkAutoTUnref<SkShader> bitmapShader(this->buildBitmapShader(context->getMatrix())); |
- if (!bitmapShader) { |
+ if (!this->buildBitmapShader(context->getMatrix())) { |
return NULL; |
} |
- return bitmapShader->asNewEffect(context, paint); |
+ SkASSERT(fCachedShader); |
+ return fCachedShader->asNewEffect(context, paint); |
} |
#endif |