Index: src/effects/SkMorphologyImageFilter.cpp |
diff --git a/src/effects/SkMorphologyImageFilter.cpp b/src/effects/SkMorphologyImageFilter.cpp |
index eca5f00d0b2c3b731cffe365bb03f8d6cbb50d74..163f9d975a76a8dccf0ea637fb661c9979a120af 100644 |
--- a/src/effects/SkMorphologyImageFilter.cpp |
+++ b/src/effects/SkMorphologyImageFilter.cpp |
@@ -8,10 +8,10 @@ |
#include "SkMorphologyImageFilter.h" |
#include "SkBitmap.h" |
#include "SkColorPriv.h" |
+#include "SkOpts.h" |
#include "SkReadBuffer.h" |
-#include "SkWriteBuffer.h" |
#include "SkRect.h" |
-#include "SkMorphology_opts.h" |
+#include "SkWriteBuffer.h" |
#if SK_SUPPORT_GPU |
#include "GrContext.h" |
#include "GrDrawContext.h" |
@@ -35,86 +35,6 @@ void SkMorphologyImageFilter::flatten(SkWriteBuffer& buffer) const { |
buffer.writeInt(fRadius.fHeight); |
} |
-enum MorphDirection { |
- kX, kY |
-}; |
- |
-template<MorphDirection direction> |
-static void erode(const SkPMColor* src, SkPMColor* dst, |
- int radius, int width, int height, |
- int srcStride, int dstStride) |
-{ |
- const int srcStrideX = direction == kX ? 1 : srcStride; |
- const int dstStrideX = direction == kX ? 1 : dstStride; |
- const int srcStrideY = direction == kX ? srcStride : 1; |
- const int dstStrideY = direction == kX ? dstStride : 1; |
- radius = SkMin32(radius, width - 1); |
- const SkPMColor* upperSrc = src + radius * srcStrideX; |
- for (int x = 0; x < width; ++x) { |
- const SkPMColor* lp = src; |
- const SkPMColor* up = upperSrc; |
- SkPMColor* dptr = dst; |
- for (int y = 0; y < height; ++y) { |
- int minB = 255, minG = 255, minR = 255, minA = 255; |
- for (const SkPMColor* p = lp; p <= up; p += srcStrideX) { |
- int b = SkGetPackedB32(*p); |
- int g = SkGetPackedG32(*p); |
- int r = SkGetPackedR32(*p); |
- int a = SkGetPackedA32(*p); |
- if (b < minB) minB = b; |
- if (g < minG) minG = g; |
- if (r < minR) minR = r; |
- if (a < minA) minA = a; |
- } |
- *dptr = SkPackARGB32(minA, minR, minG, minB); |
- dptr += dstStrideY; |
- lp += srcStrideY; |
- up += srcStrideY; |
- } |
- if (x >= radius) src += srcStrideX; |
- if (x + radius < width - 1) upperSrc += srcStrideX; |
- dst += dstStrideX; |
- } |
-} |
- |
-template<MorphDirection direction> |
-static void dilate(const SkPMColor* src, SkPMColor* dst, |
- int radius, int width, int height, |
- int srcStride, int dstStride) |
-{ |
- const int srcStrideX = direction == kX ? 1 : srcStride; |
- const int dstStrideX = direction == kX ? 1 : dstStride; |
- const int srcStrideY = direction == kX ? srcStride : 1; |
- const int dstStrideY = direction == kX ? dstStride : 1; |
- radius = SkMin32(radius, width - 1); |
- const SkPMColor* upperSrc = src + radius * srcStrideX; |
- for (int x = 0; x < width; ++x) { |
- const SkPMColor* lp = src; |
- const SkPMColor* up = upperSrc; |
- SkPMColor* dptr = dst; |
- for (int y = 0; y < height; ++y) { |
- int maxB = 0, maxG = 0, maxR = 0, maxA = 0; |
- for (const SkPMColor* p = lp; p <= up; p += srcStrideX) { |
- int b = SkGetPackedB32(*p); |
- int g = SkGetPackedG32(*p); |
- int r = SkGetPackedR32(*p); |
- int a = SkGetPackedA32(*p); |
- if (b > maxB) maxB = b; |
- if (g > maxG) maxG = g; |
- if (r > maxR) maxR = r; |
- if (a > maxA) maxA = a; |
- } |
- *dptr = SkPackARGB32(maxA, maxR, maxG, maxB); |
- dptr += dstStrideY; |
- lp += srcStrideY; |
- up += srcStrideY; |
- } |
- if (x >= radius) src += srcStrideX; |
- if (x + radius < width - 1) upperSrc += srcStrideX; |
- dst += dstStrideX; |
- } |
-} |
- |
static void callProcX(SkMorphologyImageFilter::Proc procX, const SkBitmap& src, SkBitmap* dst, int radiusX, const SkIRect& bounds) |
{ |
procX(src.getAddr32(bounds.left(), bounds.top()), dst->getAddr32(0, 0), |
@@ -203,29 +123,15 @@ bool SkMorphologyImageFilter::filterImageGeneric(SkMorphologyImageFilter::Proc p |
bool SkErodeImageFilter::onFilterImage(Proxy* proxy, |
const SkBitmap& source, const Context& ctx, |
SkBitmap* dst, SkIPoint* offset) const { |
- Proc erodeXProc = SkMorphologyGetPlatformProc(kErodeX_SkMorphologyProcType); |
- if (!erodeXProc) { |
- erodeXProc = erode<kX>; |
- } |
- Proc erodeYProc = SkMorphologyGetPlatformProc(kErodeY_SkMorphologyProcType); |
- if (!erodeYProc) { |
- erodeYProc = erode<kY>; |
- } |
- return this->filterImageGeneric(erodeXProc, erodeYProc, proxy, source, ctx, dst, offset); |
+ return this->filterImageGeneric(SkOpts::erode_x, SkOpts::erode_y, |
+ proxy, source, ctx, dst, offset); |
} |
bool SkDilateImageFilter::onFilterImage(Proxy* proxy, |
const SkBitmap& source, const Context& ctx, |
SkBitmap* dst, SkIPoint* offset) const { |
- Proc dilateXProc = SkMorphologyGetPlatformProc(kDilateX_SkMorphologyProcType); |
- if (!dilateXProc) { |
- dilateXProc = dilate<kX>; |
- } |
- Proc dilateYProc = SkMorphologyGetPlatformProc(kDilateY_SkMorphologyProcType); |
- if (!dilateYProc) { |
- dilateYProc = dilate<kY>; |
- } |
- return this->filterImageGeneric(dilateXProc, dilateYProc, proxy, source, ctx, dst, offset); |
+ return this->filterImageGeneric(SkOpts::dilate_x, SkOpts::dilate_y, |
+ proxy, source, ctx, dst, offset); |
} |
void SkMorphologyImageFilter::computeFastBounds(const SkRect& src, SkRect* dst) const { |
@@ -714,7 +620,7 @@ bool SkMorphologyImageFilter::filterImageGPUGeneric(bool dilate, |
SkIPoint* offset) const { |
SkBitmap input = src; |
SkIPoint srcOffset = SkIPoint::Make(0, 0); |
- if (this->getInput(0) && |
+ if (this->getInput(0) && |
!this->getInput(0)->getInputResultGPU(proxy, src, ctx, &input, &srcOffset)) { |
return false; |
} |