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
This commit is contained in:
parent
80b4ebe5d5
commit
d6a5f4e200
@ -731,21 +731,33 @@ private:
|
|||||||
|
|
||||||
#include "SkCoreBlitters.h"
|
#include "SkCoreBlitters.h"
|
||||||
|
|
||||||
class SkAutoRestoreShader {
|
class SkAutoRestoreShaderXfer {
|
||||||
public:
|
public:
|
||||||
SkAutoRestoreShader(const SkPaint& p) : fPaint((SkPaint*)&p)
|
SkAutoRestoreShaderXfer(const SkPaint& p) : fPaint((SkPaint*)&p) {
|
||||||
{
|
|
||||||
fShader = fPaint->getShader();
|
fShader = fPaint->getShader();
|
||||||
fShader->safeRef();
|
SkSafeRef(fShader);
|
||||||
|
fXfer = fPaint->getXfermode();
|
||||||
|
SkSafeRef(fXfer);
|
||||||
}
|
}
|
||||||
~SkAutoRestoreShader()
|
~SkAutoRestoreShaderXfer() {
|
||||||
{
|
|
||||||
fPaint->setShader(fShader);
|
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:
|
private:
|
||||||
SkPaint* fPaint;
|
SkPaint* fPaint;
|
||||||
SkShader* fShader;
|
SkShader* fShader;
|
||||||
|
SkXfermode* fXfer;
|
||||||
};
|
};
|
||||||
|
|
||||||
class SkAutoCallProc {
|
class SkAutoCallProc {
|
||||||
@ -857,14 +869,14 @@ SkBlitter* SkBlitter::Choose(const SkBitmap& device,
|
|||||||
return blitter;
|
return blitter;
|
||||||
}
|
}
|
||||||
|
|
||||||
SkAutoRestoreShader restore(paint);
|
SkAutoRestoreShaderXfer restorePaint(paint);
|
||||||
SkShader* shader = paint.getShader();
|
SkShader* shader = paint.getShader();
|
||||||
|
|
||||||
Sk3DShader* shader3D = NULL;
|
Sk3DShader* shader3D = NULL;
|
||||||
if (paint.getMaskFilter() != NULL && paint.getMaskFilter()->getFormat() == SkMask::k3D_Format)
|
if (paint.getMaskFilter() != NULL && paint.getMaskFilter()->getFormat() == SkMask::k3D_Format)
|
||||||
{
|
{
|
||||||
shader3D = SkNEW_ARGS(Sk3DShader, (shader));
|
shader3D = SkNEW_ARGS(Sk3DShader, (shader));
|
||||||
((SkPaint*)&paint)->setShader(shader3D)->unref();
|
restorePaint.setShader(shader3D)->unref();
|
||||||
shader = shader3D;
|
shader = shader3D;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -873,6 +885,7 @@ SkBlitter* SkBlitter::Choose(const SkBitmap& device,
|
|||||||
switch (interpret_xfermode(paint, mode, device.config())) {
|
switch (interpret_xfermode(paint, mode, device.config())) {
|
||||||
case kSrcOver_XferInterp:
|
case kSrcOver_XferInterp:
|
||||||
mode = NULL;
|
mode = NULL;
|
||||||
|
restorePaint.setXfermode(NULL);
|
||||||
break;
|
break;
|
||||||
case kSkipDrawing_XferInterp:
|
case kSkipDrawing_XferInterp:
|
||||||
SK_PLACEMENT_NEW(blitter, SkNullBlitter, storage, storageSize);
|
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)) {
|
if (NULL == shader && (NULL != mode || paint.getColorFilter() != NULL)) {
|
||||||
// xfermodes (and filters) require shaders for our current blitters
|
// xfermodes (and filters) require shaders for our current blitters
|
||||||
shader = SkNEW(SkColorShader);
|
shader = SkNEW(SkColorShader);
|
||||||
((SkPaint*)&paint)->setShader(shader)->unref();
|
restorePaint.setShader(shader)->unref();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (paint.getColorFilter() != NULL)
|
if (paint.getColorFilter() != NULL)
|
||||||
{
|
{
|
||||||
SkASSERT(shader);
|
SkASSERT(shader);
|
||||||
shader = SkNEW_ARGS(SkFilterShader, (shader, paint.getColorFilter()));
|
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
|
// blitters should ignore the presence/absence of a filter, since
|
||||||
// if there is one, the shader will take care of it.
|
// if there is one, the shader will take care of it.
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user