| 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();
|
| }
|
|
|