From d6a5f4e2008d96a896c76ca031bece0723e16e3c Mon Sep 17 00:00:00 2001 From: "reed@android.com" Date: Thu, 22 Oct 2009 16:50:05 +0000 Subject: clear xfermode in paint to reflect that we saw it was srcover This allows our asserts in the RGB16 blitter chooser to pass. git-svn-id: http://skia.googlecode.com/svn/trunk@403 2bbb7eff-a529-9590-31e7-b0007b416f81 --- src/core/SkBlitter.cpp | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) (limited to 'src/core/SkBlitter.cpp') diff --git a/src/core/SkBlitter.cpp b/src/core/SkBlitter.cpp index c8580ea8ce..930f9bf74c 100644 --- a/src/core/SkBlitter.cpp +++ b/src/core/SkBlitter.cpp @@ -731,21 +731,33 @@ private: #include "SkCoreBlitters.h" -class SkAutoRestoreShader { +class SkAutoRestoreShaderXfer { public: - SkAutoRestoreShader(const SkPaint& p) : fPaint((SkPaint*)&p) - { + SkAutoRestoreShaderXfer(const SkPaint& p) : fPaint((SkPaint*)&p) { fShader = fPaint->getShader(); - fShader->safeRef(); + SkSafeRef(fShader); + fXfer = fPaint->getXfermode(); + SkSafeRef(fXfer); } - ~SkAutoRestoreShader() - { + ~SkAutoRestoreShaderXfer() { fPaint->setShader(fShader); - fShader->safeUnref(); + SkSafeUnref(fShader); + fPaint->setXfermode(fXfer); + SkSafeUnref(fXfer); + } + + SkShader* setShader(SkShader* shader) { + return fPaint->setShader(shader); } + + SkXfermode* setXfermode(SkXfermode* mode) { + return fPaint->setXfermode(mode); + } + private: SkPaint* fPaint; SkShader* fShader; + SkXfermode* fXfer; }; class SkAutoCallProc { @@ -857,14 +869,14 @@ SkBlitter* SkBlitter::Choose(const SkBitmap& device, return blitter; } - SkAutoRestoreShader restore(paint); + SkAutoRestoreShaderXfer restorePaint(paint); SkShader* shader = paint.getShader(); Sk3DShader* shader3D = NULL; if (paint.getMaskFilter() != NULL && paint.getMaskFilter()->getFormat() == SkMask::k3D_Format) { shader3D = SkNEW_ARGS(Sk3DShader, (shader)); - ((SkPaint*)&paint)->setShader(shader3D)->unref(); + restorePaint.setShader(shader3D)->unref(); shader = shader3D; } @@ -873,6 +885,7 @@ SkBlitter* SkBlitter::Choose(const SkBitmap& device, switch (interpret_xfermode(paint, mode, device.config())) { case kSrcOver_XferInterp: mode = NULL; + restorePaint.setXfermode(NULL); break; case kSkipDrawing_XferInterp: SK_PLACEMENT_NEW(blitter, SkNullBlitter, storage, storageSize); @@ -885,14 +898,14 @@ SkBlitter* SkBlitter::Choose(const SkBitmap& device, if (NULL == shader && (NULL != mode || paint.getColorFilter() != NULL)) { // xfermodes (and filters) require shaders for our current blitters shader = SkNEW(SkColorShader); - ((SkPaint*)&paint)->setShader(shader)->unref(); + restorePaint.setShader(shader)->unref(); } if (paint.getColorFilter() != NULL) { SkASSERT(shader); shader = SkNEW_ARGS(SkFilterShader, (shader, paint.getColorFilter())); - ((SkPaint*)&paint)->setShader(shader)->unref(); + restorePaint.setShader(shader)->unref(); // blitters should ignore the presence/absence of a filter, since // if there is one, the shader will take care of it. } -- cgit v1.2.3