| Index: src/effects/SkMorphologyImageFilter.cpp
|
| diff --git a/src/effects/SkMorphologyImageFilter.cpp b/src/effects/SkMorphologyImageFilter.cpp
|
| index 09d9f5de4ae1762a01229e19532034c777bb61ab..af45c0d3a109febeb2e93c7cbba03001df75ce2c 100644
|
| --- a/src/effects/SkMorphologyImageFilter.cpp
|
| +++ b/src/effects/SkMorphologyImageFilter.cpp
|
| @@ -84,28 +84,6 @@ static void erode(const SkPMColor* src, SkPMColor* dst,
|
| }
|
| }
|
|
|
| -static void erodeX(const SkBitmap& src, SkBitmap* dst, int radiusX, const SkIRect& bounds)
|
| -{
|
| - SkMorphologyProc erodeXProc = SkMorphologyGetPlatformProc(kErodeX_SkMorphologyProcType);
|
| - if (!erodeXProc) {
|
| - erodeXProc = erode<kX>;
|
| - }
|
| - erodeXProc(src.getAddr32(bounds.left(), bounds.top()), dst->getAddr32(0, 0),
|
| - radiusX, bounds.width(), bounds.height(),
|
| - src.rowBytesAsPixels(), dst->rowBytesAsPixels());
|
| -}
|
| -
|
| -static void erodeY(const SkBitmap& src, SkBitmap* dst, int radiusY, const SkIRect& bounds)
|
| -{
|
| - SkMorphologyProc erodeYProc = SkMorphologyGetPlatformProc(kErodeY_SkMorphologyProcType);
|
| - if (!erodeYProc) {
|
| - erodeYProc = erode<kY>;
|
| - }
|
| - erodeYProc(src.getAddr32(bounds.left(), bounds.top()), dst->getAddr32(0, 0),
|
| - radiusY, bounds.height(), bounds.width(),
|
| - src.rowBytesAsPixels(), dst->rowBytesAsPixels());
|
| -}
|
| -
|
| template<MorphDirection direction>
|
| static void dilate(const SkPMColor* src, SkPMColor* dst,
|
| int radius, int width, int height,
|
| @@ -144,31 +122,27 @@ static void dilate(const SkPMColor* src, SkPMColor* dst,
|
| }
|
| }
|
|
|
| -static void dilateX(const SkBitmap& src, SkBitmap* dst, int radiusX, const SkIRect& bounds)
|
| +static void callProcX(SkMorphologyImageFilter::Proc procX, const SkBitmap& src, SkBitmap* dst, int radiusX, const SkIRect& bounds)
|
| {
|
| - SkMorphologyProc dilateXProc = SkMorphologyGetPlatformProc(kDilateX_SkMorphologyProcType);
|
| - if (!dilateXProc) {
|
| - dilateXProc = dilate<kX>;
|
| - }
|
| - dilateXProc(src.getAddr32(bounds.left(), bounds.top()), dst->getAddr32(0, 0),
|
| - radiusX, bounds.width(), bounds.height(),
|
| - src.rowBytesAsPixels(), dst->rowBytesAsPixels());
|
| + procX(src.getAddr32(bounds.left(), bounds.top()), dst->getAddr32(0, 0),
|
| + radiusX, bounds.width(), bounds.height(),
|
| + src.rowBytesAsPixels(), dst->rowBytesAsPixels());
|
| }
|
|
|
| -static void dilateY(const SkBitmap& src, SkBitmap* dst, int radiusY, const SkIRect& bounds)
|
| +static void callProcY(SkMorphologyImageFilter::Proc procY, const SkBitmap& src, SkBitmap* dst, int radiusY, const SkIRect& bounds)
|
| {
|
| - SkMorphologyProc dilateYProc = SkMorphologyGetPlatformProc(kDilateY_SkMorphologyProcType);
|
| - if (!dilateYProc) {
|
| - dilateYProc = dilate<kY>;
|
| - }
|
| - dilateYProc(src.getAddr32(bounds.left(), bounds.top()), dst->getAddr32(0, 0),
|
| - radiusY, bounds.height(), bounds.width(),
|
| - src.rowBytesAsPixels(), dst->rowBytesAsPixels());
|
| + procY(src.getAddr32(bounds.left(), bounds.top()), dst->getAddr32(0, 0),
|
| + radiusY, bounds.height(), bounds.width(),
|
| + src.rowBytesAsPixels(), dst->rowBytesAsPixels());
|
| }
|
|
|
| -bool SkErodeImageFilter::onFilterImage(Proxy* proxy,
|
| - const SkBitmap& source, const SkMatrix& ctm,
|
| - SkBitmap* dst, SkIPoint* offset) {
|
| +bool SkMorphologyImageFilter::filterImageGeneric(SkMorphologyImageFilter::Proc procX,
|
| + SkMorphologyImageFilter::Proc procY,
|
| + Proxy* proxy,
|
| + const SkBitmap& source,
|
| + const SkMatrix& ctm,
|
| + SkBitmap* dst,
|
| + SkIPoint* offset) {
|
| SkBitmap src = source;
|
| SkIPoint srcOffset = SkIPoint::Make(0, 0);
|
| if (getInput(0) && !getInput(0)->filterImage(proxy, source, ctm, &src, &srcOffset)) {
|
| @@ -224,87 +198,45 @@ bool SkErodeImageFilter::onFilterImage(Proxy* proxy,
|
| }
|
|
|
| if (width > 0 && height > 0) {
|
| - erodeX(src, &temp, width, srcBounds);
|
| + callProcX(procX, src, &temp, width, srcBounds);
|
| SkIRect tmpBounds = SkIRect::MakeWH(srcBounds.width(), srcBounds.height());
|
| - erodeY(temp, dst, height, tmpBounds);
|
| + callProcY(procY, temp, dst, height, tmpBounds);
|
| } else if (width > 0) {
|
| - erodeX(src, dst, width, srcBounds);
|
| + callProcX(procX, src, dst, width, srcBounds);
|
| } else if (height > 0) {
|
| - erodeY(src, dst, height, srcBounds);
|
| + callProcY(procY, src, dst, height, srcBounds);
|
| }
|
| offset->fX = bounds.left();
|
| offset->fY = bounds.top();
|
| return true;
|
| }
|
|
|
| -bool SkDilateImageFilter::onFilterImage(Proxy* proxy,
|
| - const SkBitmap& source, const SkMatrix& ctm,
|
| - SkBitmap* dst, SkIPoint* offset) {
|
| - SkBitmap src = source;
|
| - SkIPoint srcOffset = SkIPoint::Make(0, 0);
|
| - if (getInput(0) && !getInput(0)->filterImage(proxy, source, ctm, &src, &srcOffset)) {
|
| - return false;
|
| - }
|
| - if (src.config() != SkBitmap::kARGB_8888_Config) {
|
| - return false;
|
| - }
|
| -
|
| - SkIRect bounds;
|
| - src.getBounds(&bounds);
|
| - bounds.offset(srcOffset);
|
| - if (!this->applyCropRect(&bounds, ctm)) {
|
| - return false;
|
| - }
|
| -
|
| - SkAutoLockPixels alp(src);
|
| - if (!src.getPixels()) {
|
| - return false;
|
| - }
|
| -
|
| - dst->setConfig(src.config(), bounds.width(), bounds.height());
|
| - dst->allocPixels();
|
| - if (!dst->getPixels()) {
|
| - return false;
|
| - }
|
| -
|
| - SkVector radius = SkVector::Make(SkIntToScalar(this->radius().width()),
|
| - SkIntToScalar(this->radius().height()));
|
| - ctm.mapVectors(&radius, 1);
|
| - int width = SkScalarFloorToInt(radius.fX);
|
| - int height = SkScalarFloorToInt(radius.fY);
|
| -
|
| - if (width < 0 || height < 0) {
|
| - return false;
|
| +bool SkErodeImageFilter::onFilterImage(Proxy* proxy,
|
| + const SkBitmap& source, const SkMatrix& ctm,
|
| + SkBitmap* dst, SkIPoint* offset) {
|
| + Proc erodeXProc = SkMorphologyGetPlatformProc(kErodeX_SkMorphologyProcType);
|
| + if (!erodeXProc) {
|
| + erodeXProc = erode<kX>;
|
| }
|
| -
|
| - SkIRect srcBounds = bounds;
|
| - srcBounds.offset(-srcOffset);
|
| -
|
| - if (width == 0 && height == 0) {
|
| - src.extractSubset(dst, srcBounds);
|
| - offset->fX = bounds.left();
|
| - offset->fY = bounds.top();
|
| - return true;
|
| + Proc erodeYProc = SkMorphologyGetPlatformProc(kErodeY_SkMorphologyProcType);
|
| + if (!erodeYProc) {
|
| + erodeYProc = erode<kY>;
|
| }
|
| + return this->filterImageGeneric(erodeXProc, erodeYProc, proxy, source, ctm, dst, offset);
|
| +}
|
|
|
| - SkBitmap temp;
|
| - temp.setConfig(dst->config(), dst->width(), dst->height());
|
| - if (!temp.allocPixels()) {
|
| - return false;
|
| +bool SkDilateImageFilter::onFilterImage(Proxy* proxy,
|
| + const SkBitmap& source, const SkMatrix& ctm,
|
| + SkBitmap* dst, SkIPoint* offset) {
|
| + Proc dilateXProc = SkMorphologyGetPlatformProc(kDilateX_SkMorphologyProcType);
|
| + if (!dilateXProc) {
|
| + dilateXProc = dilate<kX>;
|
| }
|
| -
|
| - if (width > 0 && height > 0) {
|
| - dilateX(src, &temp, width, srcBounds);
|
| - SkIRect tmpBounds = SkIRect::MakeWH(srcBounds.width(), srcBounds.height());
|
| - dilateY(temp, dst, height, tmpBounds);
|
| - } else if (width > 0) {
|
| - dilateX(src, dst, width, srcBounds);
|
| - } else if (height > 0) {
|
| - dilateY(src, dst, height, srcBounds);
|
| + Proc dilateYProc = SkMorphologyGetPlatformProc(kDilateY_SkMorphologyProcType);
|
| + if (!dilateYProc) {
|
| + dilateYProc = dilate<kY>;
|
| }
|
| - offset->fX = bounds.left();
|
| - offset->fY = bounds.top();
|
| - return true;
|
| + return this->filterImageGeneric(dilateXProc, dilateYProc, proxy, source, ctm, dst, offset);
|
| }
|
|
|
| #if SK_SUPPORT_GPU
|
| @@ -579,8 +511,12 @@ bool apply_morphology(const SkBitmap& input,
|
|
|
| };
|
|
|
| -bool SkDilateImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const SkMatrix& ctm,
|
| - SkBitmap* result, SkIPoint* offset) {
|
| +bool SkMorphologyImageFilter::filterImageGPUGeneric(bool dilate,
|
| + Proxy* proxy,
|
| + const SkBitmap& src,
|
| + const SkMatrix& ctm,
|
| + SkBitmap* result,
|
| + SkIPoint* offset) {
|
| SkBitmap input;
|
| SkIPoint srcOffset = SkIPoint::Make(0, 0);
|
| if (!SkImageFilterUtils::GetInputResultGPU(getInput(0), proxy, src, ctm, &input, &srcOffset)) {
|
| @@ -611,7 +547,8 @@ bool SkDilateImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, cons
|
| return true;
|
| }
|
|
|
| - if (!apply_morphology(input, srcBounds, GrMorphologyEffect::kDilate_MorphologyType,
|
| + GrMorphologyEffect::MorphologyType type = dilate ? GrMorphologyEffect::kDilate_MorphologyType : GrMorphologyEffect::kErode_MorphologyType;
|
| + if (!apply_morphology(input, srcBounds, type,
|
| SkISize::Make(width, height), result)) {
|
| return false;
|
| }
|
| @@ -620,46 +557,14 @@ bool SkDilateImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, cons
|
| return true;
|
| }
|
|
|
| +bool SkDilateImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const SkMatrix& ctm,
|
| + SkBitmap* result, SkIPoint* offset) {
|
| + return this->filterImageGPUGeneric(true, proxy, src, ctm, result, offset);
|
| +}
|
| +
|
| bool SkErodeImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const SkMatrix& ctm,
|
| SkBitmap* result, SkIPoint* offset) {
|
| - SkBitmap input;
|
| - SkIPoint srcOffset = SkIPoint::Make(0, 0);
|
| - if (!SkImageFilterUtils::GetInputResultGPU(getInput(0), proxy, src, ctm, &input, &srcOffset)) {
|
| - return false;
|
| - }
|
| - SkIRect bounds;
|
| - input.getBounds(&bounds);
|
| - bounds.offset(srcOffset);
|
| - if (!this->applyCropRect(&bounds, ctm)) {
|
| - return false;
|
| - }
|
| - SkVector radius = SkVector::Make(SkIntToScalar(this->radius().width()),
|
| - SkIntToScalar(this->radius().height()));
|
| - ctm.mapVectors(&radius, 1);
|
| - int width = SkScalarFloorToInt(radius.fX);
|
| - int height = SkScalarFloorToInt(radius.fY);
|
| -
|
| - if (width < 0 || height < 0) {
|
| - return false;
|
| - }
|
| -
|
| - SkIRect srcBounds = bounds;
|
| - srcBounds.offset(-srcOffset);
|
| -
|
| - if (width == 0 && height == 0) {
|
| - input.extractSubset(result, srcBounds);
|
| - offset->fX = bounds.left();
|
| - offset->fY = bounds.top();
|
| - return true;
|
| - }
|
| -
|
| - if (!apply_morphology(input, srcBounds, GrMorphologyEffect::kErode_MorphologyType,
|
| - SkISize::Make(width, height), result)) {
|
| - return false;
|
| - }
|
| - offset->fX = bounds.left();
|
| - offset->fY = bounds.top();
|
| - return true;
|
| + return this->filterImageGPUGeneric(false, proxy, src, ctm, result, offset);
|
| }
|
|
|
| #endif
|
|
|