Index: src/effects/SkMorphologyImageFilter.cpp |
diff --git a/src/effects/SkMorphologyImageFilter.cpp b/src/effects/SkMorphologyImageFilter.cpp |
index 32d525a42a8e1b409534b1092002e05c4c3c7a77..f53d88dd7de86d2893e903e4d0e12f325bab3bcb 100644 |
--- a/src/effects/SkMorphologyImageFilter.cpp |
+++ b/src/effects/SkMorphologyImageFilter.cpp |
@@ -8,6 +8,9 @@ |
#include "SkMorphologyImageFilter.h" |
#include "SkBitmap.h" |
#include "SkColorPriv.h" |
+#include "SkImage.h" |
+#include "SkImagePriv.h" |
+#include "SkImage_Base.h" |
#include "SkReadBuffer.h" |
#include "SkWriteBuffer.h" |
#include "SkRect.h" |
@@ -131,31 +134,29 @@ static void callProcY(SkMorphologyImageFilter::Proc procY, const SkBitmap& src, |
bool SkMorphologyImageFilter::filterImageGeneric(SkMorphologyImageFilter::Proc procX, |
SkMorphologyImageFilter::Proc procY, |
Proxy* proxy, |
- const SkBitmap& source, |
+ const SkImage* source, |
const Context& ctx, |
- SkBitmap* dst, |
+ SkAutoTUnref<const SkImage>& dst, |
SkIPoint* offset) const { |
- SkBitmap src = source; |
+ SkAutoTUnref<const SkImage> src(SkRef(source)); |
SkIPoint srcOffset = SkIPoint::Make(0, 0); |
- if (getInput(0) && !getInput(0)->filterImage(proxy, source, ctx, &src, &srcOffset)) { |
- return false; |
- } |
- |
- if (src.colorType() != kN32_SkColorType) { |
+ if (getInput(0) && !getInput(0)->filterImage(proxy, source, ctx, src, &srcOffset)) { |
return false; |
} |
SkIRect bounds; |
- if (!this->applyCropRect(ctx, proxy, src, &srcOffset, &bounds, &src)) { |
+ if (!this->applyCropRect(ctx, proxy, src, &srcOffset, &bounds, src)) { |
return false; |
} |
- SkAutoLockPixels alp(src); |
- if (!src.getPixels()) { |
+ SkBitmap srcBitmap; |
+ SkAutoAdoptImageAsN32Bitmap aai(src, &srcBitmap); |
+ if (NULL == srcBitmap.getPixels()) { |
return false; |
} |
- if (!dst->tryAllocPixels(src.info().makeWH(bounds.width(), bounds.height()))) { |
+ SkBitmap dstBitmap; |
+ if (!dstBitmap.tryAllocPixels(srcBitmap.info().makeWH(bounds.width(), bounds.height()))) { |
return false; |
} |
@@ -173,34 +174,48 @@ bool SkMorphologyImageFilter::filterImageGeneric(SkMorphologyImageFilter::Proc p |
srcBounds.offset(-srcOffset); |
if (width == 0 && height == 0) { |
- src.extractSubset(dst, srcBounds); |
+ srcBitmap.extractSubset(&dstBitmap, srcBounds); |
+ SkImage* image = SkNewImageFromBitmap(dstBitmap, NULL); |
+ if (NULL == image) { |
+ return false; |
+ } |
+ dst.reset(image); |
offset->fX = bounds.left(); |
offset->fY = bounds.top(); |
return true; |
} |
SkBitmap temp; |
- if (!temp.tryAllocPixels(dst->info())) { |
+ if (!temp.tryAllocPixels(dstBitmap.info())) { |
return false; |
} |
if (width > 0 && height > 0) { |
- callProcX(procX, src, &temp, width, srcBounds); |
+ callProcX(procX, srcBitmap, &temp, width, srcBounds); |
SkIRect tmpBounds = SkIRect::MakeWH(srcBounds.width(), srcBounds.height()); |
- callProcY(procY, temp, dst, height, tmpBounds); |
+ callProcY(procY, temp, &dstBitmap, height, tmpBounds); |
} else if (width > 0) { |
- callProcX(procX, src, dst, width, srcBounds); |
+ callProcX(procX, srcBitmap, &dstBitmap, width, srcBounds); |
} else if (height > 0) { |
- callProcY(procY, src, dst, height, srcBounds); |
+ callProcY(procY, srcBitmap, &dstBitmap, height, srcBounds); |
} |
+ |
+ srcBitmap = SkBitmap(); |
+ temp = SkBitmap(); |
+ |
+ SkImage* image = SkNewImageFromBitmap(dstBitmap, NULL); |
+ if (NULL == image) { |
+ return false; |
+ } |
+ dst.reset(image); |
offset->fX = bounds.left(); |
offset->fY = bounds.top(); |
return true; |
} |
bool SkErodeImageFilter::onFilterImage(Proxy* proxy, |
- const SkBitmap& source, const Context& ctx, |
- SkBitmap* dst, SkIPoint* offset) const { |
+ const SkImage* source, const Context& ctx, |
+ SkAutoTUnref<const SkImage>& dst, SkIPoint* offset) const { |
Proc erodeXProc = SkMorphologyGetPlatformProc(kErodeX_SkMorphologyProcType); |
if (!erodeXProc) { |
erodeXProc = erode<kX>; |
@@ -213,8 +228,8 @@ bool SkErodeImageFilter::onFilterImage(Proxy* proxy, |
} |
bool SkDilateImageFilter::onFilterImage(Proxy* proxy, |
- const SkBitmap& source, const Context& ctx, |
- SkBitmap* dst, SkIPoint* offset) const { |
+ const SkImage* source, const Context& ctx, |
+ SkAutoTUnref<const SkImage>& dst, SkIPoint* offset) const { |
Proc dilateXProc = SkMorphologyGetPlatformProc(kDilateX_SkMorphologyProcType); |
if (!dilateXProc) { |
dilateXProc = dilate<kX>; |
@@ -645,12 +660,12 @@ void apply_morphology_pass(GrContext* context, |
} |
} |
-bool apply_morphology(const SkBitmap& input, |
+bool apply_morphology(const SkImage* input, |
const SkIRect& rect, |
GrMorphologyEffect::MorphologyType morphType, |
SkISize radius, |
- SkBitmap* dst) { |
- SkAutoTUnref<GrTexture> srcTexture(SkRef(input.getTexture())); |
+ SkAutoTUnref<const SkImage>& dst) { |
+ SkAutoTUnref<GrTexture> srcTexture(SkRef(input->getTexture())); |
SkASSERT(srcTexture); |
GrContext* context = srcTexture->getContext(); |
@@ -693,7 +708,9 @@ bool apply_morphology(const SkBitmap& input, |
Gr1DKernelEffect::kY_Direction); |
srcTexture.reset(texture); |
} |
- SkImageFilter::WrapTexture(srcTexture, rect.width(), rect.height(), dst); |
+ if (!SkImageFilter::WrapTexture(srcTexture, rect.width(), rect.height(), dst)) { |
+ return false; |
+ } |
return true; |
} |
@@ -701,17 +718,17 @@ bool apply_morphology(const SkBitmap& input, |
bool SkMorphologyImageFilter::filterImageGPUGeneric(bool dilate, |
Proxy* proxy, |
- const SkBitmap& src, |
+ const SkImage* src, |
const Context& ctx, |
- SkBitmap* result, |
+ SkAutoTUnref<const SkImage>& result, |
SkIPoint* offset) const { |
- SkBitmap input = src; |
+ SkAutoTUnref<const SkImage> input(SkRef(src)); |
SkIPoint srcOffset = SkIPoint::Make(0, 0); |
- if (getInput(0) && !getInput(0)->getInputResultGPU(proxy, src, ctx, &input, &srcOffset)) { |
+ if (getInput(0) && !getInput(0)->getInputResultGPU(proxy, src, ctx, input, &srcOffset)) { |
return false; |
} |
SkIRect bounds; |
- if (!this->applyCropRect(ctx, proxy, input, &srcOffset, &bounds, &input)) { |
+ if (!this->applyCropRect(ctx, proxy, input, &srcOffset, &bounds, input)) { |
return false; |
} |
SkVector radius = SkVector::Make(SkIntToScalar(this->radius().width()), |
@@ -727,7 +744,11 @@ bool SkMorphologyImageFilter::filterImageGPUGeneric(bool dilate, |
SkIRect srcBounds = bounds; |
srcBounds.offset(-srcOffset); |
if (width == 0 && height == 0) { |
- input.extractSubset(result, srcBounds); |
+ SkImage* image = input->newImage(srcBounds.width(), srcBounds.height(), &srcBounds); |
+ if (NULL == image) { |
+ return false; |
+ } |
+ result.reset(image); |
offset->fX = bounds.left(); |
offset->fY = bounds.top(); |
return true; |
@@ -743,13 +764,13 @@ bool SkMorphologyImageFilter::filterImageGPUGeneric(bool dilate, |
return true; |
} |
-bool SkDilateImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context& ctx, |
- SkBitmap* result, SkIPoint* offset) const { |
+bool SkDilateImageFilter::filterImageGPU(Proxy* proxy, const SkImage* src, const Context& ctx, |
+ SkAutoTUnref<const SkImage>& result, SkIPoint* offset) const { |
return this->filterImageGPUGeneric(true, proxy, src, ctx, result, offset); |
} |
-bool SkErodeImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context& ctx, |
- SkBitmap* result, SkIPoint* offset) const { |
+bool SkErodeImageFilter::filterImageGPU(Proxy* proxy, const SkImage* src, const Context& ctx, |
+ SkAutoTUnref<const SkImage>& result, SkIPoint* offset) const { |
return this->filterImageGPUGeneric(false, proxy, src, ctx, result, offset); |
} |