aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/effects/SkMorphologyImageFilter.cpp
diff options
context:
space:
mode:
authorGravatar senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-01-24 15:43:50 +0000
committerGravatar senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-01-24 15:43:50 +0000
commit0ded88d431a1872e21986984f009db2e84f52738 (patch)
tree31050e07a32353fcbd687ee79c6b8b051baf7961 /src/effects/SkMorphologyImageFilter.cpp
parent94ecb66c4920018c833d8bbbbb8b51d18e1c5d56 (diff)
[Reland of r13154, since the Housekeeping bot seems to have reverted it in r13155. Next time I'll put the "do not disturb" sign on my commit.]
Refactor SkMorphologyImageFilter, CPU and GPU paths. This required making opts/ dependent on effects/, so that we could use the SkMorphologyProc type in SkMorphologyImageFilter.h. Correctness and performance covered by existing tests; no change in functionality. R=bsalomon@google.com, djsollen@google.com, reed@google.com Committed: https://code.google.com/p/skia/source/detail?r=13154 BUG=skia: Review URL: https://codereview.chromium.org/135013004 git-svn-id: http://skia.googlecode.com/svn/trunk@13168 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/effects/SkMorphologyImageFilter.cpp')
-rw-r--r--src/effects/SkMorphologyImageFilter.cpp203
1 files changed, 54 insertions, 149 deletions
diff --git a/src/effects/SkMorphologyImageFilter.cpp b/src/effects/SkMorphologyImageFilter.cpp
index 09d9f5de4a..af45c0d3a1 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