Index: src/effects/SkBlendImageFilter.cpp |
diff --git a/src/effects/SkBlendImageFilter.cpp b/src/effects/SkBlendImageFilter.cpp |
index 4f61ed80002acdb0d2ff82b65bec0c25ccc120ae..7b98644ec79b3292197eee3b214d8bc3ca3024f8 100644 |
--- a/src/effects/SkBlendImageFilter.cpp |
+++ b/src/effects/SkBlendImageFilter.cpp |
@@ -68,10 +68,13 @@ bool SkBlendImageFilter::onFilterImage(Proxy* proxy, |
SkImageFilter* backgroundInput = getBackgroundInput(); |
SkImageFilter* foregroundInput = getForegroundInput(); |
SkASSERT(NULL != backgroundInput); |
- if (!backgroundInput->filterImage(proxy, src, ctm, &background, offset)) { |
+ SkIPoint backgroundOffset = SkIPoint::Make(0, 0); |
+ if (!backgroundInput->filterImage(proxy, src, ctm, &background, &backgroundOffset)) { |
return false; |
} |
- if (foregroundInput && !foregroundInput->filterImage(proxy, src, ctm, &foreground, offset)) { |
+ SkIPoint foregroundOffset = SkIPoint::Make(0, 0); |
+ if (foregroundInput && |
+ !foregroundInput->filterImage(proxy, src, ctm, &foreground, &foregroundOffset)) { |
return false; |
} |
SkAutoLockPixels alp_foreground(foreground), alp_background(background); |
@@ -83,9 +86,9 @@ bool SkBlendImageFilter::onFilterImage(Proxy* proxy, |
SkCanvas canvas(*dst); |
SkPaint paint; |
paint.setXfermodeMode(SkXfermode::kSrc_Mode); |
- canvas.drawBitmap(background, 0, 0, &paint); |
+ canvas.drawBitmap(background, backgroundOffset.fX, backgroundOffset.fY, &paint); |
paint.setXfermodeMode(modeToXfermode(fMode)); |
- canvas.drawBitmap(foreground, 0, 0, &paint); |
+ canvas.drawBitmap(foreground, foregroundOffset.fX, foregroundOffset.fY, &paint); |
return true; |
} |
@@ -124,8 +127,11 @@ class GrBlendEffect : public GrEffect { |
public: |
static GrEffectRef* Create(SkBlendImageFilter::Mode mode, |
GrTexture* foreground, |
- GrTexture* background) { |
- AutoEffectUnref effect(SkNEW_ARGS(GrBlendEffect, (mode, foreground, background))); |
+ const SkIPoint& foregroundOffset, |
+ GrTexture* background, |
+ const SkIPoint& backgroundOffset) { |
+ AutoEffectUnref effect(SkNEW_ARGS(GrBlendEffect, (mode, foreground, foregroundOffset, |
+ background, backgroundOffset))); |
return CreateEffectRef(effect); |
} |
@@ -133,6 +139,8 @@ public: |
virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE; |
SkBlendImageFilter::Mode mode() const { return fMode; } |
+ const SkMatrix& foregroundMatrix() const { return fForegroundMatrix; } |
+ const SkMatrix& backgroundMatrix() const { return fBackgroundMatrix; } |
typedef GrGLBlendEffect GLEffect; |
static const char* Name() { return "Blend"; } |
@@ -142,22 +150,31 @@ public: |
private: |
virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE; |
- GrBlendEffect(SkBlendImageFilter::Mode mode, GrTexture* foreground, GrTexture* background); |
+ GrBlendEffect(SkBlendImageFilter::Mode mode, |
+ GrTexture* foreground, const SkIPoint& foregroundOffset, |
+ GrTexture* background, const SkIPoint& backgroundOffset); |
GrTextureAccess fForegroundAccess; |
+ SkMatrix fForegroundMatrix; |
GrTextureAccess fBackgroundAccess; |
+ SkMatrix fBackgroundMatrix; |
SkBlendImageFilter::Mode fMode; |
typedef GrEffect INHERITED; |
}; |
-bool SkBlendImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, SkBitmap* result) { |
+bool SkBlendImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, SkBitmap* result, |
+ SkIPoint* offset) { |
SkBitmap backgroundBM; |
- if (!SkImageFilterUtils::GetInputResultGPU(getBackgroundInput(), proxy, src, &backgroundBM)) { |
+ SkIPoint backgroundOffset = SkIPoint::Make(0, 0); |
+ if (!SkImageFilterUtils::GetInputResultGPU(getBackgroundInput(), proxy, src, &backgroundBM, |
+ &backgroundOffset)) { |
return false; |
} |
GrTexture* background = backgroundBM.getTexture(); |
SkBitmap foregroundBM; |
- if (!SkImageFilterUtils::GetInputResultGPU(getForegroundInput(), proxy, src, &foregroundBM)) { |
+ SkIPoint foregroundOffset = SkIPoint::Make(0, 0); |
+ if (!SkImageFilterUtils::GetInputResultGPU(getForegroundInput(), proxy, src, &foregroundBM, |
+ &foregroundOffset)) { |
return false; |
} |
GrTexture* foreground = foregroundBM.getTexture(); |
@@ -176,7 +193,7 @@ bool SkBlendImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, SkBit |
GrPaint paint; |
paint.colorStage(0)->setEffect( |
- GrBlendEffect::Create(fMode, foreground, background))->unref(); |
+ GrBlendEffect::Create(fMode, foreground, foregroundOffset, background, backgroundOffset))->unref(); |
SkRect srcRect; |
src.getBounds(&srcRect); |
context->drawRect(paint, srcRect); |
@@ -187,12 +204,20 @@ bool SkBlendImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, SkBit |
GrBlendEffect::GrBlendEffect(SkBlendImageFilter::Mode mode, |
GrTexture* foreground, |
- GrTexture* background) |
+ const SkIPoint& foregroundOffset, |
+ GrTexture* background, |
+ const SkIPoint& backgroundOffset) |
: fForegroundAccess(foreground) |
, fBackgroundAccess(background) |
, fMode(mode) { |
this->addTextureAccess(&fForegroundAccess); |
this->addTextureAccess(&fBackgroundAccess); |
+ fForegroundMatrix = GrEffect::MakeDivByTextureWHMatrix(foreground); |
+ fForegroundMatrix.preTranslate(SkIntToScalar(-foregroundOffset.fX), |
+ SkIntToScalar(-foregroundOffset.fY)); |
+ fBackgroundMatrix = GrEffect::MakeDivByTextureWHMatrix(background); |
+ fBackgroundMatrix.preTranslate(SkIntToScalar(-backgroundOffset.fX), |
+ SkIntToScalar(-backgroundOffset.fY)); |
} |
GrBlendEffect::~GrBlendEffect() { |
@@ -288,11 +313,11 @@ void GrGLBlendEffect::setData(const GrGLUniformManager& uman, const GrDrawEffect |
GrTexture* fgTex = blend.texture(0); |
GrTexture* bgTex = blend.texture(1); |
fForegroundEffectMatrix.setData(uman, |
- GrEffect::MakeDivByTextureWHMatrix(fgTex), |
+ blend.foregroundMatrix(), |
drawEffect, |
fgTex); |
fBackgroundEffectMatrix.setData(uman, |
- GrEffect::MakeDivByTextureWHMatrix(bgTex), |
+ blend.backgroundMatrix(), |
drawEffect, |
bgTex); |