Index: src/effects/SkDisplacementMapEffect.cpp |
diff --git a/src/effects/SkDisplacementMapEffect.cpp b/src/effects/SkDisplacementMapEffect.cpp |
index e280817e384fd3ae35445a43de289816754aabb7..ab54fa97258e1cb57938ecc6841d03273b72a5f6 100644 |
--- a/src/effects/SkDisplacementMapEffect.cpp |
+++ b/src/effects/SkDisplacementMapEffect.cpp |
@@ -6,10 +6,12 @@ |
*/ |
#include "SkDisplacementMapEffect.h" |
+#include "SkColorPriv.h" |
+#include "SkImagePriv.h" |
+#include "SkImage_Base.h" |
#include "SkReadBuffer.h" |
-#include "SkWriteBuffer.h" |
#include "SkUnPreMultiply.h" |
-#include "SkColorPriv.h" |
+#include "SkWriteBuffer.h" |
#if SK_SUPPORT_GPU |
#include "GrContext.h" |
#include "GrCoordTransform.h" |
@@ -206,41 +208,49 @@ void SkDisplacementMapEffect::flatten(SkWriteBuffer& buffer) const { |
} |
bool SkDisplacementMapEffect::onFilterImage(Proxy* proxy, |
- const SkBitmap& src, |
+ const SkImage* src, |
const Context& ctx, |
- SkBitmap* dst, |
+ SkAutoTUnref<const SkImage>& dst, |
SkIPoint* offset) const { |
- SkBitmap displ = src, color = src; |
+ SkIRect bounds; |
+ SkIPoint colorOffset = SkIPoint::Make(0, 0), displOffset = SkIPoint::Make(0, 0); |
+ |
+ SkAutoTUnref<const SkImage> displ(SkRef(src)); |
+ SkAutoTUnref<const SkImage> color(SkRef(src)); |
const SkImageFilter* colorInput = getColorInput(); |
const SkImageFilter* displInput = getDisplacementInput(); |
- SkIPoint colorOffset = SkIPoint::Make(0, 0), displOffset = SkIPoint::Make(0, 0); |
- if ((colorInput && !colorInput->filterImage(proxy, src, ctx, &color, &colorOffset)) || |
- (displInput && !displInput->filterImage(proxy, src, ctx, &displ, &displOffset))) { |
- return false; |
- } |
- if ((displ.colorType() != kN32_SkColorType) || |
- (color.colorType() != kN32_SkColorType)) { |
+ |
+ if ((colorInput && !colorInput->filterImage(proxy, src, ctx, color, &colorOffset)) || |
+ (displInput && !displInput->filterImage(proxy, src, ctx, displ, &displOffset))) { |
return false; |
} |
- SkIRect bounds; |
// Since computeDisplacement does bounds checking on color pixel access, we don't need to pad |
// the color bitmap to bounds here. |
if (!this->applyCropRect(ctx, color, colorOffset, &bounds)) { |
return false; |
} |
SkIRect displBounds; |
- if (!this->applyCropRect(ctx, proxy, displ, &displOffset, &displBounds, &displ)) { |
+ if (!this->applyCropRect(ctx, proxy, displ, &displOffset, &displBounds, displ)) { |
return false; |
} |
if (!bounds.intersect(displBounds)) { |
return false; |
} |
- SkAutoLockPixels alp_displacement(displ), alp_color(color); |
- if (!displ.getPixels() || !color.getPixels()) { |
+ |
+ SkBitmap displacementBitmap; |
+ SkAutoAdoptImageAsN32Bitmap aai_displacement(displ, &displacementBitmap); |
+ if (NULL == displacementBitmap.getPixels()) { |
+ return false; |
+ } |
+ |
+ SkBitmap colorBitmap; |
+ SkAutoAdoptImageAsN32Bitmap aai_color(color, &colorBitmap); |
+ if (NULL == colorBitmap.getPixels()) { |
return false; |
} |
- if (!dst->tryAllocPixels(color.info().makeWH(bounds.width(), bounds.height()))) { |
+ SkBitmap dstBitmap; |
+ if (!dstBitmap.tryAllocPixels(colorBitmap.info().makeWH(bounds.width(), bounds.height()))) { |
return false; |
} |
@@ -249,9 +259,19 @@ bool SkDisplacementMapEffect::onFilterImage(Proxy* proxy, |
SkIRect colorBounds = bounds; |
colorBounds.offset(-colorOffset); |
- computeDisplacement(fXChannelSelector, fYChannelSelector, scale, dst, |
- &displ, colorOffset - displOffset, &color, colorBounds); |
+ computeDisplacement(fXChannelSelector, fYChannelSelector, scale, &dstBitmap, |
+ &displacementBitmap, colorOffset - displOffset, |
+ &colorBitmap, colorBounds); |
+ |
+ displacementBitmap = SkBitmap(); |
+ colorBitmap = SkBitmap(); |
+ |
+ SkImage* image = SkNewImageFromBitmap(dstBitmap, NULL); |
+ if (NULL == image) { |
+ return false; |
+ } |
+ dst.reset(image); |
offset->fX = bounds.left(); |
offset->fY = bounds.top(); |
return true; |
@@ -382,18 +402,19 @@ private: |
typedef GrFragmentProcessor INHERITED; |
}; |
-bool SkDisplacementMapEffect::filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context& ctx, |
- SkBitmap* result, SkIPoint* offset) const { |
- SkBitmap colorBM = src; |
+bool SkDisplacementMapEffect::filterImageGPU(Proxy* proxy, const SkImage* src, const Context& ctx, |
+ SkAutoTUnref<const SkImage>& result, |
+ SkIPoint* offset) const { |
+ SkAutoTUnref<const SkImage> colorBM(SkRef(src)); |
SkIPoint colorOffset = SkIPoint::Make(0, 0); |
- if (getColorInput() && !getColorInput()->getInputResultGPU(proxy, src, ctx, &colorBM, |
+ if (getColorInput() && !getColorInput()->getInputResultGPU(proxy, src, ctx, colorBM, |
&colorOffset)) { |
return false; |
} |
- SkBitmap displacementBM = src; |
+ SkAutoTUnref<const SkImage> displacementBM(SkRef(src)); |
SkIPoint displacementOffset = SkIPoint::Make(0, 0); |
if (getDisplacementInput() && |
- !getDisplacementInput()->getInputResultGPU(proxy, src, ctx, &displacementBM, |
+ !getDisplacementInput()->getInputResultGPU(proxy, src, ctx, displacementBM, |
&displacementOffset)) { |
return false; |
} |
@@ -405,14 +426,14 @@ bool SkDisplacementMapEffect::filterImageGPU(Proxy* proxy, const SkBitmap& src, |
} |
SkIRect displBounds; |
if (!this->applyCropRect(ctx, proxy, displacementBM, |
- &displacementOffset, &displBounds, &displacementBM)) { |
+ &displacementOffset, &displBounds, displacementBM)) { |
return false; |
} |
if (!bounds.intersect(displBounds)) { |
return false; |
} |
- GrTexture* color = colorBM.getTexture(); |
- GrTexture* displacement = displacementBM.getTexture(); |
+ GrTexture* color = colorBM->getTexture(); |
+ GrTexture* displacement = displacementBM->getTexture(); |
GrContext* context = color->getContext(); |
GrSurfaceDesc desc; |
@@ -450,9 +471,11 @@ bool SkDisplacementMapEffect::filterImageGPU(Proxy* proxy, const SkBitmap& src, |
-SkIntToScalar(colorBounds.y())); |
context->drawRect(dst->asRenderTarget(), GrClip::WideOpen(), paint, matrix, |
SkRect::Make(colorBounds)); |
+ if (!WrapTexture(dst, bounds.width(), bounds.height(), result)) { |
+ return false; |
+ } |
offset->fX = bounds.left(); |
offset->fY = bounds.top(); |
- WrapTexture(dst, bounds.width(), bounds.height(), result); |
return true; |
} |