Index: src/core/SkBlitter.cpp |
diff --git a/src/core/SkBlitter.cpp b/src/core/SkBlitter.cpp |
index 31a3edea769a3f68de7e4978a2e8d36bfb870c49..1786d30f2b1628d4fa86f1a40583c8f0ac19b537 100644 |
--- a/src/core/SkBlitter.cpp |
+++ b/src/core/SkBlitter.cpp |
@@ -577,15 +577,13 @@ public: |
void setMask(const SkMask* mask) { fMask = mask; } |
- virtual bool setContext(const SkBitmap& device, const SkPaint& paint, |
- const SkMatrix& matrix) SK_OVERRIDE { |
- if (!this->INHERITED::setContext(device, paint, matrix)) { |
+ virtual bool onSetContext(Context* c, const SkBitmap& device, const SkPaint& paint, |
+ const SkMatrix& matrix) SK_OVERRIDE { |
+ if (!this->INHERITED::onSetContext(c, device, paint, matrix)) { |
return false; |
} |
if (fProxy) { |
- if (!fProxy->setContext(device, paint, matrix)) { |
- // must keep our set/end context calls balanced |
- this->INHERITED::endContext(); |
+ if (!fProxy->onSetContext(c, device, paint, matrix)) { |
return false; |
} |
} else { |
@@ -601,9 +599,9 @@ public: |
this->INHERITED::endContext(); |
} |
- virtual void shadeSpan(int x, int y, SkPMColor span[], int count) SK_OVERRIDE { |
+ virtual void shadeSpan(Context* c, int x, int y, SkPMColor span[], int count) SK_OVERRIDE { |
if (fProxy) { |
- fProxy->shadeSpan(x, y, span, count); |
+ fProxy->shadeSpan(c, x, y, span, count); |
} |
if (fMask == NULL) { |
@@ -703,6 +701,8 @@ private: |
typedef SkShader INHERITED; |
}; |
+// Remember, this class is going to hang onto another blitter. I think it's okay for |
+// him to just let that blitter handle the Context. |
class Sk3DBlitter : public SkBlitter { |
public: |
Sk3DBlitter(SkBlitter* proxy, Sk3DShader* shader, void (*killProc)(void*)) |
@@ -939,9 +939,13 @@ SkBlitter* SkBlitter::Choose(const SkBitmap& device, |
* The endContext() call is made by the blitter (assuming setContext did |
* not fail) in its destructor. |
*/ |
- if (shader && !shader->setContext(device, *paint, matrix)) { |
- SK_PLACEMENT_NEW(blitter, SkNullBlitter, storage, storageSize); |
- return blitter; |
+ SkShader::Context* context = NULL; |
+ if (shader) { |
+ context = shader->setContext(device, *paint, matrix); |
+ if (!context) { |
+ SK_PLACEMENT_NEW(blitter, SkNullBlitter, storage, storageSize); |
+ return blitter; |
+ } |
} |
@@ -949,12 +953,16 @@ SkBlitter* SkBlitter::Choose(const SkBitmap& device, |
case SkBitmap::kA8_Config: |
if (drawCoverage) { |
SkASSERT(NULL == shader); |
+ SkASSERT(NULL == context); |
SkASSERT(NULL == paint->getXfermode()); |
SK_PLACEMENT_NEW_ARGS(blitter, SkA8_Coverage_Blitter, |
storage, storageSize, (device, *paint)); |
} else if (shader) { |
+ // I've just made the blitters slightly larger. Make sure they're still |
+ // small enough to fit in storage |
+ SkASSERT(sizeof(SkA8_Shader_Blitter) <= storageSize); |
SK_PLACEMENT_NEW_ARGS(blitter, SkA8_Shader_Blitter, |
- storage, storageSize, (device, *paint)); |
+ storage, storageSize, (device, *paint, context)); |
} else { |
SK_PLACEMENT_NEW_ARGS(blitter, SkA8_Blitter, |
storage, storageSize, (device, *paint)); |
@@ -962,13 +970,14 @@ SkBlitter* SkBlitter::Choose(const SkBitmap& device, |
break; |
case SkBitmap::kRGB_565_Config: |
- blitter = SkBlitter_ChooseD565(device, *paint, storage, storageSize); |
+ blitter = SkBlitter_ChooseD565(device, *paint, context, storage, storageSize); |
break; |
case SkBitmap::kARGB_8888_Config: |
if (shader) { |
+ SkASSERT(sizeof(SkARGB32_Shader_Blitter) <= storageSize); |
SK_PLACEMENT_NEW_ARGS(blitter, SkARGB32_Shader_Blitter, |
- storage, storageSize, (device, *paint)); |
+ storage, storageSize, (device, *paint, context)); |
} else if (paint->getColor() == SK_ColorBLACK) { |
SK_PLACEMENT_NEW_ARGS(blitter, SkARGB32_Black_Blitter, |
storage, storageSize, (device, *paint)); |
@@ -1004,7 +1013,8 @@ const uint32_t gMask_00FF00FF = 0xFF00FF; |
/////////////////////////////////////////////////////////////////////////////// |
-SkShaderBlitter::SkShaderBlitter(const SkBitmap& device, const SkPaint& paint) |
+SkShaderBlitter::SkShaderBlitter(const SkBitmap& device, const SkPaint& paint, |
+ SkShader::Context* context) |
: INHERITED(device) { |
fShader = paint.getShader(); |
SkASSERT(fShader); |
@@ -1012,10 +1022,13 @@ SkShaderBlitter::SkShaderBlitter(const SkBitmap& device, const SkPaint& paint) |
fShader->ref(); |
fShaderFlags = fShader->getFlags(); |
+ |
+ fContext = context; |
+ SkASSERT(fContext); |
} |
SkShaderBlitter::~SkShaderBlitter() { |
SkASSERT(fShader->setContextHasBeenCalled()); |
- fShader->endContext(); |
+ fShader->endContext(fContext); |
fShader->unref(); |
} |