| 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);
|
| }
|
|
|
|
|